index.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { parse, ParserOptions } from './parse'
  2. import { transform, TransformOptions } from './transform'
  3. import { generate, CodegenOptions, CodegenResult } from './codegen'
  4. import { RootNode } from './ast'
  5. import { isString } from '@vue/shared'
  6. import { transformIf } from './transforms/vIf'
  7. import { transformFor } from './transforms/vFor'
  8. import { transformExpression } from './transforms/transformExpression'
  9. import { transformStyle } from './transforms/transformStyle'
  10. import { transformSlotOutlet } from './transforms/transfromSlotOutlet'
  11. import { transformElement } from './transforms/transformElement'
  12. import { transformOn } from './transforms/vOn'
  13. import { transformBind } from './transforms/vBind'
  14. import { defaultOnError, createCompilerError, ErrorCodes } from './errors'
  15. import { trackSlotScopes } from './transforms/vSlot'
  16. export type CompilerOptions = ParserOptions & TransformOptions & CodegenOptions
  17. // we name it `baseCompile` so that higher order compilers like @vue/compiler-dom
  18. // can export `compile` while re-exporting everything else.
  19. export function baseCompile(
  20. template: string | RootNode,
  21. options: CompilerOptions = {}
  22. ): CodegenResult {
  23. if (__BROWSER__) {
  24. const onError = options.onError || defaultOnError
  25. if (options.prefixIdentifiers === true) {
  26. onError(createCompilerError(ErrorCodes.X_PREFIX_ID_NOT_SUPPORTED))
  27. } else if (options.mode === 'module') {
  28. onError(createCompilerError(ErrorCodes.X_MODULE_MODE_NOT_SUPPORTED))
  29. }
  30. }
  31. const ast = isString(template) ? parse(template, options) : template
  32. const prefixIdentifiers =
  33. !__BROWSER__ &&
  34. (options.prefixIdentifiers === true || options.mode === 'module')
  35. transform(ast, {
  36. ...options,
  37. prefixIdentifiers,
  38. nodeTransforms: [
  39. transformIf,
  40. transformFor,
  41. ...(prefixIdentifiers ? [transformExpression, trackSlotScopes] : []),
  42. transformStyle,
  43. transformSlotOutlet,
  44. transformElement,
  45. ...(options.nodeTransforms || []) // user transforms
  46. ],
  47. directiveTransforms: {
  48. on: transformOn,
  49. bind: transformBind,
  50. ...(options.directiveTransforms || {}) // user transforms
  51. }
  52. })
  53. return generate(ast, options)
  54. }
  55. // Also expose lower level APIs & types
  56. export { parse, ParserOptions, TextModes } from './parse'
  57. export {
  58. transform,
  59. createStructuralDirectiveTransform,
  60. TransformOptions,
  61. TransformContext,
  62. NodeTransform,
  63. StructuralDirectiveTransform
  64. } from './transform'
  65. export {
  66. generate,
  67. CodegenOptions,
  68. CodegenContext,
  69. CodegenResult
  70. } from './codegen'
  71. export { ErrorCodes, CompilerError, createCompilerError } from './errors'
  72. export * from './ast'