monaco-languageclient-examples 2025.6.3 → 2025.8.2

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 (176) hide show
  1. package/CHANGELOG.md +8 -2
  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 +3 -2
  5. package/dist/appPlayground/common.js.map +1 -1
  6. package/dist/appPlayground/config.d.ts +2 -4
  7. package/dist/appPlayground/config.d.ts.map +1 -1
  8. package/dist/appPlayground/config.js +63 -65
  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 +4 -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 -2
  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 +15 -12
  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 +27 -28
  25. package/dist/browser/main.js.map +1 -1
  26. package/dist/clangd/client/config.d.ts +3 -10
  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 +9 -12
  32. package/dist/clangd/client/main.js.map +1 -1
  33. package/dist/clangd/worker/clangd-server.js.map +1 -1
  34. package/dist/common/client/utils.d.ts +1 -8
  35. package/dist/common/client/utils.d.ts.map +1 -1
  36. package/dist/common/client/utils.js +3 -0
  37. package/dist/common/client/utils.js.map +1 -1
  38. package/dist/debugger/client/debugger.d.ts +1 -1
  39. package/dist/debugger/client/debugger.d.ts.map +1 -1
  40. package/dist/eclipse.jdt.ls/client/main.d.ts +1 -1
  41. package/dist/eclipse.jdt.ls/client/main.d.ts.map +1 -1
  42. package/dist/eclipse.jdt.ls/client/main.js +74 -4
  43. package/dist/eclipse.jdt.ls/client/main.js.map +1 -1
  44. package/dist/eclipse.jdt.ls/config.d.ts +5 -2
  45. package/dist/eclipse.jdt.ls/config.d.ts.map +1 -1
  46. package/dist/eclipse.jdt.ls/config.js +1 -2
  47. package/dist/eclipse.jdt.ls/config.js.map +1 -1
  48. package/dist/groovy/client/main.d.ts +1 -1
  49. package/dist/groovy/client/main.d.ts.map +1 -1
  50. package/dist/groovy/client/main.js +63 -4
  51. package/dist/groovy/client/main.js.map +1 -1
  52. package/dist/groovy/config.d.ts +5 -2
  53. package/dist/groovy/config.d.ts.map +1 -1
  54. package/dist/groovy/config.js +1 -2
  55. package/dist/groovy/config.js.map +1 -1
  56. package/dist/json/client/wrapperWs.d.ts +5 -0
  57. package/dist/json/client/wrapperWs.d.ts.map +1 -0
  58. package/dist/json/client/wrapperWs.js +87 -0
  59. package/dist/json/client/wrapperWs.js.map +1 -0
  60. package/dist/json/server/main.js.map +1 -1
  61. package/dist/langium/langium-dsl/config/classicConfig.d.ts +2 -2
  62. package/dist/langium/langium-dsl/config/classicConfig.d.ts.map +1 -1
  63. package/dist/langium/langium-dsl/config/classicConfig.js +45 -53
  64. package/dist/langium/langium-dsl/config/classicConfig.js.map +1 -1
  65. package/dist/langium/langium-dsl/config/extendedConfig.d.ts +2 -2
  66. package/dist/langium/langium-dsl/config/extendedConfig.d.ts.map +1 -1
  67. package/dist/langium/langium-dsl/config/extendedConfig.js +40 -40
  68. package/dist/langium/langium-dsl/config/extendedConfig.js.map +1 -1
  69. package/dist/langium/langium-dsl/wrapperLangium.d.ts.map +1 -1
  70. package/dist/langium/langium-dsl/wrapperLangium.js +16 -23
  71. package/dist/langium/langium-dsl/wrapperLangium.js.map +1 -1
  72. package/dist/langium/statemachine/config/wrapperStatemachineConfig.d.ts +4 -4
  73. package/dist/langium/statemachine/config/wrapperStatemachineConfig.d.ts.map +1 -1
  74. package/dist/langium/statemachine/config/wrapperStatemachineConfig.js +41 -40
  75. package/dist/langium/statemachine/config/wrapperStatemachineConfig.js.map +1 -1
  76. package/dist/langium/statemachine/launcher.js +1 -1
  77. package/dist/langium/statemachine/launcher.js.map +1 -1
  78. package/dist/langium/statemachine/ls/generated/ast.d.ts +127 -22
  79. package/dist/langium/statemachine/ls/generated/ast.d.ts.map +1 -1
  80. package/dist/langium/statemachine/ls/generated/ast.js +112 -97
  81. package/dist/langium/statemachine/ls/generated/ast.js.map +1 -1
  82. package/dist/langium/statemachine/ls/generated/grammar.d.ts +2 -2
  83. package/dist/langium/statemachine/ls/generated/grammar.d.ts.map +1 -1
  84. package/dist/langium/statemachine/ls/generated/grammar.js +43 -41
  85. package/dist/langium/statemachine/ls/generated/grammar.js.map +1 -1
  86. package/dist/langium/statemachine/ls/generated/module.d.ts +3 -3
  87. package/dist/langium/statemachine/ls/generated/module.d.ts.map +1 -1
  88. package/dist/langium/statemachine/ls/generated/module.js +6 -6
  89. package/dist/langium/statemachine/ls/generated/module.js.map +1 -1
  90. package/dist/langium/statemachine/ls/statemachine-module.js +2 -2
  91. package/dist/langium/statemachine/ls/statemachine-module.js.map +1 -1
  92. package/dist/langium/statemachine/main-react.js +3 -2
  93. package/dist/langium/statemachine/main-react.js.map +1 -1
  94. package/dist/langium/statemachine/main.d.ts.map +1 -1
  95. package/dist/langium/statemachine/main.js +27 -38
  96. package/dist/langium/statemachine/main.js.map +1 -1
  97. package/dist/multi/config.d.ts +1 -1
  98. package/dist/multi/config.d.ts.map +1 -1
  99. package/dist/multi/config.js +1 -0
  100. package/dist/multi/config.js.map +1 -1
  101. package/dist/multi/twoLanguageClients.d.ts.map +1 -1
  102. package/dist/multi/twoLanguageClients.js +49 -45
  103. package/dist/multi/twoLanguageClients.js.map +1 -1
  104. package/dist/node.d.ts +3 -0
  105. package/dist/node.d.ts.map +1 -1
  106. package/dist/node.js +3 -3
  107. package/dist/node.js.map +1 -1
  108. package/dist/python/client/config.d.ts +3 -7
  109. package/dist/python/client/config.d.ts.map +1 -1
  110. package/dist/python/client/config.js +97 -93
  111. package/dist/python/client/config.js.map +1 -1
  112. package/dist/python/client/main.d.ts.map +1 -1
  113. package/dist/python/client/main.js +10 -16
  114. package/dist/python/client/main.js.map +1 -1
  115. package/dist/python/client/reactPython.d.ts.map +1 -1
  116. package/dist/python/client/reactPython.js +9 -8
  117. package/dist/python/client/reactPython.js.map +1 -1
  118. package/dist/ts/wrapperTs.d.ts.map +1 -1
  119. package/dist/ts/wrapperTs.js +45 -50
  120. package/dist/ts/wrapperTs.js.map +1 -1
  121. package/json.html +1 -1
  122. package/package.json +45 -44
  123. package/src/appPlayground/common.ts +3 -3
  124. package/src/appPlayground/config.ts +65 -69
  125. package/src/appPlayground/launcher.ts +1 -2
  126. package/src/appPlayground/main.ts +5 -8
  127. package/src/appPlayground/reactLauncher.ts +1 -2
  128. package/src/appPlayground/reactMain.tsx +4 -4
  129. package/src/bare/client.ts +16 -15
  130. package/src/browser/main.ts +27 -29
  131. package/src/clangd/client/config.ts +87 -97
  132. package/src/clangd/client/main.ts +10 -14
  133. package/src/clangd/worker/clangd-server.ts +2 -2
  134. package/src/common/client/utils.ts +2 -7
  135. package/src/debugger/client/debugger.ts +1 -1
  136. package/src/eclipse.jdt.ls/client/main.ts +78 -4
  137. package/src/eclipse.jdt.ls/config.ts +2 -6
  138. package/src/groovy/client/main.ts +65 -4
  139. package/src/groovy/config.ts +2 -6
  140. package/src/json/client/wrapperWs.ts +90 -0
  141. package/src/json/server/main.ts +1 -1
  142. package/src/langium/langium-dsl/config/classicConfig.ts +48 -64
  143. package/src/langium/langium-dsl/config/extendedConfig.ts +42 -49
  144. package/src/langium/langium-dsl/wrapperLangium.ts +15 -25
  145. package/src/langium/statemachine/config/wrapperStatemachineConfig.ts +45 -48
  146. package/src/langium/statemachine/launcher.ts +1 -1
  147. package/src/langium/statemachine/ls/generated/ast.ts +131 -111
  148. package/src/langium/statemachine/ls/generated/grammar.ts +43 -41
  149. package/src/langium/statemachine/ls/generated/module.ts +6 -6
  150. package/src/langium/statemachine/ls/statemachine-module.ts +2 -2
  151. package/src/langium/statemachine/ls/statemachine.langium +20 -5
  152. package/src/langium/statemachine/main-react.tsx +4 -4
  153. package/src/langium/statemachine/main.ts +27 -43
  154. package/src/multi/config.ts +3 -3
  155. package/src/multi/twoLanguageClients.ts +52 -48
  156. package/src/node.ts +3 -3
  157. package/src/python/client/config.ts +99 -101
  158. package/src/python/client/main.ts +11 -20
  159. package/src/python/client/reactPython.tsx +10 -11
  160. package/src/ts/wrapperTs.ts +45 -52
  161. package/two_langauge_clients.html +1 -0
  162. package/dist/common/client/extendedClient.d.ts +0 -9
  163. package/dist/common/client/extendedClient.d.ts.map +0 -1
  164. package/dist/common/client/extendedClient.js +0 -97
  165. package/dist/common/client/extendedClient.js.map +0 -1
  166. package/dist/json/client/client.d.ts +0 -3
  167. package/dist/json/client/client.d.ts.map +0 -1
  168. package/dist/json/client/client.js +0 -13
  169. package/dist/json/client/client.js.map +0 -1
  170. package/dist/json/client/config.d.ts +0 -3
  171. package/dist/json/client/config.d.ts.map +0 -1
  172. package/dist/json/client/config.js +0 -11
  173. package/dist/json/client/config.js.map +0 -1
  174. package/src/common/client/extendedClient.ts +0 -111
  175. package/src/json/client/client.ts +0 -14
  176. package/src/json/client/config.ts +0 -13
@@ -5,26 +5,22 @@
5
5
 
6
6
  import * as vscode from 'vscode';
7
7
  import { BrowserMessageReader, BrowserMessageWriter } from 'vscode-languageclient/browser.js';
8
- import { EditorApp } from 'monaco-languageclient/editorApp';
8
+ import { MonacoEditorLanguageClientWrapper } from 'monaco-editor-wrapper';
9
9
  import { createLangiumGlobalConfig } from './config/wrapperStatemachineConfig.js';
10
10
  import workerUrl from './worker/statemachine-server?worker&url';
11
11
  import workerPortUrl from './worker/statemachine-server-port?worker&url';
12
12
  import text from '../../../resources/langium/statemachine/example.statemachine?raw';
13
13
  import textMod from '../../../resources/langium/statemachine/example-mod.statemachine?raw';
14
- import { disableElement } from '../../common/client/utils.js';
15
- import { delayExecution } from 'monaco-languageclient/common';
16
- import { MonacoVscodeApiWrapper } from 'monaco-languageclient/vscodeApiWrapper';
17
- import { LanguageClientWrapper } from 'monaco-languageclient/lcwrapper';
14
+ import { delayExecution, disableElement } from '../../common/client/utils.js';
18
15
 
19
- let editorApp: EditorApp | undefined;
20
- let editorApp2: EditorApp | undefined;
21
- let lcWrapper: LanguageClientWrapper;
16
+ const wrapper = new MonacoEditorLanguageClientWrapper();
17
+ const wrapper2 = new MonacoEditorLanguageClientWrapper();
22
18
 
23
19
  const startEditor = async () => {
24
20
  disableElement('button-start', true);
25
21
  disableElement('button-dispose', false);
26
22
 
27
- if (editorApp?.isStarted() === true || editorApp2?.isStarted() === true) {
23
+ if (wrapper.isStarted() && wrapper2.isStarted()) {
28
24
  alert('Editor was already started!');
29
25
  return;
30
26
  }
@@ -47,49 +43,39 @@ const startEditor = async () => {
47
43
  });
48
44
 
49
45
  // the configuration does not contain any text content
50
- const appConfig = createLangiumGlobalConfig({
46
+ const langiumGlobalConfig = createLangiumGlobalConfig({
51
47
  languageServerId: 'first',
52
48
  codeContent: {
53
49
  text,
54
50
  uri: '/workspace/example.statemachine'
55
51
  },
52
+ useLanguageClient: true,
56
53
  worker: stateMachineWorkerPort,
57
54
  messagePort: channel.port1,
58
55
  messageTransports: { reader, writer },
59
56
  htmlContainer: document.getElementById('monaco-editor-root')!
60
57
  });
61
- editorApp = new EditorApp(appConfig.editorAppConfig);
58
+ await wrapper.initAndStart(langiumGlobalConfig);
62
59
 
63
- // perform global init
64
- const apiWrapper = new MonacoVscodeApiWrapper(appConfig.vscodeApiConfig);
65
- await apiWrapper.init();
66
-
67
- // init language client
68
- lcWrapper = new LanguageClientWrapper(appConfig.languageClientConfig);
69
- await lcWrapper.start();
70
-
71
- // run editorApp
72
- await editorApp.start(appConfig.vscodeApiConfig.htmlContainer!);
73
-
74
- editorApp.updateCodeResources({
60
+ wrapper.updateCodeResources({
75
61
  modified: {
76
62
  text,
77
63
  uri: '/workspace/statemachine-mod.statemachine'
78
64
  }
79
65
  });
80
66
 
81
- // start the second editorApp without any languageclient config
67
+ // start the second wrapper without any languageclient config
82
68
  // => they share the language server and both text contents have different uris
83
- const appConfig2 = appConfig;
84
- appConfig2.editorAppConfig.codeResources!.modified = {
85
- text: textMod,
86
- uri: '/workspace/example-mod.statemachine'
87
- };
88
- appConfig2.vscodeApiConfig.htmlContainer = document.getElementById('monaco-editor-root2')!;
89
- editorApp2 = new EditorApp(appConfig2.editorAppConfig);
90
-
91
- // run editorApp
92
- await editorApp2.start(appConfig2.vscodeApiConfig.htmlContainer);
69
+ const langiumGlobalConfig2 = createLangiumGlobalConfig({
70
+ languageServerId: 'second',
71
+ useLanguageClient: false,
72
+ codeContent: {
73
+ text: textMod,
74
+ uri: '/workspace/example-mod.statemachine'
75
+ },
76
+ htmlContainer: document.getElementById('monaco-editor-root2')!
77
+ });
78
+ await wrapper2.initAndStart(langiumGlobalConfig2);
93
79
 
94
80
  vscode.commands.getCommands().then((x) => {
95
81
  console.log('Currently registered # of vscode commands: ' + x.length);
@@ -97,7 +83,7 @@ const startEditor = async () => {
97
83
 
98
84
  await delayExecution(1000);
99
85
 
100
- editorApp.updateCodeResources({
86
+ wrapper.updateCodeResources({
101
87
  modified: {
102
88
  text: `// modified file\n\n${text}`,
103
89
  uri: '/workspace/statemachine-mod2.statemachine'
@@ -109,15 +95,13 @@ const disposeEditor = async () => {
109
95
  disableElement('button-start', false);
110
96
  disableElement('button-dispose', true);
111
97
 
112
- lcWrapper.dispose();
113
-
114
- editorApp?.reportStatus();
115
- await editorApp?.dispose();
116
- console.log(editorApp?.reportStatus().join('\n'));
98
+ wrapper.reportStatus();
99
+ await wrapper.dispose();
100
+ console.log(wrapper.reportStatus().join('\n'));
117
101
 
118
- editorApp2?.reportStatus();
119
- await editorApp2?.dispose();
120
- console.log(editorApp2?.reportStatus().join('\n'));
102
+ wrapper2.reportStatus();
103
+ await wrapper2.dispose();
104
+ console.log(wrapper2.reportStatus().join('\n'));
121
105
  };
122
106
 
123
107
  export const runStatemachineWrapper = async () => {
@@ -4,8 +4,8 @@
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
6
  import * as vscode from 'vscode';
7
- import type { LanguageClientConfig } from 'monaco-languageclient/lcwrapper';
8
- import type { BaseLanguageClient } from 'vscode-languageclient/browser.js';
7
+ import { MonacoLanguageClient } from 'monaco-languageclient';
8
+ import type { LanguageClientConfig } from 'monaco-editor-wrapper';
9
9
 
10
10
  export const createJsonLanguageClientConfig: () => LanguageClientConfig = () => {
11
11
  return {
@@ -38,7 +38,7 @@ export const createPythonLanguageClientConfig: () => LanguageClientConfig = () =
38
38
  authorization: 'UserAuth'
39
39
  },
40
40
  startOptions: {
41
- onCall: (languageClient?: BaseLanguageClient) => {
41
+ onCall: (languageClient?: MonacoLanguageClient) => {
42
42
  setTimeout(() => {
43
43
  ['pyright.restartserver', 'pyright.organizeimports'].forEach((cmdName) => {
44
44
  vscode.commands.registerCommand(cmdName, (...args: unknown[]) => {
@@ -9,12 +9,10 @@ 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 { EditorApp, type EditorAppConfig } from 'monaco-languageclient/editorApp';
13
- import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
12
+ import { MonacoEditorLanguageClientWrapper, type WrapperConfig } from 'monaco-editor-wrapper';
13
+ import { configureDefaultWorkerFactory } from 'monaco-editor-wrapper/workers/workerLoaders';
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';
18
16
 
19
17
  export const runMultipleLanguageClientsExample = async () => {
20
18
  disableElement('button-flip', true);
@@ -33,63 +31,64 @@ print("Hello Moon!")
33
31
  let currentText = textJson;
34
32
  let currenFileExt = 'json';
35
33
 
36
- const htmlContainer = document.getElementById('monaco-editor-root')!;
37
- const vscodeApiConfig: MonacoVscodeApiConfig = {
34
+ const wrapperConfig: WrapperConfig = {
35
+ id: '42',
38
36
  $type: 'extended',
39
- htmlContainer,
37
+ htmlContainer: document.getElementById('monaco-editor-root')!,
40
38
  logLevel: LogLevel.Debug,
41
- serviceOverrides: {
42
- ...getKeybindingsServiceOverride()
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
+ }
43
50
  },
44
- userConfiguration: {
45
- json: JSON.stringify({
46
- 'workbench.colorTheme': 'Default Dark Modern',
47
- 'editor.wordBasedSuggestions': 'off',
48
- 'editor.experimental.asyncTokenization': true
49
- })
51
+ editorAppConfig: {
52
+ codeResources: {
53
+ modified: {
54
+ text: currentText,
55
+ uri: `/workspace/example.${currenFileExt}`
56
+ }
57
+ },
58
+ monacoWorkerFactory: configureDefaultWorkerFactory
50
59
  },
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}`
60
+ languageClientConfigs: {
61
+ configs: {
62
+ json: createJsonLanguageClientConfig(),
63
+ python: createPythonLanguageClientConfig()
61
64
  }
62
65
  }
63
66
  };
64
67
 
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);
68
+ const wrapper = new MonacoEditorLanguageClientWrapper();
78
69
 
79
70
  document.querySelector('#button-start')?.addEventListener('click', async () => {
80
71
  try {
81
72
  disableElement('button-start', true);
82
73
  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;
83
80
 
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}`;
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}`;
88
85
  }
89
86
 
90
- // init and start language clients after start
91
- await lcManager.setConfigs(languageClientConfigs);
92
- await lcManager.start();
87
+ // init language clients after start
88
+ if (externalLc) {
89
+ wrapper.initLanguageClients();
90
+ await wrapper.startLanguageClients();
91
+ }
93
92
  } catch (e) {
94
93
  console.error(e);
95
94
  }
@@ -99,13 +98,18 @@ print("Hello Moon!")
99
98
  disableElement('button-dispose', true);
100
99
  disableElement('button-start', false);
101
100
 
102
- await editorApp.dispose();
103
- await lcManager.dispose();
101
+ const externalLc = (document.getElementById('checkbox-extlc')! as HTMLInputElement).checked;
102
+
103
+ await wrapper.dispose();
104
+
105
+ if (externalLc) {
106
+ wrapper.disposeLanguageClients();
107
+ }
104
108
  });
105
109
  document.querySelector('#button-flip')?.addEventListener('click', async () => {
106
110
  currentText = currentText === textJson ? textPython : textJson;
107
111
  currenFileExt = currenFileExt === 'json' ? 'py' : 'json';
108
- editorApp.updateCodeResources({
112
+ wrapper.updateCodeResources({
109
113
  modified: {
110
114
  text: currentText,
111
115
  uri: `/workspace/example.${currenFileExt}`
package/src/node.ts CHANGED
@@ -6,6 +6,6 @@
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';
9
+ export * from './json/server/json-server.js';
10
+ export * from './json/server/main.js';
11
+ export * from './python/server/main.js';
@@ -21,14 +21,13 @@ 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 { 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';
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';
30
30
  import * as vscode from 'vscode';
31
- import type { BaseLanguageClient } from 'vscode-languageclient/browser.js';
32
31
  import { toSocket, WebSocketMessageReader, WebSocketMessageWriter } from 'vscode-ws-jsonrpc';
33
32
  import badPyCode from '../../../resources/python/bad.py?raw';
34
33
  import helloPyCode from '../../../resources/python/hello.py?raw';
@@ -68,7 +67,7 @@ export const createDefaultConfigParams = (homeDir: string, htmlContainer?: HTMLE
68
67
  fileSystemProvider.registerFile(new RegisteredMemoryFile(files.get('hello.py')!.uri, helloPyCode));
69
68
  fileSystemProvider.registerFile(new RegisteredMemoryFile(files.get('hello2.py')!.uri, hello2PyCode));
70
69
  fileSystemProvider.registerFile(new RegisteredMemoryFile(files.get('bad.py')!.uri, badPyCode));
71
- fileSystemProvider.registerFile(new RegisteredMemoryFile(configParams.workspaceFile, createDefaultWorkspaceContent(workspaceRoot)));
70
+ fileSystemProvider.registerFile(new RegisteredMemoryFile(configParams.workspaceFile, createDefaultWorkspaceContent(configParams.workspaceRoot)));
72
71
  fileSystemProvider.registerFile(createDebugLaunchConfigFile(workspaceRoot, configParams.languageId));
73
72
  registerFileSystemOverlay(1, fileSystemProvider);
74
73
 
@@ -76,13 +75,11 @@ export const createDefaultConfigParams = (homeDir: string, htmlContainer?: HTMLE
76
75
  };
77
76
 
78
77
  export type PythonAppConfig = {
79
- languageClientConfig: LanguageClientConfig;
80
- vscodeApiConfig: MonacoVscodeApiConfig;
81
- editorAppConfig: EditorAppConfig;
78
+ wrapperConfig: WrapperConfig;
82
79
  configParams: ConfigParams;
83
80
  }
84
81
 
85
- export const createPythonAppConfig = (): PythonAppConfig => {
82
+ export const createWrapperConfig = (): PythonAppConfig => {
86
83
  const configParams = createDefaultConfigParams('/home/mlc', document.body);
87
84
 
88
85
  const url = createUrl({
@@ -99,65 +96,101 @@ export const createPythonAppConfig = (): PythonAppConfig => {
99
96
  const reader = new WebSocketMessageReader(iWebSocket);
100
97
  const writer = new WebSocketMessageWriter(iWebSocket);
101
98
 
102
- const vscodeApiConfig: MonacoVscodeApiConfig = {
99
+ const wrapperConfig: WrapperConfig = {
103
100
  $type: 'extended',
104
101
  htmlContainer: configParams.htmlContainer,
105
102
  logLevel: LogLevel.Debug,
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()
122
- },
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
- })
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
+ }
136
136
  },
137
- workspaceConfig: {
138
- enableWorkspaceTrust: true,
139
- windowIndicator: {
140
- label: 'mlc-python-example',
141
- tooltip: '',
142
- command: ''
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()
143
154
  },
144
- workspaceProvider: {
145
- trusted: true,
146
- async open() {
147
- window.open(window.location.href);
148
- return true;
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
+ })
168
+ },
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}'
149
188
  },
150
- workspace: {
151
- workspaceUri: configParams.workspaceFile
189
+ productConfiguration: {
190
+ nameShort: 'mlc-python-example',
191
+ nameLong: 'mlc-python-example'
152
192
  }
153
193
  },
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
- }
161
194
  },
162
195
  extensions: [
163
196
  {
@@ -172,48 +205,13 @@ export const createPythonAppConfig = (): PythonAppConfig => {
172
205
  },
173
206
  provideDebuggerExtensionConfig(configParams)
174
207
  ],
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
- },
208
+ editorAppConfig: {
209
+ monacoWorkerFactory: configureDefaultWorkerFactory
206
210
  }
207
211
  };
208
212
 
209
- const editorAppConfig: EditorAppConfig = {
210
- $type: vscodeApiConfig.$type
211
- };
212
-
213
213
  return {
214
- vscodeApiConfig,
215
- languageClientConfig,
216
- editorAppConfig,
214
+ wrapperConfig,
217
215
  configParams: configParams
218
216
  };
219
217
  };
@@ -3,41 +3,32 @@
3
3
  * Licensed under the MIT License. See LICENSE in the package root for license information.
4
4
  * ------------------------------------------------------------------------------------------ */
5
5
 
6
- import { type RegisterLocalProcessExtensionResult } from '@codingame/monaco-vscode-api/extensions';
7
- import { EditorApp } from 'monaco-languageclient/editorApp';
8
- import { LanguageClientWrapper } from 'monaco-languageclient/lcwrapper';
9
- import { MonacoVscodeApiWrapper } from 'monaco-languageclient/vscodeApiWrapper';
10
6
  import * as vscode from 'vscode';
7
+ import { type RegisterLocalProcessExtensionResult } from '@codingame/monaco-vscode-api/extensions';
8
+ import { MonacoEditorLanguageClientWrapper } from 'monaco-editor-wrapper';
9
+ import { createWrapperConfig } from './config.js';
11
10
  import { configureDebugging } from '../../debugger/client/debugger.js';
12
- import { createPythonAppConfig } from './config.js';
13
11
 
14
12
  export const runPythonWrapper = async () => {
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);
13
+ const appConfig = createWrapperConfig();
14
+ const wrapper = new MonacoEditorLanguageClientWrapper();
22
15
 
23
- const editorApp = new EditorApp(appConfig.editorAppConfig);
24
-
25
- if (editorApp.isStarted()) {
16
+ if (wrapper.isStarted()) {
26
17
  console.warn('Editor was already started!');
27
18
  } else {
28
- const result = apiWrapper.getExtensionRegisterResult('mlc-python-example') as RegisterLocalProcessExtensionResult;
19
+ await wrapper.init(appConfig.wrapperConfig);
20
+
21
+ const result = wrapper.getExtensionRegisterResult('mlc-python-example') as RegisterLocalProcessExtensionResult;
29
22
  result.setAsDefaultApi();
30
23
 
31
- const initResult = apiWrapper.getExtensionRegisterResult('debugger-py-client') as RegisterLocalProcessExtensionResult | undefined;
24
+ const initResult = wrapper.getExtensionRegisterResult('debugger-py-client') as RegisterLocalProcessExtensionResult | undefined;
32
25
  if (initResult !== undefined) {
33
26
  configureDebugging(await initResult.getApi(), appConfig.configParams);
34
27
  }
35
28
 
36
- await lcWrapper.start();
37
-
38
29
  await vscode.commands.executeCommand('workbench.view.explorer');
39
30
  await vscode.window.showTextDocument(appConfig.configParams.files.get('hello2.py')!.uri);
40
31
 
41
- await editorApp.start(appConfig.vscodeApiConfig.htmlContainer!);
32
+ await wrapper.start();
42
33
  }
43
34
  };
@@ -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';
6
7
  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';
9
8
  import React from 'react';
10
9
  import ReactDOM from 'react-dom/client';
11
- import * as vscode from 'vscode';
10
+ import { MonacoEditorReactComp } from '@typefox/monaco-editor-react';
11
+ import { MonacoEditorLanguageClientWrapper } from 'monaco-editor-wrapper';
12
+ import { createWrapperConfig } from './config.js';
12
13
  import { configureDebugging } from '../../debugger/client/debugger.js';
13
- import { createPythonAppConfig } from './config.js';
14
14
 
15
15
  export const runPythonReact = async () => {
16
- const appConfig = createPythonAppConfig();
16
+ const appConfig = createWrapperConfig();
17
17
 
18
- const onVscodeApiInitDone = async (apiWrapper: MonacoVscodeApiWrapper) => {
19
- const result = apiWrapper.getExtensionRegisterResult('mlc-python-example') as RegisterLocalProcessExtensionResult;
18
+ const onLoad = async (wrapper: MonacoEditorLanguageClientWrapper) => {
19
+ const result = wrapper.getExtensionRegisterResult('mlc-python-example') as RegisterLocalProcessExtensionResult;
20
20
  result.setAsDefaultApi();
21
21
 
22
- const initResult = apiWrapper.getExtensionRegisterResult('debugger-py-client') as RegisterLocalProcessExtensionResult | undefined;
22
+ const initResult = wrapper.getExtensionRegisterResult('debugger-py-client') as RegisterLocalProcessExtensionResult | undefined;
23
23
  if (initResult !== undefined) {
24
24
  configureDebugging(await initResult.getApi(), appConfig.configParams);
25
25
  }
@@ -34,10 +34,9 @@ export const runPythonReact = async () => {
34
34
  return (
35
35
  <div style={{ 'backgroundColor': '#1f1f1f' }} >
36
36
  <MonacoEditorReactComp
37
- vscodeApiConfig={appConfig.vscodeApiConfig}
38
- editorAppConfig={appConfig.editorAppConfig}
37
+ wrapperConfig={appConfig.wrapperConfig}
39
38
  style={{ 'height': '100%' }}
40
- onVscodeApiInitDone={onVscodeApiInitDone}
39
+ onLoad={onLoad}
41
40
  onError={(e) => {
42
41
  console.error(e);
43
42
  }} />