monaco-languageclient 10.0.0-next.1 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -3
- package/README.md +98 -34
- package/lib/editorApp/config.d.ts +0 -2
- package/lib/editorApp/config.d.ts.map +1 -1
- package/lib/editorApp/config.js +0 -1
- package/lib/editorApp/config.js.map +1 -1
- package/lib/editorApp/editorApp.d.ts +0 -1
- package/lib/editorApp/editorApp.d.ts.map +1 -1
- package/lib/editorApp/editorApp.js +0 -5
- package/lib/editorApp/editorApp.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/lib/vscode/apiWrapper.d.ts +17 -5
- package/lib/vscode/apiWrapper.d.ts.map +1 -1
- package/lib/vscode/apiWrapper.js +46 -27
- package/lib/vscode/apiWrapper.js.map +1 -1
- package/lib/vscode/config.d.ts +8 -6
- package/lib/vscode/config.d.ts.map +1 -1
- package/lib/vscode/utils.d.ts.map +1 -1
- package/lib/vscode/utils.js +3 -4
- package/lib/vscode/utils.js.map +1 -1
- package/lib/wrapper/lcconfig.d.ts +3 -3
- package/lib/wrapper/lcconfig.d.ts.map +1 -1
- package/lib/wrapper/lcmanager.d.ts +2 -1
- package/lib/wrapper/lcmanager.d.ts.map +1 -1
- package/lib/wrapper/lcmanager.js +20 -16
- package/lib/wrapper/lcmanager.js.map +1 -1
- package/lib/wrapper/lcwrapper.d.ts +1 -1
- package/lib/wrapper/lcwrapper.d.ts.map +1 -1
- package/lib/wrapper/lcwrapper.js +9 -8
- package/lib/wrapper/lcwrapper.js.map +1 -1
- package/package.json +38 -38
- package/src/editorApp/config.ts +0 -2
- package/src/editorApp/editorApp.ts +2 -7
- package/src/index.ts +0 -1
- package/src/vscode/apiWrapper.ts +63 -31
- package/src/vscode/config.ts +12 -7
- package/src/vscode/utils.ts +3 -4
- package/src/wrapper/lcconfig.ts +4 -4
- package/src/wrapper/lcmanager.ts +22 -17
- package/src/wrapper/lcwrapper.ts +9 -8
package/src/vscode/apiWrapper.ts
CHANGED
|
@@ -4,23 +4,32 @@
|
|
|
4
4
|
* ------------------------------------------------------------------------------------------ */
|
|
5
5
|
|
|
6
6
|
import { initialize, LogLevel } from '@codingame/monaco-vscode-api';
|
|
7
|
-
import { ExtensionHostKind,
|
|
7
|
+
import { ExtensionHostKind, getBuiltinExtensions, registerExtension, type IExtensionManifest, type RegisterExtensionResult } from '@codingame/monaco-vscode-api/extensions';
|
|
8
8
|
import { DisposableStore, setUnexpectedErrorHandler } from '@codingame/monaco-vscode-api/monaco';
|
|
9
9
|
import getConfigurationServiceOverride, { initUserConfiguration } from '@codingame/monaco-vscode-configuration-service-override';
|
|
10
|
-
import
|
|
10
|
+
import * as monaco from '@codingame/monaco-vscode-editor-api';
|
|
11
11
|
import getLogServiceOverride from '@codingame/monaco-vscode-log-service-override';
|
|
12
12
|
import getModelServiceOverride from '@codingame/monaco-vscode-model-service-override';
|
|
13
13
|
import { ConsoleLogger, encodeStringOrUrlToDataUrl, type Logger } from 'monaco-languageclient/common';
|
|
14
14
|
import { useWorkerFactory } from 'monaco-languageclient/workerFactory';
|
|
15
15
|
import * as vscode from 'vscode';
|
|
16
16
|
import 'vscode/localExtensionHost';
|
|
17
|
-
import type { ExtensionConfig, MonacoVscodeApiConfig } from './config.js';
|
|
17
|
+
import type { ExtensionConfig, MonacoVscodeApiConfig, ViewsConfig } from './config.js';
|
|
18
18
|
import { configureExtHostWorker, getEnhancedMonacoEnvironment, mergeServices, reportServiceLoading, useOpenEditorStub } from './utils.js';
|
|
19
19
|
|
|
20
|
-
export interface
|
|
20
|
+
export interface ViewsConfigRuntime extends ViewsConfig {
|
|
21
|
+
htmlContainer: HTMLElement;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface MonacoVscodeApiConfigRuntime extends MonacoVscodeApiConfig {
|
|
25
|
+
serviceOverrides: monaco.editor.IEditorOverrideServices;
|
|
26
|
+
logLevel: LogLevel | number;
|
|
27
|
+
viewsConfig: ViewsConfigRuntime;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface StartInstructions {
|
|
21
31
|
caller?: string;
|
|
22
32
|
performServiceConsistencyChecks?: boolean;
|
|
23
|
-
htmlContainer?: HTMLElement | null;
|
|
24
33
|
}
|
|
25
34
|
|
|
26
35
|
export class MonacoVscodeApiWrapper {
|
|
@@ -28,11 +37,20 @@ export class MonacoVscodeApiWrapper {
|
|
|
28
37
|
private logger: Logger = new ConsoleLogger();
|
|
29
38
|
private extensionRegisterResults: Map<string, | RegisterExtensionResult> = new Map();
|
|
30
39
|
private disposableStore: DisposableStore = new DisposableStore();
|
|
31
|
-
private apiConfig:
|
|
40
|
+
private apiConfig: MonacoVscodeApiConfigRuntime;
|
|
32
41
|
|
|
33
42
|
constructor(apiConfig: MonacoVscodeApiConfig) {
|
|
34
|
-
|
|
35
|
-
|
|
43
|
+
const intermediate = {
|
|
44
|
+
...apiConfig,
|
|
45
|
+
serviceOverrides: apiConfig.serviceOverrides ?? {},
|
|
46
|
+
logLevel: apiConfig.logLevel ?? LogLevel.Off,
|
|
47
|
+
};
|
|
48
|
+
if (intermediate.viewsConfig.htmlContainer === 'ReactPlaceholder') {
|
|
49
|
+
// this is temporary and must be overriden at start by react component with
|
|
50
|
+
// correct react dom element
|
|
51
|
+
intermediate.viewsConfig.htmlContainer = document.body;
|
|
52
|
+
}
|
|
53
|
+
this.apiConfig = intermediate as MonacoVscodeApiConfigRuntime;
|
|
36
54
|
this.logger.setLevel(this.apiConfig.logLevel);
|
|
37
55
|
}
|
|
38
56
|
|
|
@@ -48,6 +66,10 @@ export class MonacoVscodeApiWrapper {
|
|
|
48
66
|
return this.apiConfig;
|
|
49
67
|
}
|
|
50
68
|
|
|
69
|
+
getHtmlContainer() {
|
|
70
|
+
return this.apiConfig.viewsConfig.htmlContainer;
|
|
71
|
+
}
|
|
72
|
+
|
|
51
73
|
protected configureMonacoWorkers() {
|
|
52
74
|
if (typeof this.apiConfig.monacoWorkerFactory === 'function') {
|
|
53
75
|
this.apiConfig.monacoWorkerFactory(this.logger);
|
|
@@ -62,7 +84,9 @@ export class MonacoVscodeApiWrapper {
|
|
|
62
84
|
if (this.apiConfig.$type === 'extended') {
|
|
63
85
|
const getTextmateServiceOverride = (await import('@codingame/monaco-vscode-textmate-service-override')).default;
|
|
64
86
|
const getThemeServiceOverride = (await import('@codingame/monaco-vscode-theme-service-override')).default;
|
|
87
|
+
const getLanguagesServiceOverride = (await import('@codingame/monaco-vscode-languages-service-override')).default;
|
|
65
88
|
mergeServices(this.apiConfig.serviceOverrides, {
|
|
89
|
+
...getLanguagesServiceOverride(),
|
|
66
90
|
...getTextmateServiceOverride(),
|
|
67
91
|
...getThemeServiceOverride()
|
|
68
92
|
});
|
|
@@ -75,19 +99,19 @@ export class MonacoVscodeApiWrapper {
|
|
|
75
99
|
}
|
|
76
100
|
|
|
77
101
|
protected async configureViewsServices() {
|
|
78
|
-
const
|
|
79
|
-
if (this.apiConfig.$type === 'classic' && (
|
|
80
|
-
throw new Error(`View Service Type "${
|
|
102
|
+
const viewsConfigType = this.apiConfig.viewsConfig.$type;
|
|
103
|
+
if (this.apiConfig.$type === 'classic' && (viewsConfigType === 'ViewsService' || viewsConfigType === 'WorkspaceService')) {
|
|
104
|
+
throw new Error(`View Service Type "${viewsConfigType}" cannot be used with classic configuration.`);
|
|
81
105
|
}
|
|
82
106
|
|
|
83
107
|
const envEnhanced = getEnhancedMonacoEnvironment();
|
|
84
|
-
if (
|
|
108
|
+
if (viewsConfigType === 'ViewsService') {
|
|
85
109
|
const getViewsServiceOverride = (await import('@codingame/monaco-vscode-views-service-override')).default;
|
|
86
110
|
mergeServices(this.apiConfig.serviceOverrides, {
|
|
87
111
|
...getViewsServiceOverride(this.apiConfig.viewsConfig.openEditorFunc ?? useOpenEditorStub)
|
|
88
112
|
});
|
|
89
113
|
envEnhanced.viewServiceType = 'ViewsService';
|
|
90
|
-
} else if (
|
|
114
|
+
} else if (viewsConfigType === 'WorkspaceService') {
|
|
91
115
|
const getWorkbenchServiceOverride = (await import('@codingame/monaco-vscode-workbench-service-override')).default;
|
|
92
116
|
mergeServices(this.apiConfig.serviceOverrides, {
|
|
93
117
|
...getWorkbenchServiceOverride()
|
|
@@ -96,15 +120,15 @@ export class MonacoVscodeApiWrapper {
|
|
|
96
120
|
} else {
|
|
97
121
|
const getEditorServiceOverride = (await import('@codingame/monaco-vscode-editor-service-override')).default;
|
|
98
122
|
mergeServices(this.apiConfig.serviceOverrides, {
|
|
99
|
-
...getEditorServiceOverride(this.apiConfig.viewsConfig
|
|
123
|
+
...getEditorServiceOverride(this.apiConfig.viewsConfig.openEditorFunc ?? useOpenEditorStub)
|
|
100
124
|
});
|
|
101
125
|
envEnhanced.viewServiceType = 'EditorService';
|
|
102
126
|
}
|
|
103
127
|
}
|
|
104
128
|
|
|
105
129
|
protected async applyViewsPostConfig() {
|
|
106
|
-
this.apiConfig.viewsConfig
|
|
107
|
-
await this.apiConfig.viewsConfig
|
|
130
|
+
this.apiConfig.viewsConfig.htmlAugmentationInstructions?.(this.apiConfig.viewsConfig.htmlContainer);
|
|
131
|
+
await this.apiConfig.viewsConfig.viewsInitFunc?.();
|
|
108
132
|
}
|
|
109
133
|
|
|
110
134
|
/**
|
|
@@ -169,7 +193,6 @@ export class MonacoVscodeApiWrapper {
|
|
|
169
193
|
protected async supplyRequiredServices() {
|
|
170
194
|
return {
|
|
171
195
|
...getConfigurationServiceOverride(),
|
|
172
|
-
...getLanguagesServiceOverride(),
|
|
173
196
|
...getLogServiceOverride(),
|
|
174
197
|
...getModelServiceOverride()
|
|
175
198
|
};
|
|
@@ -204,8 +227,9 @@ export class MonacoVscodeApiWrapper {
|
|
|
204
227
|
* - languages
|
|
205
228
|
* - log
|
|
206
229
|
* - model
|
|
230
|
+
* - configuration services
|
|
207
231
|
*/
|
|
208
|
-
protected async
|
|
232
|
+
protected async initAllServices(performServiceConsistencyChecks?: boolean) {
|
|
209
233
|
const services = await this.supplyRequiredServices();
|
|
210
234
|
|
|
211
235
|
mergeServices(services, this.apiConfig.serviceOverrides);
|
|
@@ -213,12 +237,12 @@ export class MonacoVscodeApiWrapper {
|
|
|
213
237
|
|
|
214
238
|
reportServiceLoading(services, this.logger);
|
|
215
239
|
|
|
216
|
-
if (
|
|
240
|
+
if (performServiceConsistencyChecks ?? true) {
|
|
217
241
|
this.checkServiceConsistency();
|
|
218
242
|
}
|
|
219
243
|
|
|
220
|
-
if (this.apiConfig.viewsConfig
|
|
221
|
-
await initialize(services, this.apiConfig.htmlContainer, this.apiConfig.workspaceConfig, this.apiConfig.envOptions);
|
|
244
|
+
if (this.apiConfig.viewsConfig.$type === 'ViewsService' || this.apiConfig.viewsConfig.$type === 'WorkspaceService') {
|
|
245
|
+
await initialize(services, this.apiConfig.viewsConfig.htmlContainer, this.apiConfig.workspaceConfig, this.apiConfig.envOptions);
|
|
222
246
|
} else {
|
|
223
247
|
await initialize(services, undefined, this.apiConfig.workspaceConfig, this.apiConfig.envOptions);
|
|
224
248
|
}
|
|
@@ -237,7 +261,7 @@ export class MonacoVscodeApiWrapper {
|
|
|
237
261
|
if (this.apiConfig.extensions) {
|
|
238
262
|
const allPromises: Array<Promise<void>> = [];
|
|
239
263
|
const extensionIds: string[] = [];
|
|
240
|
-
|
|
264
|
+
getBuiltinExtensions().forEach((ext) => {
|
|
241
265
|
extensionIds.push(ext.identifier.id);
|
|
242
266
|
});
|
|
243
267
|
for (const extensionConfig of extensions ?? []) {
|
|
@@ -276,33 +300,41 @@ export class MonacoVscodeApiWrapper {
|
|
|
276
300
|
|
|
277
301
|
protected markGlobalInitDone() {
|
|
278
302
|
const envEnhanced = getEnhancedMonacoEnvironment();
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
303
|
+
envEnhanced.vscodeApiGlobalInitResolve?.();
|
|
304
|
+
|
|
282
305
|
envEnhanced.vscodeApiInitialised = true;
|
|
283
306
|
envEnhanced.vscodeApiGlobalInitAwait = undefined;
|
|
284
307
|
envEnhanced.vscodeApiGlobalInitResolve = undefined;
|
|
285
308
|
this.logger.debug('markGlobalInitDone');
|
|
286
309
|
}
|
|
287
310
|
|
|
288
|
-
|
|
311
|
+
overrideViewsConfig(viewsConfigOverride: ViewsConfigRuntime) {
|
|
312
|
+
const orgViewsConfig = this.apiConfig.viewsConfig;
|
|
313
|
+
this.apiConfig.viewsConfig = {
|
|
314
|
+
$type: viewsConfigOverride.$type,
|
|
315
|
+
htmlContainer: viewsConfigOverride.htmlContainer,
|
|
316
|
+
htmlAugmentationInstructions: viewsConfigOverride.htmlAugmentationInstructions ?? orgViewsConfig.htmlAugmentationInstructions,
|
|
317
|
+
openEditorFunc: viewsConfigOverride.openEditorFunc ?? orgViewsConfig.openEditorFunc,
|
|
318
|
+
viewsInitFunc: viewsConfigOverride.viewsInitFunc ?? orgViewsConfig.viewsInitFunc
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
async start(startInstructions?: StartInstructions): Promise<void> {
|
|
289
323
|
const envEnhanced = getEnhancedMonacoEnvironment();
|
|
290
324
|
if (envEnhanced.vscodeApiInitialised === true) {
|
|
291
325
|
this.logger.warn('Initialization of monaco-vscode api can only performed once!');
|
|
292
326
|
} else {
|
|
293
327
|
if (!(envEnhanced.vscodeApiInitialising === true)) {
|
|
328
|
+
|
|
294
329
|
envEnhanced.vscodeApiInitialising = true;
|
|
295
330
|
this.markGlobalInit();
|
|
296
|
-
if (instructions?.htmlContainer !== undefined && instructions.htmlContainer !== null) {
|
|
297
|
-
this.apiConfig.htmlContainer = instructions.htmlContainer;
|
|
298
|
-
}
|
|
299
331
|
|
|
300
332
|
// ensures "vscodeApiConfig.workspaceConfig" is available
|
|
301
333
|
this.configureWorkspaceConfig();
|
|
302
334
|
|
|
303
335
|
// ensure logging and development logging options are in-line
|
|
304
336
|
this.configureDevLogLevel();
|
|
305
|
-
this.logger.info(`Initializing monaco-vscode api. Caller: ${
|
|
337
|
+
this.logger.info(`Initializing monaco-vscode api. Caller: ${startInstructions?.caller ?? 'unknown'}`);
|
|
306
338
|
|
|
307
339
|
await this.configureMonacoWorkers();
|
|
308
340
|
|
|
@@ -317,7 +349,7 @@ export class MonacoVscodeApiWrapper {
|
|
|
317
349
|
|
|
318
350
|
await this.initUserConfiguration();
|
|
319
351
|
|
|
320
|
-
await this.
|
|
352
|
+
await this.initAllServices(startInstructions?.performServiceConsistencyChecks);
|
|
321
353
|
|
|
322
354
|
await this.applyViewsPostConfig();
|
|
323
355
|
|
package/src/vscode/config.ts
CHANGED
|
@@ -11,21 +11,27 @@ import type { EnvironmentOverride } from '@codingame/monaco-vscode-api/workbench
|
|
|
11
11
|
import type { OpenEditor } from '@codingame/monaco-vscode-editor-service-override';
|
|
12
12
|
import type { Logger } from 'monaco-languageclient/common';
|
|
13
13
|
|
|
14
|
+
export type OverallConfigType = 'extended' | 'classic';
|
|
15
|
+
|
|
16
|
+
export type ViewsConfigTypes = 'EditorService' | 'ViewsService' | 'WorkspaceService';
|
|
17
|
+
|
|
18
|
+
export type HtmlContainerConfig = HTMLElement | 'ReactPlaceholder';
|
|
19
|
+
|
|
14
20
|
export interface MonacoEnvironmentEnhanced extends monaco.Environment {
|
|
15
21
|
vscodeApiInitialising?: boolean;
|
|
16
22
|
vscodeApiInitialised?: boolean;
|
|
17
23
|
vscodeApiGlobalInitAwait?: Promise<void>;
|
|
18
24
|
vscodeApiGlobalInitResolve?: ((value: void | PromiseLike<void>) => void);
|
|
19
|
-
viewServiceType?:
|
|
25
|
+
viewServiceType?: ViewsConfigTypes;
|
|
20
26
|
}
|
|
21
27
|
|
|
22
|
-
export type OverallConfigType = 'extended' | 'classic';
|
|
23
|
-
|
|
24
28
|
export interface UserConfiguration {
|
|
25
29
|
json?: string;
|
|
26
30
|
}
|
|
31
|
+
|
|
27
32
|
export interface ViewsConfig {
|
|
28
|
-
|
|
33
|
+
$type: ViewsConfigTypes;
|
|
34
|
+
htmlContainer: HtmlContainerConfig;
|
|
29
35
|
openEditorFunc?: OpenEditor;
|
|
30
36
|
htmlAugmentationInstructions?: (htmlContainer: HTMLElement | null | undefined) => void;
|
|
31
37
|
viewsInitFunc?: () => Promise<void>;
|
|
@@ -38,12 +44,11 @@ export interface ExtensionConfig {
|
|
|
38
44
|
|
|
39
45
|
export interface MonacoVscodeApiConfig {
|
|
40
46
|
$type: OverallConfigType;
|
|
41
|
-
|
|
42
|
-
serviceOverrides
|
|
47
|
+
viewsConfig: ViewsConfig,
|
|
48
|
+
serviceOverrides?: monaco.editor.IEditorOverrideServices;
|
|
43
49
|
logLevel?: LogLevel | number;
|
|
44
50
|
workspaceConfig?: IWorkbenchConstructionOptions;
|
|
45
51
|
userConfiguration?: UserConfiguration;
|
|
46
|
-
viewsConfig?: ViewsConfig,
|
|
47
52
|
envOptions?: EnvironmentOverride;
|
|
48
53
|
extensions?: ExtensionConfig[];
|
|
49
54
|
monacoWorkerFactory?: (logger?: Logger) => void;
|
package/src/vscode/utils.ts
CHANGED
|
@@ -12,11 +12,10 @@ import { FakeWorker as Worker } from 'monaco-languageclient/workerFactory';
|
|
|
12
12
|
import type { MonacoEnvironmentEnhanced } from './config.js';
|
|
13
13
|
|
|
14
14
|
export const getEnhancedMonacoEnvironment = (): MonacoEnvironmentEnhanced => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
monWin.MonacoEnvironment = {};
|
|
15
|
+
if (typeof MonacoEnvironment === 'undefined') {
|
|
16
|
+
globalThis.MonacoEnvironment = {};
|
|
18
17
|
}
|
|
19
|
-
const envEnhanced =
|
|
18
|
+
const envEnhanced = MonacoEnvironment as MonacoEnvironmentEnhanced;
|
|
20
19
|
if (envEnhanced.vscodeApiInitialising === undefined) {
|
|
21
20
|
envEnhanced.vscodeApiInitialising = false;
|
|
22
21
|
}
|
package/src/wrapper/lcconfig.ts
CHANGED
|
@@ -12,11 +12,13 @@ export interface ConnectionConfig {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export interface LanguageClientConfig {
|
|
15
|
-
|
|
15
|
+
languageId: string;
|
|
16
16
|
connection: ConnectionConfig;
|
|
17
17
|
clientOptions: LanguageClientOptions;
|
|
18
18
|
restartOptions?: LanguageClientRestartOptions;
|
|
19
19
|
disposeWorker?: boolean;
|
|
20
|
+
overwriteExisting?: boolean;
|
|
21
|
+
enforceDispose?: boolean;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
export interface LanguageClientRestartOptions {
|
|
@@ -26,7 +28,5 @@ export interface LanguageClientRestartOptions {
|
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
export interface LanguageClientConfigs {
|
|
29
|
-
configs: Record<string, LanguageClientConfig
|
|
30
|
-
overwriteExisting?: boolean;
|
|
31
|
-
enforceDispose?: boolean;
|
|
31
|
+
configs: Record<string, LanguageClientConfig>;
|
|
32
32
|
}
|
package/src/wrapper/lcmanager.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* ------------------------------------------------------------------------------------------ */
|
|
5
5
|
|
|
6
6
|
import type { Logger } from 'monaco-languageclient/common';
|
|
7
|
-
import type { LanguageClientConfigs } from './lcconfig.js';
|
|
7
|
+
import type { LanguageClientConfig, LanguageClientConfigs } from './lcconfig.js';
|
|
8
8
|
import { LanguageClientWrapper } from './lcwrapper.js';
|
|
9
9
|
|
|
10
10
|
export class LanguageClientsManager {
|
|
@@ -33,25 +33,30 @@ export class LanguageClientsManager {
|
|
|
33
33
|
return this.languageClientWrappers.get(languageId)?.getWorker();
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
async setConfig(languageClientConfig: LanguageClientConfig): Promise<void> {
|
|
37
|
+
const languageId = languageClientConfig.languageId;
|
|
38
|
+
const current = this.languageClientWrappers.get(languageId);
|
|
39
|
+
const lcw = new LanguageClientWrapper(languageClientConfig, this.logger);
|
|
40
|
+
|
|
41
|
+
if (current !== undefined) {
|
|
42
|
+
if (languageClientConfig.overwriteExisting === true) {
|
|
43
|
+
if (languageClientConfig.enforceDispose === true) {
|
|
44
|
+
await current.dispose();
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
throw new Error(`A languageclient config with id "${languageId}" already exists and you confiured to not override.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
this.languageClientWrappers.set(languageId, lcw);
|
|
51
|
+
}
|
|
52
|
+
|
|
36
53
|
async setConfigs(languageClientConfigs: LanguageClientConfigs): Promise<void> {
|
|
37
54
|
this.languageClientConfigs = languageClientConfigs;
|
|
38
55
|
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
-
for (const
|
|
42
|
-
|
|
43
|
-
const lcw = new LanguageClientWrapper(lcc, this.logger);
|
|
44
|
-
|
|
45
|
-
if (current !== undefined) {
|
|
46
|
-
if (languageClientConfigs.overwriteExisting === true) {
|
|
47
|
-
if (languageClientConfigs.enforceDispose === true) {
|
|
48
|
-
await current.dispose();
|
|
49
|
-
}
|
|
50
|
-
} else {
|
|
51
|
-
throw new Error(`A languageclient config with id "${languageId}" already exists and you confiured to not override.`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
this.languageClientWrappers.set(languageId, lcw);
|
|
56
|
+
const lccs = Object.values(this.languageClientConfigs.configs);
|
|
57
|
+
if (lccs.length > 0) {
|
|
58
|
+
for (const lcc of lccs) {
|
|
59
|
+
await this.setConfig(lcc);
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
62
|
}
|
package/src/wrapper/lcwrapper.ts
CHANGED
|
@@ -21,12 +21,12 @@ export class LanguageClientWrapper {
|
|
|
21
21
|
private languageClientConfig: LanguageClientConfig;
|
|
22
22
|
private worker?: Worker;
|
|
23
23
|
private port?: MessagePort;
|
|
24
|
-
private
|
|
24
|
+
private languageId: string;
|
|
25
25
|
private logger: Logger | undefined;
|
|
26
26
|
|
|
27
27
|
constructor(config: LanguageClientConfig, logger?: Logger) {
|
|
28
28
|
this.languageClientConfig = config;
|
|
29
|
-
this.
|
|
29
|
+
this.languageId = this.languageClientConfig.languageId;
|
|
30
30
|
this.logger = logger;
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -102,7 +102,7 @@ export class LanguageClientWrapper {
|
|
|
102
102
|
};
|
|
103
103
|
webSocket.onerror = (ev: Event) => {
|
|
104
104
|
const languageClientError: LanguageClientError = {
|
|
105
|
-
message: `languageClientWrapper (${this.
|
|
105
|
+
message: `languageClientWrapper (${this.languageId}): Websocket connection failed.`,
|
|
106
106
|
error: (ev as ErrorEvent).error ?? 'No error was provided.'
|
|
107
107
|
};
|
|
108
108
|
reject(languageClientError);
|
|
@@ -120,7 +120,7 @@ export class LanguageClientWrapper {
|
|
|
120
120
|
|
|
121
121
|
this.worker.onerror = (ev) => {
|
|
122
122
|
const languageClientError: LanguageClientError = {
|
|
123
|
-
message: `languageClientWrapper (${this.
|
|
123
|
+
message: `languageClientWrapper (${this.languageId}): Illegal worker configuration detected.`,
|
|
124
124
|
error: ev.error ?? 'No error was provided.'
|
|
125
125
|
};
|
|
126
126
|
reject(languageClientError);
|
|
@@ -155,7 +155,8 @@ export class LanguageClientWrapper {
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
const mlcConfig = {
|
|
158
|
-
|
|
158
|
+
id: this.languageClientConfig.languageId,
|
|
159
|
+
name: 'Monaco Wrapper Language Client',
|
|
159
160
|
clientOptions: {
|
|
160
161
|
// disable the default error handler...
|
|
161
162
|
errorHandler: {
|
|
@@ -205,12 +206,12 @@ export class LanguageClientWrapper {
|
|
|
205
206
|
}
|
|
206
207
|
} catch (e: unknown) {
|
|
207
208
|
const languageClientError: LanguageClientError = {
|
|
208
|
-
message: `languageClientWrapper (${this.
|
|
209
|
+
message: `languageClientWrapper (${this.languageId}): Start was unsuccessful.`,
|
|
209
210
|
error: Object.hasOwn(e ?? {}, 'cause') ? (e as Error) : 'No error was provided.'
|
|
210
211
|
};
|
|
211
212
|
reject(languageClientError);
|
|
212
213
|
}
|
|
213
|
-
this.logger?.info(`languageClientWrapper (${this.
|
|
214
|
+
this.logger?.info(`languageClientWrapper (${this.languageId}): Started successfully.`);
|
|
214
215
|
resolve();
|
|
215
216
|
starting = false;
|
|
216
217
|
}
|
|
@@ -258,7 +259,7 @@ export class LanguageClientWrapper {
|
|
|
258
259
|
}
|
|
259
260
|
} catch (e) {
|
|
260
261
|
const languageClientError: LanguageClientError = {
|
|
261
|
-
message: `languageClientWrapper (${this.
|
|
262
|
+
message: `languageClientWrapper (${this.languageId}): Disposing the monaco-languageclient resulted in error.`,
|
|
262
263
|
error: Object.hasOwn(e ?? {}, 'cause') ? (e as Error) : 'No error was provided.'
|
|
263
264
|
};
|
|
264
265
|
return Promise.reject(languageClientError);
|