1`] = `
Object {
"children": Array [
Object {
@@ -6899,7 +6827,7 @@ Object {
}
`;
-exports[`base parser onError option X_MISSING_INTERPOLATION_END {{ 1`] = `
+exports[`base parser Errors X_MISSING_INTERPOLATION_END {{ 1`] = `
Object {
"children": Array [
Object {
@@ -6938,7 +6866,7 @@ Object {
}
`;
-exports[`base parser onError option X_MISSING_INTERPOLATION_END {{ foo 1`] = `
+exports[`base parser Errors X_MISSING_INTERPOLATION_END {{ foo 1`] = `
Object {
"children": Array [
Object {
@@ -6977,7 +6905,7 @@ Object {
}
`;
-exports[`base parser onError option X_MISSING_INTERPOLATION_END {{}} 1`] = `
+exports[`base parser Errors X_MISSING_INTERPOLATION_END {{}} 1`] = `
Object {
"children": Array [
Object {
@@ -7016,6 +6944,78 @@ Object {
}
`;
+exports[`base parser invalid html 1`] = `
+Object {
+ "children": Array [
+ Object {
+ "children": Array [
+ Object {
+ "children": Array [],
+ "isSelfClosing": false,
+ "loc": Object {
+ "end": Object {
+ "column": 1,
+ "line": 3,
+ "offset": 13,
+ },
+ "source": "
+",
+ "start": Object {
+ "column": 1,
+ "line": 2,
+ "offset": 6,
+ },
+ },
+ "ns": 0,
+ "props": Array [],
+ "tag": "span",
+ "tagType": 0,
+ "type": 2,
+ },
+ ],
+ "isSelfClosing": false,
+ "loc": Object {
+ "end": Object {
+ "column": 7,
+ "line": 3,
+ "offset": 19,
+ },
+ "source": "
+
+
",
+ "start": Object {
+ "column": 1,
+ "line": 1,
+ "offset": 0,
+ },
+ },
+ "ns": 0,
+ "props": Array [],
+ "tag": "div",
+ "tagType": 0,
+ "type": 2,
+ },
+ ],
+ "loc": Object {
+ "end": Object {
+ "column": 8,
+ "line": 4,
+ "offset": 27,
+ },
+ "source": "
+
+
+",
+ "start": Object {
+ "column": 1,
+ "line": 1,
+ "offset": 0,
+ },
+ },
+ "type": 6,
+}
+`;
+
exports[`base parser self closing multiple tag 1`] = `
Object {
"children": Array [
diff --git a/packages/compiler-core/__tests__/parse.spec.ts b/packages/compiler-core/__tests__/parse.spec.ts
index 20d3c1af5..dbe2e334d 100644
--- a/packages/compiler-core/__tests__/parse.spec.ts
+++ b/packages/compiler-core/__tests__/parse.spec.ts
@@ -9,7 +9,8 @@ import {
Namespaces,
NodeTypes,
Position,
- TextNode
+ TextNode,
+ AttributeNode
} from '../src/ast'
describe('base parser', () => {
@@ -175,6 +176,84 @@ describe('base parser', () => {
})
})
+ test('HTML entities compatibility in text (https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state).', () => {
+ const spy = jest.fn()
+ const ast = parse('&ersand;', {
+ namedCharacterReferences: { amp: '&' },
+ onError: spy
+ })
+ const text = ast.children[0] as TextNode
+
+ expect(text).toStrictEqual({
+ type: NodeTypes.TEXT,
+ content: '&ersand;',
+ isEmpty: false,
+ loc: {
+ start: { offset: 0, line: 1, column: 1 },
+ end: { offset: 11, line: 1, column: 12 },
+ source: '&ersand;'
+ }
+ })
+ expect(spy.mock.calls).toEqual([
+ [
+ ParserErrorTypes.MISSING_SEMICOLON_AFTER_CHARACTER_REFERENCE,
+ { offset: 4, line: 1, column: 5 }
+ ]
+ ])
+ })
+
+ test('HTML entities compatibility in attribute (https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state).', () => {
+ const spy = jest.fn()
+ const ast = parse(
+ '
',
+ {
+ namedCharacterReferences: { amp: '&', 'amp;': '&' },
+ onError: spy
+ }
+ )
+ const element = ast.children[0] as ElementNode
+ const text1 = (element.props[0] as AttributeNode).value
+ const text2 = (element.props[1] as AttributeNode).value
+ const text3 = (element.props[2] as AttributeNode).value
+
+ expect(text1).toStrictEqual({
+ type: NodeTypes.TEXT,
+ content: '&ersand;',
+ isEmpty: false,
+ loc: {
+ start: { offset: 7, line: 1, column: 8 },
+ end: { offset: 20, line: 1, column: 21 },
+ source: '"&ersand;"'
+ }
+ })
+ expect(text2).toStrictEqual({
+ type: NodeTypes.TEXT,
+ content: '&ersand;',
+ isEmpty: false,
+ loc: {
+ start: { offset: 23, line: 1, column: 24 },
+ end: { offset: 37, line: 1, column: 38 },
+ source: '"&ersand;"'
+ }
+ })
+ expect(text3).toStrictEqual({
+ type: NodeTypes.TEXT,
+ content: '&!',
+ isEmpty: false,
+ loc: {
+ start: { offset: 40, line: 1, column: 41 },
+ end: { offset: 47, line: 1, column: 48 },
+ source: '"&!"'
+ }
+ })
+ expect(spy.mock.calls).toEqual([
+ [
+ ParserErrorTypes.MISSING_SEMICOLON_AFTER_CHARACTER_REFERENCE,
+ { offset: 45, line: 1, column: 46 }
+ ]
+ ])
+ })
+
test('Some control character reference should be replaced.', () => {
const spy = jest.fn()
const ast = parse('', { onError: spy })
diff --git a/packages/compiler-core/src/assert.ts b/packages/compiler-core/src/assert.ts
deleted file mode 100644
index e69de29bb..000000000
diff --git a/packages/compiler-core/src/codegen.ts b/packages/compiler-core/src/codegen.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/codegen.ts
+++ b/packages/compiler-core/src/codegen.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/directives/vBind.ts b/packages/compiler-core/src/directives/vBind.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/directives/vBind.ts
+++ b/packages/compiler-core/src/directives/vBind.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/directives/vFor.ts b/packages/compiler-core/src/directives/vFor.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/directives/vFor.ts
+++ b/packages/compiler-core/src/directives/vFor.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/directives/vIf.ts b/packages/compiler-core/src/directives/vIf.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/directives/vIf.ts
+++ b/packages/compiler-core/src/directives/vIf.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/directives/vModel.ts b/packages/compiler-core/src/directives/vModel.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/directives/vModel.ts
+++ b/packages/compiler-core/src/directives/vModel.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/directives/vOn.ts b/packages/compiler-core/src/directives/vOn.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/directives/vOn.ts
+++ b/packages/compiler-core/src/directives/vOn.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/directives/vPre.ts b/packages/compiler-core/src/directives/vPre.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/directives/vPre.ts
+++ b/packages/compiler-core/src/directives/vPre.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/directives/vSlot.ts b/packages/compiler-core/src/directives/vSlot.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/directives/vSlot.ts
+++ b/packages/compiler-core/src/directives/vSlot.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/directives/vText.ts b/packages/compiler-core/src/directives/vText.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/directives/vText.ts
+++ b/packages/compiler-core/src/directives/vText.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/index.ts b/packages/compiler-core/src/index.ts
index d6bb179e9..6cd157a49 100644
--- a/packages/compiler-core/src/index.ts
+++ b/packages/compiler-core/src/index.ts
@@ -1,3 +1,3 @@
export { parse, ParserOptions, TextModes } from './parser'
+export { ParserErrorTypes } from './errorTypes'
export * from './ast'
-export * from './errorTypes'
diff --git a/packages/compiler-core/src/optimizations/blocks.ts b/packages/compiler-core/src/optimizations/blocks.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/optimizations/blocks.ts
+++ b/packages/compiler-core/src/optimizations/blocks.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/optimizations/class.ts b/packages/compiler-core/src/optimizations/class.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/optimizations/class.ts
+++ b/packages/compiler-core/src/optimizations/class.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/optimizations/patchFlag.ts b/packages/compiler-core/src/optimizations/patchFlag.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/optimizations/patchFlag.ts
+++ b/packages/compiler-core/src/optimizations/patchFlag.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/optimizations/style.ts b/packages/compiler-core/src/optimizations/style.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/optimizations/style.ts
+++ b/packages/compiler-core/src/optimizations/style.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-core/src/parser.ts b/packages/compiler-core/src/parser.ts
index 7c3edc85a..0b45b5c60 100644
--- a/packages/compiler-core/src/parser.ts
+++ b/packages/compiler-core/src/parser.ts
@@ -35,10 +35,18 @@ export const defaultParserOptions: Required
= {
getNamespace: () => Namespaces.HTML,
getTextMode: () => TextModes.DATA,
isVoidTag: () => false,
- namedCharacterReferences: {},
+ namedCharacterReferences: {
+ 'gt;': '>',
+ 'lt;': '<',
+ 'amp;': '&',
+ 'apos;': "'",
+ 'quot;': '"'
+ },
onError(code: ParserErrorTypes, loc: Position): void {
const error: any = new SyntaxError(
- `${errorMessages[code]} (${loc.line}:${loc.column})`
+ `${__DEV__ || !__BROWSER__ ? errorMessages[code] : code} (${loc.line}:${
+ loc.column
+ })`
)
error.code = code
error.loc = loc
@@ -658,7 +666,7 @@ function parseTextData(
return text
}
- // DATA or RCDATA.
+ // DATA or RCDATA. Entity decoding required.
const end = context.offset + length
let text: string = ''
@@ -767,7 +775,6 @@ function parseTextData(
}
}
}
-
return text
}
diff --git a/packages/compiler-core/src/transform.ts b/packages/compiler-core/src/transform.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-core/src/transform.ts
+++ b/packages/compiler-core/src/transform.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-dom/__tests__/parse.spec.ts b/packages/compiler-dom/__tests__/parse.spec.ts
index 86f62c8ae..7d43a6d04 100644
--- a/packages/compiler-dom/__tests__/parse.spec.ts
+++ b/packages/compiler-dom/__tests__/parse.spec.ts
@@ -3,7 +3,6 @@ import {
NodeTypes,
ElementNode,
TextNode,
- AttributeNode,
ParserErrorTypes,
ExpressionNode,
ElementTypes
@@ -104,86 +103,6 @@ describe('DOM parser', () => {
}
})
})
-
- test('HTML entities compatibility in text (https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state).', () => {
- const spy = jest.fn()
- const ast = parse('&ersand;', {
- ...parserOptions,
- namedCharacterReferences: { amp: '&' },
- onError: spy
- })
- const text = ast.children[0] as TextNode
-
- expect(text).toStrictEqual({
- type: NodeTypes.TEXT,
- content: '&ersand;',
- isEmpty: false,
- loc: {
- start: { offset: 0, line: 1, column: 1 },
- end: { offset: 11, line: 1, column: 12 },
- source: '&ersand;'
- }
- })
- expect(spy.mock.calls).toEqual([
- [
- ParserErrorTypes.MISSING_SEMICOLON_AFTER_CHARACTER_REFERENCE,
- { offset: 4, line: 1, column: 5 }
- ]
- ])
- })
-
- test('HTML entities compatibility in attribute (https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state).', () => {
- const spy = jest.fn()
- const ast = parse(
- '',
- {
- ...parserOptions,
- namedCharacterReferences: { amp: '&', 'amp;': '&' },
- onError: spy
- }
- )
- const element = ast.children[0] as ElementNode
- const text1 = (element.props[0] as AttributeNode).value
- const text2 = (element.props[1] as AttributeNode).value
- const text3 = (element.props[2] as AttributeNode).value
-
- expect(text1).toStrictEqual({
- type: NodeTypes.TEXT,
- content: '&ersand;',
- isEmpty: false,
- loc: {
- start: { offset: 7, line: 1, column: 8 },
- end: { offset: 20, line: 1, column: 21 },
- source: '"&ersand;"'
- }
- })
- expect(text2).toStrictEqual({
- type: NodeTypes.TEXT,
- content: '&ersand;',
- isEmpty: false,
- loc: {
- start: { offset: 23, line: 1, column: 24 },
- end: { offset: 37, line: 1, column: 38 },
- source: '"&ersand;"'
- }
- })
- expect(text3).toStrictEqual({
- type: NodeTypes.TEXT,
- content: '&!',
- isEmpty: false,
- loc: {
- start: { offset: 40, line: 1, column: 41 },
- end: { offset: 47, line: 1, column: 48 },
- source: '"&!"'
- }
- })
- expect(spy.mock.calls).toEqual([
- [
- ParserErrorTypes.MISSING_SEMICOLON_AFTER_CHARACTER_REFERENCE,
- { offset: 45, line: 1, column: 46 }
- ]
- ])
- })
})
describe('Interpolation', () => {
diff --git a/packages/compiler-dom/src/directives/vCloak.ts b/packages/compiler-dom/src/directives/vCloak.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-dom/src/directives/vCloak.ts
+++ b/packages/compiler-dom/src/directives/vCloak.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-dom/src/directives/vHtml.ts b/packages/compiler-dom/src/directives/vHtml.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-dom/src/directives/vHtml.ts
+++ b/packages/compiler-dom/src/directives/vHtml.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-dom/src/directives/vModel.ts b/packages/compiler-dom/src/directives/vModel.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-dom/src/directives/vModel.ts
+++ b/packages/compiler-dom/src/directives/vModel.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-dom/src/directives/vOn.ts b/packages/compiler-dom/src/directives/vOn.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-dom/src/directives/vOn.ts
+++ b/packages/compiler-dom/src/directives/vOn.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-dom/src/directives/vShow.ts b/packages/compiler-dom/src/directives/vShow.ts
index e69de29bb..70b786d12 100644
--- a/packages/compiler-dom/src/directives/vShow.ts
+++ b/packages/compiler-dom/src/directives/vShow.ts
@@ -0,0 +1 @@
+// TODO
diff --git a/packages/compiler-dom/src/index.ts b/packages/compiler-dom/src/index.ts
index a1a106456..5c052d2f6 100644
--- a/packages/compiler-dom/src/index.ts
+++ b/packages/compiler-dom/src/index.ts
@@ -1,4 +1,8 @@
// TODO
export * from '@vue/compiler-core'
-export { parserOptionsMinimal } from './parserOptionsMinimal'
-export { parserOptionsStandard } from './parserOptionsStandard'
+import { parserOptionsMinimal } from './parserOptionsMinimal'
+import { parserOptionsStandard } from './parserOptionsStandard'
+
+export const parserOptions = __BROWSER__
+ ? parserOptionsMinimal
+ : parserOptionsStandard
diff --git a/packages/compiler-dom/src/parserOptionsMinimal.ts b/packages/compiler-dom/src/parserOptionsMinimal.ts
index a652f17fd..a22614a8a 100644
--- a/packages/compiler-dom/src/parserOptionsMinimal.ts
+++ b/packages/compiler-dom/src/parserOptionsMinimal.ts
@@ -81,13 +81,5 @@ export const parserOptionsMinimal: ParserOptions = {
isVoidTag(tag: string): boolean {
return VOID_TAG_RE.test(tag)
- },
-
- namedCharacterReferences: {
- 'gt;': '>',
- 'lt;': '<',
- 'amp;': '&',
- 'apos;': "'",
- 'quot;': '"'
}
}
diff --git a/packages/global.d.ts b/packages/global.d.ts
index 6e0808fe0..0d8115278 100644
--- a/packages/global.d.ts
+++ b/packages/global.d.ts
@@ -1,8 +1,8 @@
// Global compile-time constants
declare var __DEV__: boolean
declare var __JSDOM__: boolean
+declare var __BROWSER__: boolean
// Feature flags
declare var __FEATURE_OPTIONS__: boolean
-declare var __FEATURE_PRODUCTION_TIP__: boolean
declare var __FEATURE_SUSPENSE__: boolean
diff --git a/packages/vue/src/index.ts b/packages/vue/src/index.ts
index b70c9fe2c..11fdece3f 100644
--- a/packages/vue/src/index.ts
+++ b/packages/vue/src/index.ts
@@ -7,7 +7,7 @@
export * from '@vue/compiler-dom'
export * from '@vue/runtime-dom'
-if (__FEATURE_PRODUCTION_TIP__) {
+if (__BROWSER__ && __DEV__) {
console[console.info ? 'info' : 'log'](
`You are running a development build of Vue.\n` +
`Make sure to use the production build (*.prod.js) when deploying for production.`
diff --git a/rollup.config.js b/rollup.config.js
index e94a5ce17..360bdf9b2 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -134,9 +134,8 @@ function createReplacePlugin(isProduction, isBunlderESMBuild, isBrowserBuild) {
`process.env.NODE_ENV !== 'production'`
: // hard coded dev/prod builds
!isProduction,
- // show production tip?
- // should only do this for dev AND browser-targeting builds.
- __FEATURE_PRODUCTION_TIP__: !isProduction && isBrowserBuild,
+ // If the build is expected to run directly in the browser (global / esm-browser builds)
+ __BROWSER__: isBrowserBuild,
// support options?
// the lean build drops options related code with buildOptions.lean: true
__FEATURE_OPTIONS__: !packageOptions.lean,