monaco-languageclient 9.7.1 → 10.0.0-next.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 +9 -0
- package/lib/{commonTypes.d.ts → common/commonTypes.d.ts} +2 -2
- package/lib/common/commonTypes.d.ts.map +1 -0
- package/lib/common/commonTypes.js +6 -0
- package/lib/common/commonTypes.js.map +1 -0
- package/lib/common/index.d.ts +4 -0
- package/lib/common/index.d.ts.map +1 -0
- package/lib/{tools → common}/index.js +1 -0
- package/lib/common/index.js.map +1 -0
- package/lib/common/logging.d.ts.map +1 -0
- package/lib/common/logging.js.map +1 -0
- package/lib/common/utils.d.ts +5 -0
- package/lib/common/utils.d.ts.map +1 -0
- package/lib/{tools → common}/utils.js +14 -0
- package/lib/common/utils.js.map +1 -0
- package/lib/editorApp/config.d.ts +55 -0
- package/lib/editorApp/config.d.ts.map +1 -0
- package/lib/editorApp/config.js +13 -0
- package/lib/editorApp/config.js.map +1 -0
- package/lib/editorApp/editorApp.d.ts +66 -0
- package/lib/editorApp/editorApp.d.ts.map +1 -0
- package/lib/editorApp/editorApp.js +404 -0
- package/lib/editorApp/editorApp.js.map +1 -0
- package/lib/editorApp/index.d.ts +3 -0
- package/lib/editorApp/index.d.ts.map +1 -0
- package/lib/editorApp/index.js +7 -0
- package/lib/editorApp/index.js.map +1 -0
- package/lib/fs/definitions.d.ts +1 -1
- package/lib/fs/definitions.d.ts.map +1 -1
- package/lib/fs/endpoints/defaultEndpoint.d.ts +1 -1
- package/lib/fs/endpoints/defaultEndpoint.d.ts.map +1 -1
- package/lib/index.d.ts +15 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +18 -2
- package/lib/index.js.map +1 -1
- package/lib/vscode/apiWrapper.d.ts +59 -0
- package/lib/vscode/apiWrapper.d.ts.map +1 -0
- package/lib/vscode/apiWrapper.js +290 -0
- package/lib/vscode/apiWrapper.js.map +1 -0
- package/lib/vscode/config.d.ts +46 -0
- package/lib/vscode/config.d.ts.map +1 -0
- package/lib/vscode/config.js +7 -0
- package/lib/vscode/config.js.map +1 -0
- package/lib/vscode/index.d.ts +4 -2
- package/lib/vscode/index.d.ts.map +1 -1
- package/lib/vscode/index.js +4 -2
- package/lib/vscode/index.js.map +1 -1
- package/lib/vscode/locales.d.ts +5 -0
- package/lib/vscode/locales.d.ts.map +1 -0
- package/lib/vscode/locales.js +124 -0
- package/lib/vscode/locales.js.map +1 -0
- package/lib/vscode/utils.d.ts +13 -0
- package/lib/vscode/utils.d.ts.map +1 -0
- package/lib/vscode/utils.js +56 -0
- package/lib/vscode/utils.js.map +1 -0
- package/lib/vscode/viewsService.d.ts +4 -0
- package/lib/vscode/viewsService.d.ts.map +1 -0
- package/lib/vscode/viewsService.js +67 -0
- package/lib/vscode/viewsService.js.map +1 -0
- package/lib/{vscode → worker}/fakeWorker.d.ts.map +1 -1
- package/lib/{vscode → worker}/fakeWorker.js.map +1 -1
- package/lib/worker/index.d.ts +4 -0
- package/lib/worker/index.d.ts.map +1 -0
- package/lib/worker/index.js +8 -0
- package/lib/worker/index.js.map +1 -0
- package/lib/{workerFactory.d.ts → worker/workerFactory.d.ts} +1 -1
- package/lib/worker/workerFactory.d.ts.map +1 -0
- package/lib/{workerFactory.js → worker/workerFactory.js} +1 -1
- package/lib/worker/workerFactory.js.map +1 -0
- package/lib/worker/workerLoaders.d.ts +5 -0
- package/lib/worker/workerLoaders.d.ts.map +1 -0
- package/lib/worker/workerLoaders.js +26 -0
- package/lib/worker/workerLoaders.js.map +1 -0
- package/lib/wrapper/index.d.ts +4 -0
- package/lib/wrapper/index.d.ts.map +1 -0
- package/lib/wrapper/index.js +8 -0
- package/lib/wrapper/index.js.map +1 -0
- package/lib/wrapper/lcconfig.d.ts +24 -0
- package/lib/wrapper/lcconfig.d.ts.map +1 -0
- package/lib/wrapper/lcconfig.js +6 -0
- package/lib/wrapper/lcconfig.js.map +1 -0
- package/lib/wrapper/lcmanager.d.ts +18 -0
- package/lib/wrapper/lcmanager.d.ts.map +1 -0
- package/lib/wrapper/lcmanager.js +75 -0
- package/lib/wrapper/lcmanager.js.map +1 -0
- package/lib/wrapper/lcwrapper.d.ts +37 -0
- package/lib/wrapper/lcwrapper.d.ts.map +1 -0
- package/lib/wrapper/lcwrapper.js +247 -0
- package/lib/wrapper/lcwrapper.js.map +1 -0
- package/package.json +70 -28
- package/src/{commonTypes.ts → common/commonTypes.ts} +2 -2
- package/src/{tools → common}/index.ts +1 -0
- package/src/{tools → common}/utils.ts +16 -1
- package/src/editorApp/config.ts +67 -0
- package/src/editorApp/editorApp.ts +458 -0
- package/{lib/commonTypes.js → src/editorApp/index.ts} +3 -2
- package/src/fs/definitions.ts +1 -1
- package/src/fs/endpoints/defaultEndpoint.ts +1 -1
- package/src/index.ts +29 -2
- package/src/vscode/apiWrapper.ts +333 -0
- package/src/vscode/config.ts +55 -0
- package/src/vscode/index.ts +4 -2
- package/src/vscode/locales.ts +128 -0
- package/src/vscode/utils.ts +67 -0
- package/src/vscode/viewsService.ts +73 -0
- package/src/worker/index.ts +8 -0
- package/src/{workerFactory.ts → worker/workerFactory.ts} +2 -2
- package/src/worker/workerLoaders.ts +36 -0
- package/src/wrapper/index.ts +8 -0
- package/src/wrapper/lcconfig.ts +32 -0
- package/src/wrapper/lcmanager.ts +89 -0
- package/src/wrapper/lcwrapper.ts +280 -0
- package/lib/client.d.ts +0 -13
- package/lib/client.d.ts.map +0 -1
- package/lib/client.js +0 -16
- package/lib/client.js.map +0 -1
- package/lib/commonTypes.d.ts.map +0 -1
- package/lib/commonTypes.js.map +0 -1
- package/lib/tools/index.d.ts +0 -3
- package/lib/tools/index.d.ts.map +0 -1
- package/lib/tools/index.js.map +0 -1
- package/lib/tools/logging.d.ts.map +0 -1
- package/lib/tools/logging.js.map +0 -1
- package/lib/tools/utils.d.ts +0 -3
- package/lib/tools/utils.d.ts.map +0 -1
- package/lib/tools/utils.js.map +0 -1
- package/lib/vscode/services.d.ts +0 -64
- package/lib/vscode/services.d.ts.map +0 -1
- package/lib/vscode/services.js +0 -192
- package/lib/vscode/services.js.map +0 -1
- package/lib/workerFactory.d.ts.map +0 -1
- package/lib/workerFactory.js.map +0 -1
- package/src/client.ts +0 -26
- package/src/vscode/services.ts +0 -249
- /package/lib/{tools → common}/logging.d.ts +0 -0
- /package/lib/{tools → common}/logging.js +0 -0
- /package/lib/{vscode → worker}/fakeWorker.d.ts +0 -0
- /package/lib/{vscode → worker}/fakeWorker.js +0 -0
- /package/src/{tools → common}/logging.ts +0 -0
- /package/src/{vscode → worker}/fakeWorker.ts +0 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/* --------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) 2024 TypeFox and others.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the package root for license information.
|
|
4
|
+
* ------------------------------------------------------------------------------------------ */
|
|
5
|
+
|
|
6
|
+
import { initialize, LogLevel } from '@codingame/monaco-vscode-api';
|
|
7
|
+
import { ExtensionHostKind, getExtensionManifests, registerExtension, type IExtensionManifest, type RegisterExtensionResult } from '@codingame/monaco-vscode-api/extensions';
|
|
8
|
+
import { DisposableStore, setUnexpectedErrorHandler } from '@codingame/monaco-vscode-api/monaco';
|
|
9
|
+
import getConfigurationServiceOverride, { initUserConfiguration } from '@codingame/monaco-vscode-configuration-service-override';
|
|
10
|
+
import getLanguagesServiceOverride from '@codingame/monaco-vscode-languages-service-override';
|
|
11
|
+
import getLogServiceOverride from '@codingame/monaco-vscode-log-service-override';
|
|
12
|
+
import getModelServiceOverride from '@codingame/monaco-vscode-model-service-override';
|
|
13
|
+
import { ConsoleLogger, verifyUrlOrCreateDataUrl, type Logger } from 'monaco-languageclient/common';
|
|
14
|
+
import { useWorkerFactory } from 'monaco-languageclient/workerFactory';
|
|
15
|
+
import * as vscode from 'vscode';
|
|
16
|
+
import 'vscode/localExtensionHost';
|
|
17
|
+
import type { MonacoVscodeApiConfig } from './config.js';
|
|
18
|
+
import { configureExtHostWorker, getEnhancedMonacoEnvironment, mergeServices, reportServiceLoading, useOpenEditorStub } from './utils.js';
|
|
19
|
+
|
|
20
|
+
export interface InitServicesInstructions {
|
|
21
|
+
caller?: string;
|
|
22
|
+
performServiceConsistencyChecks?: boolean;
|
|
23
|
+
htmlContainer?: HTMLElement | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class MonacoVscodeApiWrapper {
|
|
27
|
+
|
|
28
|
+
private logger: Logger = new ConsoleLogger();
|
|
29
|
+
private extensionRegisterResults: Map<string, | RegisterExtensionResult> = new Map();
|
|
30
|
+
private disposableStore: DisposableStore = new DisposableStore();
|
|
31
|
+
private apiConfig: MonacoVscodeApiConfig;
|
|
32
|
+
|
|
33
|
+
constructor(apiConfig: MonacoVscodeApiConfig) {
|
|
34
|
+
this.apiConfig = apiConfig;
|
|
35
|
+
this.apiConfig.logLevel = this.apiConfig.logLevel ?? LogLevel.Off;
|
|
36
|
+
this.logger.setLevel(this.apiConfig.logLevel);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
getLogger(): Logger {
|
|
40
|
+
return this.logger;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
getExtensionRegisterResult(extensionName: string) {
|
|
44
|
+
return this.extensionRegisterResults.get(extensionName);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
getMonacoVscodeApiConfig(): MonacoVscodeApiConfig {
|
|
48
|
+
return this.apiConfig;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
protected configureMonacoWorkers() {
|
|
52
|
+
if (typeof this.apiConfig.monacoWorkerFactory === 'function') {
|
|
53
|
+
this.apiConfig.monacoWorkerFactory(this.logger);
|
|
54
|
+
} else {
|
|
55
|
+
useWorkerFactory({
|
|
56
|
+
logger: this.logger
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
protected async configureHighlightingServices() {
|
|
62
|
+
if (this.apiConfig.$type === 'extended') {
|
|
63
|
+
const getTextmateServiceOverride = (await import('@codingame/monaco-vscode-textmate-service-override')).default;
|
|
64
|
+
const getThemeServiceOverride = (await import('@codingame/monaco-vscode-theme-service-override')).default;
|
|
65
|
+
mergeServices(this.apiConfig.serviceOverrides, {
|
|
66
|
+
...getTextmateServiceOverride(),
|
|
67
|
+
...getThemeServiceOverride()
|
|
68
|
+
});
|
|
69
|
+
} else {
|
|
70
|
+
const getMonarchServiceOverride = (await import('@codingame/monaco-vscode-monarch-service-override')).default;
|
|
71
|
+
mergeServices(this.apiConfig.serviceOverrides, {
|
|
72
|
+
...getMonarchServiceOverride()
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
protected async configureViewsServices() {
|
|
78
|
+
const viewServiceType = this.apiConfig.viewsConfig?.viewServiceType ?? 'EditorService';
|
|
79
|
+
if (this.apiConfig.$type === 'classic' && (viewServiceType === 'ViewsService' || viewServiceType === 'WorkspaceService')) {
|
|
80
|
+
throw new Error(`View Service Type "${viewServiceType}" cannot be used with classic configuration.`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const envEnhanced = getEnhancedMonacoEnvironment();
|
|
84
|
+
if (this.apiConfig.viewsConfig?.viewServiceType === 'ViewsService') {
|
|
85
|
+
const getViewsServiceOverride = (await import('@codingame/monaco-vscode-views-service-override')).default;
|
|
86
|
+
mergeServices(this.apiConfig.serviceOverrides, {
|
|
87
|
+
...getViewsServiceOverride(this.apiConfig.viewsConfig.openEditorFunc ?? useOpenEditorStub)
|
|
88
|
+
});
|
|
89
|
+
envEnhanced.viewServiceType = 'ViewsService';
|
|
90
|
+
} else if (this.apiConfig.viewsConfig?.viewServiceType === 'WorkspaceService') {
|
|
91
|
+
const getWorkbenchServiceOverride = (await import('@codingame/monaco-vscode-workbench-service-override')).default;
|
|
92
|
+
mergeServices(this.apiConfig.serviceOverrides, {
|
|
93
|
+
...getWorkbenchServiceOverride()
|
|
94
|
+
});
|
|
95
|
+
envEnhanced.viewServiceType = 'WorkspaceService';
|
|
96
|
+
} else {
|
|
97
|
+
const getEditorServiceOverride = (await import('@codingame/monaco-vscode-editor-service-override')).default;
|
|
98
|
+
mergeServices(this.apiConfig.serviceOverrides, {
|
|
99
|
+
...getEditorServiceOverride(this.apiConfig.viewsConfig?.openEditorFunc ?? useOpenEditorStub)
|
|
100
|
+
});
|
|
101
|
+
envEnhanced.viewServiceType = 'EditorService';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
protected async applyViewsPostConfig() {
|
|
106
|
+
this.apiConfig.viewsConfig?.htmlAugmentationInstructions?.(this.apiConfig.htmlContainer);
|
|
107
|
+
await this.apiConfig.viewsConfig?.viewsInitFunc?.();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Adding the default workspace config if not provided
|
|
112
|
+
*/
|
|
113
|
+
protected configureWorkspaceConfig() {
|
|
114
|
+
if (this.apiConfig.workspaceConfig === undefined) {
|
|
115
|
+
this.apiConfig.workspaceConfig = {
|
|
116
|
+
workspaceProvider: {
|
|
117
|
+
trusted: true,
|
|
118
|
+
workspace: {
|
|
119
|
+
workspaceUri: vscode.Uri.file('/workspace.code-workspace')
|
|
120
|
+
},
|
|
121
|
+
async open() {
|
|
122
|
+
window.open(window.location.href);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* set the log-level via the development settings
|
|
132
|
+
*/
|
|
133
|
+
protected configureDevLogLevel() {
|
|
134
|
+
const devLogLevel = this.apiConfig.workspaceConfig?.developmentOptions?.logLevel;
|
|
135
|
+
if (devLogLevel === undefined) {
|
|
136
|
+
|
|
137
|
+
// this needs to be done so complicated, because developmentOptions is read-only
|
|
138
|
+
const devOptions: Record<string, unknown> = {
|
|
139
|
+
...this.apiConfig.workspaceConfig!.developmentOptions
|
|
140
|
+
};
|
|
141
|
+
devOptions.logLevel = this.apiConfig.logLevel;
|
|
142
|
+
(this.apiConfig.workspaceConfig!.developmentOptions as Record<string, unknown>) = Object.assign({}, devOptions);
|
|
143
|
+
} else if (devLogLevel !== this.apiConfig.logLevel) {
|
|
144
|
+
throw new Error(`You have configured mismatching logLevels: ${this.apiConfig.logLevel} (wrapperConfig) ${devLogLevel} (workspaceConfig.developmentOptions)`);
|
|
145
|
+
} else {
|
|
146
|
+
this.logger.debug('Development log level and api log level are in aligned.');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* enable semantic highlighting in the default configuration
|
|
152
|
+
*/
|
|
153
|
+
protected configureSemanticHighlighting() {
|
|
154
|
+
if (this.apiConfig.advanced?.enforceSemanticHighlighting === true) {
|
|
155
|
+
const configDefaults: Record<string, unknown> = {
|
|
156
|
+
...this.apiConfig.workspaceConfig!.configurationDefaults ?? {}
|
|
157
|
+
};
|
|
158
|
+
configDefaults['editor.semanticHighlighting.enabled'] = true;
|
|
159
|
+
(this.apiConfig.workspaceConfig!.configurationDefaults as Record<string, unknown>) = Object.assign({}, configDefaults);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
protected async initUserConfiguration() {
|
|
164
|
+
if (this.apiConfig.userConfiguration?.json !== undefined) {
|
|
165
|
+
await initUserConfiguration(this.apiConfig.userConfiguration.json);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
protected async supplyRequiredServices() {
|
|
170
|
+
return {
|
|
171
|
+
...getConfigurationServiceOverride(),
|
|
172
|
+
...getLanguagesServiceOverride(),
|
|
173
|
+
...getLogServiceOverride(),
|
|
174
|
+
...getModelServiceOverride()
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
protected checkServiceConsistency() {
|
|
179
|
+
const userServices = this.apiConfig.serviceOverrides;
|
|
180
|
+
const haveThemeService = Object.keys(userServices).includes('themeService');
|
|
181
|
+
const haveTextmateService = Object.keys(userServices).includes('textMateTokenizationFeature');
|
|
182
|
+
const haveMarkersService = Object.keys(userServices).includes('markersService');
|
|
183
|
+
const haveViewsService = Object.keys(userServices).includes('viewsService');
|
|
184
|
+
|
|
185
|
+
// theme requires textmate
|
|
186
|
+
if (haveThemeService && !haveTextmateService) {
|
|
187
|
+
throw new Error('"theme" service requires "textmate" service. Please add it to the "userServices".');
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// markers service requires views service
|
|
191
|
+
if (haveMarkersService && !haveViewsService) {
|
|
192
|
+
throw new Error('"markers" service requires "views" service. Please add it to the "userServices".');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* monaco-vscode-api automatically loads the following services:
|
|
198
|
+
* - layout
|
|
199
|
+
* - environment
|
|
200
|
+
* - extension
|
|
201
|
+
* - files
|
|
202
|
+
* - quickAccess
|
|
203
|
+
* monaco-languageclient always adds the following services:
|
|
204
|
+
* - languages
|
|
205
|
+
* - log
|
|
206
|
+
* - model
|
|
207
|
+
*/
|
|
208
|
+
protected async importAllServices(instructions?: InitServicesInstructions) {
|
|
209
|
+
const services = await this.supplyRequiredServices();
|
|
210
|
+
|
|
211
|
+
mergeServices(services, this.apiConfig.serviceOverrides);
|
|
212
|
+
await configureExtHostWorker(this.apiConfig.advanced?.enableExtHostWorker === true, services);
|
|
213
|
+
|
|
214
|
+
reportServiceLoading(services, this.logger);
|
|
215
|
+
|
|
216
|
+
if (instructions?.performServiceConsistencyChecks === true) {
|
|
217
|
+
this.checkServiceConsistency();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (this.apiConfig.viewsConfig?.viewServiceType === 'ViewsService' || this.apiConfig.viewsConfig?.viewServiceType === 'WorkspaceService') {
|
|
221
|
+
await initialize(services, this.apiConfig.htmlContainer, this.apiConfig.workspaceConfig, this.apiConfig.envOptions);
|
|
222
|
+
} else {
|
|
223
|
+
await initialize(services, undefined, this.apiConfig.workspaceConfig, this.apiConfig.envOptions);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
setUnexpectedErrorHandler((e) => {
|
|
227
|
+
this.logger.createErrorAndLog('Unexpected error', e);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async initExtensions(): Promise<void> {
|
|
232
|
+
if (this.apiConfig.$type === 'extended' && (this.apiConfig.advanced?.loadThemes === undefined ? true : this.apiConfig.advanced.loadThemes === true)) {
|
|
233
|
+
await import('@codingame/monaco-vscode-theme-defaults-default-extension');
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const extensions = this.apiConfig.extensions;
|
|
237
|
+
if (this.apiConfig.extensions) {
|
|
238
|
+
const allPromises: Array<Promise<void>> = [];
|
|
239
|
+
const extensionIds: string[] = [];
|
|
240
|
+
getExtensionManifests().forEach((ext) => {
|
|
241
|
+
extensionIds.push(ext.identifier.id);
|
|
242
|
+
});
|
|
243
|
+
for (const extensionConfig of extensions ?? []) {
|
|
244
|
+
if (!extensionIds.includes(`${extensionConfig.config.publisher}.${extensionConfig.config.name}`)) {
|
|
245
|
+
const manifest = extensionConfig.config as IExtensionManifest;
|
|
246
|
+
const extRegResult = registerExtension(manifest, ExtensionHostKind.LocalProcess);
|
|
247
|
+
this.extensionRegisterResults.set(manifest.name, extRegResult);
|
|
248
|
+
if (extensionConfig.filesOrContents && Object.hasOwn(extRegResult, 'registerFileUrl')) {
|
|
249
|
+
for (const entry of extensionConfig.filesOrContents) {
|
|
250
|
+
this.disposableStore.add(extRegResult.registerFileUrl(entry[0], verifyUrlOrCreateDataUrl(entry[1])));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
allPromises.push(extRegResult.whenReady());
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
await Promise.all(allPromises);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
protected markGlobalInit() {
|
|
261
|
+
this.logger.debug('markGlobalInit');
|
|
262
|
+
|
|
263
|
+
const envEnhanced = getEnhancedMonacoEnvironment();
|
|
264
|
+
envEnhanced.vscodeApiGlobalInitAwait = new Promise<void>((resolve) => {
|
|
265
|
+
envEnhanced.vscodeApiGlobalInitResolve = resolve;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
protected markGlobalInitDone() {
|
|
270
|
+
const envEnhanced = getEnhancedMonacoEnvironment();
|
|
271
|
+
if (typeof envEnhanced.vscodeApiGlobalInitResolve === 'function') {
|
|
272
|
+
envEnhanced.vscodeApiGlobalInitResolve();
|
|
273
|
+
}
|
|
274
|
+
envEnhanced.vscodeApiInitialised = true;
|
|
275
|
+
envEnhanced.vscodeApiGlobalInitAwait = undefined;
|
|
276
|
+
envEnhanced.vscodeApiGlobalInitResolve = undefined;
|
|
277
|
+
this.logger.debug('markGlobalInitDone');
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
async init(instructions?: InitServicesInstructions): Promise<void> {
|
|
281
|
+
const envEnhanced = getEnhancedMonacoEnvironment();
|
|
282
|
+
if (envEnhanced.vscodeApiInitialised === true) {
|
|
283
|
+
this.logger.warn('Initialization of monaco-vscode api can only performed once!');
|
|
284
|
+
} else {
|
|
285
|
+
if (!(envEnhanced.vscodeApiInitialising === true)) {
|
|
286
|
+
envEnhanced.vscodeApiInitialising = true;
|
|
287
|
+
this.markGlobalInit();
|
|
288
|
+
if (instructions?.htmlContainer !== undefined && instructions.htmlContainer !== null) {
|
|
289
|
+
this.apiConfig.htmlContainer = instructions.htmlContainer;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// ensures "vscodeApiConfig.workspaceConfig" is available
|
|
293
|
+
this.configureWorkspaceConfig();
|
|
294
|
+
|
|
295
|
+
// ensure logging and development logging options are in-line
|
|
296
|
+
this.configureDevLogLevel();
|
|
297
|
+
this.logger.info(`Initializing monaco-vscode api. Caller: ${instructions?.caller ?? 'unknown'}`);
|
|
298
|
+
|
|
299
|
+
await this.configureMonacoWorkers();
|
|
300
|
+
|
|
301
|
+
// ensure either classic (monarch) or textmate (extended) highlighting is used
|
|
302
|
+
await this.configureHighlightingServices();
|
|
303
|
+
|
|
304
|
+
// ensure one of the three potential view services are configured
|
|
305
|
+
await this.configureViewsServices();
|
|
306
|
+
|
|
307
|
+
// enforece semantic highlighting if configured
|
|
308
|
+
this.configureSemanticHighlighting();
|
|
309
|
+
|
|
310
|
+
await this.initUserConfiguration();
|
|
311
|
+
|
|
312
|
+
await this.importAllServices(instructions);
|
|
313
|
+
|
|
314
|
+
await this.applyViewsPostConfig();
|
|
315
|
+
|
|
316
|
+
await this.initExtensions();
|
|
317
|
+
|
|
318
|
+
this.markGlobalInitDone();
|
|
319
|
+
this.logger.debug('Initialization of monaco-vscode api completed successfully.');
|
|
320
|
+
} else {
|
|
321
|
+
this.logger.debug('Initialization of monaco-vscode api is already ongoing.');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
dispose() {
|
|
327
|
+
this.extensionRegisterResults.forEach((k) => k.dispose());
|
|
328
|
+
this.disposableStore.dispose();
|
|
329
|
+
|
|
330
|
+
// re-create disposable stores
|
|
331
|
+
this.disposableStore = new DisposableStore();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/* --------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) 2024 TypeFox and others.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the package root for license information.
|
|
4
|
+
* ------------------------------------------------------------------------------------------ */
|
|
5
|
+
|
|
6
|
+
import * as monaco from '@codingame/monaco-vscode-editor-api';
|
|
7
|
+
import { LogLevel } from '@codingame/monaco-vscode-api';
|
|
8
|
+
import type { IWorkbenchConstructionOptions } from '@codingame/monaco-vscode-api';
|
|
9
|
+
import type { IExtensionManifest } from '@codingame/monaco-vscode-api/extensions';
|
|
10
|
+
import type { EnvironmentOverride } from '@codingame/monaco-vscode-api/workbench';
|
|
11
|
+
import type { OpenEditor } from '@codingame/monaco-vscode-editor-service-override';
|
|
12
|
+
import type { Logger } from 'monaco-languageclient/common';
|
|
13
|
+
|
|
14
|
+
export interface MonacoEnvironmentEnhanced extends monaco.Environment {
|
|
15
|
+
vscodeApiInitialising?: boolean;
|
|
16
|
+
vscodeApiInitialised?: boolean;
|
|
17
|
+
vscodeApiGlobalInitAwait?: Promise<void>;
|
|
18
|
+
vscodeApiGlobalInitResolve?: ((value: void | PromiseLike<void>) => void);
|
|
19
|
+
viewServiceType?: 'EditorService' | 'ViewsService' | 'WorkspaceService';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type OverallConfigType = 'extended' | 'classic';
|
|
23
|
+
|
|
24
|
+
export interface UserConfiguration {
|
|
25
|
+
json?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ViewsConfig {
|
|
28
|
+
viewServiceType: 'EditorService' | 'ViewsService' | 'WorkspaceService';
|
|
29
|
+
openEditorFunc?: OpenEditor;
|
|
30
|
+
htmlAugmentationInstructions?: (htmlContainer: HTMLElement | null | undefined) => void;
|
|
31
|
+
viewsInitFunc?: () => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ExtensionConfig {
|
|
35
|
+
config: IExtensionManifest;
|
|
36
|
+
filesOrContents?: Map<string, string | URL>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface MonacoVscodeApiConfig {
|
|
40
|
+
$type: OverallConfigType;
|
|
41
|
+
htmlContainer?: HTMLElement;
|
|
42
|
+
serviceOverrides: monaco.editor.IEditorOverrideServices;
|
|
43
|
+
logLevel?: LogLevel | number;
|
|
44
|
+
workspaceConfig?: IWorkbenchConstructionOptions;
|
|
45
|
+
userConfiguration?: UserConfiguration;
|
|
46
|
+
viewsConfig?: ViewsConfig,
|
|
47
|
+
envOptions?: EnvironmentOverride;
|
|
48
|
+
extensions?: ExtensionConfig[];
|
|
49
|
+
monacoWorkerFactory?: (logger?: Logger) => void;
|
|
50
|
+
advanced?: {
|
|
51
|
+
enableExtHostWorker?: boolean;
|
|
52
|
+
loadThemes?: boolean;
|
|
53
|
+
enforceSemanticHighlighting?: boolean;
|
|
54
|
+
};
|
|
55
|
+
}
|
package/src/vscode/index.ts
CHANGED
|
@@ -3,5 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License. See LICENSE in the package root for license information.
|
|
4
4
|
* ------------------------------------------------------------------------------------------ */
|
|
5
5
|
|
|
6
|
-
export * from './
|
|
7
|
-
export * from './
|
|
6
|
+
export * from './config.js';
|
|
7
|
+
export * from './apiWrapper.js';
|
|
8
|
+
export * from './utils.js';
|
|
9
|
+
export * from './viewsService.js';
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/* --------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) 2024 TypeFox and others.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the package root for license information.
|
|
4
|
+
* ------------------------------------------------------------------------------------------ */
|
|
5
|
+
|
|
6
|
+
import type { LocalizationOptions } from '@codingame/monaco-vscode-localization-service-override';
|
|
7
|
+
|
|
8
|
+
export const createDefaultLocaleConfiguration = (): LocalizationOptions => {
|
|
9
|
+
return {
|
|
10
|
+
async clearLocale() {
|
|
11
|
+
const url = new URL(window.location.href);
|
|
12
|
+
url.searchParams.delete('locale');
|
|
13
|
+
window.history.pushState(null, '', url.toString());
|
|
14
|
+
},
|
|
15
|
+
async setLocale(id: string) {
|
|
16
|
+
const url = new URL(window.location.href);
|
|
17
|
+
url.searchParams.set('locale', id);
|
|
18
|
+
window.history.pushState(null, '', url.toString());
|
|
19
|
+
},
|
|
20
|
+
availableLanguages: [{
|
|
21
|
+
locale: 'en',
|
|
22
|
+
languageName: 'English'
|
|
23
|
+
}, {
|
|
24
|
+
locale: 'cs',
|
|
25
|
+
languageName: 'Czech'
|
|
26
|
+
}, {
|
|
27
|
+
locale: 'de',
|
|
28
|
+
languageName: 'German'
|
|
29
|
+
}, {
|
|
30
|
+
locale: 'es',
|
|
31
|
+
languageName: 'Spanish'
|
|
32
|
+
}, {
|
|
33
|
+
locale: 'fr',
|
|
34
|
+
languageName: 'French'
|
|
35
|
+
}, {
|
|
36
|
+
locale: 'it',
|
|
37
|
+
languageName: 'Italian'
|
|
38
|
+
}, {
|
|
39
|
+
locale: 'ja',
|
|
40
|
+
languageName: 'Japanese'
|
|
41
|
+
}, {
|
|
42
|
+
locale: 'ko',
|
|
43
|
+
languageName: 'Korean'
|
|
44
|
+
}, {
|
|
45
|
+
locale: 'pl',
|
|
46
|
+
languageName: 'Polish'
|
|
47
|
+
}, {
|
|
48
|
+
locale: 'pt-br',
|
|
49
|
+
languageName: 'Portuguese (Brazil)'
|
|
50
|
+
}, {
|
|
51
|
+
locale: 'qps-ploc',
|
|
52
|
+
languageName: 'Pseudo Language'
|
|
53
|
+
}, {
|
|
54
|
+
locale: 'ru',
|
|
55
|
+
languageName: 'Russian'
|
|
56
|
+
}, {
|
|
57
|
+
locale: 'tr',
|
|
58
|
+
languageName: 'Turkish'
|
|
59
|
+
}, {
|
|
60
|
+
locale: 'zh-hans',
|
|
61
|
+
languageName: 'Chinese (Simplified)'
|
|
62
|
+
}, {
|
|
63
|
+
locale: 'zh-hant',
|
|
64
|
+
languageName: 'Chinese (Traditional)'
|
|
65
|
+
}, {
|
|
66
|
+
locale: 'en',
|
|
67
|
+
languageName: 'English'
|
|
68
|
+
}]
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const localeLoader: Partial<Record<string, () => Promise<void>>> = {
|
|
73
|
+
cs: async () => {
|
|
74
|
+
await import('@codingame/monaco-vscode-language-pack-cs');
|
|
75
|
+
},
|
|
76
|
+
de: async () => {
|
|
77
|
+
await import('@codingame/monaco-vscode-language-pack-de');
|
|
78
|
+
},
|
|
79
|
+
es: async () => {
|
|
80
|
+
await import('@codingame/monaco-vscode-language-pack-es');
|
|
81
|
+
},
|
|
82
|
+
fr: async () => {
|
|
83
|
+
await import('@codingame/monaco-vscode-language-pack-fr');
|
|
84
|
+
},
|
|
85
|
+
it: async () => {
|
|
86
|
+
await import('@codingame/monaco-vscode-language-pack-it');
|
|
87
|
+
},
|
|
88
|
+
ja: async () => {
|
|
89
|
+
await import('@codingame/monaco-vscode-language-pack-ja');
|
|
90
|
+
},
|
|
91
|
+
ko: async () => {
|
|
92
|
+
await import('@codingame/monaco-vscode-language-pack-ko');
|
|
93
|
+
},
|
|
94
|
+
pl: async () => {
|
|
95
|
+
await import('@codingame/monaco-vscode-language-pack-pl');
|
|
96
|
+
},
|
|
97
|
+
'pt-br': async () => {
|
|
98
|
+
await import('@codingame/monaco-vscode-language-pack-pt-br');
|
|
99
|
+
},
|
|
100
|
+
'qps-ploc': async () => {
|
|
101
|
+
await import('@codingame/monaco-vscode-language-pack-qps-ploc');
|
|
102
|
+
},
|
|
103
|
+
ru: async () => {
|
|
104
|
+
await import('@codingame/monaco-vscode-language-pack-ru');
|
|
105
|
+
},
|
|
106
|
+
tr: async () => {
|
|
107
|
+
await import('@codingame/monaco-vscode-language-pack-tr');
|
|
108
|
+
},
|
|
109
|
+
'zh-hans': async () => {
|
|
110
|
+
await import('@codingame/monaco-vscode-language-pack-zh-hans');
|
|
111
|
+
},
|
|
112
|
+
'zh-hant': async () => {
|
|
113
|
+
await import('@codingame/monaco-vscode-language-pack-zh-hant');
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export const locales = Object.keys(localeLoader);
|
|
118
|
+
|
|
119
|
+
export const initLocaleLoader = async (locale = new URLSearchParams(window.location.search).get('locale')) => {
|
|
120
|
+
if (locale !== null) {
|
|
121
|
+
const loader = localeLoader[locale];
|
|
122
|
+
if (loader) {
|
|
123
|
+
await loader();
|
|
124
|
+
} else {
|
|
125
|
+
console.error(`Unknown locale ${locale}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* --------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) 2024 TypeFox and others.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the package root for license information.
|
|
4
|
+
* ------------------------------------------------------------------------------------------ */
|
|
5
|
+
|
|
6
|
+
import * as monaco from '@codingame/monaco-vscode-editor-api';
|
|
7
|
+
import type { OpenEditor } from '@codingame/monaco-vscode-editor-service-override';
|
|
8
|
+
import type { WorkerConfig } from '@codingame/monaco-vscode-extensions-service-override';
|
|
9
|
+
import getExtensionServiceOverride from '@codingame/monaco-vscode-extensions-service-override';
|
|
10
|
+
import type { Logger } from 'monaco-languageclient/common';
|
|
11
|
+
import { FakeWorker as Worker } from 'monaco-languageclient/workerFactory';
|
|
12
|
+
import type { MonacoEnvironmentEnhanced } from './config.js';
|
|
13
|
+
|
|
14
|
+
export const getEnhancedMonacoEnvironment = (): MonacoEnvironmentEnhanced => {
|
|
15
|
+
const monWin = (self as Window);
|
|
16
|
+
if (monWin.MonacoEnvironment === undefined) {
|
|
17
|
+
monWin.MonacoEnvironment = {};
|
|
18
|
+
}
|
|
19
|
+
const envEnhanced = monWin.MonacoEnvironment as MonacoEnvironmentEnhanced;
|
|
20
|
+
if (envEnhanced.vscodeApiInitialising === undefined) {
|
|
21
|
+
envEnhanced.vscodeApiInitialising = false;
|
|
22
|
+
}
|
|
23
|
+
if (envEnhanced.vscodeApiInitialised === undefined) {
|
|
24
|
+
envEnhanced.vscodeApiInitialised = false;
|
|
25
|
+
}
|
|
26
|
+
if (envEnhanced.viewServiceType === undefined) {
|
|
27
|
+
envEnhanced.viewServiceType = 'EditorService';
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return envEnhanced;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const reportServiceLoading = (services: monaco.editor.IEditorOverrideServices, logger?: Logger) => {
|
|
34
|
+
for (const serviceName of Object.keys(services)) {
|
|
35
|
+
logger?.debug(`Loading service: ${serviceName}`);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const mergeServices = (overrideServices: monaco.editor.IEditorOverrideServices, services?: monaco.editor.IEditorOverrideServices) => {
|
|
40
|
+
if (services !== undefined) {
|
|
41
|
+
for (const [name, service] of Object.entries(services)) {
|
|
42
|
+
overrideServices[name] = service;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Enable ext host to run in a worker
|
|
49
|
+
*/
|
|
50
|
+
export const configureExtHostWorker = async (enableExtHostWorker: boolean, userServices: monaco.editor.IEditorOverrideServices) => {
|
|
51
|
+
if (enableExtHostWorker) {
|
|
52
|
+
const fakeWorker = new Worker(new URL('@codingame/monaco-vscode-api/workers/extensionHost.worker', import.meta.url), { type: 'module' });
|
|
53
|
+
const workerConfig: WorkerConfig = {
|
|
54
|
+
url: fakeWorker.url.toString(),
|
|
55
|
+
options: fakeWorker.options
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
mergeServices(userServices, {
|
|
59
|
+
...getExtensionServiceOverride(workerConfig),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export const useOpenEditorStub: OpenEditor = async (modelRef, options, sideBySide) => {
|
|
65
|
+
console.log('Received open editor call with parameters: ', modelRef, options, sideBySide);
|
|
66
|
+
return undefined;
|
|
67
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/* --------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) 2024 TypeFox and others.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the package root for license information.
|
|
4
|
+
* ------------------------------------------------------------------------------------------ */
|
|
5
|
+
|
|
6
|
+
export const defaultViewsInit = async () => {
|
|
7
|
+
const { Parts, Position, onPartVisibilityChange, isPartVisibile, attachPart, getSideBarPosition, onDidChangeSideBarPosition } = await import('@codingame/monaco-vscode-views-service-override');
|
|
8
|
+
|
|
9
|
+
for (const config of [
|
|
10
|
+
{ part: Parts.TITLEBAR_PART, element: '#titleBar' },
|
|
11
|
+
{ part: Parts.BANNER_PART, element: '#banner' },
|
|
12
|
+
{
|
|
13
|
+
part: Parts.SIDEBAR_PART, get element() {
|
|
14
|
+
return getSideBarPosition() === Position.LEFT ? '#sidebar' : '#sidebar-right';
|
|
15
|
+
}, onDidElementChange: onDidChangeSideBarPosition
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
part: Parts.ACTIVITYBAR_PART, get element() {
|
|
19
|
+
return getSideBarPosition() === Position.LEFT ? '#activityBar' : '#activityBar-right';
|
|
20
|
+
}, onDidElementChange: onDidChangeSideBarPosition
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
part: Parts.AUXILIARYBAR_PART, get element() {
|
|
24
|
+
return getSideBarPosition() === Position.LEFT ? '#auxiliaryBar' : '#auxiliaryBar-left';
|
|
25
|
+
}, onDidElementChange: onDidChangeSideBarPosition
|
|
26
|
+
},
|
|
27
|
+
{ part: Parts.EDITOR_PART, element: '#editors' },
|
|
28
|
+
{ part: Parts.PANEL_PART, element: '#panel' },
|
|
29
|
+
{ part: Parts.STATUSBAR_PART, element: '#statusBar' }
|
|
30
|
+
]) {
|
|
31
|
+
attachPart(config.part, document.querySelector<HTMLDivElement>(config.element)!);
|
|
32
|
+
|
|
33
|
+
config.onDidElementChange?.(() => {
|
|
34
|
+
attachPart(config.part, document.querySelector<HTMLDivElement>(config.element)!);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
if (!isPartVisibile(config.part)) {
|
|
38
|
+
document.querySelector<HTMLDivElement>(config.element)!.style.display = 'none';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
onPartVisibilityChange(config.part, visible => {
|
|
42
|
+
document.querySelector<HTMLDivElement>(config.element)!.style.display = visible ? 'block' : 'none';
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const defaultViewsHtml = `<div id="workbench-container">
|
|
48
|
+
<div id="titleBar"></div>
|
|
49
|
+
<div id="banner"></div>
|
|
50
|
+
<div id="workbench-top">
|
|
51
|
+
<div id="sidebarDiv">
|
|
52
|
+
<div id="activityBar"></div>
|
|
53
|
+
<div id="sidebar"></div>
|
|
54
|
+
<div id="auxiliaryBar-left"></div>
|
|
55
|
+
</div>
|
|
56
|
+
<div id="editorsDiv">
|
|
57
|
+
<div id="editors"></div>
|
|
58
|
+
</div>
|
|
59
|
+
<div id="sidebarRightDiv">
|
|
60
|
+
<div id="sidebar-right"></div>
|
|
61
|
+
<div id="activityBar-right"></div>
|
|
62
|
+
<div id="auxiliaryBar"></div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
<div id="panel"></div>
|
|
66
|
+
<div id="statusBar"></div>
|
|
67
|
+
</div>`;
|
|
68
|
+
|
|
69
|
+
export const defaultHtmlAugmentationInstructions = (htmlElement: HTMLElement | null | undefined) => {
|
|
70
|
+
const htmlContainer = document.createElement('div', { is: 'app' });
|
|
71
|
+
htmlContainer.innerHTML = defaultViewsHtml;
|
|
72
|
+
htmlElement?.append(htmlContainer);
|
|
73
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/* --------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) 2024 TypeFox and others.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the package root for license information.
|
|
4
|
+
* ------------------------------------------------------------------------------------------ */
|
|
5
|
+
|
|
6
|
+
export * from './fakeWorker.js';
|
|
7
|
+
export * from './workerFactory.js';
|
|
8
|
+
export * from './workerLoaders.js';
|