Ship a metadata in the esm folder which can help the webpack plugin

This commit is contained in:
Alex Dima 2021-12-09 23:55:04 +01:00
parent e77825074d
commit 0abbb2be7d
No known key found for this signature in database
GPG key ID: 39563C1504FDD0C9
10 changed files with 302 additions and 818 deletions

View file

@ -19,6 +19,7 @@ const { REPO_ROOT, removeDir, readFiles, writeFiles } = require('../build/utils'
const ts = require('typescript');
/**@type { IMetadata } */
const metadata = require('../metadata.js');
const { generateMetadata } = require('./releaseMetadata');
removeDir(`release`);
@ -37,6 +38,9 @@ releaseDTS();
// ThirdPartyNotices.txt
releaseThirdPartyNotices();
// esm/metadata.d.ts, esm/metadata.js
generateMetadata();
// package.json
(() => {
const packageJSON = readFiles('package.json', { base: '' })[0];

View file

@ -8,7 +8,7 @@
const glob = require('glob');
const path = require('path');
const fs = require('fs');
const { REPO_ROOT, prettier } = require('./utils');
const { REPO_ROOT, prettier, ensureDir } = require('./utils');
const customFeatureLabels = {
'vs/editor/browser/controller/coreCommands': 'coreCommands',
@ -24,9 +24,6 @@ const customFeatureLabels = {
'vs/editor/standalone/browser/quickAccess/standaloneHelpQuickAccess': 'quickHelp'
};
generateLanguages();
generateFeatures();
/**
* @returns { Promise<{ label: string; entry: string; }[]> }
*/
@ -114,7 +111,7 @@ function getAdvancedLanguages() {
}
}
function generateLanguages() {
function generateMetadata() {
return Promise.all([getBasicLanguages(), getAdvancedLanguages()]).then(
([basicLanguages, advancedLanguages]) => {
basicLanguages.sort(strcmp);
@ -124,14 +121,14 @@ function generateLanguages() {
len = basicLanguages.length;
let j = 0,
lenJ = advancedLanguages.length;
let result = [];
let languages = [];
while (i < len || j < lenJ) {
if (i < len && j < lenJ) {
if (basicLanguages[i].label === advancedLanguages[j].label) {
let entry = [];
entry.push(basicLanguages[i].entry);
entry.push(advancedLanguages[j].entry);
result.push({
languages.push({
label: basicLanguages[i].label,
entry: entry,
worker: advancedLanguages[j].worker
@ -139,56 +136,67 @@ function generateLanguages() {
i++;
j++;
} else if (basicLanguages[i].label < advancedLanguages[j].label) {
result.push(basicLanguages[i]);
languages.push(basicLanguages[i]);
i++;
} else {
result.push(advancedLanguages[j]);
languages.push(advancedLanguages[j]);
j++;
}
} else if (i < len) {
result.push(basicLanguages[i]);
languages.push(basicLanguages[i]);
i++;
} else {
result.push(advancedLanguages[j]);
languages.push(advancedLanguages[j]);
j++;
}
}
const code = `//
// THIS IS A GENERATED FILE. PLEASE DO NOT EDIT DIRECTLY.
// GENERATED USING node scripts/import-editor.js
//
import { IFeatureDefinition } from "./types";
const features = getFeatures();
export const languagesArr: IFeatureDefinition[] = ${JSON.stringify(result, null, ' ')
.replace(/"label":/g, 'label:')
.replace(/"entry":/g, 'entry:')
.replace(/"worker":/g, 'worker:')
.replace(/"id":/g, 'id:')
.replace(/"/g, "'")};
const dtsContents = `
/*!----------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Released under the MIT license
* https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
*----------------------------------------------------------------*/
export type EditorLanguage = ${result.map((el) => `'${el.label}'`).join(' | ')};
export interface IWorkerDefinition {
id: string;
entry: string;
}
export interface IFeatureDefinition {
label: string;
entry: string | string[] | undefined;
worker?: IWorkerDefinition;
}
export const features: IFeatureDefinition[];
export const languages: IFeatureDefinition[];
export type EditorLanguage = ${languages.map((el) => `'${el.label}'`).join(' | ')};
export type EditorFeature = ${features.map((el) => `'${el.label}'`).join(' | ')};
export type NegatedEditorFeature = ${features.map((el) => `'!${el.label}'`).join(' | ')};
`;
fs.writeFileSync(
path.join(REPO_ROOT, 'webpack-plugin/src/languages.ts'),
code.replace(/\r\n/g, '\n')
);
const dtsDestination = path.join(REPO_ROOT, 'release/esm/metadata.d.ts');
ensureDir(path.dirname(dtsDestination));
fs.writeFileSync(dtsDestination, dtsContents.replace(/\r\n/g, '\n'));
prettier('webpack-plugin/src/languages.ts');
const readmeLanguages = JSON.stringify(result.map((r) => r.label))
.replace(/"/g, "'")
.replace(/','/g, "', '");
let readme = fs.readFileSync(path.join(REPO_ROOT, 'webpack-plugin/README.md')).toString();
readme = readme.replace(
/<!-- LANGUAGES_BEGIN -->([^<]+)<!-- LANGUAGES_END -->/,
`<!-- LANGUAGES_BEGIN -->\`${readmeLanguages}\`<!-- LANGUAGES_END -->`
);
fs.writeFileSync(path.join(REPO_ROOT, 'webpack-plugin/README.md'), readme);
const jsContents = `
exports.features = ${JSON.stringify(features, null, ' ')};
exports.languages = ${JSON.stringify(languages, null, ' ')};
`;
const jsDestination = path.join(REPO_ROOT, 'release/esm/metadata.js');
ensureDir(path.dirname(jsDestination));
fs.writeFileSync(jsDestination, jsContents.replace(/\r\n/g, '\n'));
}
);
}
exports.generateMetadata = generateMetadata;
/**
* @tyoe {string} a
@ -204,7 +212,10 @@ function strcmp(a, b) {
return 0;
}
function generateFeatures() {
/**
* @returns {{label:string;entry:string|string[];}[]}
*/
function getFeatures() {
const skipImports = [
'vs/editor/browser/widget/codeEditorWidget',
'vs/editor/browser/widget/diffEditorWidget',
@ -257,35 +268,5 @@ function generateFeatures() {
}
}
const code = `//
// THIS IS A GENERATED FILE. PLEASE DO NOT EDIT DIRECTLY.
// GENERATED USING node scripts/import-editor.js
//
import { IFeatureDefinition } from "./types";
export const featuresArr: IFeatureDefinition[] = ${JSON.stringify(result, null, ' ')
.replace(/"label":/g, 'label:')
.replace(/"entry":/g, 'entry:')
.replace(/"/g, "'")};
export type EditorFeature = ${result.map((el) => `'${el.label}'`).join(' | ')};
export type NegatedEditorFeature = ${result.map((el) => `'!${el.label}'`).join(' | ')};
`;
fs.writeFileSync(
path.join(REPO_ROOT, 'webpack-plugin/src/features.ts'),
code.replace(/\r\n/g, '\n')
);
prettier('webpack-plugin/src/features.ts');
const readmeFeatures = JSON.stringify(result.map((r) => r.label))
.replace(/"/g, "'")
.replace(/','/g, "', '");
let readme = fs.readFileSync(path.join(REPO_ROOT, 'webpack-plugin/README.md')).toString();
readme = readme.replace(
/<!-- FEATURES_BEGIN -->([^<]+)<!-- FEATURES_END -->/,
`<!-- FEATURES_BEGIN -->\`${readmeFeatures}\`<!-- FEATURES_END -->`
);
fs.writeFileSync(path.join(REPO_ROOT, 'webpack-plugin/README.md'), readme);
return result;
}