amd progress

This commit is contained in:
Henning Dieterichs 2025-07-30 18:28:24 +02:00
parent f420968fc9
commit 967982e245
No known key found for this signature in database
GPG key ID: 771381EFFDB9EC06
20 changed files with 283 additions and 111 deletions

View file

@ -4,8 +4,8 @@
*--------------------------------------------------------------------------------------------*/
import glob from 'glob';
import { runTsc, massageAndCopyDts, buildESM, buildAMD } from './utils';
import { copyFile, removeDir } from './fs';
import { runTsc, massageAndCopyDts, buildESM } from './utils';
import { removeDir } from './fs';
removeDir(`out/languages`);
@ -47,23 +47,24 @@ buildESM({
],
external: ['monaco-editor-core', '*/cssMode', '*/monaco.contribution']
});
buildAMD({
base: 'language/css',
entryPoint: 'src/language/css/monaco.contribution.ts',
amdModuleId: 'vs/language/css/monaco.contribution',
amdDependencies: ['vs/editor/editor.api']
});
buildAMD({
base: 'language/css',
entryPoint: 'src/language/css/cssMode.ts',
amdModuleId: 'vs/language/css/cssMode',
external: ['*/monaco.contribution']
});
buildAMD({
base: 'language/css',
entryPoint: 'src/language/css/cssWorker.ts',
amdModuleId: 'vs/language/css/cssWorker'
});
// buildAMD({
// base: 'language/css',
// entryPoint: 'src/language/css/monaco.contribution.ts',
// amdModuleId: 'vs/language/css/monaco.contribution',
// amdDependencies: ['vs/editor/editor.api']
// });
// buildAMD({
// base: 'language/css',
// entryPoint: 'src/language/css/cssMode.ts',
// amdModuleId: 'vs/language/css/cssMode',
// external: ['*/monaco.contribution']
// });
// buildAMD({
// base: 'language/css',
// entryPoint: 'src/language/css/cssWorker.ts',
// amdModuleId: 'vs/language/css/cssWorker'
// });
//#endregion
@ -78,23 +79,23 @@ buildESM({
],
external: ['monaco-editor-core', '*/htmlMode', '*/monaco.contribution']
});
buildAMD({
base: 'language/html',
entryPoint: 'src/language/html/monaco.contribution.ts',
amdModuleId: 'vs/language/html/monaco.contribution',
amdDependencies: ['vs/editor/editor.api']
});
buildAMD({
base: 'language/html',
entryPoint: 'src/language/html/htmlMode.ts',
amdModuleId: 'vs/language/html/htmlMode',
external: ['*/monaco.contribution']
});
buildAMD({
base: 'language/html',
entryPoint: 'src/language/html/htmlWorker.ts',
amdModuleId: 'vs/language/html/htmlWorker'
});
// buildAMD({
// base: 'language/html',
// entryPoint: 'src/language/html/monaco.contribution.ts',
// amdModuleId: 'vs/language/html/monaco.contribution',
// amdDependencies: ['vs/editor/editor.api']
// });
// buildAMD({
// base: 'language/html',
// entryPoint: 'src/language/html/htmlMode.ts',
// amdModuleId: 'vs/language/html/htmlMode',
// external: ['*/monaco.contribution']
// });
// buildAMD({
// base: 'language/html',
// entryPoint: 'src/language/html/htmlWorker.ts',
// amdModuleId: 'vs/language/html/htmlWorker'
// });
//#endregion
@ -109,23 +110,23 @@ buildESM({
],
external: ['monaco-editor-core', '*/jsonMode', '*/monaco.contribution']
});
buildAMD({
base: 'language/json',
entryPoint: 'src/language/json/monaco.contribution.ts',
amdModuleId: 'vs/language/json/monaco.contribution',
amdDependencies: ['vs/editor/editor.api']
});
buildAMD({
base: 'language/json',
entryPoint: 'src/language/json/jsonMode.ts',
amdModuleId: 'vs/language/json/jsonMode',
external: ['*/monaco.contribution']
});
buildAMD({
base: 'language/json',
entryPoint: 'src/language/json/jsonWorker.ts',
amdModuleId: 'vs/language/json/jsonWorker'
});
// buildAMD({
// base: 'language/json',
// entryPoint: 'src/language/json/monaco.contribution.ts',
// amdModuleId: 'vs/language/json/monaco.contribution',
// amdDependencies: ['vs/editor/editor.api']
// });
// buildAMD({
// base: 'language/json',
// entryPoint: 'src/language/json/jsonMode.ts',
// amdModuleId: 'vs/language/json/jsonMode',
// external: ['*/monaco.contribution']
// });
// buildAMD({
// base: 'language/json',
// entryPoint: 'src/language/json/jsonWorker.ts',
// amdModuleId: 'vs/language/json/jsonWorker'
// });
//#endregion
@ -140,23 +141,23 @@ buildESM({
],
external: ['monaco-editor-core', '*/tsMode', '*/monaco.contribution']
});
buildAMD({
base: 'language/typescript',
entryPoint: 'src/language/typescript/monaco.contribution.ts',
amdModuleId: 'vs/language/typescript/monaco.contribution',
amdDependencies: ['vs/editor/editor.api']
});
buildAMD({
base: 'language/typescript',
entryPoint: 'src/language/typescript/tsMode.ts',
amdModuleId: 'vs/language/typescript/tsMode',
external: ['*/monaco.contribution']
});
buildAMD({
base: 'language/typescript',
entryPoint: 'src/language/typescript/tsWorker.ts',
amdModuleId: 'vs/language/typescript/tsWorker'
});
// buildAMD({
// base: 'language/typescript',
// entryPoint: 'src/language/typescript/monaco.contribution.ts',
// amdModuleId: 'vs/language/typescript/monaco.contribution',
// amdDependencies: ['vs/editor/editor.api']
// });
// buildAMD({
// base: 'language/typescript',
// entryPoint: 'src/language/typescript/tsMode.ts',
// amdModuleId: 'vs/language/typescript/tsMode',
// external: ['*/monaco.contribution']
// });
// buildAMD({
// base: 'language/typescript',
// entryPoint: 'src/language/typescript/tsWorker.ts',
// amdModuleId: 'vs/language/typescript/tsWorker'
// });
//#endregion
@ -192,21 +193,21 @@ glob('../src/basic-languages/*/*.contribution.ts', { cwd: __dirname }, function
}
// AMD
{
buildAMD({
base: 'basic-languages',
entryPoint: 'src/basic-languages/monaco.contribution.ts',
amdModuleId: 'vs/basic-languages/monaco.contribution',
amdDependencies: ['vs/editor/editor.api']
});
for (const language of languages) {
buildAMD({
base: 'basic-languages',
entryPoint: `src/basic-languages/${language}/${language}.ts`,
amdModuleId: `vs/basic-languages/${language}/${language}`
});
}
}
// {
// buildAMD({
// base: 'basic-languages',
// entryPoint: 'src/basic-languages/monaco.contribution.ts',
// amdModuleId: 'vs/basic-languages/monaco.contribution',
// amdDependencies: ['vs/editor/editor.api']
// });
// for (const language of languages) {
// buildAMD({
// base: 'basic-languages',
// entryPoint: `src/basic-languages/${language}/${language}.ts`,
// amdModuleId: `vs/basic-languages/${language}/${language}`
// });
// }
// }
});
//#endregion

View file

@ -7,16 +7,16 @@ import path = require('path');
import fs = require('fs');
import { REPO_ROOT, readFiles, writeFiles, IFile, readFile } from '../build/utils';
import { removeDir } from '../build/fs';
import ts = require('typescript');
import { generateMetadata } from './releaseMetadata';
import ts = require('typescript');
removeDir(`out/monaco-editor`);
// dev folder
AMD_releaseOne('dev');
// // dev folder
// AMD_releaseOne('dev');
// min folder
AMD_releaseOne('min');
// // min folder
// AMD_releaseOne('min');
// esm folder
ESM_release();

13
package-lock.json generated
View file

@ -9,6 +9,9 @@
"version": "0.52.0",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@types/trusted-types": "^1.0.6"
},
"devDependencies": {
"@types/mocha": "^9.1.0",
"@types/shelljs": "^0.8.11",
@ -2308,6 +2311,11 @@
"@types/node": "*"
}
},
"node_modules/@types/trusted-types": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-1.0.6.tgz",
"integrity": "sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw=="
},
"node_modules/@typescript/vfs": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.3.5.tgz",
@ -9011,6 +9019,11 @@
"@types/node": "*"
}
},
"@types/trusted-types": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-1.0.6.tgz",
"integrity": "sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw=="
},
"@typescript/vfs": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.3.5.tgz",

View file

@ -77,5 +77,8 @@
"alias": {
"process": false,
"buffer": false
},
"dependencies": {
"@types/trusted-types": "^1.0.6"
}
}

View file

@ -6,6 +6,6 @@
// Resolves with the global monaco API
/// <reference path="./editor.api.d.ts" />
import * as api from 'vs/editor/editor.api';
export = api;
// export = api;
export * from 'monaco-editor-core';

View file

@ -0,0 +1,7 @@
import * as worker from 'monaco-editor-core/esm/vs/editor/editor.worker.start';
export function initialize(callback: (ctx: any, createData: any) => any): void {
self.onmessage = (m) => {
worker.start((ctx) => callback(ctx, m.data));
};
}

View file

@ -0,0 +1,134 @@
import { editor } from '../../fillers/monaco-editor-core';
export function createTrustedTypesPolicy<Options extends TrustedTypePolicyOptions>(
policyName: string,
policyOptions?: Options
):
| undefined
| Pick<
TrustedTypePolicy<Options>,
'name' | Extract<keyof Options, keyof TrustedTypePolicyOptions>
> {
interface IMonacoEnvironment {
createTrustedTypesPolicy<Options extends TrustedTypePolicyOptions>(
policyName: string,
policyOptions?: Options
):
| undefined
| Pick<
TrustedTypePolicy<Options>,
'name' | Extract<keyof Options, keyof TrustedTypePolicyOptions>
>;
}
const monacoEnvironment: IMonacoEnvironment | undefined = (globalThis as any).MonacoEnvironment;
if (monacoEnvironment?.createTrustedTypesPolicy) {
try {
return monacoEnvironment.createTrustedTypesPolicy(policyName, policyOptions);
} catch (err) {
console.error(err);
return undefined;
}
}
try {
return (globalThis as any).trustedTypes?.createPolicy(policyName, policyOptions);
} catch (err) {
console.error(err);
return undefined;
}
}
let ttPolicy: ReturnType<typeof createTrustedTypesPolicy>;
if (
typeof self === 'object' &&
self.constructor &&
self.constructor.name === 'DedicatedWorkerGlobalScope' &&
(globalThis as any).workerttPolicy !== undefined
) {
ttPolicy = (globalThis as any).workerttPolicy;
} else {
ttPolicy = createTrustedTypesPolicy('defaultWorkerFactory', {
createScriptURL: (value) => value
});
}
export function getWorker(descriptor: {
label: string;
moduleId: string;
}): Worker | Promise<Worker> {
const label = descriptor.label;
// Option for hosts to overwrite the worker script (used in the standalone editor)
interface IMonacoEnvironment {
getWorker?(moduleId: string, label: string): Worker | Promise<Worker>;
getWorkerUrl?(moduleId: string, label: string): string;
}
const monacoEnvironment: IMonacoEnvironment | undefined = (globalThis as any).MonacoEnvironment;
if (monacoEnvironment) {
if (typeof monacoEnvironment.getWorker === 'function') {
return monacoEnvironment.getWorker('workerMain.js', label);
}
if (typeof monacoEnvironment.getWorkerUrl === 'function') {
const workerUrl = monacoEnvironment.getWorkerUrl('workerMain.js', label);
return new Worker(
ttPolicy ? (ttPolicy.createScriptURL(workerUrl) as unknown as string) : workerUrl,
{ name: label, type: 'module' }
);
}
}
// const esmWorkerLocation = descriptor.esmModuleLocation;
// if (esmWorkerLocation) {
// const workerUrl = getWorkerBootstrapUrl(label, esmWorkerLocation.toString(true));
// const worker = new Worker(ttPolicy ? ttPolicy.createScriptURL(workerUrl) as unknown as string : workerUrl, { name: label, type: 'module' });
// return whenESMWorkerReady(worker);
// }
throw new Error(
`You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker`
);
}
export function createWebWorker<T extends object>(
opts: IWebWorkerOptions
): editor.MonacoWebWorker<T> {
const worker = Promise.resolve(
getWorker({
label: opts.label ?? 'monaco-editor-worker',
moduleId: opts.moduleId
})
).then((w) => {
w.postMessage('ignore');
w.postMessage(opts.createData);
return w;
});
return editor.createWebWorker<T>({
worker,
host: opts.host,
keepIdleModels: opts.keepIdleModels
});
}
export interface IWebWorkerOptions {
/**
* The AMD moduleId to load.
* It should export a function `create` that should return the exported proxy.
*/
moduleId: string;
/**
* The data to send over when calling create on the module.
*/
createData?: any;
/**
* A label to be used to identify the web worker for debugging purposes.
*/
label?: string;
/**
* An object that can be used by the web worker to make calls back to the main thread.
*/
host?: any;
/**
* Keep idle models.
* Defaults to false, which means that idle models will stop syncing after a while.
*/
keepIdleModels?: boolean;
}

View file

@ -3,12 +3,12 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as worker from 'monaco-editor-core/esm/vs/editor/editor.worker';
import { initialize } from '../common/initialize';
import { CSSWorker } from './cssWorker';
self.onmessage = () => {
// ignore the first message
worker.initialize((ctx, createData) => {
initialize((ctx, createData) => {
return new CSSWorker(ctx, createData);
});
};

View file

@ -6,6 +6,7 @@
import { LanguageServiceDefaults } from './monaco.contribution';
import type { CSSWorker } from './cssWorker';
import { editor, IDisposable, Uri } from '../../fillers/monaco-editor-core';
import { createWebWorker } from '../common/workers';
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; // 2min
@ -55,7 +56,7 @@ export class WorkerManager {
this._lastUsedTime = Date.now();
if (!this._client) {
this._worker = editor.createWebWorker<CSSWorker>({
this._worker = createWebWorker<CSSWorker>({
// module that exports the create() method and returns a `CSSWorker` instance
moduleId: 'vs/language/css/cssWorker',

View file

@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as worker from 'monaco-editor-core/esm/vs/editor/editor.worker';
import * as worker from '../common/initialize';
import { HTMLWorker } from './htmlWorker';
self.onmessage = () => {

View file

@ -6,6 +6,7 @@
import { LanguageServiceDefaults } from './monaco.contribution';
import type { HTMLWorker } from './htmlWorker';
import { Uri, IDisposable, editor } from '../../fillers/monaco-editor-core';
import { createWebWorker } from '../common/workers';
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; // 2min
@ -55,7 +56,7 @@ export class WorkerManager {
this._lastUsedTime = Date.now();
if (!this._client) {
this._worker = editor.createWebWorker<HTMLWorker>({
this._worker = createWebWorker<HTMLWorker>({
// module that exports the create() method and returns a `HTMLWorker` instance
moduleId: 'vs/language/html/htmlWorker',

View file

@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as worker from 'monaco-editor-core/esm/vs/editor/editor.worker';
import * as worker from '../common/initialize';
import { JSONWorker } from './jsonWorker';
self.onmessage = () => {

View file

@ -6,6 +6,7 @@
import { LanguageServiceDefaults } from './monaco.contribution';
import type { JSONWorker } from './jsonWorker';
import { IDisposable, Uri, editor } from '../../fillers/monaco-editor-core';
import { createWebWorker } from '../common/workers';
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1000; // 2min
@ -55,7 +56,7 @@ export class WorkerManager {
this._lastUsedTime = Date.now();
if (!this._client) {
this._worker = editor.createWebWorker<JSONWorker>({
this._worker = createWebWorker<JSONWorker>({
// module that exports the create() method and returns a `JSONWorker` instance
moduleId: 'vs/language/json/jsonWorker',

View file

@ -3,6 +3,8 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
declare module 'monaco-editor-core/esm/vs/editor/editor.worker' {
export function initialize(callback: (ctx: any, createData: any) => any): void;
}
declare module 'monaco-editor-core/esm/vs/editor/editor.worker.start' {
import type { worker } from 'monaco-editor-core';
export function start<THost extends object, TClient extends object>(createClient: (ctx: worker.IWorkerContext<THost>) => TClient): TClient;
}

View file

@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { initialize } from 'monaco-editor-core/esm/vs/editor/editor.worker';
import { initialize } from '../common/initialize';
import * as ts from './lib/typescriptServices';
import { ICreateData, TypeScriptWorker, create } from './tsWorker';
import { worker } from '../../fillers/monaco-editor-core';

View file

@ -6,6 +6,7 @@
import { LanguageServiceDefaults } from './monaco.contribution';
import type { TypeScriptWorker } from './tsWorker';
import { editor, Uri, IDisposable } from '../../fillers/monaco-editor-core';
import { createWebWorker } from '../common/workers';
export class WorkerManager {
private _configChangeListener: IDisposable;
@ -58,7 +59,7 @@ export class WorkerManager {
private _getClient(): Promise<TypeScriptWorker> {
if (!this._client) {
this._client = (async () => {
this._worker = editor.createWebWorker<TypeScriptWorker>({
this._worker = createWebWorker<TypeScriptWorker>({
// module that exports the create() method and returns a `TypeScriptWorker` instance
moduleId: 'vs/language/typescript/tsWorker',

View file

@ -2,7 +2,7 @@
"compilerOptions": {
"declaration": true,
"lib": ["dom", "es5", "es2015.collection", "es2015.promise", "es2015.iterable"],
"module": "amd",
"module": "esnext",
"moduleResolution": "node",
"outDir": "../out/languages/amd-tsc",
"strict": true,

View file

@ -19,8 +19,14 @@ self.MonacoEnvironment = {
if (label === 'typescript' || label === 'javascript') {
return './out/vs/language/typescript/ts.worker.js';
}
return './out/vs/editor/editor.worker.js';
//return './out/vs/editor/editor.worker.js';
return './out/vs/editor/common/services/editorWebWorkerMain.js';
}
};
window.monacoAPI = monaco;
window.ed = monacoAPI.editor.create(document.getElementById('editor-container'), {
value: '.test { color: blue; }',
language: 'javascript'
});

View file

@ -14,7 +14,8 @@ const workerEntryPoints = [
'vs/language/css/css.worker.js',
'vs/language/html/html.worker.js',
'vs/language/typescript/ts.worker.js',
'vs/editor/editor.worker.js'
//'vs/editor/editor.worker.js'
'vs/editor/common/services/editorWebWorkerMain.js'
];
build({

View file

@ -42,13 +42,14 @@ async function runTests() {
// uncomment to shortcircuit and run a specific combo
// await runTest('webpack', 'chromium'); return;
/** @type {PackagerKind[]} */
const testTypes = ['amd', 'webpack', 'esbuild', 'vite'];
//const testTypes = ['amd', 'webpack', 'esbuild', 'vite'];
const testTypes = ['esbuild'];
// TODO: add parcel! (this currently fails because parcel replaces process with {})
for (const type of testTypes) {
await runTest(type, 'chromium');
await runTest(type, 'firefox');
await runTest(type, 'webkit');
// await runTest(type, 'firefox');
// await runTest(type, 'webkit');
}
}
@ -73,7 +74,7 @@ function runTest(packager, browser) {
path.join(REPO_ROOT, 'node_modules/mocha/bin/mocha'),
'test/smoke/*.test.js',
'--no-delay',
'--headless',
//'--headless',
'--timeout',
'20000'
],