import * as m from 'monaco-editor' import { compile, CompilerError, CompilerOptions } from '@vue/compiler-dom' import { compile as ssrCompile } from '@vue/compiler-ssr' import { compilerOptions, initOptions, ssrMode } from './options' import { watchEffect } from '@vue/runtime-dom' import { SourceMapConsumer } from 'source-map' import { parse } from '@babel/parser' window._deps['@babel/parser'] = { parse } declare global { interface Window { monaco: typeof m _deps: any init: () => void } } interface PersistedState { src: string ssr: boolean options: CompilerOptions } window.init = () => { const monaco = window.monaco const persistedState: PersistedState = JSON.parse( decodeURIComponent(window.location.hash.slice(1)) || localStorage.getItem('state') || `{}` ) ssrMode.value = persistedState.ssr Object.assign(compilerOptions, persistedState.options) let lastSuccessfulCode: string let lastSuccessfulMap: SourceMapConsumer | undefined = undefined function compileCode(source: string): string { console.clear() try { const errors: CompilerError[] = [] const compileFn = ssrMode.value ? ssrCompile : compile const start = performance.now() const { code, ast, map } = compileFn(source, { filename: 'template.vue', ...compilerOptions, sourceMap: true, onError: err => { errors.push(err) } }) console.log(`Compiled in ${(performance.now() - start).toFixed(2)}ms.`) monaco.editor.setModelMarkers( editor.getModel()!, `@vue/compiler-dom`, errors.filter(e => e.loc).map(formatError) ) console.log(`AST: `, ast) lastSuccessfulCode = code + `\n\n// Check the console for the AST` lastSuccessfulMap = new window._deps['source-map'].SourceMapConsumer(map) lastSuccessfulMap!.computeColumnSpans() } catch (e) { lastSuccessfulCode = `/* ERROR: ${ e.message } (see console for more info) */` console.error(e) } return lastSuccessfulCode } function formatError(err: CompilerError) { const loc = err.loc! return { severity: monaco.MarkerSeverity.Error, startLineNumber: loc.start.line, startColumn: loc.start.column, endLineNumber: loc.end.line, endColumn: loc.end.column, message: `Vue template compilation error: ${err.message}`, code: String(err.code) } } function reCompile() { const src = editor.getValue() // every time we re-compile, persist current state const state = JSON.stringify({ src, ssr: ssrMode.value, options: compilerOptions } as PersistedState) localStorage.setItem('state', state) window.location.hash = encodeURIComponent(state) const res = compileCode(src) if (res) { output.setValue(res) } } const sharedEditorOptions: m.editor.IStandaloneEditorConstructionOptions = { theme: 'vs-dark', fontSize: 14, wordWrap: 'on', scrollBeyondLastLine: false, renderWhitespace: 'selection', contextmenu: false, minimap: { enabled: false } } const editor = monaco.editor.create(document.getElementById('source')!, { value: persistedState.src || `