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