monaco-languageclient 10.0.0 → 10.2.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +5 -6
  3. package/lib/common/logging.d.ts.map +1 -1
  4. package/lib/common/logging.js.map +1 -1
  5. package/lib/common/utils.d.ts.map +1 -1
  6. package/lib/common/utils.js +0 -4
  7. package/lib/common/utils.js.map +1 -1
  8. package/lib/debugger/index.d.ts +38 -0
  9. package/lib/debugger/index.d.ts.map +1 -0
  10. package/lib/debugger/index.js +109 -0
  11. package/lib/debugger/index.js.map +1 -0
  12. package/lib/editorApp/editorApp.d.ts +2 -2
  13. package/lib/editorApp/editorApp.d.ts.map +1 -1
  14. package/lib/editorApp/editorApp.js +3 -3
  15. package/lib/editorApp/editorApp.js.map +1 -1
  16. package/lib/fs/definitions.d.ts +1 -6
  17. package/lib/fs/definitions.d.ts.map +1 -1
  18. package/lib/fs/definitions.js +1 -11
  19. package/lib/fs/definitions.js.map +1 -1
  20. package/lib/fs/endpoints/defaultEndpoint.d.ts +1 -2
  21. package/lib/fs/endpoints/defaultEndpoint.d.ts.map +1 -1
  22. package/lib/fs/endpoints/defaultEndpoint.js +0 -5
  23. package/lib/fs/endpoints/defaultEndpoint.js.map +1 -1
  24. package/lib/index.d.ts.map +1 -1
  25. package/lib/index.js.map +1 -1
  26. package/lib/vscode/apiWrapper.d.ts +2 -6
  27. package/lib/vscode/apiWrapper.d.ts.map +1 -1
  28. package/lib/vscode/apiWrapper.js +10 -14
  29. package/lib/vscode/apiWrapper.js.map +1 -1
  30. package/lib/vscode/config.d.ts +2 -3
  31. package/lib/vscode/config.d.ts.map +1 -1
  32. package/lib/vscode/locales.d.ts +2 -1
  33. package/lib/vscode/locales.d.ts.map +1 -1
  34. package/lib/vscode/locales.js +3 -6
  35. package/lib/vscode/locales.js.map +1 -1
  36. package/lib/vscode/utils.d.ts +2 -2
  37. package/lib/vscode/utils.d.ts.map +1 -1
  38. package/lib/vscode/utils.js +2 -2
  39. package/lib/vscode/utils.js.map +1 -1
  40. package/lib/vscode/viewsService.d.ts.map +1 -1
  41. package/lib/vscode/viewsService.js.map +1 -1
  42. package/lib/worker/fakeWorker.d.ts.map +1 -1
  43. package/lib/worker/fakeWorker.js.map +1 -1
  44. package/lib/worker/workerFactory.d.ts.map +1 -1
  45. package/lib/worker/workerFactory.js.map +1 -1
  46. package/lib/worker/workerLoaders.d.ts +1 -1
  47. package/lib/worker/workerLoaders.d.ts.map +1 -1
  48. package/lib/worker/workerLoaders.js +0 -4
  49. package/lib/worker/workerLoaders.js.map +1 -1
  50. package/lib/wrapper/lcconfig.js +0 -4
  51. package/lib/wrapper/lcconfig.js.map +1 -1
  52. package/lib/wrapper/lcmanager.d.ts.map +1 -1
  53. package/lib/wrapper/lcmanager.js +0 -4
  54. package/lib/wrapper/lcmanager.js.map +1 -1
  55. package/lib/wrapper/lcwrapper.d.ts.map +1 -1
  56. package/lib/wrapper/lcwrapper.js.map +1 -1
  57. package/package.json +45 -38
  58. package/src/debugger/index.ts +168 -0
  59. package/src/editorApp/editorApp.ts +3 -3
  60. package/src/fs/definitions.ts +1 -6
  61. package/src/fs/endpoints/defaultEndpoint.ts +1 -2
  62. package/src/vscode/apiWrapper.ts +14 -21
  63. package/src/vscode/config.ts +3 -3
  64. package/src/vscode/locales.ts +3 -2
  65. package/src/vscode/utils.ts +2 -2
@@ -0,0 +1,168 @@
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 { RegisteredMemoryFile } from '@codingame/monaco-vscode-files-service-override';
7
+ import type { Logger } from 'monaco-languageclient/common';
8
+ import type { ExtensionConfig } from 'monaco-languageclient/vscodeApiWrapper';
9
+ import * as vscode from 'vscode';
10
+ import { Uri } from 'vscode';
11
+
12
+ // This is derived from:
13
+ // https://github.com/CodinGame/monaco-vscode-api/blob/main/demo/src/features/debugger.ts
14
+ // The client configuration is generic and can be used for a another language
15
+
16
+ export type FileDefinition = {
17
+ path: string;
18
+ code: string;
19
+ uri: Uri;
20
+ }
21
+
22
+ export type InitMessage = {
23
+ id: 'init',
24
+ files: Record<string, FileDefinition>
25
+ defaultFile: string;
26
+ debuggerExecCall: string;
27
+ };
28
+
29
+ export type ConfigParams = {
30
+ extensionName: string;
31
+ version: string;
32
+ publisher: string;
33
+ languageId: string;
34
+ documentSelector: string[];
35
+ homeDir: string;
36
+ workspaceRoot: string;
37
+ workspaceFile: Uri;
38
+ htmlContainer: HTMLElement;
39
+ protocol: 'ws' | 'wss';
40
+ hostname: string;
41
+ port: number;
42
+ files: Map<string, FileDefinition>;
43
+ defaultFile: string;
44
+ helpContainerCmd: string;
45
+ debuggerExecCall: string;
46
+ }
47
+
48
+ export const provideDebuggerExtensionConfig = (config: ConfigParams): ExtensionConfig => {
49
+ const filesOrContents = new Map<string, string | URL>();
50
+ filesOrContents.set('./extension.js', '// nothing');
51
+
52
+ return {
53
+ config: {
54
+ name: config.extensionName,
55
+ publisher: config.publisher,
56
+ version: config.version,
57
+ engines: {
58
+ vscode: '*'
59
+ },
60
+ // A browser field is mandatory for the extension to be flagged as `web`
61
+ browser: 'extension.js',
62
+ contributes: {
63
+ debuggers: [
64
+ {
65
+ type: config.languageId,
66
+ label: 'Test',
67
+ languages: [config.languageId]
68
+ }
69
+ ],
70
+ breakpoints: [
71
+ {
72
+ language: config.languageId
73
+ }
74
+ ]
75
+ },
76
+ activationEvents: [
77
+ 'onDebug'
78
+ ]
79
+ },
80
+ filesOrContents
81
+ };
82
+ };
83
+
84
+ export const configureDebugging = async (api: typeof vscode, config: ConfigParams, logger?: Logger) => {
85
+ class WebsocketDebugAdapter implements vscode.DebugAdapter {
86
+ private websocket: WebSocket;
87
+
88
+ constructor(websocket: WebSocket) {
89
+ this.websocket = websocket;
90
+ this.websocket.onmessage = (message) => {
91
+ this._onDidSendMessage.fire(JSON.parse(message.data));
92
+ };
93
+ }
94
+
95
+ _onDidSendMessage = new api.EventEmitter<vscode.DebugProtocolMessage>();
96
+ onDidSendMessage = this._onDidSendMessage.event;
97
+
98
+ handleMessage(message: vscode.DebugProtocolMessage): void {
99
+ // path with on Windows (Chrome/Firefox) arrive here with \\ and not like expected with /
100
+ // Chrome on Ubuntu behaves as expected
101
+ const msg = JSON.stringify(message).replaceAll('\\\\', '/');
102
+ this.websocket.send(msg);
103
+ }
104
+
105
+ dispose() {
106
+ this.websocket.close();
107
+ }
108
+ }
109
+
110
+ api.debug.registerDebugAdapterDescriptorFactory(config.languageId, {
111
+ async createDebugAdapterDescriptor() {
112
+ const websocket = new WebSocket(`${config.protocol}://${config.hostname}:${config.port}`);
113
+
114
+ await new Promise((resolve, reject) => {
115
+ websocket.onopen = resolve;
116
+ websocket.onerror = () =>
117
+ reject(new Error(`Unable to connect to debugger server. Run "${config.helpContainerCmd}"`));
118
+ });
119
+
120
+ const adapter = new WebsocketDebugAdapter(websocket);
121
+
122
+ const initMessage: InitMessage = {
123
+ id: 'init',
124
+ files: {},
125
+ // the default file is the one that will be used by the debugger
126
+ defaultFile: config.defaultFile,
127
+ debuggerExecCall: config.debuggerExecCall
128
+ };
129
+ for (const [name, fileDef] of config.files.entries()) {
130
+ logger?.info(`Found: ${name} Sending file: ${fileDef.path}`);
131
+ initMessage.files[name] = {
132
+ path: fileDef.path,
133
+ code: fileDef.code,
134
+ uri: fileDef.uri
135
+ };
136
+ }
137
+ websocket.send(JSON.stringify(initMessage));
138
+
139
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
140
+ adapter.onDidSendMessage((message: any) => {
141
+ if (message.type === 'event' && message.event === 'output') {
142
+ logger?.info('OUTPUT', message.body.output);
143
+ }
144
+ });
145
+ return new api.DebugAdapterInlineImplementation(adapter);
146
+ }
147
+ });
148
+ };
149
+
150
+ export const createDebugLaunchConfigFile = (workspacePath: string, type: string) => {
151
+ return new RegisteredMemoryFile(
152
+ Uri.file(`${workspacePath}/.vscode/launch.json`),
153
+ JSON.stringify(
154
+ {
155
+ version: '0.2.0',
156
+ configurations: [
157
+ {
158
+ name: 'Debugger: Lauch',
159
+ type,
160
+ request: 'attach',
161
+ }
162
+ ]
163
+ },
164
+ null,
165
+ 2
166
+ )
167
+ );
168
+ };
@@ -416,11 +416,11 @@ export class EditorApp {
416
416
  }
417
417
  }
418
418
 
419
- updateLayout() {
419
+ updateLayout(dimension?: monaco.editor.IDimension, postponeRendering?: boolean) {
420
420
  if (this.isDiffEditor()) {
421
- this.diffEditor?.layout();
421
+ this.diffEditor?.layout(dimension, postponeRendering);
422
422
  } else {
423
- this.editor?.layout();
423
+ this.editor?.layout(dimension, postponeRendering);
424
424
  }
425
425
  }
426
426
 
@@ -50,12 +50,7 @@ export interface StatsRequestResult {
50
50
  mtime: number
51
51
  }
52
52
 
53
- export enum EndpointType {
54
- DRIVER,
55
- FOLLOWER,
56
- LOCAL,
57
- EMPTY
58
- }
53
+ export type EndpointType = 'DRIVER' | 'FOLLOWER' | 'LOCAL' | 'EMPTY';
59
54
 
60
55
  export interface FileSystemCapabilities {
61
56
 
@@ -4,8 +4,7 @@
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
6
  import type { Logger } from 'monaco-languageclient/common';
7
- import type { DirectoryListingRequest, DirectoryListingRequestResult, FileReadRequest, FileReadRequestResult, FileSystemEndpoint, FileUpdate, FileUpdateResult, StatsRequest, StatsRequestResult } from '../definitions.js';
8
- import { EndpointType } from '../definitions.js';
7
+ import type { DirectoryListingRequest, DirectoryListingRequestResult, EndpointType, FileReadRequest, FileReadRequestResult, FileSystemEndpoint, FileUpdate, FileUpdateResult, StatsRequest, StatsRequestResult } from '../definitions.js';
9
8
 
10
9
  export class EmptyFileSystemEndpoint implements FileSystemEndpoint {
11
10
 
@@ -17,14 +17,10 @@ import 'vscode/localExtensionHost';
17
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 ViewsConfigRuntime extends ViewsConfig {
21
- htmlContainer: HTMLElement;
22
- }
23
-
24
20
  export interface MonacoVscodeApiConfigRuntime extends MonacoVscodeApiConfig {
25
21
  serviceOverrides: monaco.editor.IEditorOverrideServices;
26
22
  logLevel: LogLevel | number;
27
- viewsConfig: ViewsConfigRuntime;
23
+ viewsConfig: ViewsConfig;
28
24
  }
29
25
 
30
26
  export interface StartInstructions {
@@ -40,17 +36,18 @@ export class MonacoVscodeApiWrapper {
40
36
  private apiConfig: MonacoVscodeApiConfigRuntime;
41
37
 
42
38
  constructor(apiConfig: MonacoVscodeApiConfig) {
43
- const intermediate = {
39
+ const viewsConfigType = apiConfig.viewsConfig.$type;
40
+ if ((viewsConfigType === 'ViewsService' || viewsConfigType === 'WorkbenchService') &&
41
+ apiConfig.viewsConfig.htmlContainer === undefined) {
42
+
43
+ throw new Error(`View Service Type "${viewsConfigType}" requires a HTMLElement.`);
44
+ }
45
+
46
+ this.apiConfig = {
44
47
  ...apiConfig,
45
48
  serviceOverrides: apiConfig.serviceOverrides ?? {},
46
49
  logLevel: apiConfig.logLevel ?? LogLevel.Off,
47
50
  };
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;
54
51
  this.logger.setLevel(this.apiConfig.logLevel);
55
52
  }
56
53
 
@@ -66,10 +63,6 @@ export class MonacoVscodeApiWrapper {
66
63
  return this.apiConfig;
67
64
  }
68
65
 
69
- getHtmlContainer() {
70
- return this.apiConfig.viewsConfig.htmlContainer;
71
- }
72
-
73
66
  protected configureMonacoWorkers() {
74
67
  if (typeof this.apiConfig.monacoWorkerFactory === 'function') {
75
68
  this.apiConfig.monacoWorkerFactory(this.logger);
@@ -100,7 +93,7 @@ export class MonacoVscodeApiWrapper {
100
93
 
101
94
  protected async configureViewsServices() {
102
95
  const viewsConfigType = this.apiConfig.viewsConfig.$type;
103
- if (this.apiConfig.$type === 'classic' && (viewsConfigType === 'ViewsService' || viewsConfigType === 'WorkspaceService')) {
96
+ if (this.apiConfig.$type === 'classic' && (viewsConfigType === 'ViewsService' || viewsConfigType === 'WorkbenchService')) {
104
97
  throw new Error(`View Service Type "${viewsConfigType}" cannot be used with classic configuration.`);
105
98
  }
106
99
 
@@ -111,12 +104,12 @@ export class MonacoVscodeApiWrapper {
111
104
  ...getViewsServiceOverride(this.apiConfig.viewsConfig.openEditorFunc ?? useOpenEditorStub)
112
105
  });
113
106
  envEnhanced.viewServiceType = 'ViewsService';
114
- } else if (viewsConfigType === 'WorkspaceService') {
107
+ } else if (viewsConfigType === 'WorkbenchService') {
115
108
  const getWorkbenchServiceOverride = (await import('@codingame/monaco-vscode-workbench-service-override')).default;
116
109
  mergeServices(this.apiConfig.serviceOverrides, {
117
110
  ...getWorkbenchServiceOverride()
118
111
  });
119
- envEnhanced.viewServiceType = 'WorkspaceService';
112
+ envEnhanced.viewServiceType = 'WorkbenchService';
120
113
  } else {
121
114
  const getEditorServiceOverride = (await import('@codingame/monaco-vscode-editor-service-override')).default;
122
115
  mergeServices(this.apiConfig.serviceOverrides, {
@@ -241,7 +234,7 @@ export class MonacoVscodeApiWrapper {
241
234
  this.checkServiceConsistency();
242
235
  }
243
236
 
244
- if (this.apiConfig.viewsConfig.$type === 'ViewsService' || this.apiConfig.viewsConfig.$type === 'WorkspaceService') {
237
+ if (this.apiConfig.viewsConfig.$type === 'ViewsService' || this.apiConfig.viewsConfig.$type === 'WorkbenchService') {
245
238
  await initialize(services, this.apiConfig.viewsConfig.htmlContainer, this.apiConfig.workspaceConfig, this.apiConfig.envOptions);
246
239
  } else {
247
240
  await initialize(services, undefined, this.apiConfig.workspaceConfig, this.apiConfig.envOptions);
@@ -308,7 +301,7 @@ export class MonacoVscodeApiWrapper {
308
301
  this.logger.debug('markGlobalInitDone');
309
302
  }
310
303
 
311
- overrideViewsConfig(viewsConfigOverride: ViewsConfigRuntime) {
304
+ overrideViewsConfig(viewsConfigOverride: ViewsConfig) {
312
305
  const orgViewsConfig = this.apiConfig.viewsConfig;
313
306
  this.apiConfig.viewsConfig = {
314
307
  $type: viewsConfigOverride.$type,
@@ -13,9 +13,9 @@ import type { Logger } from 'monaco-languageclient/common';
13
13
 
14
14
  export type OverallConfigType = 'extended' | 'classic';
15
15
 
16
- export type ViewsConfigTypes = 'EditorService' | 'ViewsService' | 'WorkspaceService';
16
+ export type ViewsConfigTypes = 'EditorService' | 'ViewsService' | 'WorkbenchService';
17
17
 
18
- export type HtmlContainerConfig = HTMLElement | 'ReactPlaceholder';
18
+ // export type HtmlContainerConfig = HTMLElement;
19
19
 
20
20
  export interface MonacoEnvironmentEnhanced extends monaco.Environment {
21
21
  vscodeApiInitialising?: boolean;
@@ -31,7 +31,7 @@ export interface UserConfiguration {
31
31
 
32
32
  export interface ViewsConfig {
33
33
  $type: ViewsConfigTypes;
34
- htmlContainer: HtmlContainerConfig;
34
+ htmlContainer?: HTMLElement;
35
35
  openEditorFunc?: OpenEditor;
36
36
  htmlAugmentationInstructions?: (htmlContainer: HTMLElement | null | undefined) => void;
37
37
  viewsInitFunc?: () => Promise<void>;
@@ -4,6 +4,7 @@
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
6
  import type { LocalizationOptions } from '@codingame/monaco-vscode-localization-service-override';
7
+ import { type Logger } from 'monaco-languageclient/common';
7
8
 
8
9
  export const createDefaultLocaleConfiguration = (): LocalizationOptions => {
9
10
  return {
@@ -116,13 +117,13 @@ const localeLoader: Partial<Record<string, () => Promise<void>>> = {
116
117
 
117
118
  export const locales = Object.keys(localeLoader);
118
119
 
119
- export const initLocaleLoader = async (locale = new URLSearchParams(window.location.search).get('locale')) => {
120
+ export const initLocaleLoader = async (locale = new URLSearchParams(window.location.search).get('locale'), logger?: Logger) => {
120
121
  if (locale !== null) {
121
122
  const loader = localeLoader[locale];
122
123
  if (loader) {
123
124
  await loader();
124
125
  } else {
125
- console.error(`Unknown locale ${locale}`);
126
+ logger?.error(`Unknown locale ${locale}`);
126
127
  }
127
128
  }
128
129
  };
@@ -60,7 +60,7 @@ export const configureExtHostWorker = async (enableExtHostWorker: boolean, userS
60
60
  }
61
61
  };
62
62
 
63
- export const useOpenEditorStub: OpenEditor = async (modelRef, options, sideBySide) => {
64
- console.log('Received open editor call with parameters: ', modelRef, options, sideBySide);
63
+ export const useOpenEditorStub: OpenEditor = async (modelRef, options, sideBySide, logger?: Logger) => {
64
+ logger?.info('Received open editor call with parameters: ', modelRef, options, sideBySide);
65
65
  return undefined;
66
66
  };