import { ElementNode, Namespace, TemplateChildNode, ParentNode } from './ast' import { TextModes } from './parse' import { CompilerError } from './errors' import { NodeTransform, DirectiveTransform, TransformContext } from './transform' import { ParserPlugin } from '@babel/parser' export interface ParserOptions { /** * e.g. platform native elements, e.g. `
` */ isPreTag?: (tag: string) => boolean /** * Platform-specific built-in components e.g. `` */ isBuiltInComponent?: (tag: string) => symbol | void /** * Separate option for end users to extend the native elements list */ isCustomElement?: (tag: string) => boolean | void /** * Get tag namespace */ getNamespace?: (tag: string, parent: ElementNode | undefined) => Namespace /** * Get text parsing mode for this element */ getTextMode?: ( node: ElementNode, parent: ElementNode | undefined ) => TextModes /** * @default ['{{', '}}'] */ delimiters?: [string, string] /** * Only needed for DOM compilers */ decodeEntities?: (rawText: string, asAttr: boolean) => string onError?: (error: CompilerError) => void } export type HoistTransform = ( children: TemplateChildNode[], context: TransformContext, parent: ParentNode ) => void export interface BindingMetadata { [key: string]: 'data' | 'props' | 'setup' | 'options' } export interface TransformOptions { /** * An array of node transforms to be applied to every AST node. */ nodeTransforms?: NodeTransform[] /** * An object of { name: transform } to be applied to every directive attribute * node found on element nodes. */ directiveTransforms?: Record /** * An optional hook to transform a node being hoisted. * used by compiler-dom to turn hoisted nodes into stringified HTML vnodes. * @default null */ transformHoist?: HoistTransform | null /** * If the pairing runtime provides additional built-in elements, use this to * mark them as built-in so the compiler will generate component vnodes * for them. */ isBuiltInComponent?: (tag: string) => symbol | void /** * Used by some transforms that expects only native elements */ isCustomElement?: (tag: string) => boolean | void /** * Transform expressions like {{ foo }} to `_ctx.foo`. * If this option is false, the generated code will be wrapped in a * `with (this) { ... }` block. * - This is force-enabled in module mode, since modules are by default strict * and cannot use `with` * @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: * ```js * { onClick: _cache[0] || (_cache[0] = e => _ctx.foo(e)) } * ``` * - Requires "prefixIdentifiers" to be enabled because it relies on scope * analysis to determine if a handler is safe to cache. * @default false */ cacheHandlers?: boolean /** * A list of parser plugins to enable for `@babel/parser`, which is used to * parse expressions in bindings and interpolations. * https://babeljs.io/docs/en/next/babel-parser#plugins */ expressionPlugins?: ParserPlugin[] /** * SFC scoped styles ID */ scopeId?: string | null /** * Generate SSR-optimized render functions instead. * The resulting function must be attached to the component via the * `ssrRender` option instead of `render`. */ ssr?: boolean /** * SFC `