monaco-languageclient-examples 2025.8.3 → 2025.8.4

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 +4 -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 +4 -2
  7. package/dist/appPlayground/config.d.ts.map +1 -1
  8. package/dist/appPlayground/config.js +65 -63
  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 +5 -4
  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 +2 -3
  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 +12 -9
  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 +8 -1
  38. package/dist/common/client/utils.d.ts.map +1 -1
  39. package/dist/common/client/utils.js +0 -3
  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 +0 -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 +93 -97
  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 +5 -6
  116. package/src/appPlayground/common.ts +3 -3
  117. package/src/appPlayground/config.ts +69 -65
  118. package/src/appPlayground/launcher.ts +2 -1
  119. package/src/appPlayground/main.ts +8 -5
  120. package/src/appPlayground/reactLauncher.ts +2 -1
  121. package/src/appPlayground/reactMain.tsx +4 -4
  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 +14 -10
  126. package/src/common/client/extendedClient.ts +111 -0
  127. package/src/common/client/utils.ts +7 -2
  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 +0 -3
  146. package/src/python/client/config.ts +101 -99
  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
@@ -9,10 +9,12 @@ import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-
9
9
  import '@codingame/monaco-vscode-json-default-extension';
10
10
  import '@codingame/monaco-vscode-python-default-extension';
11
11
  import { LogLevel } from '@codingame/monaco-vscode-api';
12
- import { MonacoEditorLanguageClientWrapper, type WrapperConfig } from 'monaco-editor-wrapper';
13
- import { configureDefaultWorkerFactory } from 'monaco-editor-wrapper/workers/workerLoaders';
12
+ import { EditorApp, type EditorAppConfig } from 'monaco-languageclient/editorApp';
13
+ import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
14
14
  import { disableElement } from '../common/client/utils.js';
15
15
  import { createJsonLanguageClientConfig, createPythonLanguageClientConfig } from './config.js';
16
+ import { MonacoVscodeApiWrapper, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
17
+ import { LanguageClientsManager } from 'monaco-languageclient/lcwrapper';
16
18
 
17
19
  export const runMultipleLanguageClientsExample = async () => {
18
20
  disableElement('button-flip', true);
@@ -31,64 +33,63 @@ print("Hello Moon!")
31
33
  let currentText = textJson;
32
34
  let currenFileExt = 'json';
33
35
 
34
- const wrapperConfig: WrapperConfig = {
35
- id: '42',
36
+ const htmlContainer = document.getElementById('monaco-editor-root')!;
37
+ const vscodeApiConfig: MonacoVscodeApiConfig = {
36
38
  $type: 'extended',
37
- htmlContainer: document.getElementById('monaco-editor-root')!,
39
+ htmlContainer,
38
40
  logLevel: LogLevel.Debug,
39
- vscodeApiConfig: {
40
- serviceOverrides: {
41
- ...getKeybindingsServiceOverride()
42
- },
43
- userConfiguration: {
44
- json: JSON.stringify({
45
- 'workbench.colorTheme': 'Default Dark Modern',
46
- 'editor.wordBasedSuggestions': 'off',
47
- 'editor.experimental.asyncTokenization': true
48
- })
49
- }
41
+ serviceOverrides: {
42
+ ...getKeybindingsServiceOverride()
50
43
  },
51
- editorAppConfig: {
52
- codeResources: {
53
- modified: {
54
- text: currentText,
55
- uri: `/workspace/example.${currenFileExt}`
56
- }
57
- },
58
- monacoWorkerFactory: configureDefaultWorkerFactory
44
+ userConfiguration: {
45
+ json: JSON.stringify({
46
+ 'workbench.colorTheme': 'Default Dark Modern',
47
+ 'editor.wordBasedSuggestions': 'off',
48
+ 'editor.experimental.asyncTokenization': true
49
+ })
59
50
  },
60
- languageClientConfigs: {
61
- configs: {
62
- json: createJsonLanguageClientConfig(),
63
- python: createPythonLanguageClientConfig()
51
+ monacoWorkerFactory: configureDefaultWorkerFactory
52
+ };
53
+
54
+ const editorAppConfig: EditorAppConfig = {
55
+ $type: vscodeApiConfig.$type,
56
+ id: '42',
57
+ codeResources: {
58
+ modified: {
59
+ text: currentText,
60
+ uri: `/workspace/example.${currenFileExt}`
64
61
  }
65
62
  }
66
63
  };
67
64
 
68
- const wrapper = new MonacoEditorLanguageClientWrapper();
65
+ // perform global init
66
+ const apiWrapper = new MonacoVscodeApiWrapper(vscodeApiConfig);
67
+ await apiWrapper.init();
68
+
69
+ const lcManager = new LanguageClientsManager();
70
+ const languageClientConfigs = {
71
+ configs: {
72
+ json: createJsonLanguageClientConfig(),
73
+ python: createPythonLanguageClientConfig()
74
+ }
75
+ };
76
+
77
+ const editorApp = new EditorApp(editorAppConfig);
69
78
 
70
79
  document.querySelector('#button-start')?.addEventListener('click', async () => {
71
80
  try {
72
81
  disableElement('button-start', true);
73
82
  disableElement('button-flip', false);
74
- disableElement('checkbox-extlc', true);
75
-
76
- const externalLc = (document.getElementById('checkbox-extlc') as HTMLInputElement).checked;
77
- wrapperConfig.languageClientConfigs!.automaticallyInit = !externalLc;
78
- wrapperConfig.languageClientConfigs!.automaticallyStart = !externalLc;
79
- wrapperConfig.languageClientConfigs!.automaticallyDispose = !externalLc;
80
83
 
81
- await wrapper.initAndStart(wrapperConfig);
82
- if (wrapperConfig.editorAppConfig?.codeResources?.modified !== undefined) {
83
- wrapperConfig.editorAppConfig.codeResources.modified.text = currentText;
84
- wrapperConfig.editorAppConfig.codeResources.modified.uri = `/workspace/example.${currenFileExt}`;
84
+ await editorApp.start(htmlContainer);
85
+ if (editorAppConfig.codeResources?.modified !== undefined) {
86
+ editorAppConfig.codeResources.modified.text = currentText;
87
+ editorAppConfig.codeResources.modified.uri = `/workspace/example.${currenFileExt}`;
85
88
  }
86
89
 
87
- // init language clients after start
88
- if (externalLc) {
89
- wrapper.initLanguageClients();
90
- await wrapper.startLanguageClients();
91
- }
90
+ // init and start language clients after start
91
+ await lcManager.setConfigs(languageClientConfigs);
92
+ await lcManager.start();
92
93
  } catch (e) {
93
94
  console.error(e);
94
95
  }
@@ -98,18 +99,13 @@ print("Hello Moon!")
98
99
  disableElement('button-dispose', true);
99
100
  disableElement('button-start', false);
100
101
 
101
- const externalLc = (document.getElementById('checkbox-extlc')! as HTMLInputElement).checked;
102
-
103
- await wrapper.dispose();
104
-
105
- if (externalLc) {
106
- wrapper.disposeLanguageClients();
107
- }
102
+ await editorApp.dispose();
103
+ await lcManager.dispose();
108
104
  });
109
105
  document.querySelector('#button-flip')?.addEventListener('click', async () => {
110
106
  currentText = currentText === textJson ? textPython : textJson;
111
107
  currenFileExt = currenFileExt === 'json' ? 'py' : 'json';
112
- wrapper.updateCodeResources({
108
+ editorApp.updateCodeResources({
113
109
  modified: {
114
110
  text: currentText,
115
111
  uri: `/workspace/example.${currenFileExt}`
package/src/node.ts CHANGED
@@ -6,6 +6,3 @@
6
6
  /* server side export only */
7
7
  export * from './common/node/server-commons.js';
8
8
  export * from './common/node/language-server-runner.js';
9
- export * from './json/server/json-server.js';
10
- export * from './json/server/main.js';
11
- export * from './python/server/main.js';
@@ -21,13 +21,14 @@ import getTestingServiceOverride from '@codingame/monaco-vscode-testing-service-
21
21
  import getBannerServiceOverride from '@codingame/monaco-vscode-view-banner-service-override';
22
22
  import getStatusBarServiceOverride from '@codingame/monaco-vscode-view-status-bar-service-override';
23
23
  import getTitleBarServiceOverride from '@codingame/monaco-vscode-view-title-bar-service-override';
24
- import type { WrapperConfig } from 'monaco-editor-wrapper';
25
- import { defaultHtmlAugmentationInstructions, defaultViewsInit } from 'monaco-editor-wrapper/vscode/services';
26
- import { configureDefaultWorkerFactory } from 'monaco-editor-wrapper/workers/workerLoaders';
27
- import { MonacoLanguageClient } from 'monaco-languageclient';
28
- import { createUrl } from 'monaco-languageclient/tools';
29
- import { createDefaultLocaleConfiguration } from 'monaco-languageclient/vscode/services';
24
+ import type { EditorAppConfig } from 'monaco-languageclient/editorApp';
25
+ import { createUrl } from 'monaco-languageclient/common';
26
+ import type { LanguageClientConfig } from 'monaco-languageclient/lcwrapper';
27
+ import { createDefaultLocaleConfiguration } from 'monaco-languageclient/vscodeApiLocales';
28
+ import { defaultHtmlAugmentationInstructions, defaultViewsInit, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
29
+ import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
30
30
  import * as vscode from 'vscode';
31
+ import type { BaseLanguageClient } from 'vscode-languageclient/browser.js';
31
32
  import { toSocket, WebSocketMessageReader, WebSocketMessageWriter } from 'vscode-ws-jsonrpc';
32
33
  import badPyCode from '../../../resources/python/bad.py?raw';
33
34
  import helloPyCode from '../../../resources/python/hello.py?raw';
@@ -67,7 +68,7 @@ export const createDefaultConfigParams = (homeDir: string, htmlContainer?: HTMLE
67
68
  fileSystemProvider.registerFile(new RegisteredMemoryFile(files.get('hello.py')!.uri, helloPyCode));
68
69
  fileSystemProvider.registerFile(new RegisteredMemoryFile(files.get('hello2.py')!.uri, hello2PyCode));
69
70
  fileSystemProvider.registerFile(new RegisteredMemoryFile(files.get('bad.py')!.uri, badPyCode));
70
- fileSystemProvider.registerFile(new RegisteredMemoryFile(configParams.workspaceFile, createDefaultWorkspaceContent(configParams.workspaceRoot)));
71
+ fileSystemProvider.registerFile(new RegisteredMemoryFile(configParams.workspaceFile, createDefaultWorkspaceContent(workspaceRoot)));
71
72
  fileSystemProvider.registerFile(createDebugLaunchConfigFile(workspaceRoot, configParams.languageId));
72
73
  registerFileSystemOverlay(1, fileSystemProvider);
73
74
 
@@ -75,11 +76,13 @@ export const createDefaultConfigParams = (homeDir: string, htmlContainer?: HTMLE
75
76
  };
76
77
 
77
78
  export type PythonAppConfig = {
78
- wrapperConfig: WrapperConfig;
79
+ languageClientConfig: LanguageClientConfig;
80
+ vscodeApiConfig: MonacoVscodeApiConfig;
81
+ editorAppConfig: EditorAppConfig;
79
82
  configParams: ConfigParams;
80
83
  }
81
84
 
82
- export const createWrapperConfig = (): PythonAppConfig => {
85
+ export const createPythonAppConfig = (): PythonAppConfig => {
83
86
  const configParams = createDefaultConfigParams('/home/mlc', document.body);
84
87
 
85
88
  const url = createUrl({
@@ -96,101 +99,65 @@ export const createWrapperConfig = (): PythonAppConfig => {
96
99
  const reader = new WebSocketMessageReader(iWebSocket);
97
100
  const writer = new WebSocketMessageWriter(iWebSocket);
98
101
 
99
- const wrapperConfig: WrapperConfig = {
102
+ const vscodeApiConfig: MonacoVscodeApiConfig = {
100
103
  $type: 'extended',
101
104
  htmlContainer: configParams.htmlContainer,
102
105
  logLevel: LogLevel.Debug,
103
- languageClientConfigs: {
104
- configs: {
105
- python: {
106
- name: 'Python Language Server Example',
107
- connection: {
108
- options: {
109
- $type: 'WebSocketDirect',
110
- webSocket: webSocket,
111
- startOptions: {
112
- onCall: (languageClient?: MonacoLanguageClient) => {
113
- setTimeout(() => {
114
- ['pyright.restartserver', 'pyright.organizeimports'].forEach((cmdName) => {
115
- vscode.commands.registerCommand(cmdName, (...args: unknown[]) => {
116
- languageClient?.sendRequest('workspace/executeCommand', { command: cmdName, arguments: args });
117
- });
118
- });
119
- }, 250);
120
- },
121
- reportStatus: true,
122
- }
123
- },
124
- messageTransports: { reader, writer }
125
- },
126
- clientOptions: {
127
- documentSelector: [configParams.languageId],
128
- workspaceFolder: {
129
- index: 0,
130
- name: configParams.workspaceRoot,
131
- uri: vscode.Uri.parse(configParams.workspaceRoot)
132
- },
133
- }
134
- }
135
- }
106
+ serviceOverrides: {
107
+ ...getKeybindingsServiceOverride(),
108
+ ...getLifecycleServiceOverride(),
109
+ ...getLocalizationServiceOverride(createDefaultLocaleConfiguration()),
110
+ ...getBannerServiceOverride(),
111
+ ...getStatusBarServiceOverride(),
112
+ ...getTitleBarServiceOverride(),
113
+ ...getExplorerServiceOverride(),
114
+ ...getRemoteAgentServiceOverride(),
115
+ ...getEnvironmentServiceOverride(),
116
+ ...getSecretStorageServiceOverride(),
117
+ ...getStorageServiceOverride(),
118
+ ...getSearchServiceOverride(),
119
+ ...getDebugServiceOverride(),
120
+ ...getTestingServiceOverride(),
121
+ ...getPreferencesServiceOverride()
136
122
  },
137
- vscodeApiConfig: {
138
- serviceOverrides: {
139
- ...getKeybindingsServiceOverride(),
140
- ...getLifecycleServiceOverride(),
141
- ...getLocalizationServiceOverride(createDefaultLocaleConfiguration()),
142
- ...getBannerServiceOverride(),
143
- ...getStatusBarServiceOverride(),
144
- ...getTitleBarServiceOverride(),
145
- ...getExplorerServiceOverride(),
146
- ...getRemoteAgentServiceOverride(),
147
- ...getEnvironmentServiceOverride(),
148
- ...getSecretStorageServiceOverride(),
149
- ...getStorageServiceOverride(),
150
- ...getSearchServiceOverride(),
151
- ...getDebugServiceOverride(),
152
- ...getTestingServiceOverride(),
153
- ...getPreferencesServiceOverride()
154
- },
155
- viewsConfig: {
156
- viewServiceType: 'ViewsService',
157
- htmlAugmentationInstructions: defaultHtmlAugmentationInstructions,
158
- viewsInitFunc: defaultViewsInit
159
- },
160
- userConfiguration: {
161
- json: JSON.stringify({
162
- 'workbench.colorTheme': 'Default Dark Modern',
163
- 'editor.guides.bracketPairsHorizontal': 'active',
164
- 'editor.wordBasedSuggestions': 'off',
165
- 'editor.experimental.asyncTokenization': true,
166
- 'debug.toolBarLocation': 'docked'
167
- })
123
+ viewsConfig: {
124
+ viewServiceType: 'ViewsService',
125
+ htmlAugmentationInstructions: defaultHtmlAugmentationInstructions,
126
+ viewsInitFunc: defaultViewsInit
127
+ },
128
+ userConfiguration: {
129
+ json: JSON.stringify({
130
+ 'workbench.colorTheme': 'Default Dark Modern',
131
+ 'editor.guides.bracketPairsHorizontal': 'active',
132
+ 'editor.wordBasedSuggestions': 'off',
133
+ 'editor.experimental.asyncTokenization': true,
134
+ 'debug.toolBarLocation': 'docked'
135
+ })
136
+ },
137
+ workspaceConfig: {
138
+ enableWorkspaceTrust: true,
139
+ windowIndicator: {
140
+ label: 'mlc-python-example',
141
+ tooltip: '',
142
+ command: ''
168
143
  },
169
- workspaceConfig: {
170
- enableWorkspaceTrust: true,
171
- windowIndicator: {
172
- label: 'mlc-python-example',
173
- tooltip: '',
174
- command: ''
175
- },
176
- workspaceProvider: {
177
- trusted: true,
178
- async open() {
179
- window.open(window.location.href);
180
- return true;
181
- },
182
- workspace: {
183
- workspaceUri: configParams.workspaceFile
184
- }
185
- },
186
- configurationDefaults: {
187
- 'window.title': 'mlc-python-example${separator}${dirty}${activeEditorShort}'
144
+ workspaceProvider: {
145
+ trusted: true,
146
+ async open() {
147
+ window.open(window.location.href);
148
+ return true;
188
149
  },
189
- productConfiguration: {
190
- nameShort: 'mlc-python-example',
191
- nameLong: 'mlc-python-example'
150
+ workspace: {
151
+ workspaceUri: configParams.workspaceFile
192
152
  }
193
153
  },
154
+ configurationDefaults: {
155
+ 'window.title': 'mlc-python-example${separator}${dirty}${activeEditorShort}'
156
+ },
157
+ productConfiguration: {
158
+ nameShort: 'mlc-python-example',
159
+ nameLong: 'mlc-python-example'
160
+ }
194
161
  },
195
162
  extensions: [
196
163
  {
@@ -205,13 +172,48 @@ export const createWrapperConfig = (): PythonAppConfig => {
205
172
  },
206
173
  provideDebuggerExtensionConfig(configParams)
207
174
  ],
208
- editorAppConfig: {
209
- monacoWorkerFactory: configureDefaultWorkerFactory
175
+ monacoWorkerFactory: configureDefaultWorkerFactory
176
+ };
177
+
178
+ const languageClientConfig: LanguageClientConfig = {
179
+ name: 'Python Language Server Example',
180
+ connection: {
181
+ options: {
182
+ $type: 'WebSocketDirect',
183
+ webSocket: webSocket,
184
+ startOptions: {
185
+ onCall: (languageClient?: BaseLanguageClient) => {
186
+ setTimeout(() => {
187
+ ['pyright.restartserver', 'pyright.organizeimports'].forEach((cmdName) => {
188
+ vscode.commands.registerCommand(cmdName, (...args: unknown[]) => {
189
+ languageClient?.sendRequest('workspace/executeCommand', { command: cmdName, arguments: args });
190
+ });
191
+ });
192
+ }, 250);
193
+ },
194
+ reportStatus: true,
195
+ }
196
+ },
197
+ messageTransports: { reader, writer }
198
+ },
199
+ clientOptions: {
200
+ documentSelector: [configParams.languageId],
201
+ workspaceFolder: {
202
+ index: 0,
203
+ name: configParams.workspaceRoot,
204
+ uri: vscode.Uri.parse(configParams.workspaceRoot)
205
+ },
210
206
  }
211
207
  };
212
208
 
209
+ const editorAppConfig: EditorAppConfig = {
210
+ $type: vscodeApiConfig.$type
211
+ };
212
+
213
213
  return {
214
- wrapperConfig,
214
+ vscodeApiConfig,
215
+ languageClientConfig,
216
+ editorAppConfig,
215
217
  configParams: configParams
216
218
  };
217
219
  };
@@ -3,32 +3,41 @@
3
3
  * Licensed under the MIT License. See LICENSE in the package root for license information.
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
- import * as vscode from 'vscode';
7
6
  import { type RegisterLocalProcessExtensionResult } from '@codingame/monaco-vscode-api/extensions';
8
- import { MonacoEditorLanguageClientWrapper } from 'monaco-editor-wrapper';
9
- import { createWrapperConfig } from './config.js';
7
+ import { EditorApp } from 'monaco-languageclient/editorApp';
8
+ import { LanguageClientWrapper } from 'monaco-languageclient/lcwrapper';
9
+ import { MonacoVscodeApiWrapper } from 'monaco-languageclient/vscodeApiWrapper';
10
+ import * as vscode from 'vscode';
10
11
  import { configureDebugging } from '../../debugger/client/debugger.js';
12
+ import { createPythonAppConfig } from './config.js';
11
13
 
12
14
  export const runPythonWrapper = async () => {
13
- const appConfig = createWrapperConfig();
14
- const wrapper = new MonacoEditorLanguageClientWrapper();
15
+ const appConfig = createPythonAppConfig();
16
+
17
+ // perform global init
18
+ const apiWrapper = new MonacoVscodeApiWrapper(appConfig.vscodeApiConfig);
19
+ await apiWrapper.init();
20
+
21
+ const lcWrapper = new LanguageClientWrapper(appConfig.languageClientConfig);
15
22
 
16
- if (wrapper.isStarted()) {
23
+ const editorApp = new EditorApp(appConfig.editorAppConfig);
24
+
25
+ if (editorApp.isStarted()) {
17
26
  console.warn('Editor was already started!');
18
27
  } else {
19
- await wrapper.init(appConfig.wrapperConfig);
20
-
21
- const result = wrapper.getExtensionRegisterResult('mlc-python-example') as RegisterLocalProcessExtensionResult;
28
+ const result = apiWrapper.getExtensionRegisterResult('mlc-python-example') as RegisterLocalProcessExtensionResult;
22
29
  result.setAsDefaultApi();
23
30
 
24
- const initResult = wrapper.getExtensionRegisterResult('debugger-py-client') as RegisterLocalProcessExtensionResult | undefined;
31
+ const initResult = apiWrapper.getExtensionRegisterResult('debugger-py-client') as RegisterLocalProcessExtensionResult | undefined;
25
32
  if (initResult !== undefined) {
26
33
  configureDebugging(await initResult.getApi(), appConfig.configParams);
27
34
  }
28
35
 
36
+ await lcWrapper.start();
37
+
29
38
  await vscode.commands.executeCommand('workbench.view.explorer');
30
39
  await vscode.window.showTextDocument(appConfig.configParams.files.get('hello2.py')!.uri);
31
40
 
32
- await wrapper.start();
41
+ await editorApp.start(appConfig.vscodeApiConfig.htmlContainer!);
33
42
  }
34
43
  };
@@ -3,23 +3,23 @@
3
3
  * Licensed under the MIT License. See LICENSE in the package root for license information.
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
- import * as vscode from 'vscode';
7
6
  import { type RegisterLocalProcessExtensionResult } from '@codingame/monaco-vscode-api/extensions';
7
+ import { MonacoEditorReactComp } from '@typefox/monaco-editor-react';
8
+ import type { MonacoVscodeApiWrapper } from 'monaco-languageclient/vscodeApiWrapper';
8
9
  import React from 'react';
9
10
  import ReactDOM from 'react-dom/client';
10
- import { MonacoEditorReactComp } from '@typefox/monaco-editor-react';
11
- import { MonacoEditorLanguageClientWrapper } from 'monaco-editor-wrapper';
12
- import { createWrapperConfig } from './config.js';
11
+ import * as vscode from 'vscode';
13
12
  import { configureDebugging } from '../../debugger/client/debugger.js';
13
+ import { createPythonAppConfig } from './config.js';
14
14
 
15
15
  export const runPythonReact = async () => {
16
- const appConfig = createWrapperConfig();
16
+ const appConfig = createPythonAppConfig();
17
17
 
18
- const onLoad = async (wrapper: MonacoEditorLanguageClientWrapper) => {
19
- const result = wrapper.getExtensionRegisterResult('mlc-python-example') as RegisterLocalProcessExtensionResult;
18
+ const onVscodeApiInitDone = async (apiWrapper: MonacoVscodeApiWrapper) => {
19
+ const result = apiWrapper.getExtensionRegisterResult('mlc-python-example') as RegisterLocalProcessExtensionResult;
20
20
  result.setAsDefaultApi();
21
21
 
22
- const initResult = wrapper.getExtensionRegisterResult('debugger-py-client') as RegisterLocalProcessExtensionResult | undefined;
22
+ const initResult = apiWrapper.getExtensionRegisterResult('debugger-py-client') as RegisterLocalProcessExtensionResult | undefined;
23
23
  if (initResult !== undefined) {
24
24
  configureDebugging(await initResult.getApi(), appConfig.configParams);
25
25
  }
@@ -34,9 +34,10 @@ export const runPythonReact = async () => {
34
34
  return (
35
35
  <div style={{ 'backgroundColor': '#1f1f1f' }} >
36
36
  <MonacoEditorReactComp
37
- wrapperConfig={appConfig.wrapperConfig}
37
+ vscodeApiConfig={appConfig.vscodeApiConfig}
38
+ editorAppConfig={appConfig.editorAppConfig}
38
39
  style={{ 'height': '100%' }}
39
- onLoad={onLoad}
40
+ onVscodeApiInitDone={onVscodeApiInitDone}
40
41
  onError={(e) => {
41
42
  console.error(e);
42
43
  }} />
@@ -3,14 +3,15 @@
3
3
  * Licensed under the MIT License. See LICENSE in the package root for license information.
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
- import * as vscode from 'vscode';
7
- import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
6
+ import { LogLevel } from '@codingame/monaco-vscode-api';
8
7
  import '@codingame/monaco-vscode-javascript-default-extension';
8
+ import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
9
9
  import '@codingame/monaco-vscode-typescript-basics-default-extension';
10
10
  import '@codingame/monaco-vscode-typescript-language-features-default-extension';
11
- import { LogLevel } from '@codingame/monaco-vscode-api';
12
- import { MonacoEditorLanguageClientWrapper, type WrapperConfig } from 'monaco-editor-wrapper';
13
- import { configureDefaultWorkerFactory } from 'monaco-editor-wrapper/workers/workerLoaders';
11
+ import { EditorApp, type EditorAppConfig } from 'monaco-languageclient/editorApp';
12
+ import { MonacoVscodeApiWrapper, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
13
+ import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
14
+ import * as vscode from 'vscode';
14
15
  import { disableElement } from '../common/client/utils.js';
15
16
 
16
17
  export const runTsWrapper = async () => {
@@ -24,49 +25,55 @@ export const runTsWrapper = async () => {
24
25
  return "Goodbye";
25
26
  };`;
26
27
 
27
- const wrapperConfig: WrapperConfig = {
28
+ const htmlContainer = document.getElementById('monaco-editor-root')!;
29
+ const vscodeApiConfig: MonacoVscodeApiConfig = {
28
30
  $type: 'extended',
29
- htmlContainer: document.getElementById('monaco-editor-root')!,
31
+ htmlContainer,
30
32
  logLevel: LogLevel.Debug,
31
- vscodeApiConfig: {
32
- serviceOverrides: {
33
- ...getKeybindingsServiceOverride()
34
- },
33
+ serviceOverrides: {
34
+ ...getKeybindingsServiceOverride()
35
+ },
36
+ advanced: {
35
37
  enableExtHostWorker: true,
36
- userConfiguration: {
37
- json: JSON.stringify({
38
- 'workbench.colorTheme': 'Default Dark Modern',
39
- 'typescript.tsserver.web.projectWideIntellisense.enabled': true,
40
- 'typescript.tsserver.web.projectWideIntellisense.suppressSemanticErrors': false,
41
- 'diffEditor.renderSideBySide': false,
42
- 'editor.lightbulb.enabled': 'on',
43
- 'editor.glyphMargin': true,
44
- 'editor.guides.bracketPairsHorizontal': true,
45
- 'editor.experimental.asyncTokenization': true
46
- })
47
- }
48
38
  },
49
- editorAppConfig: {
50
- codeResources: {
51
- modified: {
52
- text: code,
53
- uri: codeUri
54
- },
55
- original: {
56
- text: codeOriginal,
57
- uri: codeOriginalUri,
58
- }
39
+ userConfiguration: {
40
+ json: JSON.stringify({
41
+ 'workbench.colorTheme': 'Default Dark Modern',
42
+ 'typescript.tsserver.web.projectWideIntellisense.enabled': true,
43
+ 'typescript.tsserver.web.projectWideIntellisense.suppressSemanticErrors': false,
44
+ 'diffEditor.renderSideBySide': false,
45
+ 'editor.lightbulb.enabled': 'on',
46
+ 'editor.glyphMargin': true,
47
+ 'editor.guides.bracketPairsHorizontal': true,
48
+ 'editor.experimental.asyncTokenization': true
49
+ })
50
+ },
51
+ monacoWorkerFactory: configureDefaultWorkerFactory
52
+ };
53
+
54
+ const editorAppConfig: EditorAppConfig = {
55
+ $type: vscodeApiConfig.$type,
56
+ codeResources: {
57
+ modified: {
58
+ text: code,
59
+ uri: codeUri
59
60
  },
60
- monacoWorkerFactory: configureDefaultWorkerFactory
61
+ original: {
62
+ text: codeOriginal,
63
+ uri: codeOriginalUri,
64
+ }
61
65
  }
62
66
  };
63
67
 
64
- const wrapper = new MonacoEditorLanguageClientWrapper();
68
+ const apiWrapper = new MonacoVscodeApiWrapper(vscodeApiConfig);
69
+ await apiWrapper.init();
70
+
71
+ const editorApp = new EditorApp(editorAppConfig);
65
72
  disableElement('button-swap-code', true);
66
73
 
67
74
  try {
68
75
  document.querySelector('#button-start')?.addEventListener('click', async () => {
69
- await wrapper.initAndStart(wrapperConfig);
76
+ await editorApp.start(htmlContainer);
70
77
 
71
78
  vscode.commands.getCommands().then((x) => {
72
79
  console.log(`Found ${x.length} commands`);
@@ -74,13 +81,13 @@ export const runTsWrapper = async () => {
74
81
  console.log(`Found command: ${finding}`);
75
82
  });
76
83
 
77
- wrapper.getEditor()?.focus();
84
+ editorApp.getEditor()?.focus();
78
85
  await vscode.commands.executeCommand('actions.find');
79
86
  });
80
87
  document.querySelector('#button-swap-code')?.addEventListener('click', () => {
81
- const codeResources = wrapper.getEditorApp()?.getConfig().codeResources;
88
+ const codeResources = editorApp.getConfig().codeResources;
82
89
  if (codeResources?.modified?.uri === codeUri) {
83
- wrapper.updateCodeResources({
90
+ editorApp.updateCodeResources({
84
91
  modified: {
85
92
  text: codeOriginal,
86
93
  uri: codeOriginalUri
@@ -91,7 +98,7 @@ export const runTsWrapper = async () => {
91
98
  }
92
99
  });
93
100
  } else {
94
- wrapper.updateCodeResources({
101
+ editorApp.updateCodeResources({
95
102
  modified: {
96
103
  text: code,
97
104
  uri: codeUri
@@ -105,14 +112,14 @@ export const runTsWrapper = async () => {
105
112
  });
106
113
  document.querySelector('#button-diff')?.addEventListener('click', async () => {
107
114
  // ensure it is boolean value and not undefined
108
- const useDiffEditor = wrapperConfig.editorAppConfig!.useDiffEditor ?? false;
109
- wrapperConfig.editorAppConfig!.useDiffEditor = !useDiffEditor;
110
- disableElement('button-swap-code', !wrapperConfig.editorAppConfig!.useDiffEditor);
115
+ const useDiffEditor = editorAppConfig.useDiffEditor ?? false;
116
+ editorAppConfig.useDiffEditor = !useDiffEditor;
117
+ disableElement('button-swap-code', !editorAppConfig.useDiffEditor);
111
118
 
112
- await wrapper.initAndStart(wrapperConfig);
119
+ await editorApp.start(htmlContainer);
113
120
  });
114
121
  document.querySelector('#button-dispose')?.addEventListener('click', async () => {
115
- await wrapper.dispose();
122
+ await editorApp.dispose();
116
123
  });
117
124
  } catch (e) {
118
125
  console.error(e);