]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat: expose compiler APIs
authorEvan You <yyx990803@gmail.com>
Fri, 20 Sep 2019 04:12:37 +0000 (00:12 -0400)
committerEvan You <yyx990803@gmail.com>
Fri, 20 Sep 2019 04:12:37 +0000 (00:12 -0400)
packages/compiler-core/__tests__/codegen.spec.ts
packages/compiler-core/src/codegen.ts
packages/compiler-core/src/index.ts
packages/compiler-dom/src/index.ts
packages/runtime-core/src/componentPublicInstanceProxy.ts
packages/vue/package.json
packages/vue/src/index.ts

index 03a00b67533089ce444c82ec81d0f44ab7896f89..4090853545f33610858454c6cea0b08458998794 100644 (file)
@@ -4,7 +4,7 @@ import { SourceMapConsumer, RawSourceMap } from 'source-map'
 describe('compiler: codegen', () => {
   test('basic source map support', async () => {
     const ast = parse(`hello {{ world }}`)
-    const { code, map } = generate(ast, { module: false })
+    const { code, map } = generate(ast)
     expect(code).toBe(`["hello ", world]`)
 
     const consumer = await new SourceMapConsumer(map as RawSourceMap)
index 06753c36a9b7d37c6ec2374ec4bc67e4c234256d..52b348b56b0607d50fa87b97cef63a778bed3eb0 100644 (file)
@@ -15,6 +15,7 @@ import { advancePositionWithMutation } from './utils'
 export interface CodegenOptions {
   // Assume ES module environment. If true, will generate import statements for
   // runtime helpers; otherwise will grab the helpers from global `Vue`.
+  // default: false
   module?: boolean
   // Filename for source map generation.
   filename?: string
@@ -68,7 +69,7 @@ function createCodegenContext(
   options: CodegenOptions
 ): CodegenContext {
   const context: CodegenContext = {
-    module: true,
+    module: false,
     filename: `template.vue.html`,
     ...options,
     source: ast.loc.source,
index 9fcb1534f3af69491f2f73876190df985724c14f..250bebcfe6b7527cea81e38d1139e3e342e5419d 100644 (file)
@@ -1,5 +1,11 @@
 export { parse, ParserOptions, TextModes } from './parse'
-export { transform, TransformOptions, Transform } from './transform'
+export {
+  transform,
+  createDirectiveTransform,
+  TransformOptions,
+  Transform
+} from './transform'
 export { generate, CodegenOptions, CodegenResult } from './codegen'
-export { ErrorCodes } from './errors'
+export { ErrorCodes, CompilerError, createCompilerError } from './errors'
+
 export * from './ast'
index 5c052d2f67de808f7e6f3ca1765c1d6132d7e920..47c58e09f100d09bd4ab3ca98ab35171e0b33896 100644 (file)
@@ -1,8 +1,46 @@
-// TODO
-export * from '@vue/compiler-core'
+import {
+  parse,
+  transform,
+  generate,
+  CompilerError,
+  Transform,
+  CodegenResult
+} from '@vue/compiler-core'
 import { parserOptionsMinimal } from './parserOptionsMinimal'
 import { parserOptionsStandard } from './parserOptionsStandard'
 
-export const parserOptions = __BROWSER__
-  ? parserOptionsMinimal
-  : parserOptionsStandard
+const parserOptions = __BROWSER__ ? parserOptionsMinimal : parserOptionsStandard
+
+export interface CompilerOptions {
+  module?: boolean
+  onError?(err: CompilerError): void
+  transforms?: Transform[]
+}
+
+export function compile(
+  template: string,
+  options: CompilerOptions = {}
+): CodegenResult {
+  const {
+    module = false,
+    onError = (err: CompilerError) => {
+      throw err
+    },
+    transforms = []
+  } = options
+  const ast = parse(template, {
+    ...parserOptions,
+    onError
+  })
+  transform(ast, {
+    transforms: [
+      // TODO include core transforms
+      // TODO include DOM transforms
+      ...transforms // user transforms
+    ],
+    onError
+  })
+  return generate(ast, { module })
+}
+
+export * from '@vue/compiler-core'
index 409cf496c793a0cf9056a065a457ea6c239dd0ff..6494028e63f698c278b5b608834e9c2434623136 100644 (file)
@@ -77,6 +77,14 @@ export const PublicInstanceProxyHandlers = {
       }
     }
   },
+  has(target: ComponentInternalInstance, key: string): boolean {
+    const { renderContext, data, props } = target
+    return (
+      (data !== EMPTY_OBJ && hasOwn(data, key)) ||
+      hasOwn(renderContext, key) ||
+      hasOwn(props, key)
+    )
+  },
   set(target: ComponentInternalInstance, key: string, value: any): boolean {
     const { data, renderContext } = target
     if (data !== EMPTY_OBJ && hasOwn(data, key)) {
index c53ab2d12a889996f5aa5096e956f58f060cdc60..9b6eac6d6893c198137120e94fd00c667ff7cd81 100644 (file)
@@ -28,6 +28,7 @@
   },
   "homepage": "https://github.com/vuejs/vue/tree/dev/packages/vue#readme",
   "dependencies": {
+    "@vue/compiler-dom": "3.0.0-alpha.1",
     "@vue/runtime-dom": "3.0.0-alpha.1"
   }
 }
index 11fdece3f4bf1f8a52426831f3f70a681a3e0597..5db370eb7f77a67cf0dae8b99cf0849fefd94b6f 100644 (file)
@@ -4,7 +4,13 @@
 
 // TODO hook up the runtime to compile templates on the fly
 
-export * from '@vue/compiler-dom'
+import { compile as baseCompile, CompilerOptions } from '@vue/compiler-dom'
+
+export function compile(template: string, options?: CompilerOptions): Function {
+  const { code } = baseCompile(template, options)
+  return new Function(`with(this){return ${code}}`)
+}
+
 export * from '@vue/runtime-dom'
 
 if (__BROWSER__ && __DEV__) {