Skip to content

Commit 3dd6e1c

Browse files
committed
Fix tests and add new tests and updated vite optimizeDeps
1 parent 76627c0 commit 3dd6e1c

File tree

5 files changed

+177
-27
lines changed

5 files changed

+177
-27
lines changed

packages/wrapper-react/src/index.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,12 @@ export const MonacoEditorReactComp: React.FC<MonacoEditorProps> = (props) => {
6767
}, [wrapperConfig]);
6868

6969
useEffect(() => {
70-
// exact copy of the above function, to prevent declaration in useCallback
7170
const disposeMonaco = async () => {
7271
try {
7372
await wrapperRef.current.dispose();
74-
} catch {
73+
} catch (error) {
7574
// The language client may throw an error during disposal, but we want to continue anyway
75+
console.error(`Unexpected error occurred during disposal of the language client: ${error}`);
7676
}
7777
};
7878

packages/wrapper-react/test/index.test.tsx

+68-14
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ describe('Test MonacoEditorReactComp', () => {
8282
});
8383

8484
test('rerender without error', async () => {
85-
let error = false;
85+
let errorOccurred = false;
8686

8787
const workerUrl = new URL('monaco-languageclient-examples/worker/langium', import.meta.url);
8888
const worker = new Worker(workerUrl, {
@@ -130,14 +130,15 @@ describe('Test MonacoEditorReactComp', () => {
130130
expect(result1).toBeUndefined();
131131

132132
renderResult!.rerender(<MonacoEditorReactComp wrapperConfig={newWrapperConfig} />);
133-
} catch (_e) {
134-
error = true;
133+
} catch (error) {
134+
console.error(`Unexpected error occured: ${error}`);
135+
errorOccurred = true;
135136
}
136-
expect(error).toBe(false);
137+
expect(errorOccurred).toBe(false);
137138
});
138139

139140
test('strict-mode: editor only', async () => {
140-
let error = false;
141+
let errorOccurred = false;
141142

142143
const wrapperConfig = createDefaultWrapperConfig({
143144
modified: {
@@ -152,15 +153,15 @@ describe('Test MonacoEditorReactComp', () => {
152153
};
153154
render(<StrictMode><MonacoEditorReactComp wrapperConfig={wrapperConfig} onLoad={handleOnLoad} /></StrictMode>);
154155

155-
} catch (e) {
156-
console.error(`Unexpected error occured: ${e}`);
157-
error = true;
156+
} catch (error) {
157+
console.error(`Unexpected error occured: ${error}`);
158+
errorOccurred = true;
158159
}
159-
expect(error).toBe(false);
160+
expect(errorOccurred).toBe(false);
160161
});
161162

162163
test('strict-mode: language server', async () => {
163-
let error = false;
164+
let errorOccurred = false;
164165

165166
const workerUrl = new URL('monaco-languageclient-examples/worker/langium', import.meta.url);
166167
const worker = new Worker(workerUrl, {
@@ -187,11 +188,64 @@ describe('Test MonacoEditorReactComp', () => {
187188
};
188189
render(<StrictMode><MonacoEditorReactComp wrapperConfig={wrapperConfig} onLoad={handleOnLoad} /></StrictMode>);
189190

190-
} catch (e) {
191-
console.error(`Unexpected error occured: ${e}`);
192-
error = true;
191+
} catch (error) {
192+
console.error(`Unexpected error occured: ${error}`);
193+
errorOccurred = true;
193194
}
194-
expect(error).toBe(false);
195+
expect(errorOccurred).toBe(false);
195196
});
196197

198+
test('strict-mode: language server (re-render)', async () => {
199+
let errorOccurred = false;
200+
201+
const workerUrl = new URL('monaco-languageclient-examples/worker/langium', import.meta.url);
202+
const worker = new Worker(workerUrl, {
203+
type: 'module',
204+
name: 'Langium LS (React Test 1)'
205+
});
206+
const languageClientConfig = createDefaultLcWorkerConfig(worker, 'langium');
207+
208+
const wrapperConfig = createDefaultWrapperConfig({
209+
modified: {
210+
text: 'const text = "Hello World!";',
211+
uri: `/workspace/${expect.getState().testPath}.langium`,
212+
},
213+
});
214+
wrapperConfig.languageClientConfigs = {
215+
automaticallyDisposeWorkers: false,
216+
configs: {
217+
'langium': languageClientConfig
218+
}
219+
};
220+
221+
let renderResult: RenderResult;
222+
try {
223+
const result1 = await new Promise<void>(resolve => {
224+
let called = 0;
225+
const handleOnLoad = async (wrapper: MonacoEditorLanguageClientWrapper) => {
226+
called++;
227+
console.log(`onLoad re-render call: ${called}`);
228+
229+
const lcWrapper = wrapper.getLanguageClientWrapper('langium');
230+
console.log(lcWrapper?.reportStatus());
231+
232+
if (called === 2) {
233+
renderResult.rerender(<StrictMode>[]</StrictMode>);
234+
resolve();
235+
}
236+
};
237+
238+
renderResult = render(<StrictMode><MonacoEditorReactComp wrapperConfig={wrapperConfig} onLoad={handleOnLoad} /></StrictMode>);
239+
// renderResult = render(<MonacoEditorReactComp wrapperConfig={wrapperConfig} onLoad={handleOnLoad} />);
240+
});
241+
242+
// void promise is undefined after it was awaited
243+
expect(result1).toBeUndefined();
244+
} catch (error) {
245+
console.error(`Unexpected error occured: ${error}`);
246+
errorOccurred = true;
247+
}
248+
249+
expect(errorOccurred).toBe(false);
250+
});
197251
});

packages/wrapper/src/wrapper.ts

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export interface WrapperConfig {
3636
htmlContainer?: HTMLElement;
3737
id?: string;
3838
logLevel?: LogLevel | number;
39+
// default is true if not specified as it is optional
3940
automaticallyDispose?: boolean;
4041
extensions?: ExtensionConfig[];
4142
vscodeApiConfig?: VscodeApiConfig;

packages/wrapper/test/languageClientWrapper.test.ts

+47-10
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,19 @@
55

66
import { beforeAll, describe, expect, test } from 'vitest';
77
import { BrowserMessageReader, BrowserMessageWriter } from 'vscode-languageclient/browser.js';
8-
import { LanguageClientWrapper, type LanguageClientConfig } from 'monaco-editor-wrapper';
8+
import { LanguageClientWrapper } from 'monaco-editor-wrapper';
99
import { initServices } from 'monaco-languageclient/vscode/services';
1010
import { createDefaultLcUnreachableUrlConfig, createDefaultLcWorkerConfig, createUnreachableWorkerConfig } from './support/helper.js';
1111

1212
describe('Test LanguageClientWrapper', () => {
1313

14-
let worker: Worker;
15-
let languageClientConfig: LanguageClientConfig;
16-
1714
beforeAll(async () => {
1815
await initServices({});
16+
});
1917

18+
const createWorkerAndConfig = () => {
2019
const workerUrl = 'monaco-languageclient-examples/worker/langium';
21-
worker = new Worker(workerUrl, {
20+
const worker = new Worker(workerUrl, {
2221
type: 'module',
2322
name: 'Langium LS'
2423
});
@@ -28,22 +27,28 @@ describe('Test LanguageClientWrapper', () => {
2827
reader.listen((message) => {
2928
console.log('Received message from worker:', message);
3029
});
31-
languageClientConfig = createDefaultLcWorkerConfig(worker, 'langium', { reader, writer });
32-
});
30+
const languageClientConfig = createDefaultLcWorkerConfig(worker, 'langium', { reader, writer });
31+
return {
32+
worker,
33+
languageClientConfig
34+
};
35+
};
3336

3437
test('Constructor: no config', () => {
38+
const workerAndConfig = createWorkerAndConfig();
3539
const languageClientWrapper = new LanguageClientWrapper({
36-
languageClientConfig
40+
languageClientConfig: workerAndConfig.languageClientConfig
3741
});
3842
expect(languageClientWrapper.haveLanguageClient()).toBeFalsy();
3943
});
4044

4145
test('Dispose: direct worker is cleaned up afterwards', async () => {
46+
const workerAndConfig = createWorkerAndConfig();
4247
const languageClientWrapper = new LanguageClientWrapper({
43-
languageClientConfig
48+
languageClientConfig: workerAndConfig.languageClientConfig
4449
});
4550

46-
expect(worker).toBeDefined();
51+
expect(workerAndConfig.worker).toBeDefined();
4752
expect(languageClientWrapper.getWorker()).toBeUndefined();
4853

4954
// WA: language client in fails due to vitest (reason not clear, yet)
@@ -99,4 +104,36 @@ describe('Test LanguageClientWrapper', () => {
99104
});
100105
});
101106

107+
test('Dispose: start, dispose worker and restart', async () => {
108+
const workerAndConfig = createWorkerAndConfig();
109+
const languageClientWrapper = new LanguageClientWrapper({
110+
languageClientConfig: workerAndConfig.languageClientConfig
111+
});
112+
113+
expect(workerAndConfig.worker).toBeDefined();
114+
expect(languageClientWrapper.getWorker()).toBeUndefined();
115+
116+
// WA: language client in fails due to vitest (reason not clear, yet)
117+
try {
118+
await languageClientWrapper.start();
119+
} catch (_error) {
120+
// ignore
121+
console.error(_error);
122+
};
123+
expect(languageClientWrapper.getWorker()).toBeTruthy();
124+
125+
// dispose & verify
126+
await languageClientWrapper.disposeLanguageClient(true);
127+
expect(languageClientWrapper.getWorker()).toBeUndefined();
128+
129+
// restart & verify
130+
try {
131+
await languageClientWrapper.start();
132+
} catch (_error) {
133+
// ignore
134+
console.error(_error);
135+
};
136+
expect(languageClientWrapper.getWorker()).toBeTruthy();
137+
});
138+
102139
});

vite.config.ts

+59-1
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,70 @@ export const definedViteConfig = defineConfig({
6161
]
6262
},
6363
include: [
64+
'@codingame/monaco-vscode-api',
65+
'@codingame/monaco-vscode-configuration-service-override',
66+
'@codingame/monaco-vscode-cpp-default-extension',
67+
'@codingame/monaco-vscode-debug-service-override',
68+
'@codingame/monaco-vscode-editor-api',
69+
'@codingame/monaco-vscode-editor-service-override',
70+
'@codingame/monaco-vscode-environment-service-override',
71+
'@codingame/monaco-vscode-explorer-service-override',
72+
'@codingame/monaco-vscode-extension-api',
73+
'@codingame/monaco-vscode-extensions-service-override',
74+
'@codingame/monaco-vscode-files-service-override',
75+
'@codingame/monaco-vscode-groovy-default-extension',
76+
'@codingame/monaco-vscode-java-default-extension',
77+
'@codingame/monaco-vscode-javascript-default-extension',
78+
'@codingame/monaco-vscode-json-default-extension',
79+
'@codingame/monaco-vscode-keybindings-service-override',
80+
'@codingame/monaco-vscode-language-pack-cs',
81+
'@codingame/monaco-vscode-language-pack-de',
82+
'@codingame/monaco-vscode-language-pack-es',
83+
'@codingame/monaco-vscode-language-pack-fr',
84+
'@codingame/monaco-vscode-language-pack-it',
85+
'@codingame/monaco-vscode-language-pack-ja',
86+
'@codingame/monaco-vscode-language-pack-ko',
87+
'@codingame/monaco-vscode-language-pack-pl',
88+
'@codingame/monaco-vscode-language-pack-pt-br',
89+
'@codingame/monaco-vscode-language-pack-qps-ploc',
90+
'@codingame/monaco-vscode-language-pack-ru',
91+
'@codingame/monaco-vscode-language-pack-tr',
92+
'@codingame/monaco-vscode-language-pack-zh-hans',
93+
'@codingame/monaco-vscode-language-pack-zh-hant',
94+
'@codingame/monaco-vscode-languages-service-override',
95+
'@codingame/monaco-vscode-lifecycle-service-override',
96+
'@codingame/monaco-vscode-localization-service-override',
97+
'@codingame/monaco-vscode-log-service-override',
98+
'@codingame/monaco-vscode-model-service-override',
99+
'@codingame/monaco-vscode-monarch-service-override',
100+
'@codingame/monaco-vscode-preferences-service-override',
101+
'@codingame/monaco-vscode-python-default-extension',
102+
'@codingame/monaco-vscode-remote-agent-service-override',
103+
'@codingame/monaco-vscode-search-result-default-extension',
104+
'@codingame/monaco-vscode-search-service-override',
105+
'@codingame/monaco-vscode-secret-storage-service-override',
106+
'@codingame/monaco-vscode-standalone-css-language-features',
107+
'@codingame/monaco-vscode-standalone-html-language-features',
108+
'@codingame/monaco-vscode-standalone-json-language-features',
109+
'@codingame/monaco-vscode-standalone-languages',
110+
'@codingame/monaco-vscode-standalone-typescript-language-features',
111+
'@codingame/monaco-vscode-storage-service-override',
112+
'@codingame/monaco-vscode-testing-service-override',
113+
'@codingame/monaco-vscode-textmate-service-override',
114+
'@codingame/monaco-vscode-theme-defaults-default-extension',
115+
'@codingame/monaco-vscode-theme-service-override',
116+
'@codingame/monaco-vscode-typescript-basics-default-extension',
117+
'@codingame/monaco-vscode-typescript-language-features-default-extension',
118+
'@codingame/monaco-vscode-views-service-override',
119+
'@codingame/monaco-vscode-workbench-service-override',
64120
'@testing-library/react',
121+
'langium',
122+
'langium/lsp',
123+
'langium/grammar',
65124
'vscode/localExtensionHost',
66125
'vscode-textmate',
67126
'vscode-oniguruma',
68127
'vscode-languageclient',
69-
'langium',
70128
'vscode-languageserver/browser.js'
71129
]
72130
},

0 commit comments

Comments
 (0)