diff --git a/packages/compiler-core/__tests__/parse.spec.ts b/packages/compiler-core/__tests__/parse.spec.ts index dd2372c6..250fde48 100644 --- a/packages/compiler-core/__tests__/parse.spec.ts +++ b/packages/compiler-core/__tests__/parse.spec.ts @@ -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, diff --git a/packages/compiler-core/src/ast.ts b/packages/compiler-core/src/ast.ts index 7cbbd275..6f7abff5 100644 --- a/packages/compiler-core/src/ast.ts +++ b/packages/compiler-core/src/ast.ts @@ -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 } diff --git a/packages/compiler-core/src/codegen.ts b/packages/compiler-core/src/codegen.ts index 649b5f62..fed61519 100644 --- a/packages/compiler-core/src/codegen.ts +++ b/packages/compiler-core/src/codegen.ts @@ -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 } diff --git a/packages/compiler-core/src/index.ts b/packages/compiler-core/src/index.ts index ce4215b9..a91c094b 100644 --- a/packages/compiler-core/src/index.ts +++ b/packages/compiler-core/src/index.ts @@ -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 index 00000000..6f7a168b --- /dev/null +++ b/packages/compiler-core/src/options.ts @@ -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.
 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
+  // 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
diff --git a/packages/compiler-core/src/parse.ts b/packages/compiler-core/src/parse.ts
index 99008e01..6ed4e8bb 100644
--- a/packages/compiler-core/src/parse.ts
+++ b/packages/compiler-core/src/parse.ts
@@ -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. 
 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
-  // 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, OptionalOptions> &
diff --git a/packages/compiler-core/src/transform.ts b/packages/compiler-core/src/transform.ts
index 5038cee1..0c01cd84 100644
--- a/packages/compiler-core/src/transform.ts
+++ b/packages/compiler-core/src/transform.ts
@@ -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 {
   components: Set
   directives: Set
   hoists: JSChildNode[]
-  imports: Set
+  imports: Set
   cached: number
   identifiers: { [name: string]: number | undefined }
   scopes: {