generate-imports.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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.substring('./node_modules/monaco-editor/esm/'.length).replace(/\.js$/, '');
  27. })
  28. );
  29. }
  30. );
  31. });
  32. }
  33. /**
  34. * @returns { Promise<string[]> }
  35. */
  36. function getAdvancedLanguages() {
  37. return new Promise((resolve, reject) => {
  38. glob(
  39. './node_modules/monaco-editor/esm/vs/language/*/monaco.contribution.js',
  40. { cwd: path.dirname(__dirname) },
  41. (err, files) => {
  42. if (err) {
  43. reject(err);
  44. return;
  45. }
  46. resolve(
  47. files
  48. .map((file) => file.substring('./node_modules/monaco-editor/esm/vs/language/'.length))
  49. .map((file) => file.substring(0, file.length - '/monaco.contribution.js'.length))
  50. .map((lang) => `vs/language/${lang}/monaco.contribution`)
  51. );
  52. }
  53. );
  54. });
  55. }
  56. function generateLanguages() {
  57. return Promise.all([getBasicLanguages(), getAdvancedLanguages()]).then(
  58. ([basicLanguages, advancedLanguages]) => {
  59. basicLanguages.sort(strcmp);
  60. advancedLanguages.sort(strcmp);
  61. const allLanguages = advancedLanguages.concat(basicLanguages);
  62. const imports = allLanguages
  63. .map((l) => `import 'monaco-editor/esm/${l}.js';`)
  64. .map((l) => `${/python/.test(l) ? '' : '// '}${l}`)
  65. .join('\n');
  66. let contents = fs.readFileSync(FILE_PATH).toString();
  67. contents = contents.replace(
  68. /\/\/ BEGIN_LANGUAGES\n([\/ a-zA-Z0-9'\/\-\.;]+\n)+\/\/ END_LANGUAGES/,
  69. `// BEGIN_LANGUAGES\n${imports}\n// END_LANGUAGES`
  70. );
  71. fs.writeFileSync(FILE_PATH, contents);
  72. }
  73. );
  74. }
  75. function strcmp(a, b) {
  76. if (a < b) {
  77. return -1;
  78. }
  79. if (a > b) {
  80. return 1;
  81. }
  82. return 0;
  83. }
  84. /**
  85. * @returns { string[] }
  86. */
  87. function generateFeatures() {
  88. const skipImports = [
  89. 'vs/editor/common/standaloneStrings',
  90. 'vs/editor/contrib/tokenization/tokenization',
  91. 'vs/editor/editor.all',
  92. 'vs/base/browser/ui/codicons/codiconStyles'
  93. ];
  94. let features = [];
  95. const files =
  96. fs
  97. .readFileSync(
  98. path.join(__dirname, '../node_modules/monaco-editor/esm/vs/editor/edcore.main.js')
  99. )
  100. .toString() +
  101. fs
  102. .readFileSync(
  103. path.join(__dirname, '../node_modules/monaco-editor/esm/vs/editor/editor.all.js')
  104. )
  105. .toString();
  106. files.split(/\r\n|\n/).forEach((line) => {
  107. const m = line.match(/import '([^']+)'/);
  108. if (m) {
  109. const tmp = path.posix.join('vs/editor', m[1]).replace(/\.js$/, '');
  110. if (skipImports.indexOf(tmp) === -1) {
  111. features.push(tmp);
  112. }
  113. }
  114. });
  115. features.sort(strcmp);
  116. const imports = features
  117. .map((l) => `import 'monaco-editor/esm/${l}.js';`)
  118. .map((l) => `${/(coreCommands)|(findController)/.test(l) ? '' : '// '}${l}`)
  119. .join('\n');
  120. let contents = fs.readFileSync(FILE_PATH).toString();
  121. contents = contents.replace(
  122. /\/\/ BEGIN_FEATURES\n([\/ a-zA-Z0-9'\/\-\.;]+\n)+\/\/ END_FEATURES/,
  123. `// BEGIN_FEATURES\n${imports}\n// END_FEATURES`
  124. );
  125. fs.writeFileSync(FILE_PATH, contents);
  126. }