workflow: improve template explorer hash persistence
This commit is contained in:
		
							parent
							
								
									2b506d7df6
								
							
						
					
					
						commit
						eb721d49c0
					
				| @ -1,7 +1,12 @@ | ||||
| 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 { | ||||
|   defaultOptions, | ||||
|   compilerOptions, | ||||
|   initOptions, | ||||
|   ssrMode | ||||
| } from './options' | ||||
| import { toRaw, watchEffect } from '@vue/runtime-dom' | ||||
| import { SourceMapConsumer } from 'source-map' | ||||
| import theme from './theme' | ||||
| @ -35,19 +40,32 @@ window.init = () => { | ||||
|   monaco.editor.defineTheme('my-theme', theme) | ||||
|   monaco.editor.setTheme('my-theme') | ||||
| 
 | ||||
|   const persistedState: PersistedState = JSON.parse( | ||||
|     decodeURIComponent(window.location.hash.slice(1)) || | ||||
|       localStorage.getItem('state') || | ||||
|       `{}` | ||||
|   ) | ||||
|   // functions are not persistable, so delete it in case we sometimes need
 | ||||
|   // to debug with custom nodeTransforms
 | ||||
|   if (persistedState.options) { | ||||
|     delete persistedState.options.nodeTransforms | ||||
|   let persistedState: PersistedState | undefined | ||||
| 
 | ||||
|   try { | ||||
|     let hash = window.location.hash.slice(1) | ||||
|     try { | ||||
|       hash = escape(atob(hash)) | ||||
|     } catch (e) {} | ||||
|     persistedState = JSON.parse( | ||||
|       decodeURIComponent(hash) || localStorage.getItem('state') || `{}` | ||||
|     ) | ||||
|   } catch (e: any) { | ||||
|     // bad stored state, clear it
 | ||||
|     console.warn( | ||||
|       'Persisted state in localStorage seems to be corrupted, please reload.\n' + | ||||
|         e.message | ||||
|     ) | ||||
|     localStorage.clear() | ||||
|   } | ||||
| 
 | ||||
|   ssrMode.value = persistedState.ssr | ||||
|   Object.assign(compilerOptions, persistedState.options) | ||||
|   if (persistedState) { | ||||
|     // functions are not persistable, so delete it in case we sometimes need
 | ||||
|     // to debug with custom nodeTransforms
 | ||||
|     delete persistedState.options.nodeTransforms | ||||
|     ssrMode.value = persistedState.ssr | ||||
|     Object.assign(compilerOptions, persistedState.options) | ||||
|   } | ||||
| 
 | ||||
|   let lastSuccessfulCode: string | ||||
|   let lastSuccessfulMap: SourceMapConsumer | undefined = undefined | ||||
| @ -99,13 +117,24 @@ window.init = () => { | ||||
|   function reCompile() { | ||||
|     const src = editor.getValue() | ||||
|     // every time we re-compile, persist current state
 | ||||
| 
 | ||||
|     const optionsToSave = {} | ||||
|     let key: keyof CompilerOptions | ||||
|     for (key in compilerOptions) { | ||||
|       const val = compilerOptions[key] | ||||
|       if (typeof val !== 'object' && val !== defaultOptions[key]) { | ||||
|         // @ts-ignore
 | ||||
|         optionsToSave[key] = val | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     const state = JSON.stringify({ | ||||
|       src, | ||||
|       ssr: ssrMode.value, | ||||
|       options: compilerOptions | ||||
|       options: optionsToSave | ||||
|     } as PersistedState) | ||||
|     localStorage.setItem('state', state) | ||||
|     window.location.hash = encodeURIComponent(state) | ||||
|     window.location.hash = btoa(unescape(encodeURIComponent(state))) | ||||
|     const res = compileCode(src) | ||||
|     if (res) { | ||||
|       output.setValue(res) | ||||
| @ -113,7 +142,7 @@ window.init = () => { | ||||
|   } | ||||
| 
 | ||||
|   const editor = monaco.editor.create(document.getElementById('source')!, { | ||||
|     value: persistedState.src || `<div>Hello World!</div>`, | ||||
|     value: persistedState?.src || `<div>Hello World!</div>`, | ||||
|     language: 'html', | ||||
|     ...sharedEditorOptions, | ||||
|     wordWrap: 'bounded' | ||||
|  | ||||
| @ -4,7 +4,7 @@ import { BindingTypes } from '@vue/compiler-core' | ||||
| 
 | ||||
| export const ssrMode = ref(false) | ||||
| 
 | ||||
| export const compilerOptions: CompilerOptions = reactive({ | ||||
| export const defaultOptions: CompilerOptions = { | ||||
|   mode: 'module', | ||||
|   filename: 'Foo.vue', | ||||
|   prefixIdentifiers: false, | ||||
| @ -24,7 +24,11 @@ export const compilerOptions: CompilerOptions = reactive({ | ||||
|     setupProp: BindingTypes.PROPS, | ||||
|     vMySetupDir: BindingTypes.SETUP_CONST | ||||
|   } | ||||
| }) | ||||
| } | ||||
| 
 | ||||
| export const compilerOptions: CompilerOptions = reactive( | ||||
|   Object.assign({}, defaultOptions) | ||||
| ) | ||||
| 
 | ||||
| const App = { | ||||
|   setup() { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user