Skip to content

Commit e6d742e

Browse files
authored
Introduce Worker Label type definition for extended and classic (#1051)
* #1038 Provide Worker Label type definition for extended and classic * Implemented review comments
1 parent df214c6 commit e6d742e

16 files changed

Lines changed: 151 additions & 77 deletions

File tree

.github/workflows/verify.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ jobs:
2828
run: |
2929
npm run report:versions
3030
31+
- name: Build
32+
shell: bash
33+
run: |
34+
npm run build
35+
3136
- name: Execute verification
3237
shell: bash
3338
run: |

package-lock.json

Lines changed: 5 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/client/src/worker/index.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
* Licensed under the MIT License. See LICENSE in the package root for license information.
44
* ------------------------------------------------------------------------------------------ */
55

6+
// oxlint-disable typescript/no-redundant-type-constituents
7+
68
import type { ILogger } from '@codingame/monaco-vscode-log-service-override';
79
import { getEnhancedMonacoEnvironment } from 'monaco-languageclient/vscodeApiWrapper';
810

@@ -18,26 +20,37 @@ export class Worker {
1820

1921
export type WorkerLoader = (() => Worker) | undefined;
2022

23+
export type PossibleWorkerLabelsExtended =
24+
| 'editorWorkerService'
25+
| 'extensionHostWorkerMain'
26+
| 'TextMateWorker'
27+
| 'OutputLinkDetectionWorker'
28+
| 'LanguageDetectionWorker'
29+
| 'NotebookEditorWorker'
30+
| 'LocalFileSearchWorker';
31+
32+
export type PossibleWorkerLabelsClassic = 'editorWorkerService' | 'css' | 'html' | 'json' | 'javascript' | 'typescript';
33+
2134
export interface WorkerFactoryConfig {
22-
workerLoaders?: Partial<Record<string, WorkerLoader>>;
35+
workerLoaders?: Partial<Record<PossibleWorkerLabelsExtended | PossibleWorkerLabelsClassic | string, WorkerLoader>>;
2336
logger?: ILogger;
2437
}
2538

2639
export const useWorkerFactory = (config: WorkerFactoryConfig) => {
2740
const envEnhanced = getEnhancedMonacoEnvironment();
2841

29-
envEnhanced.getWorkerUrl = (workerId: string, label: string) => {
42+
envEnhanced.getWorkerUrl = (workerId: string, label: PossibleWorkerLabelsExtended | PossibleWorkerLabelsClassic | string) => {
3043
config.logger?.info(`getWorkerUrl: workerId: ${workerId} label: ${label}`);
3144
return config.workerLoaders?.[label]?.().url.toString();
3245
};
3346

34-
envEnhanced.getWorkerOptions = (moduleId: string, label: string) => {
47+
envEnhanced.getWorkerOptions = (moduleId: string, label: PossibleWorkerLabelsExtended | PossibleWorkerLabelsClassic | string) => {
3548
config.logger?.info(`getWorkerOptions: moduleId: ${moduleId} label: ${label}`);
3649
return config.workerLoaders?.[label]?.().options;
3750
};
3851
};
3952

40-
export const defineDefaultWorkerLoaders: () => Partial<Record<string, WorkerLoader>> = () => {
53+
export const defineDefaultWorkerLoaders: () => Record<PossibleWorkerLabelsExtended, WorkerLoader> = () => {
4154
const defaultEditorWorkerService = () =>
4255
new Worker(new URL('@codingame/monaco-vscode-editor-api/esm/vs/editor/editor.worker.js', import.meta.url), { type: 'module' });
4356
const defaultExtensionHostWorkerMain = () =>

packages/client/test/support/helper-classic.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
* ------------------------------------------------------------------------------------------ */
55

66
import type { ILogger } from '@codingame/monaco-vscode-log-service-override';
7-
import { useWorkerFactory, Worker, type WorkerLoader } from 'monaco-languageclient/workerFactory';
7+
import { useWorkerFactory, Worker, type PossibleWorkerLabelsClassic, type WorkerLoader } from 'monaco-languageclient/workerFactory';
88

9-
const workerResolver: Map<string, (value: void | PromiseLike<void>) => void> = new Map();
10-
const workerPromises: Map<string, Promise<void>> = new Map();
11-
export const createWorkerPromises = (keys: string[]) => {
9+
const workerResolver: Map<PossibleWorkerLabelsClassic, (value: void | PromiseLike<void>) => void> = new Map();
10+
const workerPromises: Map<PossibleWorkerLabelsClassic, Promise<void>> = new Map();
11+
export const createWorkerPromises = (keys: PossibleWorkerLabelsClassic[]) => {
1212
workerResolver.clear();
1313
workerPromises.clear();
1414
for (const key of keys) {
@@ -23,46 +23,49 @@ export const awaitWorkerPromises = () => {
2323
return Promise.all([...workerPromises.values()]);
2424
};
2525

26-
const pushAndPrintLastWorker = (lastWorker: string) => {
26+
const pushAndPrintLastWorker = (lastWorker: PossibleWorkerLabelsClassic) => {
2727
console.log(`Called: ${lastWorker}\n`);
2828
workerResolver.get(lastWorker)?.();
2929
};
3030

31-
const defineClassicWorkers: () => Partial<Record<string, WorkerLoader>> = () => {
31+
const defineClassicWorkers: () => Partial<Record<PossibleWorkerLabelsClassic, WorkerLoader>> = (): Record<
32+
PossibleWorkerLabelsClassic,
33+
WorkerLoader
34+
> => {
3235
const editorWorkerServiceWorker = () => {
3336
const workerUrl = new URL('@codingame/monaco-vscode-editor-api/esm/vs/editor/editor.worker.js', import.meta.url);
3437
const worker = new Worker(workerUrl, {
3538
type: 'module'
3639
});
37-
pushAndPrintLastWorker('editorWorker');
40+
pushAndPrintLastWorker('editorWorkerService');
3841
return worker;
3942
};
4043

4144
const cssWorker = () => {
4245
const workerUrl = new URL('@codingame/monaco-vscode-standalone-css-language-features', import.meta.url);
4346
const worker = new Worker(workerUrl, { type: 'module' });
44-
pushAndPrintLastWorker('cssWorker');
47+
pushAndPrintLastWorker('css');
4548
return worker;
4649
};
4750

4851
const jsonWorker = () => {
4952
const workerUrl = new URL('@codingame/monaco-vscode-standalone-json-language-features', import.meta.url);
5053
const worker = new Worker(workerUrl, { type: 'module' });
51-
pushAndPrintLastWorker('jsonWorker');
54+
pushAndPrintLastWorker('json');
5255
return worker;
5356
};
5457

5558
const htmlWorker = () => {
5659
const workerUrl = new URL('@codingame/monaco-vscode-standalone-html-language-features', import.meta.url);
5760
const worker = new Worker(workerUrl, { type: 'module' });
58-
pushAndPrintLastWorker('htmlWorker');
61+
pushAndPrintLastWorker('html');
5962
return worker;
6063
};
6164

6265
const tsWorker = () => {
6366
const workerUrl = new URL('@codingame/monaco-vscode-standalone-typescript-language-features', import.meta.url);
6467
const worker = new Worker(workerUrl, { type: 'module' });
65-
pushAndPrintLastWorker('tsWorker');
68+
pushAndPrintLastWorker('typescript');
6669
return worker;
6770
};
6871

packages/client/test/worker/workerFactory.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { LogLevel } from '@codingame/monaco-vscode-api';
77
import { ConsoleLogger } from '@codingame/monaco-vscode-log-service-override';
88
import { getEnhancedMonacoEnvironment } from 'monaco-languageclient/vscodeApiWrapper';
9-
import { useWorkerFactory, Worker } from 'monaco-languageclient/workerFactory';
9+
import { useWorkerFactory, Worker, type PossibleWorkerLabelsExtended, type WorkerLoader } from 'monaco-languageclient/workerFactory';
1010
import { describe, expect, test } from 'vitest';
1111

1212
describe.concurrent('WorkerFactory Tests', { concurrent: false, tags: ['vscode'] }, () => {
@@ -28,7 +28,7 @@ describe.concurrent('WorkerFactory Tests', { concurrent: false, tags: ['vscode']
2828
new Worker(new URL('@codingame/monaco-vscode-editor-api/esm/vs/editor/editor.worker.js', import.meta.url), {
2929
type: 'module'
3030
})
31-
},
31+
} as Record<PossibleWorkerLabelsExtended, WorkerLoader>,
3232
logger
3333
});
3434

packages/client/test/worker/workerLoaders.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ describe.concurrent('Test WorkerLoaders', { concurrent: false, tags: ['vscode']
3838
console.log(`editorWorkerUrl: ${editorWorkerUrl} worker: ${editorWorkerCheck !== undefined}\n`);
3939

4040
// default, expect editor worker to be loaded
41-
createWorkerPromises(['editorWorker']);
41+
createWorkerPromises(['editorWorkerService']);
4242
await editorApp.start(htmlContainer);
4343
expect(await awaitWorkerPromises()).toStrictEqual([undefined]);
4444
await editorApp.disposeModelRefs();
@@ -54,7 +54,7 @@ describe.concurrent('Test WorkerLoaders', { concurrent: false, tags: ['vscode']
5454
console.log(`jsonWorkerUrl: ${jsonWorkerUrl} worker: ${jsonWorkerCheck !== undefined}\n`);
5555

5656
// ts worker, expect ts worker and json worker to be loaded
57-
createWorkerPromises(['tsWorker', 'jsonWorker']);
57+
createWorkerPromises(['typescript', 'json']);
5858
await editorApp.updateCodeResources({
5959
modified: {
6060
text: '',
@@ -69,7 +69,7 @@ describe.concurrent('Test WorkerLoaders', { concurrent: false, tags: ['vscode']
6969
expect(cssWorkerCheck).toBeUndefined();
7070
console.log(`cssWorkerUrl: ${cssWorkerUrl} worker: ${cssWorkerCheck !== undefined}\n`);
7171

72-
createWorkerPromises(['cssWorker']);
72+
createWorkerPromises(['css']);
7373
await editorApp.updateCodeResources({
7474
modified: {
7575
text: '',
@@ -84,7 +84,7 @@ describe.concurrent('Test WorkerLoaders', { concurrent: false, tags: ['vscode']
8484
expect(htmlWorkerCheck).toBeUndefined();
8585
console.log(`htmlWorkerUrl: ${htmlWorkerUrl} worker: ${htmlWorkerCheck !== undefined}\n`);
8686

87-
createWorkerPromises(['htmlWorker']);
87+
createWorkerPromises(['html']);
8888
await editorApp.updateCodeResources({
8989
modified: {
9090
text: '',

packages/examples/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@
105105
"@codingame/monaco-vscode-search-result-default-extension": "^35.0.0",
106106
"@codingame/monaco-vscode-search-service-override": "^35.0.0",
107107
"@codingame/monaco-vscode-secret-storage-service-override": "^35.0.0",
108+
"@codingame/monaco-vscode-standalone-css-language-features": "^35.0.0",
109+
"@codingame/monaco-vscode-standalone-html-language-features": "^35.0.0",
110+
"@codingame/monaco-vscode-standalone-json-language-features": "^35.0.0",
111+
"@codingame/monaco-vscode-standalone-languages": "^35.0.0",
112+
"@codingame/monaco-vscode-standalone-typescript-language-features": "^35.0.0",
108113
"@codingame/monaco-vscode-storage-service-override": "^35.0.0",
109114
"@codingame/monaco-vscode-testing-service-override": "^35.0.0",
110115
"@codingame/monaco-vscode-theme-defaults-default-extension": "^35.0.0",

packages/examples/src/common/client/extendedClient.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ import { LogLevel } from '@codingame/monaco-vscode-api';
1515
import { EditorApp, type EditorAppConfig } from 'monaco-languageclient/editorApp';
1616
import { LanguageClientWrapper, type LanguageClientConfig } from 'monaco-languageclient/lcwrapper';
1717
import { MonacoVscodeApiWrapper, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
18-
import { configureDefaultWorkerFactory, useWorkerFactory, type WorkerLoader } from 'monaco-languageclient/workerFactory';
18+
import {
19+
configureDefaultWorkerFactory,
20+
useWorkerFactory,
21+
type PossibleWorkerLabelsExtended,
22+
type WorkerLoader
23+
} from 'monaco-languageclient/workerFactory';
1924
import { createUrl, type ConnectionConfigOptions, type WebSocketConfigOptionsDirect } from 'monaco-languageclient/common';
2025
import type { ILogger } from '@codingame/monaco-vscode-log-service-override';
2126

@@ -155,5 +160,5 @@ export type ExampleLsConfig = {
155160
basePath: string;
156161
languageId: string;
157162
useExternalWebSocket: boolean;
158-
workerLoaders?: () => Partial<Record<string, WorkerLoader>>;
163+
workerLoaders?: () => Partial<Record<PossibleWorkerLabelsExtended, WorkerLoader>>;
159164
};
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/* --------------------------------------------------------------------------------------------
2+
* Copyright (c) 2026 TypeFox and others.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
* ------------------------------------------------------------------------------------------ */
5+
6+
import type { ILogger } from '@codingame/monaco-vscode-log-service-override';
7+
import { useWorkerFactory, Worker, type PossibleWorkerLabelsClassic, type WorkerLoader } from 'monaco-languageclient/workerFactory';
8+
9+
export const defineClassicWorkers: () => Record<PossibleWorkerLabelsClassic, WorkerLoader> = () => {
10+
const editorWorkerServiceWorker = () => {
11+
const workerUrl = new URL('@codingame/monaco-vscode-editor-api/esm/vs/editor/editor.worker.js', import.meta.url);
12+
return new Worker(workerUrl, { type: 'module' });
13+
};
14+
15+
const cssWorker = () => {
16+
const workerUrl = new URL('@codingame/monaco-vscode-standalone-css-language-features', import.meta.url);
17+
return new Worker(workerUrl, { type: 'module' });
18+
};
19+
20+
const jsonWorker = () => {
21+
const workerUrl = new URL('@codingame/monaco-vscode-standalone-json-language-features', import.meta.url);
22+
return new Worker(workerUrl, { type: 'module' });
23+
};
24+
25+
const htmlWorker = () => {
26+
const workerUrl = new URL('@codingame/monaco-vscode-standalone-html-language-features', import.meta.url);
27+
return new Worker(workerUrl, { type: 'module' });
28+
};
29+
30+
const tsWorker = () => {
31+
const workerUrl = new URL('@codingame/monaco-vscode-standalone-typescript-language-features', import.meta.url);
32+
return new Worker(workerUrl, { type: 'module' });
33+
};
34+
35+
return {
36+
editorWorkerService: editorWorkerServiceWorker,
37+
css: cssWorker,
38+
html: htmlWorker,
39+
json: jsonWorker,
40+
// both have to be defined otherwise this leads to a test error
41+
javascript: tsWorker,
42+
typescript: tsWorker
43+
};
44+
};
45+
46+
export const configureClassicWorkerFactory = (logger?: ILogger) => {
47+
useWorkerFactory({
48+
workerLoaders: defineClassicWorkers(),
49+
logger
50+
});
51+
};

0 commit comments

Comments
 (0)