import { CompilerOptions } from './options' import { baseParse } from './parse' import { transform, NodeTransform, DirectiveTransform } from './transform' import { generate, CodegenResult } from './codegen' import { RootNode } from './ast' import { isString, extend } from '@vue/shared' import { transformIf } from './transforms/vIf' import { transformFor } from './transforms/vFor' import { transformExpression } from './transforms/transformExpression' import { transformSlotOutlet } from './transforms/transformSlotOutlet' import { transformElement } from './transforms/transformElement' import { transformOn } from './transforms/vOn' import { transformBind } from './transforms/vBind' import { trackSlotScopes, trackVForSlotScopes } from './transforms/vSlot' import { transformText } from './transforms/transformText' import { transformOnce } from './transforms/vOnce' import { transformModel } from './transforms/vModel' import { transformFilter } from './compat/transformFilter' import { defaultOnError, createCompilerError, ErrorCodes } from './errors' import { transformMemo } from './transforms/vMemo' export type TransformPreset = [ NodeTransform[], Record ] export function getBaseTransformPreset( prefixIdentifiers?: boolean ): TransformPreset { return [ [ transformOnce, transformIf, transformMemo, transformFor, ...(__COMPAT__ ? [transformFilter] : []), ...(!__BROWSER__ && prefixIdentifiers ? [ // order is important trackVForSlotScopes, transformExpression ] : __BROWSER__ && __DEV__ ? [transformExpression] : []), transformSlotOutlet, transformElement, trackSlotScopes, transformText ], { on: transformOn, bind: transformBind, model: transformModel } ] } // we name it `baseCompile` so that higher order compilers like // @vue/compiler-dom can export `compile` while re-exporting everything else. export function baseCompile( template: string | RootNode, options: CompilerOptions = {} ): CodegenResult { const onError = options.onError || defaultOnError const isModuleMode = options.mode === 'module' /* istanbul ignore if */ if (__BROWSER__) { if (options.prefixIdentifiers === true) { onError(createCompilerError(ErrorCodes.X_PREFIX_ID_NOT_SUPPORTED)) } else if (isModuleMode) { onError(createCompilerError(ErrorCodes.X_MODULE_MODE_NOT_SUPPORTED)) } } const prefixIdentifiers = !__BROWSER__ && (options.prefixIdentifiers === true || isModuleMode) if (!prefixIdentifiers && options.cacheHandlers) { onError(createCompilerError(ErrorCodes.X_CACHE_HANDLER_NOT_SUPPORTED)) } if (options.scopeId && !isModuleMode) { onError(createCompilerError(ErrorCodes.X_SCOPE_ID_NOT_SUPPORTED)) } const ast = isString(template) ? baseParse(template, options) : template const [nodeTransforms, directiveTransforms] = getBaseTransformPreset(prefixIdentifiers) if (!__BROWSER__ && options.isTS) { const { expressionPlugins } = options if (!expressionPlugins || !expressionPlugins.includes('typescript')) { options.expressionPlugins = [...(expressionPlugins || []), 'typescript'] } } transform( ast, extend({}, options, { prefixIdentifiers, nodeTransforms: [ ...nodeTransforms, ...(options.nodeTransforms || []) // user transforms ], directiveTransforms: extend( {}, directiveTransforms, options.directiveTransforms || {} // user transforms ) }) ) return generate( ast, extend({}, options, { prefixIdentifiers }) ) }