monaco-languageclient-examples 2025.6.1 → 2025.6.3

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 (155) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/appPlayground/common.d.ts +2 -2
  3. package/dist/appPlayground/common.d.ts.map +1 -1
  4. package/dist/appPlayground/common.js +2 -3
  5. package/dist/appPlayground/common.js.map +1 -1
  6. package/dist/appPlayground/config.d.ts +7 -5
  7. package/dist/appPlayground/config.d.ts.map +1 -1
  8. package/dist/appPlayground/config.js +91 -78
  9. package/dist/appPlayground/config.js.map +1 -1
  10. package/dist/appPlayground/launcher.js +1 -1
  11. package/dist/appPlayground/launcher.js.map +1 -1
  12. package/dist/appPlayground/main.d.ts.map +1 -1
  13. package/dist/appPlayground/main.js +6 -5
  14. package/dist/appPlayground/main.js.map +1 -1
  15. package/dist/appPlayground/reactLauncher.js +1 -1
  16. package/dist/appPlayground/reactLauncher.js.map +1 -1
  17. package/dist/appPlayground/reactMain.d.ts.map +1 -1
  18. package/dist/appPlayground/reactMain.js +3 -4
  19. package/dist/appPlayground/reactMain.js.map +1 -1
  20. package/dist/bare/client.d.ts.map +1 -1
  21. package/dist/bare/client.js +12 -15
  22. package/dist/bare/client.js.map +1 -1
  23. package/dist/browser/main.d.ts.map +1 -1
  24. package/dist/browser/main.js +28 -27
  25. package/dist/browser/main.js.map +1 -1
  26. package/dist/clangd/client/config.d.ts +10 -3
  27. package/dist/clangd/client/config.d.ts.map +1 -1
  28. package/dist/clangd/client/config.js +85 -85
  29. package/dist/clangd/client/config.js.map +1 -1
  30. package/dist/clangd/client/main.d.ts.map +1 -1
  31. package/dist/clangd/client/main.js +14 -11
  32. package/dist/clangd/client/main.js.map +1 -1
  33. package/dist/common/client/extendedClient.d.ts +9 -0
  34. package/dist/common/client/extendedClient.d.ts.map +1 -0
  35. package/dist/common/client/extendedClient.js +97 -0
  36. package/dist/common/client/extendedClient.js.map +1 -0
  37. package/dist/common/client/utils.d.ts +9 -4
  38. package/dist/common/client/utils.d.ts.map +1 -1
  39. package/dist/common/client/utils.js +3 -7
  40. package/dist/common/client/utils.js.map +1 -1
  41. package/dist/debugger/client/debugger.d.ts +1 -1
  42. package/dist/debugger/client/debugger.d.ts.map +1 -1
  43. package/dist/eclipse.jdt.ls/client/main.d.ts +1 -1
  44. package/dist/eclipse.jdt.ls/client/main.d.ts.map +1 -1
  45. package/dist/eclipse.jdt.ls/client/main.js +4 -74
  46. package/dist/eclipse.jdt.ls/client/main.js.map +1 -1
  47. package/dist/eclipse.jdt.ls/config.d.ts +2 -5
  48. package/dist/eclipse.jdt.ls/config.d.ts.map +1 -1
  49. package/dist/eclipse.jdt.ls/config.js +2 -1
  50. package/dist/eclipse.jdt.ls/config.js.map +1 -1
  51. package/dist/groovy/client/main.d.ts +1 -1
  52. package/dist/groovy/client/main.d.ts.map +1 -1
  53. package/dist/groovy/client/main.js +4 -63
  54. package/dist/groovy/client/main.js.map +1 -1
  55. package/dist/groovy/config.d.ts +2 -5
  56. package/dist/groovy/config.d.ts.map +1 -1
  57. package/dist/groovy/config.js +2 -1
  58. package/dist/groovy/config.js.map +1 -1
  59. package/dist/json/client/client.d.ts +3 -0
  60. package/dist/json/client/client.d.ts.map +1 -0
  61. package/dist/json/client/client.js +13 -0
  62. package/dist/json/client/client.js.map +1 -0
  63. package/dist/json/client/config.d.ts +3 -0
  64. package/dist/json/client/config.d.ts.map +1 -0
  65. package/dist/json/client/config.js +11 -0
  66. package/dist/json/client/config.js.map +1 -0
  67. package/dist/json/server/main.js.map +1 -1
  68. package/dist/langium/langium-dsl/config/classicConfig.d.ts +2 -2
  69. package/dist/langium/langium-dsl/config/classicConfig.d.ts.map +1 -1
  70. package/dist/langium/langium-dsl/config/classicConfig.js +53 -45
  71. package/dist/langium/langium-dsl/config/classicConfig.js.map +1 -1
  72. package/dist/langium/langium-dsl/config/extendedConfig.d.ts +2 -2
  73. package/dist/langium/langium-dsl/config/extendedConfig.d.ts.map +1 -1
  74. package/dist/langium/langium-dsl/config/extendedConfig.js +40 -40
  75. package/dist/langium/langium-dsl/config/extendedConfig.js.map +1 -1
  76. package/dist/langium/langium-dsl/wrapperLangium.d.ts.map +1 -1
  77. package/dist/langium/langium-dsl/wrapperLangium.js +23 -16
  78. package/dist/langium/langium-dsl/wrapperLangium.js.map +1 -1
  79. package/dist/langium/statemachine/config/wrapperStatemachineConfig.d.ts +4 -4
  80. package/dist/langium/statemachine/config/wrapperStatemachineConfig.d.ts.map +1 -1
  81. package/dist/langium/statemachine/config/wrapperStatemachineConfig.js +40 -41
  82. package/dist/langium/statemachine/config/wrapperStatemachineConfig.js.map +1 -1
  83. package/dist/langium/statemachine/launcher.js +1 -1
  84. package/dist/langium/statemachine/launcher.js.map +1 -1
  85. package/dist/langium/statemachine/main-react.js +2 -3
  86. package/dist/langium/statemachine/main-react.js.map +1 -1
  87. package/dist/langium/statemachine/main.d.ts.map +1 -1
  88. package/dist/langium/statemachine/main.js +38 -27
  89. package/dist/langium/statemachine/main.js.map +1 -1
  90. package/dist/multi/config.d.ts +1 -1
  91. package/dist/multi/config.d.ts.map +1 -1
  92. package/dist/multi/config.js +0 -1
  93. package/dist/multi/config.js.map +1 -1
  94. package/dist/multi/twoLanguageClients.d.ts.map +1 -1
  95. package/dist/multi/twoLanguageClients.js +45 -49
  96. package/dist/multi/twoLanguageClients.js.map +1 -1
  97. package/dist/node.d.ts +0 -3
  98. package/dist/node.d.ts.map +1 -1
  99. package/dist/node.js +3 -3
  100. package/dist/node.js.map +1 -1
  101. package/dist/python/client/config.d.ts +7 -3
  102. package/dist/python/client/config.d.ts.map +1 -1
  103. package/dist/python/client/config.js +108 -112
  104. package/dist/python/client/config.js.map +1 -1
  105. package/dist/python/client/main.d.ts.map +1 -1
  106. package/dist/python/client/main.js +16 -10
  107. package/dist/python/client/main.js.map +1 -1
  108. package/dist/python/client/reactPython.d.ts.map +1 -1
  109. package/dist/python/client/reactPython.js +8 -9
  110. package/dist/python/client/reactPython.js.map +1 -1
  111. package/dist/ts/wrapperTs.d.ts.map +1 -1
  112. package/dist/ts/wrapperTs.js +50 -45
  113. package/dist/ts/wrapperTs.js.map +1 -1
  114. package/json.html +1 -1
  115. package/package.json +41 -41
  116. package/src/appPlayground/common.ts +3 -3
  117. package/src/appPlayground/config.ts +97 -81
  118. package/src/appPlayground/launcher.ts +2 -1
  119. package/src/appPlayground/main.ts +9 -6
  120. package/src/appPlayground/reactLauncher.ts +2 -1
  121. package/src/appPlayground/reactMain.tsx +5 -5
  122. package/src/bare/client.ts +15 -16
  123. package/src/browser/main.ts +29 -27
  124. package/src/clangd/client/config.ts +97 -87
  125. package/src/clangd/client/main.ts +16 -12
  126. package/src/common/client/extendedClient.ts +111 -0
  127. package/src/common/client/utils.ts +18 -18
  128. package/src/debugger/client/debugger.ts +1 -1
  129. package/src/eclipse.jdt.ls/client/main.ts +4 -78
  130. package/src/eclipse.jdt.ls/config.ts +6 -2
  131. package/src/groovy/client/main.ts +4 -65
  132. package/src/groovy/config.ts +6 -2
  133. package/src/json/client/client.ts +14 -0
  134. package/src/json/client/config.ts +13 -0
  135. package/src/json/server/main.ts +1 -1
  136. package/src/langium/langium-dsl/config/classicConfig.ts +64 -48
  137. package/src/langium/langium-dsl/config/extendedConfig.ts +49 -42
  138. package/src/langium/langium-dsl/wrapperLangium.ts +25 -15
  139. package/src/langium/statemachine/config/wrapperStatemachineConfig.ts +48 -45
  140. package/src/langium/statemachine/launcher.ts +1 -1
  141. package/src/langium/statemachine/main-react.tsx +4 -4
  142. package/src/langium/statemachine/main.ts +43 -27
  143. package/src/multi/config.ts +3 -3
  144. package/src/multi/twoLanguageClients.ts +48 -52
  145. package/src/node.ts +3 -3
  146. package/src/python/client/config.ts +116 -114
  147. package/src/python/client/main.ts +20 -11
  148. package/src/python/client/reactPython.tsx +11 -10
  149. package/src/ts/wrapperTs.ts +52 -45
  150. package/two_langauge_clients.html +0 -1
  151. package/dist/json/client/wrapperWs.d.ts +0 -5
  152. package/dist/json/client/wrapperWs.d.ts.map +0 -1
  153. package/dist/json/client/wrapperWs.js +0 -87
  154. package/dist/json/client/wrapperWs.js.map +0 -1
  155. package/src/json/client/wrapperWs.ts +0 -90
@@ -3,22 +3,22 @@
3
3
  * Licensed under the MIT License. See License.txt in the project root for license information.
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
+ import { LogLevel } from '@codingame/monaco-vscode-api';
6
7
  import * as monaco from '@codingame/monaco-vscode-editor-api';
7
- import { initServices } from 'monaco-languageclient/vscode/services';
8
8
  import getTextmateServiceOverride from '@codingame/monaco-vscode-textmate-service-override';
9
9
  import getThemeServiceOverride from '@codingame/monaco-vscode-theme-service-override';
10
- import { LogLevel } from '@codingame/monaco-vscode-api';
10
+ import { MonacoVscodeApiWrapper, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
11
11
  // monaco-editor does not supply json highlighting with the json worker,
12
12
  // that's why we use the textmate extension from VSCode
13
13
  import '@codingame/monaco-vscode-json-default-extension';
14
- import { ConsoleLogger } from 'monaco-languageclient/tools';
15
- import { configureDefaultWorkerFactory } from 'monaco-editor-wrapper/workers/workerLoaders';
16
- import { LanguageClientWrapper, type LanguageClientConfig } from 'monaco-editor-wrapper';
14
+ import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
15
+ import { LanguageClientWrapper, type LanguageClientConfig } from 'monaco-languageclient/lcwrapper';
17
16
 
18
17
  export const runClient = async () => {
19
- const logger = new ConsoleLogger(LogLevel.Debug);
20
18
  const htmlContainer = document.getElementById('monaco-editor-root')!;
21
- await initServices({
19
+ const vscodeApiConfig: MonacoVscodeApiConfig = {
20
+ $type: 'classic',
21
+ logLevel: LogLevel.Debug,
22
22
  serviceOverrides: {
23
23
  ...getTextmateServiceOverride(),
24
24
  ...getThemeServiceOverride()
@@ -28,9 +28,11 @@ export const runClient = async () => {
28
28
  'editor.experimental.asyncTokenization': true
29
29
  })
30
30
  },
31
- }, {
32
- logger
33
- });
31
+ monacoWorkerFactory: configureDefaultWorkerFactory
32
+ };
33
+
34
+ const apiWrapper = new MonacoVscodeApiWrapper(vscodeApiConfig);
35
+ await apiWrapper.init();
34
36
 
35
37
  // register the JSON language with Monaco
36
38
  monaco.languages.register({
@@ -40,8 +42,6 @@ export const runClient = async () => {
40
42
  mimetypes: ['application/json']
41
43
  });
42
44
 
43
- configureDefaultWorkerFactory(logger);
44
-
45
45
  // create monaco editor
46
46
  monaco.editor.create(htmlContainer, {
47
47
  value: `{
@@ -64,10 +64,9 @@ export const runClient = async () => {
64
64
  }
65
65
  }
66
66
  };
67
- const languageClientWrapper = new LanguageClientWrapper({
67
+ const languageClientWrapper = new LanguageClientWrapper(
68
68
  languageClientConfig,
69
- logger
70
- });
71
-
69
+ apiWrapper.getLogger()
70
+ );
72
71
  await languageClientWrapper.start();
73
72
  };
@@ -11,8 +11,9 @@ import { getLanguageService, TextDocument } from 'vscode-json-languageservice';
11
11
  import { createConverter as createCodeConverter } from 'vscode-languageclient/lib/common/codeConverter.js';
12
12
  import { createConverter as createProtocolConverter } from 'vscode-languageclient/lib/common/protocolConverter.js';
13
13
  import { LogLevel } from '@codingame/monaco-vscode-api';
14
- import { MonacoEditorLanguageClientWrapper, type WrapperConfig } from 'monaco-editor-wrapper';
15
- import { configureDefaultWorkerFactory } from 'monaco-editor-wrapper/workers/workerLoaders';
14
+ import { EditorApp, type EditorAppConfig } from 'monaco-languageclient/editorApp';
15
+ import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
16
+ import { MonacoVscodeApiWrapper, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
16
17
 
17
18
  export const runBrowserEditor = async () => {
18
19
  const codeConverter = createCodeConverter();
@@ -27,35 +28,36 @@ export const runBrowserEditor = async () => {
27
28
  }`;
28
29
  const codeUri = '/workspace/model.json';
29
30
 
30
- const wrapper = new MonacoEditorLanguageClientWrapper();
31
- const jsonClientUserConfig: WrapperConfig = {
31
+ const vscodeApiConfig: MonacoVscodeApiConfig = {
32
32
  $type: 'extended',
33
33
  htmlContainer,
34
34
  logLevel: LogLevel.Debug,
35
- vscodeApiConfig: {
36
- serviceOverrides: {
37
- ...getKeybindingsServiceOverride(),
38
- },
39
- userConfiguration: {
40
- json: JSON.stringify({
41
- 'workbench.colorTheme': 'Default Dark Modern',
42
- 'editor.guides.bracketPairsHorizontal': 'active',
43
- 'editor.lightbulb.enabled': 'On',
44
- 'editor.experimental.asyncTokenization': true
45
- })
46
- }
35
+ serviceOverrides: {
36
+ ...getKeybindingsServiceOverride(),
37
+ },
38
+ userConfiguration: {
39
+ json: JSON.stringify({
40
+ 'workbench.colorTheme': 'Default Dark Modern',
41
+ 'editor.guides.bracketPairsHorizontal': 'active',
42
+ 'editor.lightbulb.enabled': 'On',
43
+ 'editor.experimental.asyncTokenization': true
44
+ })
47
45
  },
48
- editorAppConfig: {
49
- codeResources: {
50
- modified: {
51
- text: code,
52
- uri: codeUri
53
- }
54
- },
55
- monacoWorkerFactory: configureDefaultWorkerFactory
46
+ monacoWorkerFactory: configureDefaultWorkerFactory
47
+ };
48
+ const editorAppConfig: EditorAppConfig = {
49
+ $type: vscodeApiConfig.$type,
50
+ codeResources: {
51
+ modified: {
52
+ text: code,
53
+ uri: codeUri
54
+ }
56
55
  }
57
56
  };
58
- await wrapper.init(jsonClientUserConfig);
57
+ const apiWrapper = new MonacoVscodeApiWrapper(vscodeApiConfig);
58
+ await apiWrapper.init();
59
+
60
+ const editorApp = new EditorApp(editorAppConfig);
59
61
 
60
62
  vscode.workspace.onDidOpenTextDocument((_event) => {
61
63
  mainVscodeDocument = _event;
@@ -155,9 +157,9 @@ export const runBrowserEditor = async () => {
155
157
  diagnosticCollection.clear();
156
158
  };
157
159
 
158
- await wrapper.start();
160
+ await editorApp.start(htmlContainer);
159
161
 
160
- wrapper.getTextModels()?.modified?.onDidChangeContent(() => {
162
+ editorApp.getTextModels().modified?.onDidChangeContent(() => {
161
163
  validate();
162
164
  });
163
165
  };
@@ -3,113 +3,91 @@
3
3
  * Licensed under the MIT License. See LICENSE in the package root for license information.
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
- import { Uri } from 'vscode';
6
+ import { LogLevel } from '@codingame/monaco-vscode-api';
7
+ import getEnvironmentServiceOverride from '@codingame/monaco-vscode-environment-service-override';
8
+ import getExplorerServiceOverride from '@codingame/monaco-vscode-explorer-service-override';
7
9
  import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
8
10
  import getLifecycleServiceOverride from '@codingame/monaco-vscode-lifecycle-service-override';
11
+ import getRemoteAgentServiceOverride from '@codingame/monaco-vscode-remote-agent-service-override';
12
+ import getSecretStorageServiceOverride from '@codingame/monaco-vscode-secret-storage-service-override';
9
13
  import getBannerServiceOverride from '@codingame/monaco-vscode-view-banner-service-override';
10
14
  import getStatusBarServiceOverride from '@codingame/monaco-vscode-view-status-bar-service-override';
11
15
  import getTitleBarServiceOverride from '@codingame/monaco-vscode-view-title-bar-service-override';
12
- import getExplorerServiceOverride from '@codingame/monaco-vscode-explorer-service-override';
13
- import getRemoteAgentServiceOverride from '@codingame/monaco-vscode-remote-agent-service-override';
14
- import getEnvironmentServiceOverride from '@codingame/monaco-vscode-environment-service-override';
15
- import getSecretStorageServiceOverride from '@codingame/monaco-vscode-secret-storage-service-override';
16
- import { LogLevel } from '@codingame/monaco-vscode-api';
17
- import type { WrapperConfig } from 'monaco-editor-wrapper';
18
- import { configureDefaultWorkerFactory } from 'monaco-editor-wrapper/workers/workerLoaders';
19
- import { defaultHtmlAugmentationInstructions, defaultViewsInit } from 'monaco-editor-wrapper/vscode/services';
16
+ import type { EditorAppConfig } from 'monaco-languageclient/editorApp';
17
+ import type { LanguageClientConfig } from 'monaco-languageclient/lcwrapper';
18
+ import { defaultHtmlAugmentationInstructions, defaultViewsInit, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
19
+ import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
20
+ import { Uri } from 'vscode';
20
21
  import { ClangdWorkerHandler } from './workerHandler.js';
21
22
 
22
- export const createWrapperConfig = async (config: {
23
+ export type ClangdAppConfig = {
24
+ languageClientConfig: LanguageClientConfig;
25
+ vscodeApiConfig: MonacoVscodeApiConfig;
26
+ editorAppConfig: EditorAppConfig;
27
+ }
28
+
29
+ export const createClangdAppConfig = async (config: {
23
30
  htmlContainer: HTMLElement,
24
31
  workspaceUri: Uri,
25
32
  workspaceFileUri: Uri,
26
33
  clangdWorkerHandler: ClangdWorkerHandler,
27
34
  lsMessageLocalPort: MessagePort
28
- }): Promise<WrapperConfig> => {
29
- return {
35
+ }): Promise<ClangdAppConfig> => {
36
+ const vscodeApiConfig: MonacoVscodeApiConfig = {
30
37
  $type: 'extended',
31
38
  htmlContainer: config.htmlContainer,
32
39
  logLevel: LogLevel.Debug,
33
- languageClientConfigs: {
34
- configs: {
35
- LANGUAGE_ID: {
36
- name: 'Clangd WASM Language Server',
37
- connection: {
38
- options: {
39
- $type: 'WorkerDirect',
40
- worker: await config.clangdWorkerHandler.createWorker(),
41
- messagePort: config.lsMessageLocalPort
42
- }
43
- },
44
- restartOptions: {
45
- retries: 5,
46
- timeout: 1000,
47
- keepWorker: true
48
- },
49
- clientOptions: {
50
- documentSelector: ['cpp'],
51
- workspaceFolder: {
52
- index: 0,
53
- name: 'workspace',
54
- uri: config.workspaceUri
55
- }
56
- }
57
- }
58
- }
40
+ serviceOverrides: {
41
+ ...getKeybindingsServiceOverride(),
42
+ ...getLifecycleServiceOverride(),
43
+ ...getBannerServiceOverride(),
44
+ ...getStatusBarServiceOverride(),
45
+ ...getTitleBarServiceOverride(),
46
+ ...getExplorerServiceOverride(),
47
+ ...getRemoteAgentServiceOverride(),
48
+ ...getEnvironmentServiceOverride(),
49
+ ...getSecretStorageServiceOverride()
59
50
  },
60
- vscodeApiConfig: {
61
- serviceOverrides: {
62
- ...getKeybindingsServiceOverride(),
63
- ...getLifecycleServiceOverride(),
64
- ...getBannerServiceOverride(),
65
- ...getStatusBarServiceOverride(),
66
- ...getTitleBarServiceOverride(),
67
- ...getExplorerServiceOverride(),
68
- ...getRemoteAgentServiceOverride(),
69
- ...getEnvironmentServiceOverride(),
70
- ...getSecretStorageServiceOverride()
71
- },
72
- viewsConfig: {
73
- viewServiceType: 'ViewsService',
74
- htmlAugmentationInstructions: defaultHtmlAugmentationInstructions,
75
- viewsInitFunc: defaultViewsInit
51
+ viewsConfig: {
52
+ viewServiceType: 'ViewsService',
53
+ htmlAugmentationInstructions: defaultHtmlAugmentationInstructions,
54
+ viewsInitFunc: defaultViewsInit
55
+ },
56
+ workspaceConfig: {
57
+ enableWorkspaceTrust: true,
58
+ windowIndicator: {
59
+ label: 'mlc-clangd-example',
60
+ tooltip: '',
61
+ command: ''
76
62
  },
77
- workspaceConfig: {
78
- enableWorkspaceTrust: true,
79
- windowIndicator: {
80
- label: 'mlc-clangd-example',
81
- tooltip: '',
82
- command: ''
83
- },
84
- workspaceProvider: {
85
- trusted: true,
86
- async open() {
87
- window.open(window.location.href);
88
- return true;
89
- },
90
- workspace: {
91
- workspaceUri: config.workspaceFileUri
92
- },
63
+ workspaceProvider: {
64
+ trusted: true,
65
+ async open() {
66
+ window.open(window.location.href);
67
+ return true;
93
68
  },
94
- configurationDefaults: {
95
- 'window.title': 'mlc-clangd-exampled${separator}${dirty}${activeEditorShort}'
69
+ workspace: {
70
+ workspaceUri: config.workspaceFileUri
96
71
  },
97
- productConfiguration: {
98
- nameShort: 'mlc-clangd-example',
99
- nameLong: 'mlc-clangd-example'
100
- }
101
72
  },
102
- userConfiguration: {
103
- json: JSON.stringify({
104
- 'workbench.colorTheme': 'Default Dark Modern',
105
- 'editor.wordBasedSuggestions': 'off',
106
- 'editor.guides.bracketPairsHorizontal': true,
107
- 'editor.inlayHints.enabled': 'offUnlessPressed',
108
- 'editor.quickSuggestionsDelay': 200,
109
- 'editor.experimental.asyncTokenization': false
110
- })
73
+ configurationDefaults: {
74
+ 'window.title': 'mlc-clangd-exampled${separator}${dirty}${activeEditorShort}'
75
+ },
76
+ productConfiguration: {
77
+ nameShort: 'mlc-clangd-example',
78
+ nameLong: 'mlc-clangd-example'
111
79
  }
112
80
  },
81
+ userConfiguration: {
82
+ json: JSON.stringify({
83
+ 'workbench.colorTheme': 'Default Dark Modern',
84
+ 'editor.wordBasedSuggestions': 'off',
85
+ 'editor.guides.bracketPairsHorizontal': true,
86
+ 'editor.inlayHints.enabled': 'offUnlessPressed',
87
+ 'editor.quickSuggestionsDelay': 200,
88
+ 'editor.experimental.asyncTokenization': false
89
+ })
90
+ },
113
91
  extensions: [{
114
92
  config: {
115
93
  name: 'mlc-clangd-example',
@@ -120,8 +98,40 @@ export const createWrapperConfig = async (config: {
120
98
  }
121
99
  }
122
100
  }],
123
- editorAppConfig: {
124
- monacoWorkerFactory: configureDefaultWorkerFactory
101
+ monacoWorkerFactory: configureDefaultWorkerFactory
102
+ };
103
+
104
+ const languageClientConfig: LanguageClientConfig = {
105
+ name: 'Clangd WASM Language Server',
106
+ connection: {
107
+ options: {
108
+ $type: 'WorkerDirect',
109
+ worker: await config.clangdWorkerHandler.createWorker(),
110
+ messagePort: config.lsMessageLocalPort
111
+ }
112
+ },
113
+ restartOptions: {
114
+ retries: 5,
115
+ timeout: 1000,
116
+ keepWorker: true
117
+ },
118
+ clientOptions: {
119
+ documentSelector: ['cpp'],
120
+ workspaceFolder: {
121
+ index: 0,
122
+ name: 'workspace',
123
+ uri: config.workspaceUri
124
+ }
125
125
  }
126
126
  };
127
+
128
+ const editorAppConfig: EditorAppConfig = {
129
+ $type: vscodeApiConfig.$type
130
+ };
131
+
132
+ return {
133
+ vscodeApiConfig,
134
+ languageClientConfig,
135
+ editorAppConfig
136
+ };
127
137
  };
@@ -3,18 +3,17 @@
3
3
  * Licensed under the MIT License. See LICENSE in the package root for license information.
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
+ import { RegisteredFileSystemProvider, RegisteredMemoryFile, registerFileSystemOverlay } from '@codingame/monaco-vscode-files-service-override';
6
7
  import * as vscode from 'vscode';
7
- import { RegisteredFileSystemProvider, registerFileSystemOverlay } from '@codingame/monaco-vscode-files-service-override';
8
8
  // this is required syntax highlighting
9
9
  import '@codingame/monaco-vscode-cpp-default-extension';
10
- import { MonacoEditorLanguageClientWrapper } from 'monaco-editor-wrapper';
11
- import { createWrapperConfig } from './config.js';
12
- import { ClangdWorkerHandler } from './workerHandler.js';
13
- import { MainRemoteMessageChannelFs } from './mainRemoteMessageChannelFs.js';
14
- import { createDefaultWorkspaceFile, disableElement } from '../../common/client/utils.js';
10
+ import { LanguageClientWrapper } from 'monaco-languageclient/lcwrapper';
11
+ import { MonacoVscodeApiWrapper } from 'monaco-languageclient/vscodeApiWrapper';
12
+ import { createDefaultWorkspaceContent, disableElement } from '../../common/client/utils.js';
15
13
  import { HOME_DIR, WORKSPACE_PATH } from '../definitions.js';
16
-
17
- const wrapper = new MonacoEditorLanguageClientWrapper();
14
+ import { createClangdAppConfig } from './config.js';
15
+ import { MainRemoteMessageChannelFs } from './mainRemoteMessageChannelFs.js';
16
+ import { ClangdWorkerHandler } from './workerHandler.js';
18
17
 
19
18
  export const runClangdWrapper = async () => {
20
19
  const channelLs = new MessageChannel();
@@ -22,7 +21,7 @@ export const runClangdWrapper = async () => {
22
21
 
23
22
  const fileSystemProvider = new RegisteredFileSystemProvider(false);
24
23
  const workspaceFileUri = vscode.Uri.file(`${HOME_DIR}/workspace.code-workspace`);
25
- fileSystemProvider.registerFile(createDefaultWorkspaceFile(workspaceFileUri, WORKSPACE_PATH));
24
+ fileSystemProvider.registerFile(new RegisteredMemoryFile(workspaceFileUri, createDefaultWorkspaceContent(WORKSPACE_PATH)));
26
25
  registerFileSystemOverlay(1, fileSystemProvider);
27
26
 
28
27
  const readiness = async () => {
@@ -32,7 +31,7 @@ export const runClangdWrapper = async () => {
32
31
  new MainRemoteMessageChannelFs(fileSystemProvider, channelFs.port1, readiness);
33
32
 
34
33
  const clangdWorkerHandler = new ClangdWorkerHandler();
35
- const wrapperConfig = await createWrapperConfig({
34
+ const appConfig = await createClangdAppConfig({
36
35
  htmlContainer: document.body,
37
36
  workspaceUri: vscode.Uri.file(WORKSPACE_PATH),
38
37
  workspaceFileUri,
@@ -40,7 +39,12 @@ export const runClangdWrapper = async () => {
40
39
  lsMessageLocalPort: channelLs.port1
41
40
  });
42
41
 
43
- await wrapper.init(wrapperConfig);
42
+ // perform global init
43
+ const apiWrapper = new MonacoVscodeApiWrapper(appConfig.vscodeApiConfig);
44
+ await apiWrapper.init();
45
+
46
+ const lcWrapper = new LanguageClientWrapper(appConfig.languageClientConfig);
47
+
44
48
  const initConfig = {
45
49
  lsMessagePort: channelLs.port2,
46
50
  fsMessagePort: channelFs.port2,
@@ -53,7 +57,7 @@ export const runClangdWrapper = async () => {
53
57
  const startWrapper = async () => {
54
58
  await clangdWorkerHandler.init(initConfig);
55
59
  await clangdWorkerHandler.launch();
56
- await wrapper.startLanguageClients();
60
+ await lcWrapper.start();
57
61
  };
58
62
 
59
63
  try {
@@ -0,0 +1,111 @@
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 { RegisteredFileSystemProvider, RegisteredMemoryFile, registerFileSystemOverlay } from '@codingame/monaco-vscode-files-service-override';
7
+ import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
8
+ import * as vscode from 'vscode';
9
+ // this is required syntax highlighting
10
+ import { LogLevel } from '@codingame/monaco-vscode-api';
11
+ import '@codingame/monaco-vscode-java-default-extension';
12
+ import { EditorApp, type EditorAppConfig } from 'monaco-languageclient/editorApp';
13
+ import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
14
+ import { LanguageClientWrapper, type LanguageClientConfig } from 'monaco-languageclient/lcwrapper';
15
+ import { MonacoVscodeApiWrapper, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
16
+
17
+ export const runExtendedClient = async (lsConfig: ExampleLsConfig, helloCode: string) => {
18
+ const helloUri = vscode.Uri.file(`${lsConfig.basePath}/workspace/hello.${lsConfig.documentSelector}`);
19
+ const fileSystemProvider = new RegisteredFileSystemProvider(false);
20
+ fileSystemProvider.registerFile(new RegisteredMemoryFile(helloUri, helloCode));
21
+ registerFileSystemOverlay(1, fileSystemProvider);
22
+
23
+ const htmlContainer = document.getElementById('monaco-editor-root')!;
24
+ const vscodeApiConfig: MonacoVscodeApiConfig = {
25
+ $type: 'extended',
26
+ htmlContainer,
27
+ logLevel: LogLevel.Debug,
28
+ serviceOverrides: {
29
+ ...getKeybindingsServiceOverride(),
30
+ },
31
+ userConfiguration: {
32
+ json: JSON.stringify({
33
+ 'workbench.colorTheme': 'Default Dark Modern',
34
+ 'editor.guides.bracketPairsHorizontal': 'active',
35
+ 'editor.lightbulb.enabled': 'On',
36
+ 'editor.wordBasedSuggestions': 'off',
37
+ 'editor.experimental.asyncTokenization': true
38
+ })
39
+ },
40
+ monacoWorkerFactory: configureDefaultWorkerFactory
41
+ };
42
+
43
+ const languageClientConfig: LanguageClientConfig = {
44
+ connection: {
45
+ options: {
46
+ $type: 'WebSocketUrl',
47
+ url: `ws://localhost:${lsConfig.port}${lsConfig.path}`,
48
+ startOptions: {
49
+ onCall: () => {
50
+ console.log('Connected to socket.');
51
+ },
52
+ reportStatus: true
53
+ },
54
+ stopOptions: {
55
+ onCall: () => {
56
+ console.log('Disconnected from socket.');
57
+ },
58
+ reportStatus: true
59
+ }
60
+ },
61
+ },
62
+ clientOptions: {
63
+ documentSelector: [lsConfig.documentSelector],
64
+ workspaceFolder: {
65
+ index: 0,
66
+ name: 'workspace',
67
+ uri: vscode.Uri.parse(`${lsConfig.basePath}/workspace`)
68
+ }
69
+ }
70
+ };
71
+
72
+ const editorAppConfig: EditorAppConfig = {
73
+ $type: vscodeApiConfig.$type,
74
+ codeResources: {
75
+ modified: {
76
+ text: helloCode,
77
+ uri: helloUri.path
78
+ }
79
+ }
80
+ };
81
+
82
+ // perform global init
83
+ const apiWrapper = new MonacoVscodeApiWrapper(vscodeApiConfig);
84
+ await apiWrapper.init();
85
+
86
+ const lcWrapper = new LanguageClientWrapper(languageClientConfig, apiWrapper.getLogger());
87
+ const editorApp = new EditorApp(editorAppConfig);
88
+
89
+ try {
90
+ document.querySelector('#button-start')?.addEventListener('click', async () => {
91
+ await editorApp.start(htmlContainer);
92
+ await lcWrapper.start();
93
+
94
+ // open files, so the LS can pick it up
95
+ await vscode.workspace.openTextDocument(helloUri);
96
+ });
97
+ document.querySelector('#button-dispose')?.addEventListener('click', async () => {
98
+ await editorApp.dispose();
99
+ await lcWrapper.dispose();
100
+ });
101
+ } catch (e) {
102
+ console.error(e);
103
+ }
104
+ };
105
+
106
+ export type ExampleLsConfig = {
107
+ port: number;
108
+ path: string;
109
+ basePath: string;
110
+ documentSelector: string;
111
+ };
@@ -3,9 +3,10 @@
3
3
  * Licensed under the MIT License. See LICENSE in the package root for license information.
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
- import { RegisteredMemoryFile } from '@codingame/monaco-vscode-files-service-override';
7
6
  import type { IStoredWorkspace } from '@codingame/monaco-vscode-configuration-service-override';
8
- import type { Uri } from 'vscode';
7
+ import type { EditorAppConfig } from 'monaco-languageclient/editorApp';
8
+ import type { LanguageClientConfig } from 'monaco-languageclient/lcwrapper';
9
+ import type { MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
9
10
 
10
11
  export const disableElement = (id: string, disabled: boolean) => {
11
12
  const button = document.getElementById(id) as HTMLButtonElement | HTMLInputElement | null;
@@ -14,23 +15,22 @@ export const disableElement = (id: string, disabled: boolean) => {
14
15
  }
15
16
  };
16
17
 
17
- export const createDefaultWorkspaceFile = (workspaceFile: Uri, workspacePath: string) => {
18
- return new RegisteredMemoryFile(
19
- workspaceFile,
20
- JSON.stringify(
21
- <IStoredWorkspace>{
22
- folders: [
23
- {
24
- path: workspacePath
25
- }
26
- ]
27
- },
28
- null,
29
- 2
30
- )
18
+ export const createDefaultWorkspaceContent = (workspacePath: string) => {
19
+ return JSON.stringify(
20
+ <IStoredWorkspace>{
21
+ folders: [
22
+ {
23
+ path: workspacePath
24
+ }
25
+ ]
26
+ },
27
+ null,
28
+ 2
31
29
  );
32
30
  };
33
31
 
34
- export const delayExecution = (ms: number) => {
35
- return new Promise((resolve) => setTimeout(resolve, ms));
32
+ export type ExampleAppConfig = {
33
+ vscodeApiConfig: MonacoVscodeApiConfig;
34
+ languageClientConfig: LanguageClientConfig;
35
+ editorAppConfig: EditorAppConfig;
36
36
  };
@@ -4,7 +4,7 @@
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
6
  import * as vscode from 'vscode';
7
- import type { ExtensionConfig } from 'monaco-editor-wrapper';
7
+ import type { ExtensionConfig } from 'monaco-languageclient/vscodeApiWrapper';
8
8
  import type { ConfigParams, InitMessage } from '../common/definitions.js';
9
9
 
10
10
  // This is derived from: