Skip to content

Commit e5be488

Browse files
committed
Suppport all arguments for monaco-vscode-api initialize, allow to configure editor-, view- or workspace-service (preperation for further extension)
1 parent 09fa65b commit e5be488

34 files changed

+588
-448
lines changed

.editorconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ indent_size = 2
1313

1414
[*.md]
1515
indent_size = 2
16+
17+
[*.yml]
18+
indent_size = 2

package-lock.json

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

package.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,28 @@
55
"@codingame/esbuild-import-meta-url-plugin": "~1.0.2",
66
"@codingame/monaco-vscode-rollup-vsix-plugin": "~9.0.3",
77
"@testing-library/react": "~16.0.1",
8-
"@types/node": "~20.16.9",
9-
"@types/react": "~18.3.9",
8+
"@types/node": "~20.16.10",
9+
"@types/react": "~18.3.10",
1010
"@types/react-dom": "~18.3.0",
1111
"@types/vscode": "~1.93.0",
1212
"@typescript-eslint/eslint-plugin": "~7.18.0",
1313
"@typescript-eslint/parser": "~7.18.0",
14-
"@vitejs/plugin-react": "~4.3.1",
15-
"@vitest/browser": "~2.1.1",
14+
"@vitejs/plugin-react": "~4.3.2",
15+
"@vitest/browser": "~2.1.2",
1616
"editorconfig": "~2.0.0",
1717
"esbuild": "~0.24.0",
18-
"eslint": "~8.57.0",
18+
"eslint": "~8.57.1",
1919
"eslint-plugin-header": "~3.1.1",
2020
"eslint-plugin-import": "~2.29.1",
2121
"eslint-plugin-unused-imports": "~3.2.0",
2222
"http-server": "~14.1.1",
2323
"minimatch": "~10.0.1",
2424
"playwright": "~1.47.2",
25-
"typescript": "~5.5.4",
25+
"typescript": "~5.6.2",
2626
"vite": "~5.4.8",
27-
"vite-node": "~2.1.1",
28-
"vitest": "~2.1.1",
29-
"webdriverio": "~9.1.1"
27+
"vite-node": "~2.1.2",
28+
"vitest": "~2.1.2",
29+
"webdriverio": "~9.1.2"
3030
},
3131
"volta": {
3232
"node": "20.17.0",
@@ -57,7 +57,7 @@
5757
"release:prepare": "npm run reset:repo && npm ci && npm run build && npm run lint && npm run test:run",
5858
"reset:repo": "git clean -f -X -d",
5959
"test": "npm run test:webdriverio",
60-
"test:run": "npm run test:webdriverio",
60+
"test:run": "npm run test:webdriverio:run",
6161
"test:webdriverio": "vitest",
6262
"test:webdriverio:run": "vitest --run",
6363
"test:playwright": "vitest --config vitest.debug.config.ts",

packages/client/src/vscode/services.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55

66
import * as monaco from 'monaco-editor';
77
import 'vscode/localExtensionHost';
8-
import { ILogService, initialize, IWorkbenchConstructionOptions, StandaloneServices, LogLevel } from 'vscode/services';
8+
import { initialize, IWorkbenchConstructionOptions } from 'vscode/services';
9+
import { OpenEditor } from '@codingame/monaco-vscode-editor-service-override';
910
import type { WorkerConfig } from '@codingame/monaco-vscode-extensions-service-override';
1011
import getExtensionServiceOverride from '@codingame/monaco-vscode-extensions-service-override';
1112
import getLanguagesServiceOverride from '@codingame/monaco-vscode-languages-service-override';
1213
import getModelServiceOverride from '@codingame/monaco-vscode-model-service-override';
1314
import getLogServiceOverride from '@codingame/monaco-vscode-log-service-override';
1415
import type { LocalizationOptions } from '@codingame/monaco-vscode-localization-service-override';
16+
import { EnvironmentOverride } from 'vscode/workbench';
1517
import { Logger } from 'monaco-languageclient/tools';
1618
import { FakeWorker as Worker } from './fakeWorker.js';
1719

@@ -24,9 +26,16 @@ export interface InitializeServiceConfig {
2426
userServices?: monaco.editor.IEditorOverrideServices;
2527
enableExtHostWorker?: boolean;
2628
workspaceConfig?: IWorkbenchConstructionOptions;
29+
viewsConfig?: {
30+
viewServiceType: 'EditorService' | 'ViewsService' | 'WorkspaceService';
31+
openEditorFunc?: OpenEditor;
32+
viewsInitFunc?: () => void;
33+
},
34+
envOptions?: EnvironmentOverride;
2735
}
2836

2937
export interface InitServicesInstructions extends InitializeServiceConfig {
38+
htmlContainer: HTMLElement;
3039
caller?: string;
3140
performChecks?: () => boolean;
3241
logger?: Logger;
@@ -48,6 +57,11 @@ export const initEnhancedMonacoEnvironment = () => {
4857
return envEnhanced;
4958
};
5059

60+
export const getMonacoEnvironmentEnhanced = () => {
61+
const monWin = (self as Window);
62+
return monWin.MonacoEnvironment as MonacoEnvironmentEnhanced;
63+
};
64+
5165
export const supplyRequiredServices = async () => {
5266
return {
5367
...getLanguagesServiceOverride(),
@@ -79,6 +93,7 @@ export const initServices = async (instructions: InitServicesInstructions) => {
7993
instructions.logger?.debug(`Initializing vscode services. Caller: ${instructions.caller ?? 'unknown'}`);
8094

8195
await importAllServices(instructions);
96+
instructions.viewsConfig?.viewsInitFunc?.();
8297
instructions.logger?.debug('Initialization of vscode services completed successfully.');
8398

8499
envEnhanced.vscodeApiInitialised = true;
@@ -108,8 +123,7 @@ export const importAllServices = async (instructions: InitServicesInstructions)
108123
reportServiceLoading(userServices, instructions.logger);
109124

110125
if (instructions.performChecks === undefined || (typeof instructions.performChecks === 'function' && instructions.performChecks())) {
111-
await initialize(userServices, undefined, instructions.workspaceConfig);
112-
StandaloneServices.get(ILogService).setLevel(instructions.logger?.getLevel() ?? LogLevel.Off);
126+
await initialize(userServices, instructions.htmlContainer, instructions.workspaceConfig, instructions.envOptions);
113127
}
114128
};
115129

packages/examples/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
"monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~9.0.3",
7979
"monaco-editor-wrapper": "~6.0.0-next.1",
8080
"monaco-languageclient": "~9.0.0-next.1",
81-
"pyright": "~1.1.382",
81+
"pyright": "~1.1.383",
8282
"react": "~18.3.1",
8383
"react-dom": "~18.3.1",
8484
"request-light": "~0.8.0",

packages/examples/src/bare/client.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ import { updateUserConfiguration } from '@codingame/monaco-vscode-configuration-
2222

2323
export const runClient = async () => {
2424
const logger = new ConsoleLogger(LogLevel.Debug);
25+
const htmlContainer = document.getElementById('monaco-editor-root')!;
2526
await initServices({
2627
userServices: {
2728
...getConfigurationServiceOverride(),
2829
...getThemeServiceOverride(),
2930
...getTextmateServiceOverride(),
3031
},
32+
htmlContainer,
3133
logger
3234
});
3335

@@ -46,7 +48,7 @@ export const runClient = async () => {
4648
configureMonacoWorkers(logger);
4749

4850
// create monaco editor
49-
monaco.editor.create(document.getElementById('monaco-editor-root')!, {
51+
monaco.editor.create(htmlContainer, {
5052
value: `{
5153
"$schema": "http://json.schemastore.org/coffeelint",
5254
"line_endings": "unix"

packages/examples/src/browser/main.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const runBrowserEditor = async () => {
1919
const protocolConverter = createProtocolConverter(undefined, true, true);
2020

2121
let mainVscodeDocument: vscode.TextDocument | undefined;
22-
const htmlElement = document.getElementById('monaco-editor-root');
22+
const htmlContainer = document.getElementById('monaco-editor-root')!;
2323
const languageId = 'json';
2424
const code = `{
2525
"$schema": "http://json.schemastore.org/coffeelint",
@@ -52,7 +52,8 @@ export const runBrowserEditor = async () => {
5252
'editor.experimental.asyncTokenization': true
5353
})
5454
},
55-
monacoWorkerFactory: configureMonacoWorkers
55+
monacoWorkerFactory: configureMonacoWorkers,
56+
htmlContainer
5657
}
5758
};
5859
await wrapper.init(jsonClientUserConfig);
@@ -155,7 +156,7 @@ export const runBrowserEditor = async () => {
155156
diagnosticCollection.clear();
156157
};
157158

158-
await wrapper.start(htmlElement);
159+
await wrapper.start();
159160

160161
wrapper.getTextModels()?.text?.onDidChangeContent(() => {
161162
validate();

packages/examples/src/eclipse.jdt.ls/client/main.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ export const runEclipseJdtLsClient = () => {
4444
'editor.experimental.asyncTokenization': true
4545
})
4646
},
47-
monacoWorkerFactory: configureMonacoWorkers
47+
monacoWorkerFactory: configureMonacoWorkers,
48+
htmlContainer: document.getElementById('monaco-editor-root')!
4849
},
4950
languageClientConfigs: {
5051
java: {
@@ -68,7 +69,6 @@ export const runEclipseJdtLsClient = () => {
6869
};
6970

7071
const wrapper = new MonacoEditorLanguageClientWrapper();
71-
const htmlElement = document.getElementById('monaco-editor-root');
7272

7373
try {
7474
document.querySelector('#button-start')?.addEventListener('click', async () => {
@@ -77,7 +77,7 @@ export const runEclipseJdtLsClient = () => {
7777
// open files, so the LS can pick it up
7878
await vscode.workspace.openTextDocument(helloJavaUri);
7979

80-
await wrapper.start(htmlElement);
80+
await wrapper.start();
8181
});
8282
document.querySelector('#button-dispose')?.addEventListener('click', async () => {
8383
await wrapper.dispose();

packages/examples/src/groovy/client/main.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ const userConfig: WrapperConfig = {
4040
'editor.experimental.asyncTokenization': true
4141
})
4242
},
43-
monacoWorkerFactory: configureMonacoWorkers
43+
monacoWorkerFactory: configureMonacoWorkers,
44+
htmlContainer: document.getElementById('monaco-editor-root')!
4445
},
4546
languageClientConfigs: {
4647
groovy: {
@@ -57,11 +58,10 @@ const userConfig: WrapperConfig = {
5758

5859
export const runGroovyClient = () => {
5960
const wrapper = new MonacoEditorLanguageClientWrapper();
60-
const htmlElement = document.getElementById('monaco-editor-root');
6161

6262
try {
6363
document.querySelector('#button-start')?.addEventListener('click', async () => {
64-
await wrapper.initAndStart(userConfig, htmlElement);
64+
await wrapper.initAndStart(userConfig);
6565
});
6666
document.querySelector('#button-dispose')?.addEventListener('click', async () => {
6767
await wrapper.dispose();

packages/examples/src/json/client/wrapperWs.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ export const jsonClientUserConfig: WrapperConfig = {
4040
'editor.experimental.asyncTokenization': true
4141
})
4242
},
43-
monacoWorkerFactory: configureMonacoWorkers
43+
monacoWorkerFactory: configureMonacoWorkers,
44+
htmlContainer: document.getElementById('monaco-editor-root')!
4445
},
4546
languageClientConfigs: {
4647
json: {
@@ -69,11 +70,10 @@ export const jsonClientUserConfig: WrapperConfig = {
6970

7071
export const runJsonWrapper = () => {
7172
const wrapper = new MonacoEditorLanguageClientWrapper();
72-
const htmlElement = document.getElementById('monaco-editor-root');
7373

7474
try {
7575
document.querySelector('#button-start')?.addEventListener('click', async () => {
76-
await wrapper.initAndStart(jsonClientUserConfig, htmlElement);
76+
await wrapper.initAndStart(jsonClientUserConfig);
7777
});
7878
document.querySelector('#button-dispose')?.addEventListener('click', async () => {
7979
await wrapper.dispose();

packages/examples/src/langium/langium-dsl/config/classicConfig.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ export const setupLangiumClientClassic = async (): Promise<WrapperConfig> => {
4949
useWorkerFactory({
5050
logger
5151
});
52-
}
52+
},
53+
htmlContainer: document.getElementById('monaco-editor-root')!
5354
},
5455
languageClientConfigs: {
5556
langium: {

packages/examples/src/langium/langium-dsl/config/extendedConfig.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ export const setupLangiumClientExtended = async (): Promise<WrapperConfig> => {
7676
'editor.experimental.asyncTokenization': true
7777
})
7878
},
79-
monacoWorkerFactory: configureMonacoWorkers
79+
monacoWorkerFactory: configureMonacoWorkers,
80+
htmlContainer: document.getElementById('monaco-editor-root')!
8081
},
8182
languageClientConfigs: {
8283
langium: {

packages/examples/src/langium/langium-dsl/wrapperLangium.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { disableButton } from '../../common/client/utils.js';
1111

1212
let wrapper: MonacoEditorLanguageClientWrapper | undefined;
1313
let extended = false;
14-
const htmlElement = document.getElementById('monaco-editor-root');
1514

1615
export const runLangiumDslWrapper = async () => {
1716
try {
@@ -31,7 +30,7 @@ export const startLangiumClientExtended = async () => {
3130
disableButton('button-start-extended', true);
3231
const config = await setupLangiumClientExtended();
3332
wrapper = new MonacoEditorLanguageClientWrapper();
34-
wrapper.initAndStart(config, htmlElement);
33+
wrapper.initAndStart(config);
3534
} catch (e) {
3635
console.log(e);
3736
}
@@ -44,7 +43,7 @@ export const startLangiumClientClassic = async () => {
4443
disableButton('button-start-extended', true);
4544
const config = await setupLangiumClientClassic();
4645
wrapper = new MonacoEditorLanguageClientWrapper();
47-
await wrapper.initAndStart(config, htmlElement!);
46+
await wrapper.initAndStart(config);
4847
} catch (e) {
4948
console.log(e);
5049
}

packages/examples/src/langium/statemachine/config/wrapperStatemachineConfig.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ export const createLangiumGlobalConfig = async (params: {
9696
'editor.experimental.asyncTokenization': true
9797
})
9898
},
99-
monacoWorkerFactory: configureMonacoWorkers
99+
monacoWorkerFactory: configureMonacoWorkers,
100+
htmlContainer: document.getElementById('monaco-editor-root')!
100101
},
101102
languageClientConfigs
102103
};

packages/examples/src/langium/statemachine/main-react.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { loadStatemachineWorkerRegular } from './main.js';
1111
import text from './content/example.statemachine?raw';
1212

1313
export const runStatemachineReact = async () => {
14-
const langiumGlobalConfig = await createLangiumGlobalConfig({
14+
const wrapperConfig = await createLangiumGlobalConfig({
1515
languageServerId: 'react',
1616
useLanguageClient: true,
1717
text,
@@ -20,7 +20,6 @@ export const runStatemachineReact = async () => {
2020

2121
try {
2222
document.querySelector('#button-start')?.addEventListener('click', async () => {
23-
const htmlElement = document.getElementById('monaco-editor-root');
2423
const App = () => {
2524

2625
const [ height, setHeight ] = useState('80vh');
@@ -38,15 +37,15 @@ export const runStatemachineReact = async () => {
3837
<div style={{ 'height': height }} >
3938
<MonacoEditorReactComp
4039
style={{ 'height': '100%' }}
41-
wrapperConfig={langiumGlobalConfig} />
40+
wrapperConfig={wrapperConfig} />
4241
</div>
4342
);
4443
};
4544
const strictMode = (document.getElementById('checkbox-strictmode')! as HTMLInputElement).checked;
4645
if (strictMode) {
47-
ReactDOM.createRoot(htmlElement!).render(<StrictMode><App /></StrictMode>);
46+
ReactDOM.createRoot(wrapperConfig.editorAppConfig.htmlContainer).render(<StrictMode><App /></StrictMode>);
4847
} else {
49-
ReactDOM.createRoot(htmlElement!).render(<App />);
48+
ReactDOM.createRoot(wrapperConfig.editorAppConfig.htmlContainer).render(<App />);
5049
}
5150
});
5251
document.querySelector('#button-dispose')?.addEventListener('click', () => {

packages/examples/src/langium/statemachine/main.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const startEditor = async () => {
4747
messagePort: channel.port1,
4848
messageTransports: { reader, writer }
4949
});
50-
await wrapper.initAndStart(langiumGlobalConfig, document.getElementById('monaco-editor-root'));
50+
await wrapper.initAndStart(langiumGlobalConfig);
5151

5252
// here the modelReference is created manually and given to the updateEditorModels of the wrapper
5353
const uri = vscode.Uri.parse('/workspace/statemachine-mod.statemachine');
@@ -63,7 +63,7 @@ const startEditor = async () => {
6363
useLanguageClient: false,
6464
text: textMod
6565
});
66-
await wrapper2.initAndStart(langiumGlobalConfig2, document.getElementById('monaco-editor-root2'));
66+
await wrapper2.initAndStart(langiumGlobalConfig2);
6767

6868
vscode.commands.getCommands().then((x) => {
6969
console.log('Currently registered # of vscode commands: ' + x.length);

packages/examples/src/multi/twoLanguageClients.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ print("Hello Moon!")
5454
'editor.experimental.asyncTokenization': true
5555
})
5656
},
57-
monacoWorkerFactory: configureMonacoWorkers
57+
monacoWorkerFactory: configureMonacoWorkers,
58+
htmlContainer: document.getElementById('monaco-editor-root')!
5859
},
5960
languageClientConfigs: {
6061
json: {
@@ -109,7 +110,6 @@ print("Hello Moon!")
109110
}
110111
};
111112

112-
const htmlElement = document.getElementById('monaco-editor-root');
113113
const wrapper = new MonacoEditorLanguageClientWrapper();
114114

115115
try {
@@ -119,7 +119,7 @@ print("Hello Moon!")
119119
(wrapperConfig.editorAppConfig.codeResources.main as CodePlusFileExt).fileExt = currenFileExt;
120120
}
121121

122-
await wrapper.initAndStart(wrapperConfig, htmlElement);
122+
await wrapper.initAndStart(wrapperConfig);
123123
disableButton('button-flip', false);
124124
});
125125
document.querySelector('#button-dispose')?.addEventListener('click', async () => {

packages/examples/src/python/client/config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ export const createUserConfig = (workspaceRoot: string, code: string, codeUri: s
8787
})
8888
},
8989
useDiffEditor: false,
90-
monacoWorkerFactory: configureMonacoWorkers
90+
monacoWorkerFactory: configureMonacoWorkers,
91+
htmlContainer: document.getElementById('monaco-editor-root')!
9192
}
9293
};
9394
};

0 commit comments

Comments
 (0)