build-monaco-editor-pkg.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { readFile } from 'fs/promises';
  2. import { join, resolve } from 'path';
  3. import { PackageJson, getNightlyVersion, group, run, writeJsonFile, gitCommitId } from '../lib';
  4. import { getNightlyEnv } from './env';
  5. const selfPath = __dirname;
  6. const rootPath = join(selfPath, '..', '..');
  7. const monacoEditorPackageJsonPath = resolve(rootPath, 'package.json');
  8. const monacoEditorCorePackageJsonPath = resolve(
  9. rootPath,
  10. 'node_modules',
  11. 'monaco-editor-core',
  12. 'package.json'
  13. );
  14. async function prepareMonacoEditorReleaseStableOrNightly() {
  15. const monacoEditorPackageJson = JSON.parse(
  16. await readFile(monacoEditorPackageJsonPath, { encoding: 'utf-8' })
  17. ) as PackageJson;
  18. let version: string;
  19. const arg = process.argv[2];
  20. if (arg === 'stable') {
  21. version = monacoEditorPackageJson.version;
  22. } else if (arg === 'nightly') {
  23. version = getNightlyVersion(
  24. monacoEditorPackageJson.version,
  25. getNightlyEnv().PRERELEASE_VERSION
  26. );
  27. } else {
  28. throw new Error('Invalid argument');
  29. }
  30. await prepareMonacoEditorRelease(version);
  31. // npm package is now in ./out/monaco-editor, ready to be published
  32. }
  33. async function prepareMonacoEditorRelease(monacoEditorCoreVersion: string) {
  34. await group('npm ci', async () => {
  35. await run('npm ci', { cwd: resolve(rootPath, 'webpack-plugin') });
  36. });
  37. await group('Set Version & Update monaco-editor-core Version', async () => {
  38. const packageJson = JSON.parse(
  39. await readFile(monacoEditorPackageJsonPath, { encoding: 'utf-8' })
  40. ) as PackageJson;
  41. packageJson.version = monacoEditorCoreVersion;
  42. packageJson.devDependencies['monaco-editor-core'] = monacoEditorCoreVersion;
  43. const monacoEditorCorePackageJson = JSON.parse(
  44. await readFile(monacoEditorCorePackageJsonPath, { encoding: 'utf-8' })
  45. ) as PackageJson;
  46. if (monacoEditorCorePackageJson.dependencies) {
  47. if (!packageJson.dependencies) {
  48. packageJson.dependencies = {};
  49. }
  50. objectMergeThrowIfSet(
  51. packageJson.dependencies,
  52. monacoEditorCorePackageJson.dependencies,
  53. 'dependencies'
  54. );
  55. }
  56. await writeJsonFile(monacoEditorPackageJsonPath, packageJson);
  57. });
  58. await group('npm install to pick up monaco-editor-core', async () => {
  59. await run('npm install', { cwd: rootPath });
  60. });
  61. await group('Setting vscode commitId from monaco-editor-core', async () => {
  62. const monacoEditorCorePackageJson = JSON.parse(
  63. await readFile(monacoEditorCorePackageJsonPath, { encoding: 'utf-8' })
  64. ) as PackageJson;
  65. const packageJson = JSON.parse(
  66. await readFile(monacoEditorPackageJsonPath, { encoding: 'utf-8' })
  67. ) as PackageJson;
  68. packageJson.vscodeCommitId = monacoEditorCorePackageJson.vscodeCommitId;
  69. packageJson.monacoCommitId = await gitCommitId(rootPath);
  70. await writeJsonFile(monacoEditorPackageJsonPath, packageJson);
  71. });
  72. await group('Building & Testing', async () => {
  73. // TODO@hediet: await run('npm run prettier-check', { cwd: rootPath });
  74. await run('npm run build', { cwd: rootPath });
  75. await run('npm test', { cwd: rootPath });
  76. await run('npm run compile', { cwd: resolve(rootPath, 'webpack-plugin') });
  77. await run('npm run package-for-smoketest-webpack', { cwd: rootPath });
  78. await run('npm run package-for-smoketest-esbuild', { cwd: rootPath });
  79. await run('npm run package-for-smoketest-vite', { cwd: rootPath });
  80. await run('npm run smoketest', { cwd: rootPath });
  81. // npm package is now ready to be published in ./out/monaco-editor
  82. });
  83. }
  84. function objectMergeThrowIfSet(
  85. target: Record<string, any>,
  86. source: Record<string, any>,
  87. fieldName: string
  88. ): void {
  89. for (const [key, value] of Object.entries(source)) {
  90. if (key in target) {
  91. throw new Error(
  92. `Cannot merge ${fieldName}: property '${key}' already exists in target with value '${target[key]}', would be overridden with '${value}'`
  93. );
  94. }
  95. target[key] = value;
  96. }
  97. }
  98. prepareMonacoEditorReleaseStableOrNightly();