235 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { h, reactive, createApp, ref } from 'vue'
 | |
| import { CompilerOptions } from '@vue/compiler-dom'
 | |
| import { BindingTypes } from '@vue/compiler-core'
 | |
| 
 | |
| export const ssrMode = ref(false)
 | |
| 
 | |
| export const defaultOptions: CompilerOptions = {
 | |
|   mode: 'module',
 | |
|   filename: 'Foo.vue',
 | |
|   prefixIdentifiers: false,
 | |
|   hoistStatic: false,
 | |
|   cacheHandlers: false,
 | |
|   scopeId: null,
 | |
|   inline: false,
 | |
|   ssrCssVars: `{ color }`,
 | |
|   compatConfig: { MODE: 3 },
 | |
|   whitespace: 'condense',
 | |
|   bindingMetadata: {
 | |
|     TestComponent: BindingTypes.SETUP_CONST,
 | |
|     setupRef: BindingTypes.SETUP_REF,
 | |
|     setupConst: BindingTypes.SETUP_CONST,
 | |
|     setupLet: BindingTypes.SETUP_LET,
 | |
|     setupMaybeRef: BindingTypes.SETUP_MAYBE_REF,
 | |
|     setupProp: BindingTypes.PROPS,
 | |
|     vMySetupDir: BindingTypes.SETUP_CONST
 | |
|   }
 | |
| }
 | |
| 
 | |
| export const compilerOptions: CompilerOptions = reactive(
 | |
|   Object.assign({}, defaultOptions)
 | |
| )
 | |
| 
 | |
| const App = {
 | |
|   setup() {
 | |
|     return () => {
 | |
|       const isSSR = ssrMode.value
 | |
|       const isModule = compilerOptions.mode === 'module'
 | |
|       const usePrefix =
 | |
|         compilerOptions.prefixIdentifiers || compilerOptions.mode === 'module'
 | |
| 
 | |
|       return [
 | |
|         h('h1', `Vue 3 Template Explorer`),
 | |
|         h(
 | |
|           'a',
 | |
|           {
 | |
|             href: `https://github.com/vuejs/core/tree/${__COMMIT__}`,
 | |
|             target: `_blank`
 | |
|           },
 | |
|           `@${__COMMIT__}`
 | |
|         ),
 | |
|         ' | ',
 | |
|         h(
 | |
|           'a',
 | |
|           {
 | |
|             href: 'https://app.netlify.com/sites/vue-next-template-explorer/deploys',
 | |
|             target: `_blank`
 | |
|           },
 | |
|           'History'
 | |
|         ),
 | |
| 
 | |
|         h('div', { id: 'options-wrapper' }, [
 | |
|           h('div', { id: 'options-label' }, 'Options ↘'),
 | |
|           h('ul', { id: 'options' }, [
 | |
|             // mode selection
 | |
|             h('li', { id: 'mode' }, [
 | |
|               h('span', { class: 'label' }, 'Mode: '),
 | |
|               h('input', {
 | |
|                 type: 'radio',
 | |
|                 id: 'mode-module',
 | |
|                 name: 'mode',
 | |
|                 checked: isModule,
 | |
|                 onChange() {
 | |
|                   compilerOptions.mode = 'module'
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'mode-module' }, 'module'),
 | |
|               ' ',
 | |
|               h('input', {
 | |
|                 type: 'radio',
 | |
|                 id: 'mode-function',
 | |
|                 name: 'mode',
 | |
|                 checked: !isModule,
 | |
|                 onChange() {
 | |
|                   compilerOptions.mode = 'function'
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'mode-function' }, 'function')
 | |
|             ]),
 | |
| 
 | |
|             // whitespace handling
 | |
|             h('li', { id: 'whitespace' }, [
 | |
|               h('span', { class: 'label' }, 'whitespace: '),
 | |
|               h('input', {
 | |
|                 type: 'radio',
 | |
|                 id: 'whitespace-condense',
 | |
|                 name: 'whitespace',
 | |
|                 checked: compilerOptions.whitespace === 'condense',
 | |
|                 onChange() {
 | |
|                   compilerOptions.whitespace = 'condense'
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'whitespace-condense' }, 'condense'),
 | |
|               ' ',
 | |
|               h('input', {
 | |
|                 type: 'radio',
 | |
|                 id: 'whitespace-preserve',
 | |
|                 name: 'whitespace',
 | |
|                 checked: compilerOptions.whitespace === 'preserve',
 | |
|                 onChange() {
 | |
|                   compilerOptions.whitespace = 'preserve'
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'whitespace-preserve' }, 'preserve')
 | |
|             ]),
 | |
| 
 | |
|             // SSR
 | |
|             h('li', [
 | |
|               h('input', {
 | |
|                 type: 'checkbox',
 | |
|                 id: 'ssr',
 | |
|                 name: 'ssr',
 | |
|                 checked: ssrMode.value,
 | |
|                 onChange(e: Event) {
 | |
|                   ssrMode.value = (e.target as HTMLInputElement).checked
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'ssr' }, 'SSR')
 | |
|             ]),
 | |
| 
 | |
|             // toggle prefixIdentifiers
 | |
|             h('li', [
 | |
|               h('input', {
 | |
|                 type: 'checkbox',
 | |
|                 id: 'prefix',
 | |
|                 disabled: isModule || isSSR,
 | |
|                 checked: usePrefix || isSSR,
 | |
|                 onChange(e: Event) {
 | |
|                   compilerOptions.prefixIdentifiers =
 | |
|                     (e.target as HTMLInputElement).checked || isModule
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'prefix' }, 'prefixIdentifiers')
 | |
|             ]),
 | |
| 
 | |
|             // toggle hoistStatic
 | |
|             h('li', [
 | |
|               h('input', {
 | |
|                 type: 'checkbox',
 | |
|                 id: 'hoist',
 | |
|                 checked: compilerOptions.hoistStatic && !isSSR,
 | |
|                 disabled: isSSR,
 | |
|                 onChange(e: Event) {
 | |
|                   compilerOptions.hoistStatic = (
 | |
|                     e.target as HTMLInputElement
 | |
|                   ).checked
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'hoist' }, 'hoistStatic')
 | |
|             ]),
 | |
| 
 | |
|             // toggle cacheHandlers
 | |
|             h('li', [
 | |
|               h('input', {
 | |
|                 type: 'checkbox',
 | |
|                 id: 'cache',
 | |
|                 checked: usePrefix && compilerOptions.cacheHandlers && !isSSR,
 | |
|                 disabled: !usePrefix || isSSR,
 | |
|                 onChange(e: Event) {
 | |
|                   compilerOptions.cacheHandlers = (
 | |
|                     e.target as HTMLInputElement
 | |
|                   ).checked
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'cache' }, 'cacheHandlers')
 | |
|             ]),
 | |
| 
 | |
|             // toggle scopeId
 | |
|             h('li', [
 | |
|               h('input', {
 | |
|                 type: 'checkbox',
 | |
|                 id: 'scope-id',
 | |
|                 disabled: !isModule,
 | |
|                 checked: isModule && compilerOptions.scopeId,
 | |
|                 onChange(e: Event) {
 | |
|                   compilerOptions.scopeId =
 | |
|                     isModule && (e.target as HTMLInputElement).checked
 | |
|                       ? 'scope-id'
 | |
|                       : null
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'scope-id' }, 'scopeId')
 | |
|             ]),
 | |
| 
 | |
|             // inline mode
 | |
|             h('li', [
 | |
|               h('input', {
 | |
|                 type: 'checkbox',
 | |
|                 id: 'inline',
 | |
|                 checked: compilerOptions.inline,
 | |
|                 onChange(e: Event) {
 | |
|                   compilerOptions.inline = (
 | |
|                     e.target as HTMLInputElement
 | |
|                   ).checked
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'inline' }, 'inline')
 | |
|             ]),
 | |
| 
 | |
|             // compat mode
 | |
|             h('li', [
 | |
|               h('input', {
 | |
|                 type: 'checkbox',
 | |
|                 id: 'compat',
 | |
|                 checked: compilerOptions.compatConfig!.MODE === 2,
 | |
|                 onChange(e: Event) {
 | |
|                   compilerOptions.compatConfig!.MODE = (
 | |
|                     e.target as HTMLInputElement
 | |
|                   ).checked
 | |
|                     ? 2
 | |
|                     : 3
 | |
|                 }
 | |
|               }),
 | |
|               h('label', { for: 'compat' }, 'v2 compat mode')
 | |
|             ])
 | |
|           ])
 | |
|         ])
 | |
|       ]
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| export function initOptions() {
 | |
|   createApp(App).mount(document.getElementById('header')!)
 | |
| }
 |