Skip to content

Commit 9857e4a

Browse files
committed
Fix TS example: InMemoryFileSystemProvider is needed for tsserver web to work properly.
1 parent 91d3863 commit 9857e4a

File tree

5 files changed

+119
-68
lines changed

5 files changed

+119
-68
lines changed

packages/client/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ export class MonacoLanguageClient extends BaseLanguageClient {
1818
constructor({ id, name, clientOptions, messageTransports }: MonacoLanguageClientOptions) {
1919
super(id ?? name.toLowerCase(), name, clientOptions);
2020
this.messageTransports = messageTransports;
21-
ProposedFeatures.createAll(this);
2221
}
2322

2423
protected override createMessageTransports(_encoding: string): Promise<MessageTransports> {

packages/examples/src/appPlayground/common.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ export const configurePostStart = async (apiWrapper: MonacoVscodeApiWrapper, con
1212
const result = apiWrapper.getExtensionRegisterResult('mlc-app-playground') as RegisterLocalProcessExtensionResult;
1313
result.setAsDefaultApi();
1414

15-
// WA: Force show explorer and not search
16-
await vscode.commands.executeCommand('workbench.view.explorer');
17-
1815
await Promise.all([
1916
await vscode.workspace.openTextDocument(configResult.helloTsUri),
2017
await vscode.workspace.openTextDocument(configResult.testerTsUri)

packages/examples/src/appPlayground/config.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import '@codingame/monaco-vscode-typescript-language-features-default-extension'
2727

2828
import '../../resources/vsix/open-collaboration-tools.vsix';
2929

30-
import type { EditorAppConfig } from 'monaco-languageclient/editorApp';
3130
import { createDefaultLocaleConfiguration } from 'monaco-languageclient/vscodeApiLocales';
3231
import { defaultHtmlAugmentationInstructions, defaultViewsInit, type HtmlContainerConfig, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
3332
import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
@@ -37,7 +36,6 @@ import { createDefaultWorkspaceContent } from '../common/client/utils.js';
3736

3837
export type ConfigResult = {
3938
vscodeApiConfig: MonacoVscodeApiConfig;
40-
editorAppConfig: EditorAppConfig
4139
workspaceFileUri: vscode.Uri;
4240
helloTsUri: vscode.Uri;
4341
testerTsUri: vscode.Uri;
@@ -103,7 +101,7 @@ export const configure = async (htmlContainer: HtmlContainerConfig): Promise<Con
103101
'typescript.tsserver.web.projectWideIntellisense.suppressSemanticErrors': false,
104102
'editor.guides.bracketPairsHorizontal': true,
105103
'oct.serverUrl': 'https://api.open-collab.tools/',
106-
'editor.experimental.asyncTokenization': false
104+
'editor.experimental.asyncTokenization': true
107105
})
108106
},
109107
extensions: [{
@@ -122,10 +120,6 @@ export const configure = async (htmlContainer: HtmlContainerConfig): Promise<Con
122120
monacoWorkerFactory: configureDefaultWorkerFactory
123121
};
124122

125-
const editorAppConfig: EditorAppConfig = {
126-
id: 'AAP'
127-
};
128-
129123
const workspaceUri = vscode.Uri.file('/workspace');
130124
const helloTsUri = vscode.Uri.file('/workspace/hello.ts');
131125
const testerTsUri = vscode.Uri.file('/workspace/tester.ts');
@@ -146,7 +140,6 @@ export const configure = async (htmlContainer: HtmlContainerConfig): Promise<Con
146140

147141
return {
148142
vscodeApiConfig,
149-
editorAppConfig,
150143
workspaceFileUri,
151144
helloTsUri,
152145
testerTsUri

packages/examples/src/appPlayground/reactMain.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ export const runApplicationPlaygroundReact = async () => {
1818
<div style={{ 'backgroundColor': '#1f1f1f' }}>
1919
<MonacoEditorReactComp
2020
vscodeApiConfig={configResult.vscodeApiConfig}
21-
editorAppConfig={configResult.editorAppConfig}
2221
onVscodeApiInitDone={async (apiWrapper) => {
2322
await configurePostStart(apiWrapper, configResult);
2423
}}

packages/examples/src/ts/clientTs.ts

Lines changed: 118 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* ------------------------------------------------------------------------------------------ */
55

66
import { LogLevel } from '@codingame/monaco-vscode-api';
7+
import { InMemoryFileSystemProvider, registerFileSystemOverlay, type IFileWriteOptions } from '@codingame/monaco-vscode-files-service-override';
78
import '@codingame/monaco-vscode-javascript-default-extension';
89
import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
910
import '@codingame/monaco-vscode-typescript-basics-default-extension';
@@ -12,18 +13,45 @@ import { EditorApp, type EditorAppConfig } from 'monaco-languageclient/editorApp
1213
import { MonacoVscodeApiWrapper, type MonacoVscodeApiConfig } from 'monaco-languageclient/vscodeApiWrapper';
1314
import { configureDefaultWorkerFactory } from 'monaco-languageclient/workerFactory';
1415
import * as vscode from 'vscode';
15-
import { disableElement } from '../common/client/utils.js';
16+
import { createDefaultWorkspaceContent, disableElement } from '../common/client/utils.js';
1617

1718
export const runTsWrapper = async () => {
18-
const codeUri = '/workspace/hello.ts';
19-
const code = `function sayHello(): string {
20-
return "Hello";
21-
};`;
19+
disableElement('button-diff', true);
2220

23-
const codeOriginalUri = '/workspace/goodbye.ts';
24-
const codeOriginal = `function sayGoodbye(): string {
25-
return "Goodbye";
26-
};`;
21+
const code = `const takesString = (x: string) => {};
22+
23+
// you should see an error marker in the next line
24+
takesString(0);`;
25+
26+
const codeOriginal = `const takesNumber = (x: number) => {};
27+
28+
// you should see an error marker in the next line
29+
takesNumber(0);`;
30+
31+
const textEncoder = new TextEncoder();
32+
const options: IFileWriteOptions = {
33+
atomic: false,
34+
unlock: false,
35+
create: true,
36+
overwrite: true
37+
};
38+
const workspaceUri = vscode.Uri.file('/workspace');
39+
const workspaceFileUri = vscode.Uri.file('/workspace.code-workspace');
40+
const codeUri = vscode.Uri.file('/workspace/hello.ts');
41+
const codeOriginalUri = vscode.Uri.file('/workspace/goodbye.ts');
42+
const fileSystemProvider = new InMemoryFileSystemProvider();
43+
await fileSystemProvider.mkdir(workspaceUri);
44+
await fileSystemProvider.writeFile(codeUri, textEncoder.encode(code), options);
45+
await fileSystemProvider.writeFile(codeOriginalUri, textEncoder.encode(codeOriginal), options);
46+
await fileSystemProvider.writeFile(workspaceFileUri, textEncoder.encode(createDefaultWorkspaceContent('/workspace')), options);
47+
registerFileSystemOverlay(1, fileSystemProvider);
48+
49+
let currentOriginalCode = codeOriginal;
50+
let currentOriginalCodeUri = codeOriginalUri;
51+
let currentCode = code;
52+
let currentCodeUri = codeUri;
53+
let swapCode = false;
54+
let diffEditor = false;
2755

2856
const htmlContainer = document.getElementById('monaco-editor-root')!;
2957
const vscodeApiConfig: MonacoVscodeApiConfig = {
@@ -42,42 +70,90 @@ export const runTsWrapper = async () => {
4270
userConfiguration: {
4371
json: JSON.stringify({
4472
'workbench.colorTheme': 'Default Dark Modern',
73+
'editor.wordBasedSuggestions': 'off',
4574
'typescript.tsserver.web.projectWideIntellisense.enabled': true,
4675
'typescript.tsserver.web.projectWideIntellisense.suppressSemanticErrors': false,
4776
'diffEditor.renderSideBySide': false,
48-
'editor.lightbulb.enabled': 'on',
49-
'editor.glyphMargin': true,
5077
'editor.guides.bracketPairsHorizontal': true,
5178
'editor.experimental.asyncTokenization': true
5279
})
5380
},
81+
workspaceConfig: {
82+
enableWorkspaceTrust: true,
83+
workspaceProvider: {
84+
trusted: true,
85+
async open() {
86+
window.open(window.location.href);
87+
return true;
88+
},
89+
workspace: {
90+
workspaceUri: workspaceFileUri
91+
}
92+
}
93+
},
5494
monacoWorkerFactory: configureDefaultWorkerFactory
5595
};
5696

57-
const editorAppConfig: EditorAppConfig = {
58-
codeResources: {
97+
// perform global monaco-vscode-api init
98+
const apiWrapper = new MonacoVscodeApiWrapper(vscodeApiConfig);
99+
await apiWrapper.start();
100+
101+
let editorApp: EditorApp | undefined = undefined;
102+
103+
const createEditorAppConfig = (useDiffEditor: boolean): EditorAppConfig => {
104+
return {
105+
codeResources: {
106+
modified: {
107+
text: currentCode,
108+
uri: currentCodeUri.path
109+
},
110+
original: {
111+
text: currentOriginalCode,
112+
uri: currentOriginalCodeUri.path,
113+
}
114+
},
115+
useDiffEditor: useDiffEditor
116+
};
117+
};
118+
119+
const swapCurrentCode = () => {
120+
swapCode = !swapCode;
121+
if (swapCode) {
122+
currentCode = codeOriginal;
123+
currentCodeUri = codeOriginalUri;
124+
currentOriginalCode = code;
125+
currentOriginalCodeUri = codeUri;
126+
} else {
127+
currentCode = code;
128+
currentCodeUri = codeUri;
129+
currentOriginalCode = codeOriginal;
130+
currentOriginalCodeUri = codeOriginalUri;
131+
}
132+
};
133+
134+
const updateEditorCodeResources = async (editorApp: EditorApp) => {
135+
await editorApp.updateCodeResources({
59136
modified: {
60-
text: code,
61-
uri: codeUri
137+
text: currentCode,
138+
uri: currentCodeUri.path
62139
},
63140
original: {
64-
text: codeOriginal,
65-
uri: codeOriginalUri,
141+
text: currentOriginalCode,
142+
uri: currentOriginalCodeUri.path
66143
}
67-
}
144+
});
68145
};
69146

70-
// perform global monaco-vscode-api init
71-
const apiWrapper = new MonacoVscodeApiWrapper(vscodeApiConfig);
72-
await apiWrapper.start();
73-
74-
let editorApp = new EditorApp(editorAppConfig);
75-
disableElement('button-swap-code', true);
76-
77147
try {
78148
document.querySelector('#button-start')?.addEventListener('click', async () => {
149+
disableElement('button-start', true);
150+
disableElement('button-diff', false);
151+
editorApp = new EditorApp(createEditorAppConfig(diffEditor));
79152
await editorApp.start(htmlContainer);
80153

154+
await vscode.workspace.openTextDocument(codeUri);
155+
await vscode.workspace.openTextDocument(codeOriginalUri);
156+
81157
vscode.commands.getCommands().then((x) => {
82158
console.log(`Found ${x.length} commands`);
83159
const finding = x.find((elem) => elem === 'actions.find');
@@ -86,45 +162,32 @@ export const runTsWrapper = async () => {
86162

87163
editorApp.getEditor()?.focus();
88164
await vscode.commands.executeCommand('actions.find');
165+
166+
await updateEditorCodeResources(editorApp);
89167
});
90-
document.querySelector('#button-swap-code')?.addEventListener('click', () => {
91-
const textModels = editorApp.getTextModels();
92-
if (textModels.modified?.uri.path === codeUri) {
93-
editorApp.updateCodeResources({
94-
modified: {
95-
text: codeOriginal,
96-
uri: codeOriginalUri
97-
},
98-
original: {
99-
text: code,
100-
uri: codeUri
101-
}
102-
});
103-
} else {
104-
editorApp.updateCodeResources({
105-
modified: {
106-
text: code,
107-
uri: codeUri
108-
},
109-
original: {
110-
text: codeOriginal,
111-
uri: codeOriginalUri
112-
}
113-
});
168+
document.querySelector('#button-swap-code')?.addEventListener('click', async () => {
169+
swapCurrentCode();
170+
171+
if (editorApp !== undefined) {
172+
await updateEditorCodeResources(editorApp);
114173
}
115174
});
116175
document.querySelector('#button-diff')?.addEventListener('click', async () => {
117-
// ensure it is boolean value and not undefined
118-
const useDiffEditor = editorAppConfig.useDiffEditor ?? false;
119-
editorAppConfig.useDiffEditor = !useDiffEditor;
120-
disableElement('button-swap-code', !editorAppConfig.useDiffEditor);
176+
diffEditor = !diffEditor;
177+
const editorAppConfig = createEditorAppConfig(diffEditor);
121178

122-
await editorApp.dispose();
179+
if (editorApp !== undefined) {
180+
await editorApp.dispose();
181+
}
123182
editorApp = new EditorApp(editorAppConfig);
124183
await editorApp.start(htmlContainer);
184+
await updateEditorCodeResources(editorApp);
125185
});
126186
document.querySelector('#button-dispose')?.addEventListener('click', async () => {
127-
await editorApp.dispose();
187+
disableElement('button-start', false);
188+
disableElement('button-diff', true);
189+
190+
await editorApp?.dispose();
128191
});
129192
} catch (e) {
130193
console.error(e);

0 commit comments

Comments
 (0)