Uses rollup for ESM build and d.ts bundling. (#5048)

* Uses rollup for ESM build and d.ts bundling.
Moves monaco.languages.{typescript, json, html, css} to monaco.*.
Moves monaco.editor.createWebWorker to monaco.createWebWorker.

* Adds excluded files from dist, as they needed to be patched.
This commit is contained in:
Henning Dieterichs 2025-10-13 18:05:43 +02:00 committed by GitHub
parent 0fd6f29a23
commit 5a7e917587
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
39 changed files with 1795 additions and 712 deletions

View file

@ -6,9 +6,9 @@ function createTrustedTypesPolicy<Options extends TrustedTypePolicyOptions>(
):
| undefined
| Pick<
TrustedTypePolicy<Options>,
'name' | Extract<keyof Options, keyof TrustedTypePolicyOptions>
> {
TrustedTypePolicy<Options>,
'name' | Extract<keyof Options, keyof TrustedTypePolicyOptions>
> {
interface IMonacoEnvironment {
createTrustedTypesPolicy<Options extends TrustedTypePolicyOptions>(
policyName: string,
@ -16,9 +16,9 @@ function createTrustedTypesPolicy<Options extends TrustedTypePolicyOptions>(
):
| undefined
| Pick<
TrustedTypePolicy<Options>,
'name' | Extract<keyof Options, keyof TrustedTypePolicyOptions>
>;
TrustedTypePolicy<Options>,
'name' | Extract<keyof Options, keyof TrustedTypePolicyOptions>
>;
}
const monacoEnvironment: IMonacoEnvironment | undefined = (globalThis as any).MonacoEnvironment;
@ -52,7 +52,7 @@ if (
});
}
function getWorker(descriptor: { label: string; moduleId: string }): Worker | Promise<Worker> {
function getWorker(descriptor: { label: string; moduleId: string; createWorker?: () => Worker }): Worker | Promise<Worker> {
const label = descriptor.label;
// Option for hosts to overwrite the worker script (used in the standalone editor)
interface IMonacoEnvironment {
@ -73,6 +73,10 @@ function getWorker(descriptor: { label: string; moduleId: string }): Worker | Pr
}
}
if (descriptor.createWorker) {
return descriptor.createWorker();
}
// const esmWorkerLocation = descriptor.esmModuleLocation;
// if (esmWorkerLocation) {
// const workerUrl = getWorkerBootstrapUrl(label, esmWorkerLocation.toString(true));
@ -91,7 +95,8 @@ export function createWebWorker<T extends object>(
const worker = Promise.resolve(
getWorker({
label: opts.label ?? 'monaco-editor-worker',
moduleId: opts.moduleId
moduleId: opts.moduleId,
createWorker: opts.createWorker,
})
).then((w) => {
w.postMessage('ignore');
@ -111,6 +116,7 @@ export interface IWebWorkerOptions {
* It should export a function `create` that should return the exported proxy.
*/
moduleId: string;
createWorker?: () => Worker,
/**
* The data to send over when calling create on the module.
*/

View file

@ -0,0 +1,2 @@
import './internal/initialize';
export * from 'monaco-editor-core';

3
src/editor/editor.all.ts Normal file
View file

@ -0,0 +1,3 @@
import './internal/initialize';
/// @ts-ignore
export * from 'monaco-editor-core/esm/vs/editor/editor.all';

3
src/editor/editor.api.ts Normal file
View file

@ -0,0 +1,3 @@
import './internal/initialize';
/// @ts-ignore
export * from 'monaco-editor-core/esm/vs/editor/editor.api';

View file

@ -1,18 +1,14 @@
import { createWebWorker } from '../common/workers.js';
import '../basic-languages/monaco.contribution.js';
import * as css from '../language/css/monaco.contribution.js';
import * as html from '../language/html/monaco.contribution.js';
import * as json from '../language/json/monaco.contribution.js';
import * as typescript from '../language/typescript/monaco.contribution.js';
import * as monaco from 'monaco-editor-core';
export * from 'monaco-editor-core';
import * as monaco from './internal/editorWithLanguages';
import './internal/initialize';
import { getGlobalMonaco } from './internal/initialize';
export { css, html, json, typescript };
export * from './internal/editorWithLanguages';
const existingCreateWebWorker = monaco.editor.createWebWorker;
monaco.editor.createWebWorker = function (options: any) {
if (options.worker === undefined) {
return createWebWorker(options);
}
return existingCreateWebWorker(options);
} as any;
// export to the global based API (for backwards compatibility only).
// Warning: We can only write to objects, not modules / namespaces!
// Writing to modules/namespace would confuse bundlers.
const monacoApi = getGlobalMonaco();
monacoApi.languages.css = monaco.css;
monacoApi.languages.html = monaco.html;
monacoApi.languages.typescript = monaco.typescript;
monacoApi.languages.json = monaco.json;

View file

@ -0,0 +1,10 @@
import * as css from '../../language/css/monaco.contribution.js';
import * as html from '../../language/html/monaco.contribution.js';
import * as json from '../../language/json/monaco.contribution.js';
import * as typescript from '../../language/typescript/monaco.contribution.js';
import '../../basic-languages/monaco.contribution.js';
import * as lsp from '@vscode/monaco-lsp-client';
export * from 'monaco-editor-core';
export { createWebWorker, type IWebWorkerOptions } from '../../common/workers.js';
export { css, html, json, typescript, lsp };

View file

@ -0,0 +1,12 @@
import * as monaco from 'monaco-editor-core/esm/vs/editor/editor.api.js';
export function getGlobalMonaco(): any {
return monaco;
}
// TODO@hediet get rid of the monaco global
const monacoEnvironment: monaco.Environment | undefined = (globalThis as any).MonacoEnvironment;
if (monacoEnvironment?.globalAPI) {
(globalThis as any).monaco = getGlobalMonaco();
}

View file

@ -253,9 +253,6 @@ export const lessDefaults: LanguageServiceDefaults = new LanguageServiceDefaults
modeConfigurationDefault
);
// export to the global based API
(<any>languages).css = { cssDefaults, lessDefaults, scssDefaults };
// --- Registration to monaco editor ---
function getMode(): Promise<typeof mode> {

View file

@ -59,7 +59,7 @@ export class WorkerManager {
this._worker = createWebWorker<CSSWorker>({
// module that exports the create() method and returns a `CSSWorker` instance
moduleId: 'vs/language/css/cssWorker',
createWorker: () => new Worker(new URL('./css.worker', import.meta.url), { type: 'module' }),
label: this._defaults.languageId,
// passed in to the create() method

View file

@ -215,17 +215,6 @@ export const razorLanguageService = registerHTMLLanguageService(
);
export const razorDefaults = razorLanguageService.defaults;
// export to the global based API
(<any>languages).html = {
htmlDefaults,
razorDefaults,
handlebarDefaults,
htmlLanguageService,
handlebarLanguageService,
razorLanguageService,
registerHTMLLanguageService
};
// --- Registration to monaco editor ---
function getMode(): Promise<typeof mode> {

View file

@ -59,6 +59,7 @@ export class WorkerManager {
this._worker = createWebWorker<HTMLWorker>({
// module that exports the create() method and returns a `HTMLWorker` instance
moduleId: 'vs/language/html/htmlWorker',
createWorker: () => new Worker(new URL('./html.worker', import.meta.url), { type: 'module' }),
// passed in to the create() method
createData: {

View file

@ -87,10 +87,10 @@ export interface JSONSchema {
minProperties?: number;
maxProperties?: number;
dependencies?:
| JSONSchemaMap
| {
[prop: string]: string[];
};
| JSONSchemaMap
| {
[prop: string]: string[];
};
items?: JSONSchemaRef | JSONSchemaRef[];
minItems?: number;
maxItems?: number;
@ -342,9 +342,6 @@ export interface IJSONWorker {
export const getWorker = (): Promise<(...uris: Uri[]) => Promise<IJSONWorker>> =>
getMode().then((mode) => mode.getWorker());
// export to the global based API
(<any>languages).json = { jsonDefaults, getWorker };
// --- Registration to monaco editor ---
function getMode(): Promise<typeof mode> {

View file

@ -59,6 +59,7 @@ export class WorkerManager {
this._worker = createWebWorker<JSONWorker>({
// module that exports the create() method and returns a `JSONWorker` instance
moduleId: 'vs/language/json/jsonWorker',
createWorker: () => new Worker(new URL('./json.worker', import.meta.url), { type: 'module' }),
label: this._defaults.languageId,

View file

@ -618,7 +618,7 @@ class LanguageServiceDefaultsImpl implements LanguageServiceDefaults {
if (this._extraLibs[filePath] && this._extraLibs[filePath].content === content) {
// no-op, there already exists an extra lib with this content
return {
dispose: () => {}
dispose: () => { }
};
}
@ -718,7 +718,7 @@ class LanguageServiceDefaultsImpl implements LanguageServiceDefaults {
this._onDidChange.fire(undefined);
}
setMaximumWorkerIdleTime(value: number): void {}
setMaximumWorkerIdleTime(value: number): void { }
setEagerModelSync(value: boolean) {
// doesn't fire an event since no
@ -778,20 +778,6 @@ export const getJavaScriptWorker = (): Promise<(...uris: Uri[]) => Promise<TypeS
return getMode().then((mode) => mode.getJavaScriptWorker());
};
// export to the global based API
(<any>languages).typescript = {
ModuleKind,
JsxEmit,
NewLineKind,
ScriptTarget,
ModuleResolutionKind,
typescriptVersion,
typescriptDefaults,
javascriptDefaults,
getTypeScriptWorker,
getJavaScriptWorker
};
// --- Registration to monaco editor ---
function getMode(): Promise<typeof mode> {

View file

@ -62,6 +62,7 @@ export class WorkerManager {
this._worker = createWebWorker<TypeScriptWorker>({
// module that exports the create() method and returns a `TypeScriptWorker` instance
moduleId: 'vs/language/typescript/tsWorker',
createWorker: () => new Worker(new URL('./ts.worker', import.meta.url), { type: 'module' }),
label: this._modeId,