11/* --------------------------------------------------------------------------------------------
2- * Copyright (c) 2024 TypeFox and others.
2+ * Copyright (c) 2025 TypeFox and others.
33 * Licensed under the MIT License. See LICENSE in the package root for license information.
44 * ------------------------------------------------------------------------------------------ */
55
66import type { IFileWriteOptions } from '@codingame/monaco-vscode-files-service-override' ;
7- import type { ExampleAppConfig } from 'monaco-languageclient-examples' ;
7+ import type { ILogger } from '@codingame/monaco-vscode-log-service-override' ;
8+ import type { MonacoEditorProps } from '@typefox/monaco-editor-react' ;
89import type { EditorAppConfig } from 'monaco-languageclient/editorApp' ;
910import type { LanguageClientConfig } from 'monaco-languageclient/lcwrapper' ;
1011import type { MonacoVscodeApiConfig , OverallConfigType } from 'monaco-languageclient/vscodeApiWrapper' ;
1112
12- export const setupLangiumClientExtended = async ( ) : Promise < ExampleAppConfig > => {
13+ export type ExampleAppConfig = {
14+ vscodeApiConfig : MonacoVscodeApiConfig ;
15+ languageClientConfig : LanguageClientConfig ;
16+ editorAppConfig : EditorAppConfig ;
17+ MonacoEditorReactComp : React . FC < MonacoEditorProps > ;
18+ } ;
19+
20+ export const setupLangiumClientExtended = async ( languageServerWorker : Worker , enableExtHostWorker : boolean , vscodeApiWorkerFactory : ( logger ?: ILogger ) => void ) : Promise < ExampleAppConfig > => {
1321
1422 // perform all imports dynamically
1523 const getKeybindingsServiceOverride = ( await import ( '@codingame/monaco-vscode-keybindings-service-override' ) ) . default ;
16- const getExtensionServiceOverride = ( await import ( '@codingame/monaco-vscode-extensions-service-override' ) ) . default ;
1724 const { InMemoryFileSystemProvider, registerFileSystemOverlay } = ( await import ( '@codingame/monaco-vscode-files-service-override' ) ) ;
1825 const { LogLevel } = ( await import ( '@codingame/monaco-vscode-api' ) ) ;
1926 const { Uri } = ( await import ( 'vscode' ) ) ;
20- const { configureDefaultWorkerFactory } = ( await import ( 'monaco-languageclient/workerFactory' ) ) ;
2127 const { BrowserMessageReader, BrowserMessageWriter } = ( await import ( 'vscode-languageclient/browser.js' ) ) ;
2228
2329 // base configurration
@@ -40,9 +46,15 @@ export const setupLangiumClientExtended = async (): Promise<ExampleAppConfig> =>
4046 const workspaceUri = Uri . file ( '/workspace' ) ;
4147 const langiumGrammarLangiumUri = Uri . file ( '/workspace/langium-grammar.langium' ) ;
4248 const langiumTypesLangiumUri = Uri . file ( '/workspace/langium-types.langium' ) ;
49+ const tsCodeUri = Uri . file ( '/workspace/hello.ts' ) ;
4350 const fileSystemProvider = new InMemoryFileSystemProvider ( ) ;
4451 const textEncoder = new TextEncoder ( ) ;
4552
53+ const code = `const takesString = (x: string) => {};
54+
55+ // you should see an error marker in the next line
56+ takesString(0);` ;
57+
4658 const options : IFileWriteOptions = {
4759 atomic : false ,
4860 unlock : false ,
@@ -52,17 +64,12 @@ export const setupLangiumClientExtended = async (): Promise<ExampleAppConfig> =>
5264 await fileSystemProvider . mkdir ( workspaceUri ) ;
5365 await fileSystemProvider . writeFile ( langiumGrammarLangiumUri , textEncoder . encode ( exampleLangium ) , options ) ;
5466 await fileSystemProvider . writeFile ( langiumTypesLangiumUri , textEncoder . encode ( langiumTypesLangium ) , options ) ;
67+ await fileSystemProvider . writeFile ( tsCodeUri , textEncoder . encode ( code ) , options ) ;
5568 registerFileSystemOverlay ( 1 , fileSystemProvider ) ;
5669
5770 const editorAppConfig : EditorAppConfig = { } ;
58-
59- const workerFile = '/workers/langium-server.js' ;
60- const worker = new Worker ( workerFile , {
61- type : 'module' ,
62- name : 'Langium LS' ,
63- } ) ;
64- const reader = new BrowserMessageReader ( worker ) ;
65- const writer = new BrowserMessageWriter ( worker ) ;
71+ const reader = new BrowserMessageReader ( languageServerWorker ) ;
72+ const writer = new BrowserMessageWriter ( languageServerWorker ) ;
6673
6774 const innerHtml = `<div id="editorsDiv">
6875 <div id="editors"></div>
@@ -88,13 +95,10 @@ export const setupLangiumClientExtended = async (): Promise<ExampleAppConfig> =>
8895 $type : overallConfigType ,
8996 logLevel : LogLevel . Debug ,
9097 advanced : {
91- enableExtHostWorker : true
98+ enableExtHostWorker
9299 } ,
93100 serviceOverrides : {
94- ...getKeybindingsServiceOverride ( ) ,
95- ...getExtensionServiceOverride ( {
96- enableWorkerExtensionHost : false
97- } )
101+ ...getKeybindingsServiceOverride ( )
98102 } ,
99103 viewsConfig : {
100104 $type : 'ViewsService' ,
@@ -115,7 +119,7 @@ export const setupLangiumClientExtended = async (): Promise<ExampleAppConfig> =>
115119 'vitest.disableWorkspaceWarning' : true
116120 } )
117121 } ,
118- monacoWorkerFactory : configureDefaultWorkerFactory ,
122+ monacoWorkerFactory : vscodeApiWorkerFactory ,
119123 extensions : [ {
120124 config : {
121125 name : 'langium-example' ,
@@ -150,15 +154,30 @@ export const setupLangiumClientExtended = async (): Promise<ExampleAppConfig> =>
150154 connection : {
151155 options : {
152156 $type : 'WorkerDirect' ,
153- worker
157+ worker : languageServerWorker
154158 } ,
155159 messageTransports : { reader, writer }
156160 }
157161 } ;
158162
163+ const comp = await import ( '@typefox/monaco-editor-react' ) ;
164+
159165 return {
160166 editorAppConfig,
161167 vscodeApiConfig,
162- languageClientConfig
168+ languageClientConfig,
169+ MonacoEditorReactComp : comp . MonacoEditorReactComp
163170 } ;
164171} ;
172+
173+ export const openDocument = async ( uri : string ) => {
174+ const { workspace } = ( await import ( 'vscode' ) ) ;
175+ await workspace . openTextDocument ( uri ) ;
176+ }
177+
178+ export const showDocument = async ( uri : string ) => {
179+ const { window, Uri } = ( await import ( 'vscode' ) ) ;
180+ await window . showTextDocument ( Uri . file ( uri ) ) ;
181+ }
182+
183+ export * as workerFactory from 'monaco-languageclient/workerFactory' ;
0 commit comments