compile.ts 2.4 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2 3 4 5 6 7 8 9 10 11
import { baseParse } from '@vue/compiler-core'

import { isString, extend } from '@vue/shared'
import { generate } from './codegen'
import { CompilerOptions } from './options'
import { DirectiveTransform, NodeTransform, transform } from './transform'
import { transformExpression } from './transforms/transformExpression'
import { transformIdentifier } from './transforms/transformIdentifier'
import { transformIf } from './transforms/vIf'
import { transformFor } from './transforms/vFor'
import { generate as genTemplate } from './template/codegen'
fxy060608's avatar
fxy060608 已提交
12 13
import { transformOn } from './transforms/vOn'
import { transformElement } from './transforms/transformElement'
fxy060608's avatar
fxy060608 已提交
14
import { transformBind } from './transforms/vBind'
fxy060608's avatar
fxy060608 已提交
15 16 17 18 19 20

export type TransformPreset = [
  NodeTransform[],
  Record<string, DirectiveTransform>
]

fxy060608's avatar
fxy060608 已提交
21 22 23 24 25 26 27
export function getBaseTransformPreset({
  prefixIdentifiers,
  skipTransformIdentifier,
}: {
  prefixIdentifiers: boolean
  skipTransformIdentifier: boolean
}): TransformPreset {
fxy060608's avatar
fxy060608 已提交
28
  const nodeTransforms = [transformIf, transformFor]
fxy060608's avatar
fxy060608 已提交
29 30 31 32
  if (!skipTransformIdentifier) {
    nodeTransforms.push(transformIdentifier)
  }
  nodeTransforms.push(transformElement)
fxy060608's avatar
fxy060608 已提交
33 34 35
  if (prefixIdentifiers) {
    nodeTransforms.push(transformExpression)
  }
fxy060608's avatar
fxy060608 已提交
36
  return [nodeTransforms, { on: transformOn, bind: transformBind }]
fxy060608's avatar
fxy060608 已提交
37 38 39 40 41 42
}

export function baseCompile(template: string, options: CompilerOptions = {}) {
  const prefixIdentifiers =
    options.prefixIdentifiers === true || options.mode === 'module'
  const ast = isString(template) ? baseParse(template, options) : template
fxy060608's avatar
fxy060608 已提交
43 44 45 46
  const [nodeTransforms, directiveTransforms] = getBaseTransformPreset({
    prefixIdentifiers,
    skipTransformIdentifier: options.skipTransformIdentifier === true,
  })
fxy060608's avatar
fxy060608 已提交
47 48 49 50
  const context = transform(
    ast,
    extend({}, options, {
      prefixIdentifiers,
fxy060608's avatar
fxy060608 已提交
51
      nodeTransforms: [...nodeTransforms, ...(options.nodeTransforms || [])],
fxy060608's avatar
fxy060608 已提交
52 53 54 55 56 57 58
      directiveTransforms: extend(
        {},
        directiveTransforms,
        options.directiveTransforms || {}
      ),
    })
  )
59 60 61 62 63 64 65 66 67 68
  const result = extend(
    generate(
      extend(ast, {
        scope: context.scope,
        bindingComponents: context.bindingComponents,
      }),
      options
    ),
    { ast }
  )
fxy060608's avatar
fxy060608 已提交
69 70 71
  if (options.filename && options.miniProgram?.emitFile) {
    genTemplate(ast, {
      filename: options.filename,
fxy060608's avatar
fxy060608 已提交
72
      directive: options.miniProgram.directive,
fxy060608's avatar
fxy060608 已提交
73 74
      emitFile: options.miniProgram.emitFile,
    })
fxy060608's avatar
fxy060608 已提交
75 76 77 78
  }

  return result
}