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

View file

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

View file

@ -14,7 +14,7 @@
"prettier-check": "prettier --check .", "prettier-check": "prettier --check .",
"prettier": "prettier --write .", "prettier": "prettier --write .",
"pretty-quick": "pretty-quick --staged", "pretty-quick": "pretty-quick --staged",
"release": "node ./build/build.js && node ./build/release.js && node ./build/importEditorWebpackPlugin.js", "release": "node ./build/build.js && node ./build/release.js",
"simpleserver": "node ./build/simpleserver", "simpleserver": "node ./build/simpleserver",
"smoketest-debug": "node ./test/smoke/runner.js --debug-tests", "smoketest-debug": "node ./test/smoke/runner.js --debug-tests",
"smoketest": "node ./test/smoke/runner.js", "smoketest": "node ./test/smoke/runner.js",

View file

@ -59,9 +59,7 @@ Options can be passed in to `MonacoWebpackPlugin`. They can be used to generate
- default value: `'[name].worker.js'`. - default value: `'[name].worker.js'`.
- `publicPath` (`string`) - custom public path for worker scripts, overrides the public path from which files generated by this plugin will be served. This wins out over Webpack's dynamic runtime path and can be useful to avoid attempting to load workers cross-origin when using a CDN for other static resources. Use e.g. '/' if you want to load your resources from the current origin.. - `publicPath` (`string`) - custom public path for worker scripts, overrides the public path from which files generated by this plugin will be served. This wins out over Webpack's dynamic runtime path and can be useful to avoid attempting to load workers cross-origin when using a CDN for other static resources. Use e.g. '/' if you want to load your resources from the current origin..
- default value: `''`. - default value: `''`.
- `languages` (`string[]`) - include only a subset of the languages supported. - `languages` (`string[]`) - include only a subset of the languages supported. By default, all languages shipped with the `monaco-editor` will be included.
- default value: <!-- LANGUAGES_BEGIN -->`['abap', 'apex', 'azcli', 'bat', 'bicep', 'cameligo', 'clojure', 'coffee', 'cpp', 'csharp', 'csp', 'css', 'dart', 'dockerfile', 'ecl', 'elixir', 'flow9', 'fsharp', 'go', 'graphql', 'handlebars', 'hcl', 'html', 'ini', 'java', 'javascript', 'json', 'julia', 'kotlin', 'less', 'lexon', 'liquid', 'lua', 'm3', 'markdown', 'mips', 'msdax', 'mysql', 'objective-c', 'pascal', 'pascaligo', 'perl', 'pgsql', 'php', 'pla', 'postiats', 'powerquery', 'powershell', 'protobuf', 'pug', 'python', 'qsharp', 'r', 'razor', 'redis', 'redshift', 'restructuredtext', 'ruby', 'rust', 'sb', 'scala', 'scheme', 'scss', 'shell', 'solidity', 'sophia', 'sparql', 'sql', 'st', 'swift', 'systemverilog', 'tcl', 'twig', 'typescript', 'vb', 'xml', 'yaml']`<!-- LANGUAGES_END -->.
Some languages share the same web worker. If one of the following languages is included, you must also include the language responsible for instantiating their shared worker: Some languages share the same web worker. If one of the following languages is included, you must also include the language responsible for instantiating their shared worker:
@ -71,10 +69,7 @@ Options can be passed in to `MonacoWebpackPlugin`. They can be used to generate
| handlebars | html | | handlebars | html |
| scss, less | css | | scss, less | css |
- `features` (`string[]`) - include only a subset of the editor features. - `features` (`string[]`) - include only a subset of the editor features. By default, all features shipped with the `monaco-editor` will be included. Instead of enumerating included features, it is also possible to exclude certain default features prefixing them with an exclamation mark '!'.
- default value: <!-- FEATURES_BEGIN -->`['accessibilityHelp', 'anchorSelect', 'bracketMatching', 'caretOperations', 'clipboard', 'codeAction', 'codelens', 'colorPicker', 'comment', 'contextmenu', 'coreCommands', 'cursorUndo', 'dnd', 'documentSymbols', 'find', 'folding', 'fontZoom', 'format', 'gotoError', 'gotoLine', 'gotoSymbol', 'hover', 'iPadShowKeyboard', 'inPlaceReplace', 'indentation', 'inlayHints', 'inlineCompletions', 'inspectTokens', 'linesOperations', 'linkedEditing', 'links', 'multicursor', 'parameterHints', 'quickCommand', 'quickHelp', 'quickOutline', 'referenceSearch', 'rename', 'smartSelect', 'snippets', 'suggest', 'toggleHighContrast', 'toggleTabFocusMode', 'transpose', 'unusualLineTerminators', 'viewportSemanticTokens', 'wordHighlighter', 'wordOperations', 'wordPartOperations']`<!-- FEATURES_END -->.
- excluded features: It is also possible to exclude certain default features prefixing them with an exclamation mark '!'.
- `globalAPI` (`boolean`) - specify whether the editor API should be exposed through a global `monaco` object or not. This option is applicable to `0.22.0` and newer version of `monaco-editor`. Since `0.22.0`, the ESM version of the monaco editor does no longer define a global `monaco` object unless `global.MonacoEnvironment = { globalAPI: true }` is set ([change log](https://github.com/microsoft/monaco-editor/blob/main/CHANGELOG.md#0220-29012021)). - `globalAPI` (`boolean`) - specify whether the editor API should be exposed through a global `monaco` object or not. This option is applicable to `0.22.0` and newer version of `monaco-editor`. Since `0.22.0`, the ESM version of the monaco editor does no longer define a global `monaco` object unless `global.MonacoEnvironment = { globalAPI: true }` is set ([change log](https://github.com/microsoft/monaco-editor/blob/main/CHANGELOG.md#0220-29012021)).
- default value: `false`. - default value: `false`.

View file

@ -767,6 +767,12 @@
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true "dev": true
}, },
"monaco-editor": {
"version": "0.30.1",
"resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.30.1.tgz",
"integrity": "sha512-B/y4+b2O5G2gjuxIFtCE2EkM17R2NM7/3F8x0qcPsqy4V83bitJTIO4TIeZpYlzu/xy6INiY/+84BEm6+7Cmzg==",
"dev": true
},
"nanoid": { "nanoid": {
"version": "3.1.30", "version": "3.1.30",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",

View file

@ -36,6 +36,7 @@
"css-loader": "^6.5.1", "css-loader": "^6.5.1",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
"glob": "^7.2.0", "glob": "^7.2.0",
"monaco-editor": "^0.30.1",
"style-loader": "^3.3.1", "style-loader": "^3.3.1",
"typescript": "^4.4.4", "typescript": "^4.4.4",
"webpack": "^5.64.1", "webpack": "^5.64.1",

View file

@ -1,309 +0,0 @@
//
// 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[] = [
{
label: 'accessibilityHelp',
entry: 'vs/editor/standalone/browser/accessibilityHelp/accessibilityHelp'
},
{
label: 'anchorSelect',
entry: 'vs/editor/contrib/anchorSelect/anchorSelect'
},
{
label: 'bracketMatching',
entry: 'vs/editor/contrib/bracketMatching/bracketMatching'
},
{
label: 'caretOperations',
entry: 'vs/editor/contrib/caretOperations/caretOperations'
},
{
label: 'clipboard',
entry: 'vs/editor/contrib/clipboard/clipboard'
},
{
label: 'codeAction',
entry: 'vs/editor/contrib/codeAction/codeActionContributions'
},
{
label: 'codelens',
entry: 'vs/editor/contrib/codelens/codelensController'
},
{
label: 'colorPicker',
entry: 'vs/editor/contrib/colorPicker/colorContributions'
},
{
label: 'comment',
entry: 'vs/editor/contrib/comment/comment'
},
{
label: 'contextmenu',
entry: 'vs/editor/contrib/contextmenu/contextmenu'
},
{
label: 'coreCommands',
entry: 'vs/editor/browser/controller/coreCommands'
},
{
label: 'cursorUndo',
entry: 'vs/editor/contrib/cursorUndo/cursorUndo'
},
{
label: 'dnd',
entry: 'vs/editor/contrib/dnd/dnd'
},
{
label: 'documentSymbols',
entry: 'vs/editor/contrib/documentSymbols/documentSymbols'
},
{
label: 'find',
entry: 'vs/editor/contrib/find/findController'
},
{
label: 'folding',
entry: 'vs/editor/contrib/folding/folding'
},
{
label: 'fontZoom',
entry: 'vs/editor/contrib/fontZoom/fontZoom'
},
{
label: 'format',
entry: 'vs/editor/contrib/format/formatActions'
},
{
label: 'gotoError',
entry: 'vs/editor/contrib/gotoError/gotoError'
},
{
label: 'gotoLine',
entry: 'vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess'
},
{
label: 'gotoSymbol',
entry: [
'vs/editor/contrib/gotoSymbol/goToCommands',
'vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition'
]
},
{
label: 'hover',
entry: 'vs/editor/contrib/hover/hover'
},
{
label: 'iPadShowKeyboard',
entry: 'vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard'
},
{
label: 'inPlaceReplace',
entry: 'vs/editor/contrib/inPlaceReplace/inPlaceReplace'
},
{
label: 'indentation',
entry: 'vs/editor/contrib/indentation/indentation'
},
{
label: 'inlayHints',
entry: 'vs/editor/contrib/inlayHints/inlayHintsController'
},
{
label: 'inlineCompletions',
entry: 'vs/editor/contrib/inlineCompletions/ghostTextController'
},
{
label: 'inspectTokens',
entry: 'vs/editor/standalone/browser/inspectTokens/inspectTokens'
},
{
label: 'linesOperations',
entry: 'vs/editor/contrib/linesOperations/linesOperations'
},
{
label: 'linkedEditing',
entry: 'vs/editor/contrib/linkedEditing/linkedEditing'
},
{
label: 'links',
entry: 'vs/editor/contrib/links/links'
},
{
label: 'multicursor',
entry: 'vs/editor/contrib/multicursor/multicursor'
},
{
label: 'parameterHints',
entry: 'vs/editor/contrib/parameterHints/parameterHints'
},
{
label: 'quickCommand',
entry: 'vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess'
},
{
label: 'quickHelp',
entry: 'vs/editor/standalone/browser/quickAccess/standaloneHelpQuickAccess'
},
{
label: 'quickOutline',
entry: 'vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess'
},
{
label: 'referenceSearch',
entry: 'vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch'
},
{
label: 'rename',
entry: 'vs/editor/contrib/rename/rename'
},
{
label: 'smartSelect',
entry: 'vs/editor/contrib/smartSelect/smartSelect'
},
{
label: 'snippets',
entry: 'vs/editor/contrib/snippet/snippetController2'
},
{
label: 'suggest',
entry: 'vs/editor/contrib/suggest/suggestController'
},
{
label: 'toggleHighContrast',
entry: 'vs/editor/standalone/browser/toggleHighContrast/toggleHighContrast'
},
{
label: 'toggleTabFocusMode',
entry: 'vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode'
},
{
label: 'transpose',
entry: 'vs/editor/contrib/caretOperations/transpose'
},
{
label: 'unusualLineTerminators',
entry: 'vs/editor/contrib/unusualLineTerminators/unusualLineTerminators'
},
{
label: 'viewportSemanticTokens',
entry: 'vs/editor/contrib/viewportSemanticTokens/viewportSemanticTokens'
},
{
label: 'wordHighlighter',
entry: 'vs/editor/contrib/wordHighlighter/wordHighlighter'
},
{
label: 'wordOperations',
entry: 'vs/editor/contrib/wordOperations/wordOperations'
},
{
label: 'wordPartOperations',
entry: 'vs/editor/contrib/wordPartOperations/wordPartOperations'
}
];
export type EditorFeature =
| 'accessibilityHelp'
| 'anchorSelect'
| 'bracketMatching'
| 'caretOperations'
| 'clipboard'
| 'codeAction'
| 'codelens'
| 'colorPicker'
| 'comment'
| 'contextmenu'
| 'coreCommands'
| 'cursorUndo'
| 'dnd'
| 'documentSymbols'
| 'find'
| 'folding'
| 'fontZoom'
| 'format'
| 'gotoError'
| 'gotoLine'
| 'gotoSymbol'
| 'hover'
| 'iPadShowKeyboard'
| 'inPlaceReplace'
| 'indentation'
| 'inlayHints'
| 'inlineCompletions'
| 'inspectTokens'
| 'linesOperations'
| 'linkedEditing'
| 'links'
| 'multicursor'
| 'parameterHints'
| 'quickCommand'
| 'quickHelp'
| 'quickOutline'
| 'referenceSearch'
| 'rename'
| 'smartSelect'
| 'snippets'
| 'suggest'
| 'toggleHighContrast'
| 'toggleTabFocusMode'
| 'transpose'
| 'unusualLineTerminators'
| 'viewportSemanticTokens'
| 'wordHighlighter'
| 'wordOperations'
| 'wordPartOperations';
export type NegatedEditorFeature =
| '!accessibilityHelp'
| '!anchorSelect'
| '!bracketMatching'
| '!caretOperations'
| '!clipboard'
| '!codeAction'
| '!codelens'
| '!colorPicker'
| '!comment'
| '!contextmenu'
| '!coreCommands'
| '!cursorUndo'
| '!dnd'
| '!documentSymbols'
| '!find'
| '!folding'
| '!fontZoom'
| '!format'
| '!gotoError'
| '!gotoLine'
| '!gotoSymbol'
| '!hover'
| '!iPadShowKeyboard'
| '!inPlaceReplace'
| '!indentation'
| '!inlayHints'
| '!inlineCompletions'
| '!inspectTokens'
| '!linesOperations'
| '!linkedEditing'
| '!links'
| '!multicursor'
| '!parameterHints'
| '!quickCommand'
| '!quickHelp'
| '!quickOutline'
| '!referenceSearch'
| '!rename'
| '!smartSelect'
| '!snippets'
| '!suggest'
| '!toggleHighContrast'
| '!toggleTabFocusMode'
| '!transpose'
| '!unusualLineTerminators'
| '!viewportSemanticTokens'
| '!wordHighlighter'
| '!wordOperations'
| '!wordPartOperations';

View file

@ -3,11 +3,13 @@ import * as path from 'path';
import * as loaderUtils from 'loader-utils'; import * as loaderUtils from 'loader-utils';
import * as fs from 'fs'; import * as fs from 'fs';
import { AddWorkerEntryPointPlugin } from './plugins/AddWorkerEntryPointPlugin'; import { AddWorkerEntryPointPlugin } from './plugins/AddWorkerEntryPointPlugin';
import { languagesArr, EditorLanguage } from './languages';
import { featuresArr, EditorFeature, NegatedEditorFeature } from './features';
import { IFeatureDefinition } from './types'; import { IFeatureDefinition } from './types';
import { ILoaderOptions } from './loaders/include'; import { ILoaderOptions } from './loaders/include';
// TODO: replace once a new monaco-editor version is published
// import { EditorLanguage, EditorFeature, NegatedEditorFeature } from 'monaco-editor/esm/metadata';
import { EditorLanguage, EditorFeature, NegatedEditorFeature } from './metadata';
const INCLUDE_LOADER_PATH = require.resolve('./loaders/include'); const INCLUDE_LOADER_PATH = require.resolve('./loaders/include');
const EDITOR_MODULE: IFeatureDefinition = { const EDITOR_MODULE: IFeatureDefinition = {
@ -19,12 +21,6 @@ const EDITOR_MODULE: IFeatureDefinition = {
} }
}; };
const languagesById: { [language: string]: IFeatureDefinition } = {};
languagesArr.forEach((language) => (languagesById[language.label] = language));
const featuresById: { [feature: string]: IFeatureDefinition } = {};
featuresArr.forEach((feature) => (featuresById[feature.label] = feature));
/** /**
* Return a resolved path for a given Monaco file. * Return a resolved path for a given Monaco file.
*/ */
@ -57,14 +53,30 @@ function getWorkerFilename(
}); });
} }
function getFeaturesIds(userFeatures: string[]): string[] { interface EditorMetadata {
features: IFeatureDefinition[];
languages: IFeatureDefinition[];
}
function getEditorMetadata(monacoEditorPath: string | undefined): EditorMetadata {
const metadataPath = resolveMonacoPath('metadata.js', monacoEditorPath);
return require(metadataPath);
}
function resolveDesiredFeatures(
metadata: EditorMetadata,
userFeatures: (EditorFeature | NegatedEditorFeature)[] | undefined
): IFeatureDefinition[] {
const featuresById: { [feature: string]: IFeatureDefinition } = {};
metadata.features.forEach((feature) => (featuresById[feature.label] = feature));
function notContainedIn(arr: string[]) { function notContainedIn(arr: string[]) {
return (element: string) => arr.indexOf(element) === -1; return (element: string) => arr.indexOf(element) === -1;
} }
let featuresIds: string[]; let featuresIds: string[];
if (userFeatures.length) { if (userFeatures && userFeatures.length) {
const excludedFeatures = userFeatures.filter((f) => f[0] === '!').map((f) => f.slice(1)); const excludedFeatures = userFeatures.filter((f) => f[0] === '!').map((f) => f.slice(1));
if (excludedFeatures.length) { if (excludedFeatures.length) {
featuresIds = Object.keys(featuresById).filter(notContainedIn(excludedFeatures)); featuresIds = Object.keys(featuresById).filter(notContainedIn(excludedFeatures));
@ -75,7 +87,19 @@ function getFeaturesIds(userFeatures: string[]): string[] {
featuresIds = Object.keys(featuresById); featuresIds = Object.keys(featuresById);
} }
return featuresIds; return coalesce(featuresIds.map((id) => featuresById[id]));
}
function resolveDesiredLanguages(
metadata: EditorMetadata,
userLanguages: EditorLanguage[] | undefined,
userCustomLanguages: IFeatureDefinition[] | undefined
): IFeatureDefinition[] {
const languagesById: { [language: string]: IFeatureDefinition } = {};
metadata.languages.forEach((language) => (languagesById[language.label] = language));
const languages = userLanguages || Object.keys(languagesById);
return coalesce(languages.map((id) => languagesById[id])).concat(userCustomLanguages || []);
} }
interface IMonacoEditorWebpackPluginOpts { interface IMonacoEditorWebpackPluginOpts {
@ -138,14 +162,15 @@ class MonacoEditorWebpackPlugin implements webpack.WebpackPluginInstance {
private readonly options: IInternalMonacoEditorWebpackPluginOpts; private readonly options: IInternalMonacoEditorWebpackPluginOpts;
constructor(options: IMonacoEditorWebpackPluginOpts = {}) { constructor(options: IMonacoEditorWebpackPluginOpts = {}) {
const languages = options.languages || Object.keys(languagesById); const monacoEditorPath = options.monacoEditorPath;
const customLanguages = options.customLanguages || []; const metadata = getEditorMetadata(monacoEditorPath);
const features = getFeaturesIds(options.features || []); const languages = resolveDesiredLanguages(metadata, options.languages, options.customLanguages);
const features = resolveDesiredFeatures(metadata, options.features);
this.options = { this.options = {
languages: coalesce(languages.map((id) => languagesById[id])).concat(customLanguages), languages,
features: coalesce(features.map((id) => featuresById[id])), features,
filename: options.filename || '[name].worker.js', filename: options.filename || '[name].worker.js',
monacoEditorPath: options.monacoEditorPath, monacoEditorPath,
publicPath: options.publicPath || '', publicPath: options.publicPath || '',
globalAPI: options.globalAPI || false globalAPI: options.globalAPI || false
}; };

View file

@ -1,414 +0,0 @@
//
// THIS IS A GENERATED FILE. PLEASE DO NOT EDIT DIRECTLY.
// GENERATED USING node scripts/import-editor.js
//
import { IFeatureDefinition } from './types';
export const languagesArr: IFeatureDefinition[] = [
{
label: 'abap',
entry: 'vs/basic-languages/abap/abap.contribution'
},
{
label: 'apex',
entry: 'vs/basic-languages/apex/apex.contribution'
},
{
label: 'azcli',
entry: 'vs/basic-languages/azcli/azcli.contribution'
},
{
label: 'bat',
entry: 'vs/basic-languages/bat/bat.contribution'
},
{
label: 'bicep',
entry: 'vs/basic-languages/bicep/bicep.contribution'
},
{
label: 'cameligo',
entry: 'vs/basic-languages/cameligo/cameligo.contribution'
},
{
label: 'clojure',
entry: 'vs/basic-languages/clojure/clojure.contribution'
},
{
label: 'coffee',
entry: 'vs/basic-languages/coffee/coffee.contribution'
},
{
label: 'cpp',
entry: 'vs/basic-languages/cpp/cpp.contribution'
},
{
label: 'csharp',
entry: 'vs/basic-languages/csharp/csharp.contribution'
},
{
label: 'csp',
entry: 'vs/basic-languages/csp/csp.contribution'
},
{
label: 'css',
entry: ['vs/basic-languages/css/css.contribution', 'vs/language/css/monaco.contribution'],
worker: {
id: 'vs/language/css/cssWorker',
entry: 'vs/language/css/css.worker'
}
},
{
label: 'dart',
entry: 'vs/basic-languages/dart/dart.contribution'
},
{
label: 'dockerfile',
entry: 'vs/basic-languages/dockerfile/dockerfile.contribution'
},
{
label: 'ecl',
entry: 'vs/basic-languages/ecl/ecl.contribution'
},
{
label: 'elixir',
entry: 'vs/basic-languages/elixir/elixir.contribution'
},
{
label: 'flow9',
entry: 'vs/basic-languages/flow9/flow9.contribution'
},
{
label: 'fsharp',
entry: 'vs/basic-languages/fsharp/fsharp.contribution'
},
{
label: 'go',
entry: 'vs/basic-languages/go/go.contribution'
},
{
label: 'graphql',
entry: 'vs/basic-languages/graphql/graphql.contribution'
},
{
label: 'handlebars',
entry: 'vs/basic-languages/handlebars/handlebars.contribution'
},
{
label: 'hcl',
entry: 'vs/basic-languages/hcl/hcl.contribution'
},
{
label: 'html',
entry: ['vs/basic-languages/html/html.contribution', 'vs/language/html/monaco.contribution'],
worker: {
id: 'vs/language/html/htmlWorker',
entry: 'vs/language/html/html.worker'
}
},
{
label: 'ini',
entry: 'vs/basic-languages/ini/ini.contribution'
},
{
label: 'java',
entry: 'vs/basic-languages/java/java.contribution'
},
{
label: 'javascript',
entry: 'vs/basic-languages/javascript/javascript.contribution'
},
{
label: 'json',
entry: 'vs/language/json/monaco.contribution',
worker: {
id: 'vs/language/json/jsonWorker',
entry: 'vs/language/json/json.worker'
}
},
{
label: 'julia',
entry: 'vs/basic-languages/julia/julia.contribution'
},
{
label: 'kotlin',
entry: 'vs/basic-languages/kotlin/kotlin.contribution'
},
{
label: 'less',
entry: 'vs/basic-languages/less/less.contribution'
},
{
label: 'lexon',
entry: 'vs/basic-languages/lexon/lexon.contribution'
},
{
label: 'liquid',
entry: 'vs/basic-languages/liquid/liquid.contribution'
},
{
label: 'lua',
entry: 'vs/basic-languages/lua/lua.contribution'
},
{
label: 'm3',
entry: 'vs/basic-languages/m3/m3.contribution'
},
{
label: 'markdown',
entry: 'vs/basic-languages/markdown/markdown.contribution'
},
{
label: 'mips',
entry: 'vs/basic-languages/mips/mips.contribution'
},
{
label: 'msdax',
entry: 'vs/basic-languages/msdax/msdax.contribution'
},
{
label: 'mysql',
entry: 'vs/basic-languages/mysql/mysql.contribution'
},
{
label: 'objective-c',
entry: 'vs/basic-languages/objective-c/objective-c.contribution'
},
{
label: 'pascal',
entry: 'vs/basic-languages/pascal/pascal.contribution'
},
{
label: 'pascaligo',
entry: 'vs/basic-languages/pascaligo/pascaligo.contribution'
},
{
label: 'perl',
entry: 'vs/basic-languages/perl/perl.contribution'
},
{
label: 'pgsql',
entry: 'vs/basic-languages/pgsql/pgsql.contribution'
},
{
label: 'php',
entry: 'vs/basic-languages/php/php.contribution'
},
{
label: 'pla',
entry: 'vs/basic-languages/pla/pla.contribution'
},
{
label: 'postiats',
entry: 'vs/basic-languages/postiats/postiats.contribution'
},
{
label: 'powerquery',
entry: 'vs/basic-languages/powerquery/powerquery.contribution'
},
{
label: 'powershell',
entry: 'vs/basic-languages/powershell/powershell.contribution'
},
{
label: 'protobuf',
entry: 'vs/basic-languages/protobuf/protobuf.contribution'
},
{
label: 'pug',
entry: 'vs/basic-languages/pug/pug.contribution'
},
{
label: 'python',
entry: 'vs/basic-languages/python/python.contribution'
},
{
label: 'qsharp',
entry: 'vs/basic-languages/qsharp/qsharp.contribution'
},
{
label: 'r',
entry: 'vs/basic-languages/r/r.contribution'
},
{
label: 'razor',
entry: 'vs/basic-languages/razor/razor.contribution'
},
{
label: 'redis',
entry: 'vs/basic-languages/redis/redis.contribution'
},
{
label: 'redshift',
entry: 'vs/basic-languages/redshift/redshift.contribution'
},
{
label: 'restructuredtext',
entry: 'vs/basic-languages/restructuredtext/restructuredtext.contribution'
},
{
label: 'ruby',
entry: 'vs/basic-languages/ruby/ruby.contribution'
},
{
label: 'rust',
entry: 'vs/basic-languages/rust/rust.contribution'
},
{
label: 'sb',
entry: 'vs/basic-languages/sb/sb.contribution'
},
{
label: 'scala',
entry: 'vs/basic-languages/scala/scala.contribution'
},
{
label: 'scheme',
entry: 'vs/basic-languages/scheme/scheme.contribution'
},
{
label: 'scss',
entry: 'vs/basic-languages/scss/scss.contribution'
},
{
label: 'shell',
entry: 'vs/basic-languages/shell/shell.contribution'
},
{
label: 'solidity',
entry: 'vs/basic-languages/solidity/solidity.contribution'
},
{
label: 'sophia',
entry: 'vs/basic-languages/sophia/sophia.contribution'
},
{
label: 'sparql',
entry: 'vs/basic-languages/sparql/sparql.contribution'
},
{
label: 'sql',
entry: 'vs/basic-languages/sql/sql.contribution'
},
{
label: 'st',
entry: 'vs/basic-languages/st/st.contribution'
},
{
label: 'swift',
entry: 'vs/basic-languages/swift/swift.contribution'
},
{
label: 'systemverilog',
entry: 'vs/basic-languages/systemverilog/systemverilog.contribution'
},
{
label: 'tcl',
entry: 'vs/basic-languages/tcl/tcl.contribution'
},
{
label: 'twig',
entry: 'vs/basic-languages/twig/twig.contribution'
},
{
label: 'typescript',
entry: [
'vs/basic-languages/typescript/typescript.contribution',
'vs/language/typescript/monaco.contribution'
],
worker: {
id: 'vs/language/typescript/tsWorker',
entry: 'vs/language/typescript/ts.worker'
}
},
{
label: 'vb',
entry: 'vs/basic-languages/vb/vb.contribution'
},
{
label: 'xml',
entry: 'vs/basic-languages/xml/xml.contribution'
},
{
label: 'yaml',
entry: 'vs/basic-languages/yaml/yaml.contribution'
}
];
export type EditorLanguage =
| 'abap'
| 'apex'
| 'azcli'
| 'bat'
| 'bicep'
| 'cameligo'
| 'clojure'
| 'coffee'
| 'cpp'
| 'csharp'
| 'csp'
| 'css'
| 'dart'
| 'dockerfile'
| 'ecl'
| 'elixir'
| 'flow9'
| 'fsharp'
| 'go'
| 'graphql'
| 'handlebars'
| 'hcl'
| 'html'
| 'ini'
| 'java'
| 'javascript'
| 'json'
| 'julia'
| 'kotlin'
| 'less'
| 'lexon'
| 'liquid'
| 'lua'
| 'm3'
| 'markdown'
| 'mips'
| 'msdax'
| 'mysql'
| 'objective-c'
| 'pascal'
| 'pascaligo'
| 'perl'
| 'pgsql'
| 'php'
| 'pla'
| 'postiats'
| 'powerquery'
| 'powershell'
| 'protobuf'
| 'pug'
| 'python'
| 'qsharp'
| 'r'
| 'razor'
| 'redis'
| 'redshift'
| 'restructuredtext'
| 'ruby'
| 'rust'
| 'sb'
| 'scala'
| 'scheme'
| 'scss'
| 'shell'
| 'solidity'
| 'sophia'
| 'sparql'
| 'sql'
| 'st'
| 'swift'
| 'systemverilog'
| 'tcl'
| 'twig'
| 'typescript'
| 'vb'
| 'xml'
| 'yaml';

195
webpack-plugin/src/metadata.d.ts vendored Normal file
View file

@ -0,0 +1,195 @@
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 =
| 'abap'
| 'apex'
| 'azcli'
| 'bat'
| 'bicep'
| 'cameligo'
| 'clojure'
| 'coffee'
| 'cpp'
| 'csharp'
| 'csp'
| 'css'
| 'dart'
| 'dockerfile'
| 'ecl'
| 'elixir'
| 'flow9'
| 'fsharp'
| 'go'
| 'graphql'
| 'handlebars'
| 'hcl'
| 'html'
| 'ini'
| 'java'
| 'javascript'
| 'json'
| 'julia'
| 'kotlin'
| 'less'
| 'lexon'
| 'liquid'
| 'lua'
| 'm3'
| 'markdown'
| 'mips'
| 'msdax'
| 'mysql'
| 'objective-c'
| 'pascal'
| 'pascaligo'
| 'perl'
| 'pgsql'
| 'php'
| 'pla'
| 'postiats'
| 'powerquery'
| 'powershell'
| 'protobuf'
| 'pug'
| 'python'
| 'qsharp'
| 'r'
| 'razor'
| 'redis'
| 'redshift'
| 'restructuredtext'
| 'ruby'
| 'rust'
| 'sb'
| 'scala'
| 'scheme'
| 'scss'
| 'shell'
| 'solidity'
| 'sophia'
| 'sparql'
| 'sql'
| 'st'
| 'swift'
| 'systemverilog'
| 'tcl'
| 'twig'
| 'typescript'
| 'vb'
| 'xml'
| 'yaml';
export type EditorFeature =
| 'accessibilityHelp'
| 'anchorSelect'
| 'bracketMatching'
| 'caretOperations'
| 'clipboard'
| 'codeAction'
| 'codelens'
| 'colorPicker'
| 'comment'
| 'contextmenu'
| 'coreCommands'
| 'cursorUndo'
| 'dnd'
| 'documentSymbols'
| 'find'
| 'folding'
| 'fontZoom'
| 'format'
| 'gotoError'
| 'gotoLine'
| 'gotoSymbol'
| 'hover'
| 'iPadShowKeyboard'
| 'inPlaceReplace'
| 'indentation'
| 'inlayHints'
| 'inlineCompletions'
| 'inspectTokens'
| 'linesOperations'
| 'linkedEditing'
| 'links'
| 'multicursor'
| 'parameterHints'
| 'quickCommand'
| 'quickHelp'
| 'quickOutline'
| 'referenceSearch'
| 'rename'
| 'smartSelect'
| 'snippets'
| 'suggest'
| 'toggleHighContrast'
| 'toggleTabFocusMode'
| 'transpose'
| 'unusualLineTerminators'
| 'viewportSemanticTokens'
| 'wordHighlighter'
| 'wordOperations'
| 'wordPartOperations';
export type NegatedEditorFeature =
| '!accessibilityHelp'
| '!anchorSelect'
| '!bracketMatching'
| '!caretOperations'
| '!clipboard'
| '!codeAction'
| '!codelens'
| '!colorPicker'
| '!comment'
| '!contextmenu'
| '!coreCommands'
| '!cursorUndo'
| '!dnd'
| '!documentSymbols'
| '!find'
| '!folding'
| '!fontZoom'
| '!format'
| '!gotoError'
| '!gotoLine'
| '!gotoSymbol'
| '!hover'
| '!iPadShowKeyboard'
| '!inPlaceReplace'
| '!indentation'
| '!inlayHints'
| '!inlineCompletions'
| '!inspectTokens'
| '!linesOperations'
| '!linkedEditing'
| '!links'
| '!multicursor'
| '!parameterHints'
| '!quickCommand'
| '!quickHelp'
| '!quickOutline'
| '!referenceSearch'
| '!rename'
| '!smartSelect'
| '!snippets'
| '!suggest'
| '!toggleHighContrast'
| '!toggleTabFocusMode'
| '!transpose'
| '!unusualLineTerminators'
| '!viewportSemanticTokens'
| '!wordHighlighter'
| '!wordOperations'
| '!wordPartOperations';