generate-imports.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See LICENSE in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. const glob = require('glob');
  6. const path = require('path');
  7. const fs = require('fs');
  8. const FILE_PATH = path.join(__dirname, 'index.js');
  9. generateLanguages();
  10. generateFeatures();
  11. /**
  12. * @returns { Promise<string[]> }
  13. */
  14. function getBasicLanguages() {
  15. return new Promise((resolve, reject) => {
  16. glob(
  17. './node_modules/monaco-editor/esm/vs/basic-languages/*/*.contribution.js',
  18. { cwd: path.dirname(__dirname) },
  19. (err, files) => {
  20. if (err) {
  21. reject(err);
  22. return;
  23. }
  24. resolve(
  25. files.map((file) => {
  26. return file
  27. .substring('./node_modules/monaco-editor/esm/'.length)
  28. .replace(/\.js$/, '');
  29. })
  30. );
  31. }
  32. );
  33. });
  34. }
  35. /**
  36. * @returns { Promise<string[]> }
  37. */
  38. function getAdvancedLanguages() {
  39. return new Promise((resolve, reject) => {
  40. glob(
  41. './node_modules/monaco-editor/esm/vs/language/*/monaco.contribution.js',
  42. { cwd: path.dirname(__dirname) },
  43. (err, files) => {
  44. if (err) {
  45. reject(err);
  46. return;
  47. }
  48. resolve(
  49. files
  50. .map((file) =>
  51. file.substring(
  52. './node_modules/monaco-editor/esm/vs/language/'.length
  53. )
  54. )
  55. .map((file) =>
  56. file.substring(0, file.length - '/monaco.contribution.js'.length)
  57. )
  58. .map((lang) => `vs/language/${lang}/monaco.contribution`)
  59. );
  60. }
  61. );
  62. });
  63. }
  64. function generateLanguages() {
  65. return Promise.all([getBasicLanguages(), getAdvancedLanguages()]).then(
  66. ([basicLanguages, advancedLanguages]) => {
  67. basicLanguages.sort(strcmp);
  68. advancedLanguages.sort(strcmp);
  69. const allLanguages = advancedLanguages.concat(basicLanguages);
  70. const imports = allLanguages
  71. .map((l) => `import 'monaco-editor/esm/${l}.js';`)
  72. .map((l) => `${/python/.test(l) ? '' : '// '}${l}`)
  73. .join('\n');
  74. let contents = fs.readFileSync(FILE_PATH).toString();
  75. contents = contents.replace(
  76. /\/\/ BEGIN_LANGUAGES\n([\/ a-zA-Z0-9'\/\-\.;]+\n)+\/\/ END_LANGUAGES/,
  77. `// BEGIN_LANGUAGES\n${imports}\n// END_LANGUAGES`
  78. );
  79. fs.writeFileSync(FILE_PATH, contents);
  80. }
  81. );
  82. }
  83. function strcmp(a, b) {
  84. if (a < b) {
  85. return -1;
  86. }
  87. if (a > b) {
  88. return 1;
  89. }
  90. return 0;
  91. }
  92. /**
  93. * @returns { string[] }
  94. */
  95. function generateFeatures() {
  96. const skipImports = [
  97. 'vs/editor/common/standaloneStrings',
  98. 'vs/editor/contrib/tokenization/tokenization',
  99. 'vs/editor/editor.all'
  100. ];
  101. let features = [];
  102. const files =
  103. fs
  104. .readFileSync(
  105. path.join(
  106. __dirname,
  107. '../node_modules/monaco-editor/esm/vs/editor/edcore.main.js'
  108. )
  109. )
  110. .toString() +
  111. fs
  112. .readFileSync(
  113. path.join(
  114. __dirname,
  115. '../node_modules/monaco-editor/esm/vs/editor/editor.all.js'
  116. )
  117. )
  118. .toString();
  119. files.split(/\r\n|\n/).forEach((line) => {
  120. const m = line.match(/import '([^']+)'/);
  121. if (m) {
  122. const tmp = path.posix.join('vs/editor', m[1]).replace(/\.js$/, '');
  123. if (skipImports.indexOf(tmp) === -1) {
  124. features.push(tmp);
  125. }
  126. }
  127. });
  128. features.sort(strcmp);
  129. const imports = features
  130. .map((l) => `import 'monaco-editor/esm/${l}.js';`)
  131. .map((l) => `${/(coreCommands)|(findController)/.test(l) ? '' : '// '}${l}`)
  132. .join('\n');
  133. let contents = fs.readFileSync(FILE_PATH).toString();
  134. contents = contents.replace(
  135. /\/\/ BEGIN_FEATURES\n([\/ a-zA-Z0-9'\/\-\.;]+\n)+\/\/ END_FEATURES/,
  136. `// BEGIN_FEATURES\n${imports}\n// END_FEATURES`
  137. );
  138. fs.writeFileSync(FILE_PATH, contents);
  139. }