1- import { editor } from "monaco-editor/esm/vs/editor/editor.api" ;
1+ import * as monaco from "monaco-editor/esm/vs/editor/editor.api" ;
2+ import "monaco-editor/esm/vs/basic-languages/lua/lua.contribution" ;
3+ import "monaco-editor/esm/vs/basic-languages/typescript/typescript.contribution" ;
4+ import "monaco-editor/esm/vs/editor/edcore.main" ;
5+ import "monaco-editor/esm/vs/language/typescript/monaco.contribution" ;
26import renderjson from "renderjson" ;
37import * as lua from "typescript-to-lua/dist/LuaAST" ;
48import { version as tstlVersion } from "typescript-to-lua/package.json" ;
5- import FengariWorker from "worker-loader?name=fengari.worker.js!./fengariWorker" ;
6- import TSTLWorker from "worker-loader?name=tstl.worker.js!./tstlWorker" ;
9+ import EditorWorker from "worker-loader?name=editor.worker.js!monaco-editor/esm/vs/editor/editor.worker.js" ;
10+ import FengariWorker from "worker-loader?name=fengari.worker.js!./fengari.worker" ;
11+ import TsWorker from "worker-loader?name=ts.worker.js!./ts.worker" ;
712import "../../assets/styles/play.scss" ;
813
14+ // TODO: Use TypeScript 3.8 type imports
15+ type CustomTypeScriptWorker = import ( "./ts.worker" ) . CustomTypeScriptWorker ;
16+
17+ ( globalThis as any ) . MonacoEnvironment = {
18+ getWorker ( _workerId : any , label : string ) {
19+ if ( label === "typescript" ) {
20+ return new TsWorker ( ) ;
21+ }
22+
23+ return new EditorWorker ( ) ;
24+ } ,
25+ } ;
26+
927const container = document . getElementById ( "editor-ts" ) ;
1028const outputTerminalHeader = document . getElementById ( "editor-output-terminal-header" ) ;
1129const outputTerminalContent = document . getElementById ( "editor-output-terminal-content" ) ;
@@ -67,14 +85,35 @@ if (queryStringSrcStart == 0) {
6785}
6886
6987if ( container && exampleLua && astLua ) {
70- let tsEditor = editor . create ( container , {
88+ renderjson . set_show_to_level ( 1 ) ;
89+ renderjson . set_replacer ( ( key : string , value : any ) => {
90+ if ( key === "kind" ) {
91+ return lua . SyntaxKind [ value ] ;
92+ }
93+
94+ return value ;
95+ } ) ;
96+
97+ async function compileLua ( ) {
98+ const model = tsEditor . getModel ( ) ! ;
99+ const getWorker = await monaco . languages . typescript . getTypeScriptWorker ( ) ;
100+ const client = ( await getWorker ( model . uri ) ) as CustomTypeScriptWorker ;
101+ const { code, ast } = await client . getTranspileOutput ( ) ;
102+
103+ luaEditor . setValue ( code ) ;
104+ astLua ! . innerText = "" ;
105+ astLua ! . appendChild ( renderjson ( ast ) ) ;
106+ fengariWorker . postMessage ( { luaStr : code } ) ;
107+ }
108+
109+ let tsEditor = monaco . editor . create ( container , {
71110 value : example ,
72111 language : "typescript" ,
73112 minimap : { enabled : false } ,
74113 theme : "vs-dark" ,
75114 } ) ;
76115
77- let luaEditor = editor . create ( exampleLua , {
116+ let luaEditor = monaco . editor . create ( exampleLua , {
78117 value : "" ,
79118 language : "lua" ,
80119 minimap : { enabled : false } ,
@@ -87,20 +126,19 @@ if (container && exampleLua && astLua) {
87126 luaEditor . layout ( ) ;
88127 } ;
89128
90- const tstlWorker = new TSTLWorker ( ) ;
91- tstlWorker . postMessage ( { tsStr : tsEditor . getValue ( ) } ) ;
129+ compileLua ( ) ;
92130
93131 let timerVar : any ;
94132 let ignoreHashChange = false ;
95133
96134 tsEditor . onDidChangeModelContent ( e => {
97135 clearInterval ( timerVar ) ;
98- // wait one second before submitting work
136+ // Update transpile result only once per 250s
99137 timerVar = setTimeout ( ( ) => {
100- tstlWorker . postMessage ( { tsStr : tsEditor . getValue ( ) } ) ;
138+ compileLua ( ) ;
101139 window . location . replace ( "#src=" + encodeURIComponent ( tsEditor . getValue ( ) ) ) ;
102140 ignoreHashChange = true ;
103- } , 500 ) ;
141+ } , 250 ) ;
104142 } ) ;
105143
106144 window . onhashchange = ( ) => {
@@ -111,26 +149,6 @@ if (container && exampleLua && astLua) {
111149 } ;
112150
113151 const fengariWorker = new FengariWorker ( ) ;
114-
115- tstlWorker . onmessage = ( event : MessageEvent ) => {
116- if ( event . data . luaStr ) {
117- luaEditor . setValue ( event . data . luaStr ) ;
118-
119- astLua . innerText = "" ;
120- astLua . appendChild (
121- renderjson . set_show_to_level ( 1 ) . set_replacer ( ( name : string , val : any ) => {
122- if ( name === "kind" ) {
123- return lua . SyntaxKind [ val ] ;
124- }
125- return val ;
126- } ) ( event . data . luaAST ) ,
127- ) ;
128- fengariWorker . postMessage ( { luaStr : event . data . luaStr } ) ;
129- } else {
130- luaEditor . setValue ( event . data . diagnostics ) ;
131- }
132- } ;
133-
134152 fengariWorker . onmessage = ( event : MessageEvent ) => {
135153 if ( outputTerminalContent ) {
136154 outputTerminalContent . innerText = event . data . luaPrint ;
0 commit comments