Răsfoiți Sursa

feat(compiler): scaffold compiler-dom

Evan You 6 ani în urmă
părinte
comite
1c8f5b612a

+ 5 - 0
packages/compiler-core/src/assert.ts

@@ -0,0 +1,5 @@
+export function assert(condition: boolean, msg?: string) {
+  if (!condition) {
+    throw new Error(msg || `unexpected parser condition`)
+  }
+}

+ 19 - 17
packages/compiler-core/src/parser.ts

@@ -1,4 +1,4 @@
-import assert from 'assert'
+import { assert } from './assert'
 import { ParserErrorTypes } from './errorTypes'
 import {
   Node,
@@ -69,7 +69,7 @@ function startsWith(source: string, searchString: string): boolean {
 }
 
 function advanceBy(context: ParserContext, numberOfCharacters: number): void {
-  assert(numberOfCharacters <= context.source.length)
+  __DEV__ && assert(numberOfCharacters <= context.source.length)
 
   const { column, source } = context
   const str = source.slice(0, numberOfCharacters)
@@ -175,7 +175,7 @@ function parseChildren(
   const nodes: RootNode['children'] = []
 
   while (!isEnd(context, mode, ancestors)) {
-    assert(context.source.length > 0)
+    __DEV__ && assert(context.source.length > 0)
     const s = context.source
     let node: any = null
 
@@ -332,15 +332,16 @@ function parseCDATA(
   context: ParserContext,
   ancestors: ElementNode[]
 ): RootNode['children'] {
-  assert(last(ancestors) == null || last(ancestors)!.ns !== Namespaces.HTML)
-  assert(startsWith(context.source, '<![CDATA['))
+  __DEV__ &&
+    assert(last(ancestors) == null || last(ancestors)!.ns !== Namespaces.HTML)
+  __DEV__ && assert(startsWith(context.source, '<![CDATA['))
 
   advanceBy(context, 9)
   const nodes = parseChildren(context, TextModes.CDATA, ancestors)
   if (context.source.length === 0) {
     emitError(context, ParserErrorTypes.EOF_IN_CDATA)
   } else {
-    assert(startsWith(context.source, ']]>'))
+    __DEV__ && assert(startsWith(context.source, ']]>'))
     advanceBy(context, 3)
   }
 
@@ -348,7 +349,7 @@ function parseCDATA(
 }
 
 function parseComment(context: ParserContext): CommentNode {
-  assert(startsWith(context.source, '<!--'))
+  __DEV__ && assert(startsWith(context.source, '<!--'))
 
   const start = getCursor(context)
   let content: string
@@ -390,7 +391,7 @@ function parseComment(context: ParserContext): CommentNode {
 }
 
 function parseBogusComment(context: ParserContext): CommentNode | undefined {
-  assert(/^<(?:[\!\?]|\/[^a-z>])/i.test(context.source))
+  __DEV__ && assert(/^<(?:[\!\?]|\/[^a-z>])/i.test(context.source))
 
   const start = getCursor(context)
   const contentStart = context.source[1] === '?' ? 1 : 2
@@ -416,7 +417,7 @@ function parseElement(
   context: ParserContext,
   ancestors: ElementNode[]
 ): ElementNode | undefined {
-  assert(/^<[a-z]/i.test(context.source))
+  __DEV__ && assert(/^<[a-z]/i.test(context.source))
 
   // Start tag.
   const parent = last(ancestors)
@@ -470,10 +471,11 @@ function parseTag(
   type: TagType,
   parent: ElementNode | undefined
 ): ElementNode {
-  assert(/^<\/?[a-z]/i.test(context.source))
-  assert(
-    type === (startsWith(context.source, '</') ? TagType.End : TagType.Start)
-  )
+  __DEV__ && assert(/^<\/?[a-z]/i.test(context.source))
+  __DEV__ &&
+    assert(
+      type === (startsWith(context.source, '</') ? TagType.End : TagType.Start)
+    )
 
   // Tag open.
   const start = getCursor(context)
@@ -547,7 +549,7 @@ function parseAttribute(
   context: ParserContext,
   nameSet: Set<string>
 ): AttributeNode | DirectiveNode {
-  assert(/^[^\t\r\n\f />]/.test(context.source))
+  __DEV__ && assert(/^[^\t\r\n\f />]/.test(context.source))
 
   // Name.
   const start = getCursor(context)
@@ -712,7 +714,7 @@ function parseInterpolation(
   mode: TextModes
 ): ExpressionNode | undefined {
   const [open, close] = context.delimiters
-  assert(startsWith(context.source, open))
+  __DEV__ && assert(startsWith(context.source, open))
 
   const closeIndex = context.source.indexOf(close, open.length)
   if (closeIndex === -1) {
@@ -734,7 +736,7 @@ function parseInterpolation(
 }
 
 function parseText(context: ParserContext, mode: TextModes): TextNode {
-  assert(context.source.length > 0)
+  __DEV__ && assert(context.source.length > 0)
 
   const [open] = context.delimiters
   const endIndex = Math.min(
@@ -745,7 +747,7 @@ function parseText(context: ParserContext, mode: TextModes): TextNode {
       context.source.length
     ].filter(n => n !== -1)
   )
-  assert(endIndex > 0)
+  __DEV__ && assert(endIndex > 0)
 
   const start = getCursor(context)
   const content = parseTextData(context, endIndex, mode)

+ 1 - 0
packages/compiler-dom/README.md

@@ -0,0 +1 @@
+# @vue/compiler-dom

+ 7 - 0
packages/compiler-dom/api-extractor.json

@@ -0,0 +1,7 @@
+{
+  "extends": "../../api-extractor.json",
+  "mainEntryPointFilePath": "./dist/packages/<unscopedPackageName>/src/index.d.ts",
+  "dtsRollup": {
+    "untrimmedFilePath": "./dist/<unscopedPackageName>.d.ts"
+  }
+}

+ 7 - 0
packages/compiler-dom/index.js

@@ -0,0 +1,7 @@
+'use strict'
+
+if (process.env.NODE_ENV === 'production') {
+  module.exports = require('./dist/compiler-dom.cjs.prod.js')
+} else {
+  module.exports = require('./dist/compiler-dom.cjs.js')
+}

+ 34 - 0
packages/compiler-dom/package.json

@@ -0,0 +1,34 @@
+{
+  "name": "@vue/compiler-dom",
+  "version": "3.0.0-alpha.1",
+  "description": "@vue/compiler-dom",
+  "main": "index.js",
+  "module": "dist/compiler-dom.esm-bundler.js",
+  "files": [
+    "index.js",
+    "dist"
+  ],
+  "types": "dist/compiler-dom.d.ts",
+  "unpkg": "dist/compiler-dom/global.js",
+  "sideEffects": false,
+  "buildOptions": {
+    "name": "VueDOMCompiler",
+    "formats": ["esm", "cjs", "global", "esm-browser"]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/vuejs/vue.git"
+  },
+  "keywords": [
+    "vue"
+  ],
+  "author": "Evan You",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/vuejs/vue/issues"
+  },
+  "homepage": "https://github.com/vuejs/vue/tree/dev/packages/compiler-dom#readme",
+  "dependencies": {
+    "@vue/compiler-core": "3.0.0-alpha.1"
+  }
+}

+ 2 - 0
packages/compiler-dom/src/index.ts

@@ -0,0 +1,2 @@
+// TODO
+export * from '@vue/compiler-core'

+ 7 - 2
packages/vue/src/index.ts

@@ -1,5 +1,10 @@
-// TODO this package will be the "full-build" that includes both the runtime
-// and the compiler
+// This package is the "full-build" that includes both the runtime
+// and the compiler. For now we are just exporting everything from the runtome
+// AND the compiler.
+
+// TODO hook up the runtime to compile templates on the fly
+
+export * from '@vue/compiler-dom'
 export * from '@vue/runtime-dom'
 
 if (__FEATURE_PRODUCTION_TIP__) {

+ 20 - 0
scripts/bootstrap.js

@@ -47,6 +47,26 @@ files.forEach(shortName => {
     fs.writeFileSync(readmePath, `# ${name}`)
   }
 
+  const apiExtractorConfigPath = path.join(
+    packagesDir,
+    shortName,
+    `api-extractor.json`
+  )
+  if (args.force || !fs.existsSync(apiExtractorConfigPath)) {
+    fs.writeFileSync(
+      apiExtractorConfigPath,
+      `
+{
+  "extends": "../../api-extractor.json",
+  "mainEntryPointFilePath": "./dist/packages/<unscopedPackageName>/src/index.d.ts",
+  "dtsRollup": {
+    "untrimmedFilePath": "./dist/<unscopedPackageName>.d.ts"
+  }
+}
+`.trim()
+    )
+  }
+
   const srcDir = path.join(packagesDir, shortName, `src`)
   const indexPath = path.join(packagesDir, shortName, `src/index.ts`)
   if (args.force || !fs.existsSync(indexPath)) {

+ 1 - 0
tsconfig.json

@@ -24,6 +24,7 @@
       "@vue/runtime-test": ["packages/runtime-test/src"],
       "@vue/reactivity": ["packages/reactivity/src"],
       "@vue/compiler-core": ["packages/compiler-core/src"],
+      "@vue/compiler-dom": ["packages/compiler-dom/src"],
       "@vue/server-renderer": ["packages/server-renderer/src"]
     }
   },