From ba2ef9863be1fdae6777c9852bb6012afc7306d8 Mon Sep 17 00:00:00 2001 From: Kai Salmen Date: Mon, 17 Apr 2023 22:15:11 +0200 Subject: [PATCH] Update to monaco-languageclient 5.1.0-next.0 and monaco-vscode-api 1.78.0 --- package-lock.json | 83 ++++++++----- packages/examples/package.json | 3 +- .../src/langium/langiumWrapperConfig.ts | 13 ++- .../examples/src/langium/wrapperLangium.ts | 8 +- packages/monaco-editor-react/package.json | 2 +- packages/monaco-editor-wrapper/package.json | 2 +- packages/monaco-editor-wrapper/src/index.ts | 5 - .../src/indexAllLanguages.ts | 1 - .../src/monacoEditorWrapper.ts | 11 +- .../src/monacoVscodeApiWrapper.ts | 109 ++---------------- packages/monaco-editor-wrapper/src/wrapper.ts | 60 +++++----- 11 files changed, 117 insertions(+), 180 deletions(-) diff --git a/package-lock.json b/package-lock.json index a234737..5712920 100644 --- a/package-lock.json +++ b/package-lock.json @@ -695,8 +695,7 @@ "node_modules/@types/node": { "version": "18.15.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -1182,6 +1181,15 @@ "node": ">=8" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/c8": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz", @@ -1840,6 +1848,15 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "peer": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2615,9 +2632,9 @@ } }, "node_modules/monaco-editor": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.36.1.tgz", - "integrity": "sha512-/CaclMHKQ3A6rnzBzOADfwdSJ25BFoFT0Emxsc4zYVyav5SkK9iA6lEtIeuN/oRYbwPgviJT+t3l+sjFa28jYg==", + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.37.1.tgz", + "integrity": "sha512-jLXEEYSbqMkT/FuJLBZAVWGuhIb4JNwHE9kPTorAVmsdZ4UzHAfgWxLsVtD7pLRFaOwYPhNG9nUCpmFL1t/dIg==", "peer": true }, "node_modules/monaco-editor-workers": { @@ -2633,9 +2650,9 @@ "link": true }, "node_modules/monaco-languageclient": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-5.0.1.tgz", - "integrity": "sha512-zTEb8PQZpnYiKkJofdIArMikX7CyQ7205copJNWSCMlOK9eEsbCM8TYb+D7f+MNWt7aOBbustQuqhwjsI3ZYgw==", + "version": "5.1.0-next.0", + "resolved": "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-5.1.0-next.0.tgz", + "integrity": "sha512-QO+GsNmqz7AyYTEva5nVBk+kuJWtoRGb7ySXbrJJpgnUyQZ4F5DEcQ9hItCpf0UZdxE4ZmzcojpKmvMdAACbSg==", "dependencies": { "vscode-jsonrpc": "~8.1.0", "vscode-languageclient": "~8.1.0" @@ -2645,7 +2662,7 @@ "npm": ">=9.0.0" }, "peerDependencies": { - "vscode": "npm:@codingame/monaco-vscode-api@~1.76.6" + "vscode": "npm:@codingame/monaco-vscode-api@~1.78.0" } }, "node_modules/monaco-languageclient/node_modules/minimatch": { @@ -2885,6 +2902,12 @@ "node": "*" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "peer": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -3848,13 +3871,18 @@ }, "node_modules/vscode": { "name": "@codingame/monaco-vscode-api", - "version": "1.76.9", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.76.9.tgz", - "integrity": "sha512-CF/9Ay6qJa0jrftxD1o+HBEy0gMVECN5P7oz3XPeX20Eg22OdI1TUvN/0iZ9ZMOWvkAoRWFBUHUrqdAYzj7oVw==", + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.78.0.tgz", + "integrity": "sha512-mV+ImrH1EdgwkujoYNCnqtZijZA7c1vxXl/Y6OwV1Mo8fZ4fUhMTiiO+0zaQZqLzM5GX/l7qfxNVOLV2pUJtmg==", + "peer": true, + "dependencies": { + "@types/node": "^18.15.11" + }, "peerDependencies": { - "monaco-editor": "~0.36.1", + "monaco-editor": "~0.37.1", "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^9.0.0" + "vscode-textmate": "^9.0.0", + "yauzl": "^2.10.0" } }, "node_modules/vscode-json-languageservice": { @@ -4135,6 +4163,16 @@ "node": ">=8" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "peer": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -4154,12 +4192,11 @@ "http-server": "~14.1.1", "langium": "~1.1.0", "langium-statemachine-dsl": "~1.1.0", - "monaco-editor-workers": "0.36.0", + "monaco-editor-workers": "0.37.0", "monaco-editor-wrapper": "2.0.0-next.1", "react": "~18.2.0", "react-dom": "~18.2.0", "request-light": "~0.7.0", - "vscode": "npm:@codingame/monaco-vscode-api@~1.76.6", "vscode-json-languageservice": "~5.3.2", "vscode-languageclient": "~8.1.0", "vscode-languageserver": "~8.1.0", @@ -4177,11 +4214,6 @@ "node": ">=10" } }, - "packages/examples/node_modules/monaco-editor-workers": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/monaco-editor-workers/-/monaco-editor-workers-0.36.0.tgz", - "integrity": "sha512-byrccv+VN5MC9aAjLd4wGis1cPVYtaxvBRjlqupiv8BrNehuPqRlc+T3j1A6Ow62j5AAHxnzHtWkIwPvDDmYIg==" - }, "packages/examples/node_modules/vscode-jsonrpc": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", @@ -4240,17 +4272,12 @@ "version": "1.0.0-next.8", "license": "MIT", "dependencies": { - "monaco-editor-workers": "0.36.0", "monaco-editor-wrapper": "2.0.0-next.1", + "monaco-languageclient": "5.1.0-next.0", "react": "~18.2.0", "react-dom": "~18.2.0" } }, - "packages/monaco-editor-react/node_modules/monaco-editor-workers": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/monaco-editor-workers/-/monaco-editor-workers-0.36.0.tgz", - "integrity": "sha512-byrccv+VN5MC9aAjLd4wGis1cPVYtaxvBRjlqupiv8BrNehuPqRlc+T3j1A6Ow62j5AAHxnzHtWkIwPvDDmYIg==" - }, "packages/monaco-editor-workers": { "version": "0.37.0", "license": "MIT", @@ -4269,7 +4296,7 @@ "license": "MIT", "dependencies": { "@types/css-font-loading-module": "~0.0.8", - "monaco-languageclient": "5.0.1", + "monaco-languageclient": "5.1.0-next.0", "normalize-url": "~8.0.0", "vscode-ws-jsonrpc": "3.0.0" }, diff --git a/packages/examples/package.json b/packages/examples/package.json index 2348372..43ca0a0 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -8,11 +8,10 @@ "langium-statemachine-dsl": "~1.1.0", "monaco-editor-wrapper": "2.0.0-next.1", "@typefox/monaco-editor-react": "1.0.0-next.8", - "monaco-editor-workers": "0.36.0", + "monaco-editor-workers": "0.37.0", "react": "~18.2.0", "react-dom": "~18.2.0", "request-light": "~0.7.0", - "vscode": "npm:@codingame/monaco-vscode-api@~1.76.6", "vscode-uri": "~3.0.7", "vscode-languageclient": "~8.1.0", "vscode-languageserver": "~8.1.0", diff --git a/packages/examples/src/langium/langiumWrapperConfig.ts b/packages/examples/src/langium/langiumWrapperConfig.ts index 4339b83..2b44e33 100644 --- a/packages/examples/src/langium/langiumWrapperConfig.ts +++ b/packages/examples/src/langium/langiumWrapperConfig.ts @@ -19,10 +19,15 @@ export const createLangiumGlobalConfig = async (htmlElement: HTMLElement): Promi htmlElement: htmlElement, wrapperConfig: { useVscodeConfig: true, - monacoVscodeApiConfig: { - activationConfig: { - basePath: '../monaco-editor-wrapper' + serviceConfig: { + enableThemeService: true, + enableLanguagesService: true, + enableConfigurationService: true, + configurationServiceConfig: { + defaultWorkspaceUri: '/tmp/' }, + }, + monacoVscodeApiConfig: { extension: { name: 'langium-example', publisher: 'monaco-languageclient-project', @@ -60,7 +65,7 @@ export const createLangiumGlobalConfig = async (htmlElement: HTMLElement): Promi }, extensionFiles: extensionFiles, userConfiguration: `{ - "workbench.colorTheme": "Dark+ (Experimental)", + "workbench.colorTheme": "Default Dark+", "editor.fontSize": 14, "editor.lightbulb.enabled": true, "editor.lineHeight": 20, diff --git a/packages/examples/src/langium/wrapperLangium.ts b/packages/examples/src/langium/wrapperLangium.ts index 22937b3..2dcdbb8 100644 --- a/packages/examples/src/langium/wrapperLangium.ts +++ b/packages/examples/src/langium/wrapperLangium.ts @@ -15,10 +15,10 @@ const startEditor = async () => { const langiumGlobalConfig = await createLangiumGlobalConfig(document.getElementById('monaco-editor-root') as HTMLElement); wrapper .init(langiumGlobalConfig) - .startEditor() - .then((s: unknown) => { - console.log(s); - + .then(() => { + wrapper.startEditor(); + }) + .then(() => { vscode.commands.getCommands().then((x) => { console.log('Currently registered # of vscode commands: ' + x.length); }); diff --git a/packages/monaco-editor-react/package.json b/packages/monaco-editor-react/package.json index 5754fa8..f92c686 100644 --- a/packages/monaco-editor-react/package.json +++ b/packages/monaco-editor-react/package.json @@ -67,8 +67,8 @@ "npm": "9.6.3" }, "dependencies": { - "monaco-editor-workers": "0.36.0", "monaco-editor-wrapper": "2.0.0-next.1", + "monaco-languageclient": "5.1.0-next.0", "react": "~18.2.0", "react-dom": "~18.2.0" }, diff --git a/packages/monaco-editor-wrapper/package.json b/packages/monaco-editor-wrapper/package.json index 0f86888..863d7f4 100644 --- a/packages/monaco-editor-wrapper/package.json +++ b/packages/monaco-editor-wrapper/package.json @@ -95,7 +95,7 @@ }, "dependencies": { "@types/css-font-loading-module": "~0.0.8", - "monaco-languageclient": "5.0.1", + "monaco-languageclient": "5.1.0-next.0", "vscode-ws-jsonrpc": "3.0.0", "normalize-url": "~8.0.0" }, diff --git a/packages/monaco-editor-wrapper/src/index.ts b/packages/monaco-editor-wrapper/src/index.ts index a966b2d..4b1b52e 100644 --- a/packages/monaco-editor-wrapper/src/index.ts +++ b/packages/monaco-editor-wrapper/src/index.ts @@ -6,10 +6,6 @@ import { MonacoEditorWrapper } from './monacoEditorWrapper.js'; -import type { - MonacoVscodeApiActivtion -} from './monacoVscodeApiWrapper.js'; - import { MonacoVscodeApiWrapper } from './monacoVscodeApiWrapper.js'; @@ -29,7 +25,6 @@ import { export type { EditorConfig, MonacoLanguageExtensionConfig, - MonacoVscodeApiActivtion, WebSocketConfigOptions, WorkerConfigOptions, UserConfig, diff --git a/packages/monaco-editor-wrapper/src/indexAllLanguages.ts b/packages/monaco-editor-wrapper/src/indexAllLanguages.ts index 754e1de..a064dcb 100644 --- a/packages/monaco-editor-wrapper/src/indexAllLanguages.ts +++ b/packages/monaco-editor-wrapper/src/indexAllLanguages.ts @@ -1,7 +1,6 @@ export type { EditorConfig, MonacoLanguageExtensionConfig, - MonacoVscodeApiActivtion, WebSocketConfigOptions, WorkerConfigOptions, UserConfig, diff --git a/packages/monaco-editor-wrapper/src/monacoEditorWrapper.ts b/packages/monaco-editor-wrapper/src/monacoEditorWrapper.ts index 91e4dd6..44e9619 100644 --- a/packages/monaco-editor-wrapper/src/monacoEditorWrapper.ts +++ b/packages/monaco-editor-wrapper/src/monacoEditorWrapper.ts @@ -24,9 +24,14 @@ export type MonacoEditorWrapperConfig = { export class MonacoEditorWrapper { async init(editorConfig: EditorConfig, runtimeConfig: MonacoEditorWrapperConfig) { - this.updateWrapperConfig(editorConfig, runtimeConfig); - - console.log('Init of MonacoConfig was completed.'); + return this.updateWrapperConfig(editorConfig, runtimeConfig) + .then(() => { + console.log('Init of MonacoConfig was completed.'); + return Promise.resolve(); + }) + .catch(e => { + return Promise.reject(e); + }); } async updateWrapperConfig(editorConfig: EditorConfig, runtimeConfig: MonacoEditorWrapperConfig) { diff --git a/packages/monaco-editor-wrapper/src/monacoVscodeApiWrapper.ts b/packages/monaco-editor-wrapper/src/monacoVscodeApiWrapper.ts index e4a1c0a..9f305e9 100644 --- a/packages/monaco-editor-wrapper/src/monacoVscodeApiWrapper.ts +++ b/packages/monaco-editor-wrapper/src/monacoVscodeApiWrapper.ts @@ -1,37 +1,10 @@ -import { StandaloneServices } from 'vscode/services'; -import getModelEditorServiceOverride from 'vscode/service-override/modelEditor'; -import getNotificationServiceOverride from 'vscode/service-override/notifications'; -import getDialogsServiceOverride from 'vscode/service-override/dialogs'; -import getConfigurationServiceOverride, { updateUserConfiguration as vscodeUpdateUserConfiguration } from 'vscode/service-override/configuration'; -import getKeybindingsServiceOverride from 'vscode/service-override/keybindings'; +import { updateUserConfiguration } from 'vscode/service-override/configuration'; import { registerExtension, IExtensionManifest } from 'vscode/extensions'; -import getTextmateServiceOverride from 'vscode/service-override/textmate'; -import getLanguagesServiceOverride from 'vscode/service-override/languages'; -import getTokenClassificationServiceOverride from 'vscode/service-override/tokenClassification'; -import getLanguageConfigurationServiceOverride from 'vscode/service-override/languageConfiguration'; -import getThemeServiceOverride from 'vscode/service-override/theme'; -import getAudioCueServiceOverride from 'vscode/service-override/audioCue'; -// import getDebugServiceOverride from 'vscode/service-override/debug'; import { createConfiguredEditor, createConfiguredDiffEditor } from 'vscode/monaco'; import { editor } from 'monaco-editor/esm/vs/editor/editor.api.js'; -import { loadAllDefaultThemes } from './helpers/themeLocalHelper.js'; - -export type MonacoVscodeApiActivtion = { - // notificationService, dialogsService and themeService are enabled by default - basePath: string, - enableModelEditorService?: boolean; - enableConfigurationService?: boolean; - enableKeybindingsService?: boolean; - enableTextmateService?: boolean; - enableTokenClassificationService?: boolean; - enableLanguagesService?: boolean; - enableLanguageConfigurationService?: boolean; - enableAudioCueService?: boolean; - enableDebugService?: boolean; -}; +import 'vscode/default-extensions/theme-defaults'; export type MonacoVscodeApiWrapperConfig = { - activationConfig: MonacoVscodeApiActivtion; extension: IExtensionManifest | object; extensionFiles?: Map; userConfiguration?: string; @@ -41,60 +14,6 @@ export class MonacoVscodeApiWrapper { async init(runtimeConfig: MonacoVscodeApiWrapperConfig) { console.log(window.location.href); - const activationInput = runtimeConfig.activationConfig; - const activationConfig = { - basePath: activationInput.basePath ?? '.', - enableModelEditorService: activationInput.enableModelEditorService ?? true, - enableConfigurationService: activationInput.enableConfigurationService ?? true, - enableKeybindingsService: activationInput.enableKeybindingsService ?? true, - enableTextmateService: activationInput.enableTextmateService ?? true, - enableTokenClassificationService: activationInput.enableTokenClassificationService ?? true, - enableLanguagesService: activationInput.enableLanguagesService ?? true, - enableLanguageConfigurationService: activationInput.enableLanguageConfigurationService ?? true, - enableAudioCueService: activationInput.enableAudioCueService ?? true, - // deactivate debugservices for now - enableDebugService: false, - }; - - const modelService = activationConfig.enableModelEditorService ? getModelEditorServiceOverride(async (model, options) => { - console.log('Trying to open a model', model, options); - return undefined; - }) : {}; - const configurationService = activationConfig.enableModelEditorService ? getConfigurationServiceOverride() : {}; - const keybindingsService = activationConfig.enableKeybindingsService ? getKeybindingsServiceOverride() : {}; - - const textmateService = activationConfig.enableTextmateService ? getTextmateServiceOverride() : {}; - const tokenClassificationService = activationConfig.enableTokenClassificationService ? getTokenClassificationServiceOverride() : {}; - let languageConfigurationService; - let languagesService; - - // tokenClassificationService requires languagesService and languageConfigurationService - if (activationConfig.enableTokenClassificationService) { - languagesService = getLanguagesServiceOverride(); - languageConfigurationService = getLanguageConfigurationServiceOverride(); - } else { - languagesService = activationConfig.enableLanguagesService ? getLanguagesServiceOverride() : {}; - languageConfigurationService = activationConfig.enableLanguageConfigurationService ? getLanguageConfigurationServiceOverride() : {}; - } - const audioCueService = activationConfig.enableAudioCueService ? getAudioCueServiceOverride() : {}; - // const debugService = activationConfig.enableDebugService ? getDebugServiceOverride() : undefined - const debugService = {}; - - StandaloneServices.initialize({ - ...modelService, - ...getNotificationServiceOverride(), - ...getDialogsServiceOverride(), - ...configurationService, - ...keybindingsService, - ...textmateService, - ...getThemeServiceOverride(), - ...tokenClassificationService, - ...languageConfigurationService, - ...languagesService, - ...audioCueService, - ...debugService - }); - runtimeConfig.activationConfig = activationConfig; const extension = runtimeConfig.extension as IExtensionManifest; const { registerFile: registerExtensionFile } = registerExtension(extension); @@ -107,23 +26,19 @@ export class MonacoVscodeApiWrapper { } } - const themesUrl = new URL(runtimeConfig.activationConfig?.basePath + '/resources/themes', window.location.href).href; - console.log(`Themes are loaded from: ${themesUrl}`); - await loadAllDefaultThemes(themesUrl); - - if (!runtimeConfig.activationConfig.enableKeybindingsService && extension.contributes?.keybindings) { - console.warn('Keybindings are set, but the KeybindingsService was not enabled.'); - extension.contributes.keybindings = []; - } - - this.updateWrapperConfig(runtimeConfig); - - console.log('Init of VscodeApiConfig was completed.'); + return this.updateWrapperConfig(runtimeConfig) + .then(() => { + console.log('Init of VscodeApiConfig was completed.'); + return Promise.resolve(); + }) + .catch(e => { + return Promise.reject(e); + }); } async updateWrapperConfig(runtimeConfig: MonacoVscodeApiWrapperConfig) { - if (runtimeConfig.activationConfig.enableConfigurationService && runtimeConfig.userConfiguration) { - void vscodeUpdateUserConfiguration(runtimeConfig.userConfiguration); + if (runtimeConfig.userConfiguration) { + return updateUserConfiguration(runtimeConfig.userConfiguration); } } diff --git a/packages/monaco-editor-wrapper/src/wrapper.ts b/packages/monaco-editor-wrapper/src/wrapper.ts index 66ed651..105ce16 100644 --- a/packages/monaco-editor-wrapper/src/wrapper.ts +++ b/packages/monaco-editor-wrapper/src/wrapper.ts @@ -2,7 +2,7 @@ import 'monaco-editor/esm/vs/editor/edcore.main.js'; import { editor, Uri } from 'monaco-editor/esm/vs/editor/editor.api.js'; -import { MonacoLanguageClient, MonacoServices } from 'monaco-languageclient'; +import { InitializeServiceConfig, initServices, MonacoLanguageClient } from 'monaco-languageclient'; import { toSocket, WebSocketMessageReader, WebSocketMessageWriter } from 'vscode-ws-jsonrpc'; import { BrowserMessageReader, BrowserMessageWriter } from 'vscode-languageserver-protocol/browser.js'; import { CloseAction, ErrorAction, MessageTransports } from 'vscode-languageclient/lib/common/client.js'; @@ -48,6 +48,7 @@ export type UserConfig = { id?: string; htmlElement: HTMLElement; wrapperConfig: { + serviceConfig?: InitializeServiceConfig; useVscodeConfig: boolean; monacoVscodeApiConfig?: MonacoVscodeApiWrapperConfig; monacoEditorConfig?: MonacoEditorWrapperConfig; @@ -60,6 +61,7 @@ export type RuntimeConfig = { id: string; htmlElement: HTMLElement; wrapperConfig: { + serviceConfig?: InitializeServiceConfig; useVscodeConfig: boolean; monacoVscodeApiConfig?: MonacoVscodeApiWrapperConfig; monacoEditorConfig?: MonacoEditorWrapperConfig; @@ -82,7 +84,7 @@ export class MonacoEditorLanguageClientWrapper { private userConfig: UserConfig; private runtimeConfig: RuntimeConfig; - init(userConfig: UserConfig): MonacoEditorLanguageClientWrapper { + async init(userConfig: UserConfig) { this.userConfig = userConfig; if (userConfig.editorConfig.useDiffEditor) { if (!userConfig.editorConfig.codeOriginal) { @@ -132,34 +134,37 @@ export class MonacoEditorLanguageClientWrapper { if (userConfig.languageClientConfig.webSocketConfigOptions) { this.runtimeConfig.languageClientConfig.webSocketConfigOptions = userConfig.languageClientConfig.webSocketConfigOptions; } else { - throw new Error('webSocketConfigOptions were not provided. Aborting...'); + return Promise.reject(new Error('webSocketConfigOptions were not provided. Aborting...')); } } else { if (userConfig.languageClientConfig.workerConfigOptions) { this.runtimeConfig.languageClientConfig.workerConfigOptions = userConfig.languageClientConfig.workerConfigOptions; } else { - throw new Error('workerConfigOptions were not provided. Aborting...'); + return Promise.reject(new Error('workerConfigOptions were not provided. Aborting...')); } } } - if (this.runtimeConfig.wrapperConfig.useVscodeConfig) { - if (userConfig.wrapperConfig.monacoVscodeApiConfig) { - this.runtimeConfig.wrapperConfig.monacoVscodeApiConfig = userConfig.wrapperConfig.monacoVscodeApiConfig; - this.monacoVscodeApiWrapper.init(this.runtimeConfig.wrapperConfig.monacoVscodeApiConfig); - } else { - throw new Error('monacoVscodeApiConfig was not provided. Aborting...'); - } - } else { - if (userConfig.wrapperConfig.monacoEditorConfig) { - this.runtimeConfig.wrapperConfig.monacoEditorConfig = userConfig.wrapperConfig.monacoEditorConfig; - } else { - this.runtimeConfig.wrapperConfig.monacoEditorConfig = {}; - } - this.monacoEditorWrapper.init(this.runtimeConfig.editorConfig, this.runtimeConfig.wrapperConfig.monacoEditorConfig); - } + await initServices(userConfig.wrapperConfig.serviceConfig) + .then(() => { + if (this.runtimeConfig.wrapperConfig.useVscodeConfig) { + if (userConfig.wrapperConfig.monacoVscodeApiConfig) { + this.runtimeConfig.wrapperConfig.monacoVscodeApiConfig = userConfig.wrapperConfig.monacoVscodeApiConfig; + return this.monacoVscodeApiWrapper.init(this.runtimeConfig.wrapperConfig.monacoVscodeApiConfig); + } else { + return Promise.reject(new Error('monacoVscodeApiConfig was not provided. Aborting...')); + } + } else { + if (userConfig.wrapperConfig.monacoEditorConfig) { + this.runtimeConfig.wrapperConfig.monacoEditorConfig = userConfig.wrapperConfig.monacoEditorConfig; + } else { + this.runtimeConfig.wrapperConfig.monacoEditorConfig = {}; + } + return this.monacoEditorWrapper.init(this.runtimeConfig.editorConfig, this.runtimeConfig.wrapperConfig.monacoEditorConfig); + } + }); - return this; + return Promise.resolve(); } getUserConfig() { @@ -241,8 +246,7 @@ export class MonacoEditorLanguageClientWrapper { const lcc = this.runtimeConfig.languageClientConfig; if (lcc.enabled) { - console.log('Enabling monaco-languageclient'); - this.installMonaco(); + console.log('Starting monaco-languageclient'); return this.startLanguageClientConnection(lcc); } else { return Promise.resolve('All fine. monaco-languageclient is not used.'); @@ -392,18 +396,6 @@ export class MonacoEditorLanguageClientWrapper { } } - private installMonaco() { - // install Monaco language client services - try { - MonacoServices.get(); - } - catch (e: unknown) { - // install only if services are not yet available (exception will happen only then) - MonacoServices.install(); - console.log(`Component (${this.runtimeConfig.id}): Installed MonacoServices`); - } - } - private startLanguageClientConnection(languageClientConfig: LanguageClientConfig): Promise { if (this.languageClient && this.languageClient.isRunning()) { return Promise.resolve('monaco-languageclient already running!');