]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor(compiler-core): centralize compiler options
authorEvan You <yyx990803@gmail.com>
Tue, 10 Dec 2019 17:53:26 +0000 (12:53 -0500)
committerEvan You <yyx990803@gmail.com>
Tue, 10 Dec 2019 17:53:26 +0000 (12:53 -0500)
packages/compiler-core/__tests__/parse.spec.ts
packages/compiler-core/src/ast.ts
packages/compiler-core/src/codegen.ts
packages/compiler-core/src/index.ts
packages/compiler-core/src/options.ts [new file with mode: 0644]
packages/compiler-core/src/parse.ts
packages/compiler-core/src/transform.ts

index dd2372c646361ea9ab9d03e17872fc5c39423923..250fde4876104cc4ddb87c1ab17faf04f20c6ea0 100644 (file)
@@ -1,4 +1,5 @@
-import { parse, ParserOptions, TextModes } from '../src/parse'
+import { ParserOptions } from '../src/options'
+import { parse, TextModes } from '../src/parse'
 import { ErrorCodes } from '../src/errors'
 import {
   CommentNode,
index 7cbbd275323f1a458b5167d65fd4e764a7fcb9a8..6f7abff5ec43c6f11e8dadb6b7afdc9acfb173fc 100644 (file)
@@ -11,7 +11,7 @@ import {
   FRAGMENT
 } from './runtimeHelpers'
 import { PropsExpression } from './transforms/transformElement'
-import { ImportsOption } from './transform'
+import { ImportItem } from './transform'
 
 // Vue template is a platform-agnostic superset of HTML (syntax only).
 // More namespaces like SVG and MathML are declared by platform specific
@@ -95,7 +95,7 @@ export interface RootNode extends Node {
   components: string[]
   directives: string[]
   hoists: JSChildNode[]
-  imports: ImportsOption[]
+  imports: ImportItem[]
   cached: number
   codegenNode: TemplateChildNode | JSChildNode | undefined
 }
index 649b5f623fd8432561356d5ae4826d09e826581f..fed615196100558c399c658b7a19f09a49ae1afb 100644 (file)
@@ -1,3 +1,4 @@
+import { CodegenOptions } from './options'
 import {
   RootNode,
   TemplateChildNode,
@@ -38,31 +39,10 @@ import {
   CREATE_COMMENT,
   CREATE_TEXT
 } from './runtimeHelpers'
-import { ImportsOption } from './transform'
+import { ImportItem } from './transform'
 
 type CodegenNode = TemplateChildNode | JSChildNode
 
-export interface CodegenOptions {
-  // - Module mode will generate ES module import statements for helpers
-  //   and export the render function as the default export.
-  // - Function mode will generate a single `const { helpers... } = Vue`
-  //   statement and return the render function. It is meant to be used with
-  //   `new Function(code)()` to generate a render function at runtime.
-  // Default: 'function'
-  mode?: 'module' | 'function'
-  // Prefix suitable identifiers with _ctx.
-  // If this option is false, the generated code will be wrapped in a
-  // `with (this) { ... }` block.
-  // Default: false
-  prefixIdentifiers?: boolean
-  // Generate source map?
-  // Default: false
-  sourceMap?: boolean
-  // Filename for source map generation.
-  // Default: `template.vue.html`
-  filename?: string
-}
-
 export interface CodegenResult {
   code: string
   ast: RootNode
@@ -332,7 +312,7 @@ function genHoists(hoists: JSChildNode[], context: CodegenContext) {
   })
 }
 
-function genImports(importsOptions: ImportsOption[], context: CodegenContext) {
+function genImports(importsOptions: ImportItem[], context: CodegenContext) {
   if (!importsOptions.length) {
     return
   }
index ce4215b9c1c69ebd794dac6fd436301aac325417..a91c094b04d22238acbc67209646069366027412 100644 (file)
@@ -1,6 +1,7 @@
-import { parse, ParserOptions } from './parse'
-import { transform, TransformOptions } from './transform'
-import { generate, CodegenOptions, CodegenResult } from './codegen'
+import { CompilerOptions } from './options'
+import { parse } from './parse'
+import { transform } from './transform'
+import { generate, CodegenResult } from './codegen'
 import { RootNode } from './ast'
 import { isString } from '@vue/shared'
 import { transformIf } from './transforms/vIf'
@@ -16,8 +17,6 @@ import { transformText } from './transforms/transformText'
 import { transformOnce } from './transforms/vOnce'
 import { transformModel } from './transforms/vModel'
 
-export type CompilerOptions = ParserOptions & TransformOptions & CodegenOptions
-
 // we name it `baseCompile` so that higher order compilers like @vue/compiler-dom
 // can export `compile` while re-exporting everything else.
 export function baseCompile(
@@ -75,22 +74,22 @@ export function baseCompile(
 }
 
 // Also expose lower level APIs & types
-export { parse, ParserOptions, TextModes } from './parse'
+export {
+  CompilerOptions,
+  ParserOptions,
+  TransformOptions,
+  CodegenOptions
+} from './options'
+export { parse, TextModes } from './parse'
 export {
   transform,
   createStructuralDirectiveTransform,
-  TransformOptions,
   TransformContext,
   NodeTransform,
   StructuralDirectiveTransform,
   DirectiveTransform
 } from './transform'
-export {
-  generate,
-  CodegenOptions,
-  CodegenContext,
-  CodegenResult
-} from './codegen'
+export { generate, CodegenContext, CodegenResult } from './codegen'
 export {
   ErrorCodes,
   CoreCompilerError,
diff --git a/packages/compiler-core/src/options.ts b/packages/compiler-core/src/options.ts
new file mode 100644 (file)
index 0000000..6f7a168
--- /dev/null
@@ -0,0 +1,67 @@
+import { ElementNode, Namespace } from './ast'
+import { TextModes } from './parse'
+import { CompilerError } from './errors'
+import { NodeTransform, DirectiveTransform } from './transform'
+
+export interface ParserOptions {
+  isVoidTag?: (tag: string) => boolean // e.g. img, br, hr
+  isNativeTag?: (tag: string) => boolean // e.g. loading-indicator in weex
+  isPreTag?: (tag: string) => boolean // e.g. <pre> where whitespace is intact
+  isCustomElement?: (tag: string) => boolean
+  isBuiltInComponent?: (tag: string) => symbol | void
+  getNamespace?: (tag: string, parent: ElementNode | undefined) => Namespace
+  getTextMode?: (tag: string, ns: Namespace) => TextModes
+  delimiters?: [string, string] // ['{{', '}}']
+
+  // Map to HTML entities. E.g., `{ "amp;": "&" }`
+  // The full set is https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references
+  namedCharacterReferences?: Record<string, string>
+  // this number is based on the map above, but it should be pre-computed
+  // to avoid the cost on every parse() call.
+  maxCRNameLength?: number
+
+  onError?: (error: CompilerError) => void
+}
+
+export interface TransformOptions {
+  nodeTransforms?: NodeTransform[]
+  directiveTransforms?: { [name: string]: DirectiveTransform }
+  isBuiltInComponent?: (tag: string) => symbol | void
+  // Transform expressions like {{ foo }} to `_ctx.foo`.
+  // Default: mode === 'module'
+  prefixIdentifiers?: boolean
+  // Hoist static VNodes and props objects to `_hoisted_x` constants
+  // Default: false
+  hoistStatic?: boolean
+  // Cache v-on handlers to avoid creating new inline functions on each render,
+  // also avoids the need for dynamically patching the handlers by wrapping it.
+  // e.g `@click="foo"` by default is compiled to `{ onClick: foo }`. With this
+  // option it's compiled to:
+  // `{ onClick: _cache[0] || (_cache[0] = e => _ctx.foo(e)) }`
+  // Default: false
+  cacheHandlers?: boolean
+  onError?: (error: CompilerError) => void
+}
+
+export interface CodegenOptions {
+  // - Module mode will generate ES module import statements for helpers
+  //   and export the render function as the default export.
+  // - Function mode will generate a single `const { helpers... } = Vue`
+  //   statement and return the render function. It is meant to be used with
+  //   `new Function(code)()` to generate a render function at runtime.
+  // Default: 'function'
+  mode?: 'module' | 'function'
+  // Prefix suitable identifiers with _ctx.
+  // If this option is false, the generated code will be wrapped in a
+  // `with (this) { ... }` block.
+  // Default: false
+  prefixIdentifiers?: boolean
+  // Generate source map?
+  // Default: false
+  sourceMap?: boolean
+  // Filename for source map generation.
+  // Default: `template.vue.html`
+  filename?: string
+}
+
+export type CompilerOptions = ParserOptions & TransformOptions & CodegenOptions
index 99008e01b6e2fd86691065d9d659aec979b38a18..6ed4e8bb5bd92c7ccaaf68e3afb0831247f73576 100644 (file)
@@ -1,10 +1,6 @@
+import { ParserOptions } from './options'
 import { NO, isArray } from '@vue/shared'
-import {
-  ErrorCodes,
-  createCompilerError,
-  defaultOnError,
-  CompilerError
-} from './errors'
+import { ErrorCodes, createCompilerError, defaultOnError } from './errors'
 import {
   assert,
   advancePositionWithMutation,
@@ -12,7 +8,6 @@ import {
   isCoreComponent
 } from './utils'
 import {
-  Namespace,
   Namespaces,
   AttributeNode,
   CommentNode,
@@ -30,26 +25,6 @@ import {
 } from './ast'
 import { extend } from '@vue/shared'
 
-export interface ParserOptions {
-  isVoidTag?: (tag: string) => boolean // e.g. img, br, hr
-  isNativeTag?: (tag: string) => boolean // e.g. loading-indicator in weex
-  isPreTag?: (tag: string) => boolean // e.g. <pre> where whitespace is intact
-  isCustomElement?: (tag: string) => boolean
-  isBuiltInComponent?: (tag: string) => symbol | void
-  getNamespace?: (tag: string, parent: ElementNode | undefined) => Namespace
-  getTextMode?: (tag: string, ns: Namespace) => TextModes
-  delimiters?: [string, string] // ['{{', '}}']
-
-  // Map to HTML entities. E.g., `{ "amp;": "&" }`
-  // The full set is https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references
-  namedCharacterReferences?: Record<string, string>
-  // this number is based on the map above, but it should be pre-computed
-  // to avoid the cost on every parse() call.
-  maxCRNameLength?: number
-
-  onError?: (error: CompilerError) => void
-}
-
 // `isNativeTag` is optional, others are required
 type OptionalOptions = 'isNativeTag' | 'isBuiltInComponent'
 type MergedParserOptions = Omit<Required<ParserOptions>, OptionalOptions> &
index 5038cee1c3ab28f28c582533ebbe43ac19a105f8..0c01cd841a48bddefb3bab60a47bbb7a79185b77 100644 (file)
@@ -1,3 +1,4 @@
+import { TransformOptions } from './options'
 import {
   RootNode,
   NodeTypes,
@@ -18,7 +19,7 @@ import {
   createCacheExpression
 } from './ast'
 import { isString, isArray, NOOP } from '@vue/shared'
-import { CompilerError, defaultOnError } from './errors'
+import { defaultOnError } from './errors'
 import {
   TO_STRING,
   FRAGMENT,
@@ -65,17 +66,7 @@ export type StructuralDirectiveTransform = (
   context: TransformContext
 ) => void | (() => void)
 
-export interface TransformOptions {
-  nodeTransforms?: NodeTransform[]
-  directiveTransforms?: { [name: string]: DirectiveTransform }
-  isBuiltInComponent?: (tag: string) => symbol | void
-  prefixIdentifiers?: boolean
-  hoistStatic?: boolean
-  cacheHandlers?: boolean
-  onError?: (error: CompilerError) => void
-}
-
-export interface ImportsOption {
+export interface ImportItem {
   exp: string | ExpressionNode
   path: string
 }
@@ -86,7 +77,7 @@ export interface TransformContext extends Required<TransformOptions> {
   components: Set<string>
   directives: Set<string>
   hoists: JSChildNode[]
-  imports: Set<ImportsOption>
+  imports: Set<ImportItem>
   cached: number
   identifiers: { [name: string]: number | undefined }
   scopes: {