validateDirectiveName(names[i])
}
}
+ if (Component.compilerOptions && isRuntimeOnly()) {
+ warn(
+ `"compilerOptions" is only supported when using a build of Vue that ` +
+ `includes the runtime compiler. Since you are using a runtime-only ` +
+ `build, the options should be passed via your build tool config instead.`
+ )
+ }
}
// 0. create render proxy property access cache
instance.accessCache = Object.create(null)
startMeasure(instance, `compile`)
}
const { isCustomElement, compilerOptions } = instance.appContext.config
+ const {
+ delimiters,
+ compilerOptions: componentCompilerOptions
+ } = Component
const finalCompilerOptions: CompilerOptions = extend(
- {
- isCustomElement: isCustomElement || NO,
- delimiters: Component.delimiters
- },
- compilerOptions
+ extend(
+ {
+ isCustomElement,
+ delimiters
+ },
+ compilerOptions
+ ),
+ componentCompilerOptions
)
if (__COMPAT__) {
// pass runtime compat config into the compiler
expose?: string[]
serverPrefetch?(): Promise<any>
+ // Runtime compiler only -----------------------------------------------------
+ compilerOptions?: RuntimeCompilerOptions
+
// Internal ------------------------------------------------------------------
/**
__defaults?: Defaults
}
+/**
+ * Subset of compiler options that makes sense for the runtime.
+ */
+export interface RuntimeCompilerOptions {
+ isCustomElement?: (tag: string) => boolean
+ whitespace?: 'preserve' | 'condense'
+ comments?: boolean
+ delimiters?: [string, string]
+}
+
export type ComponentOptionsWithoutProps<
Props = {},
RawBindings = {},
renderTriggered?: DebuggerHook
errorCaptured?: ErrorCapturedHook
- // runtime compile only
+ /**
+ * runtime compile only
+ * @deprecated use `compilerOptions.delimiters` instead.
+ */
delimiters?: [string, string]
/**
--- /dev/null
+import { createApp } from 'vue'
+
+describe('config.compilerOptions', () => {
+ test('isCustomElement', () => {
+ const app = createApp({
+ template: `<foo/>`
+ })
+ app.config.compilerOptions.isCustomElement = (tag: string) => tag === 'foo'
+ const root = document.createElement('div')
+ app.mount(root)
+ expect(root.innerHTML).toBe('<foo></foo>')
+ })
+
+ test('comments', () => {
+ const app = createApp({
+ template: `<div/><!--test--><div/>`
+ })
+ app.config.compilerOptions.comments = true
+ // the comments option is only relevant in production mode
+ __DEV__ = false
+ const root = document.createElement('div')
+ app.mount(root)
+ expect(root.innerHTML).toBe('<div></div><!--test--><div></div>')
+ __DEV__ = true
+ })
+
+ test('whitespace', () => {
+ const app = createApp({
+ template: `<div><span/>\n <span/></div>`
+ })
+ app.config.compilerOptions.whitespace = 'preserve'
+ const root = document.createElement('div')
+ app.mount(root)
+ expect(root.firstChild!.childNodes.length).toBe(3)
+ expect(root.firstChild!.childNodes[1].nodeType).toBe(Node.TEXT_NODE)
+ })
+
+ test('delimiters', () => {
+ const app = createApp({
+ data: () => ({ foo: 'hi' }),
+ template: `[[ foo ]]`
+ })
+ app.config.compilerOptions.delimiters = [`[[`, `]]`]
+ const root = document.createElement('div')
+ app.mount(root)
+ expect(root.textContent).toBe('hi')
+ })
+})
+
+describe('per-component compilerOptions', () => {
+ test('isCustomElement', () => {
+ const app = createApp({
+ template: `<foo/>`,
+ compilerOptions: {
+ isCustomElement: (tag: string) => tag === 'foo'
+ }
+ })
+ const root = document.createElement('div')
+ app.mount(root)
+ expect(root.innerHTML).toBe('<foo></foo>')
+ })
+
+ test('comments', () => {
+ const app = createApp({
+ template: `<div/><!--test--><div/>`,
+ compilerOptions: {
+ comments: true
+ }
+ })
+ app.config.compilerOptions.comments = false
+ // the comments option is only relevant in production mode
+ __DEV__ = false
+ const root = document.createElement('div')
+ app.mount(root)
+ expect(root.innerHTML).toBe('<div></div><!--test--><div></div>')
+ __DEV__ = true
+ })
+
+ test('whitespace', () => {
+ const app = createApp({
+ template: `<div><span/>\n <span/></div>`,
+ compilerOptions: {
+ whitespace: 'preserve'
+ }
+ })
+ const root = document.createElement('div')
+ app.mount(root)
+ expect(root.firstChild!.childNodes.length).toBe(3)
+ expect(root.firstChild!.childNodes[1].nodeType).toBe(Node.TEXT_NODE)
+ })
+
+ test('delimiters', () => {
+ const app = createApp({
+ data: () => ({ foo: 'hi' }),
+ template: `[[ foo ]]`,
+ compilerOptions: {
+ delimiters: [`[[`, `]]`]
+ }
+ })
+ const root = document.createElement('div')
+ app.mount(root)
+ expect(root.textContent).toBe('hi')
+ })
+})