From 90ddb7c26001ecfdd5cb8cd70d55708cd0aa391b Mon Sep 17 00:00:00 2001 From: Evan You Date: Sun, 22 Dec 2019 19:44:21 -0500 Subject: [PATCH] refactor: expose parse in compiler-dom, improve sfc parse error handling --- .../compiler-core/__tests__/parse.spec.ts | 122 +++++++++--------- .../compiler-core/__tests__/transform.spec.ts | 22 ++-- .../__tests__/transforms/hoistStatic.spec.ts | 2 +- .../transforms/transformElement.spec.ts | 7 +- .../transforms/transformExpressions.spec.ts | 2 +- .../transforms/transformSlotOutlet.spec.ts | 2 +- .../transforms/transformText.spec.ts | 2 +- .../__tests__/transforms/vBind.spec.ts | 2 +- .../__tests__/transforms/vFor.spec.ts | 2 +- .../__tests__/transforms/vIf.spec.ts | 2 +- .../__tests__/transforms/vModel.spec.ts | 2 +- .../__tests__/transforms/vOn.spec.ts | 2 +- .../__tests__/transforms/vOnce.spec.ts | 2 +- .../__tests__/transforms/vSlot.spec.ts | 2 +- packages/compiler-core/src/compile.ts | 4 +- packages/compiler-core/src/index.ts | 2 +- packages/compiler-core/src/parse.ts | 5 +- packages/compiler-dom/__tests__/parse.spec.ts | 2 +- .../transforms/transformStyle.spec.ts | 2 +- .../__tests__/transforms/vCloak.spec.ts | 2 +- .../__tests__/transforms/vHtml.spec.ts | 2 +- .../__tests__/transforms/vModel.spec.ts | 7 +- .../__tests__/transforms/vOn.spec.ts | 2 +- .../__tests__/transforms/vShow.spec.ts | 7 +- .../__tests__/transforms/vText.spec.ts | 2 +- packages/compiler-dom/src/index.ts | 15 ++- .../__tests__/compileTemplate.spec.ts | 14 +- packages/compiler-sfc/__tests__/parse.spec.ts | 53 ++++++-- .../templateTransformAssetUrl.spec.ts | 4 +- .../__tests__/templateTransformSrcset.spec.ts | 4 +- packages/compiler-sfc/src/compileTemplate.ts | 5 +- packages/compiler-sfc/src/index.ts | 6 +- packages/compiler-sfc/src/parse.ts | 79 ++++++++---- 33 files changed, 243 insertions(+), 147 deletions(-) diff --git a/packages/compiler-core/__tests__/parse.spec.ts b/packages/compiler-core/__tests__/parse.spec.ts index 72885c22..037e9377 100644 --- a/packages/compiler-core/__tests__/parse.spec.ts +++ b/packages/compiler-core/__tests__/parse.spec.ts @@ -1,5 +1,5 @@ import { ParserOptions } from '../src/options' -import { parse, TextModes } from '../src/parse' +import { baseParse, TextModes } from '../src/parse' import { ErrorCodes } from '../src/errors' import { CommentNode, @@ -16,7 +16,7 @@ import { describe('compiler: parse', () => { describe('Text', () => { test('simple text', () => { - const ast = parse('some text') + const ast = baseParse('some text') const text = ast.children[0] as TextNode expect(text).toStrictEqual({ @@ -31,7 +31,7 @@ describe('compiler: parse', () => { }) test('simple text with invalid end tag', () => { - const ast = parse('some text', { + const ast = baseParse('some text', { onError: () => {} }) const text = ast.children[0] as TextNode @@ -48,7 +48,7 @@ describe('compiler: parse', () => { }) test('text with interpolation', () => { - const ast = parse('some {{ foo + bar }} text') + const ast = baseParse('some {{ foo + bar }} text') const text1 = ast.children[0] as TextNode const text2 = ast.children[2] as TextNode @@ -73,7 +73,7 @@ describe('compiler: parse', () => { }) test('text with interpolation which has `<`', () => { - const ast = parse('some {{ ad }} text') + const ast = baseParse('some {{ ad }} text') const text1 = ast.children[0] as TextNode const text2 = ast.children[2] as TextNode @@ -98,7 +98,7 @@ describe('compiler: parse', () => { }) test('text with mix of tags and interpolations', () => { - const ast = parse('some {{ foo < bar + foo }} text') + const ast = baseParse('some {{ foo < bar + foo }} text') const text1 = ast.children[0] as TextNode const text2 = (ast.children[1] as ElementNode).children![1] as TextNode @@ -123,7 +123,7 @@ describe('compiler: parse', () => { }) test('lonly "<" don\'t separate nodes', () => { - const ast = parse('a < b', { + const ast = baseParse('a < b', { onError: err => { if (err.code !== ErrorCodes.INVALID_FIRST_CHARACTER_OF_TAG_NAME) { throw err @@ -144,7 +144,7 @@ describe('compiler: parse', () => { }) test('lonly "{{" don\'t separate nodes', () => { - const ast = parse('a {{ b', { + const ast = baseParse('a {{ b', { onError: error => { if (error.code !== ErrorCodes.X_MISSING_INTERPOLATION_END) { throw error @@ -166,7 +166,7 @@ describe('compiler: parse', () => { 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;', { + const ast = baseParse('&ersand;', { namedCharacterReferences: { amp: '&' }, onError: spy }) @@ -195,7 +195,7 @@ describe('compiler: parse', () => { 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( + const ast = baseParse( '
', { namedCharacterReferences: { amp: '&', 'amp;': '&' }, @@ -248,7 +248,7 @@ describe('compiler: parse', () => { test('Some control character reference should be replaced.', () => { const spy = jest.fn() - const ast = parse('†', { onError: spy }) + const ast = baseParse('†', { onError: spy }) const text = ast.children[0] as TextNode expect(text).toStrictEqual({ @@ -275,7 +275,7 @@ describe('compiler: parse', () => { describe('Interpolation', () => { test('simple interpolation', () => { - const ast = parse('{{message}}') + const ast = baseParse('{{message}}') const interpolation = ast.children[0] as InterpolationNode expect(interpolation).toStrictEqual({ @@ -300,7 +300,7 @@ describe('compiler: parse', () => { }) test('it can have tag-like notation', () => { - const ast = parse('{{ a { }) test('it can have tag-like notation (2)', () => { - const ast = parse('{{ ad }}') + const ast = baseParse('{{ ad }}') const interpolation1 = ast.children[0] as InterpolationNode const interpolation2 = ast.children[1] as InterpolationNode @@ -371,7 +371,7 @@ describe('compiler: parse', () => { }) test('it can have tag-like notation (3)', () => { - const ast = parse('
{{ "
" }}') + const ast = baseParse('
{{ "
" }}') const element = ast.children[0] as ElementNode const interpolation = element.children[0] as InterpolationNode @@ -398,7 +398,7 @@ describe('compiler: parse', () => { }) test('custom delimiters', () => { - const ast = parse('

{msg}

', { + const ast = baseParse('

{msg}

', { delimiters: ['{', '}'] }) const element = ast.children[0] as ElementNode @@ -428,7 +428,7 @@ describe('compiler: parse', () => { describe('Comment', () => { test('empty comment', () => { - const ast = parse('') + const ast = baseParse('') const comment = ast.children[0] as CommentNode expect(comment).toStrictEqual({ @@ -443,7 +443,7 @@ describe('compiler: parse', () => { }) test('simple comment', () => { - const ast = parse('') + const ast = baseParse('') const comment = ast.children[0] as CommentNode expect(comment).toStrictEqual({ @@ -458,7 +458,7 @@ describe('compiler: parse', () => { }) test('two comments', () => { - const ast = parse('') + const ast = baseParse('') const comment1 = ast.children[0] as CommentNode const comment2 = ast.children[1] as CommentNode @@ -485,7 +485,7 @@ describe('compiler: parse', () => { describe('Element', () => { test('simple div', () => { - const ast = parse('
hello
') + const ast = baseParse('
hello
') const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -516,7 +516,7 @@ describe('compiler: parse', () => { }) test('empty', () => { - const ast = parse('
') + const ast = baseParse('
') const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -538,7 +538,7 @@ describe('compiler: parse', () => { }) test('self closing', () => { - const ast = parse('
after') + const ast = baseParse('
after') const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -560,7 +560,7 @@ describe('compiler: parse', () => { }) test('void element', () => { - const ast = parse('after', { + const ast = baseParse('after', { isVoidTag: tag => tag === 'img' }) const element = ast.children[0] as ElementNode @@ -584,7 +584,7 @@ describe('compiler: parse', () => { }) test('native element with `isNativeTag`', () => { - const ast = parse('
', { + const ast = baseParse('
', { isNativeTag: tag => tag === 'div' }) @@ -608,7 +608,7 @@ describe('compiler: parse', () => { }) test('native element without `isNativeTag`', () => { - const ast = parse('
') + const ast = baseParse('
') expect(ast.children[0]).toMatchObject({ type: NodeTypes.ELEMENT, @@ -630,7 +630,7 @@ describe('compiler: parse', () => { }) test('custom element', () => { - const ast = parse('
', { + const ast = baseParse('
', { isNativeTag: tag => tag === 'div', isCustomElement: tag => tag === 'comp' }) @@ -649,7 +649,7 @@ describe('compiler: parse', () => { }) test('attribute with no value', () => { - const ast = parse('
') + const ast = baseParse('
') const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -682,7 +682,7 @@ describe('compiler: parse', () => { }) test('attribute with empty value, double quote', () => { - const ast = parse('
') + const ast = baseParse('
') const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -723,7 +723,7 @@ describe('compiler: parse', () => { }) test('attribute with empty value, single quote', () => { - const ast = parse("
") + const ast = baseParse("
") const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -764,7 +764,7 @@ describe('compiler: parse', () => { }) test('attribute with value, double quote', () => { - const ast = parse('
') + const ast = baseParse('
') const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -805,7 +805,7 @@ describe('compiler: parse', () => { }) test('attribute with value, single quote', () => { - const ast = parse("
") + const ast = baseParse("
") const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -846,7 +846,7 @@ describe('compiler: parse', () => { }) test('attribute with value, unquoted', () => { - const ast = parse('
') + const ast = baseParse('
') const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -887,7 +887,7 @@ describe('compiler: parse', () => { }) test('multiple attributes', () => { - const ast = parse('
') + const ast = baseParse('
') const element = ast.children[0] as ElementNode expect(element).toStrictEqual({ @@ -974,7 +974,7 @@ describe('compiler: parse', () => { }) test('directive with no value', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -992,7 +992,7 @@ describe('compiler: parse', () => { }) test('directive with value', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1020,7 +1020,7 @@ describe('compiler: parse', () => { }) test('directive with argument', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1057,7 +1057,7 @@ describe('compiler: parse', () => { }) test('directive with a modifier', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1075,7 +1075,7 @@ describe('compiler: parse', () => { }) test('directive with two modifiers', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1093,7 +1093,7 @@ describe('compiler: parse', () => { }) test('directive with argument and modifiers', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1130,7 +1130,7 @@ describe('compiler: parse', () => { }) test('v-bind shorthand', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1178,7 +1178,7 @@ describe('compiler: parse', () => { }) test('v-bind shorthand with modifier', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1226,7 +1226,7 @@ describe('compiler: parse', () => { }) test('v-on shorthand', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1274,7 +1274,7 @@ describe('compiler: parse', () => { }) test('v-on shorthand with modifier', () => { - const ast = parse('
') + const ast = baseParse('
') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1322,7 +1322,7 @@ describe('compiler: parse', () => { }) test('v-slot shorthand', () => { - const ast = parse('') + const ast = baseParse('') const directive = (ast.children[0] as ElementNode).props[0] expect(directive).toStrictEqual({ @@ -1369,7 +1369,7 @@ describe('compiler: parse', () => { }) test('v-pre', () => { - const ast = parse( + const ast = baseParse( `
{{ bar }}
\n` + `
{{ bar }}
` ) @@ -1451,7 +1451,7 @@ describe('compiler: parse', () => { }) test('end tags are case-insensitive.', () => { - const ast = parse('
hello
after') + const ast = baseParse('
hello
after') const element = ast.children[0] as ElementNode const text = element.children[0] as TextNode @@ -1468,14 +1468,14 @@ describe('compiler: parse', () => { }) test('self closing single tag', () => { - const ast = parse('
') + const ast = baseParse('
') expect(ast.children).toHaveLength(1) expect(ast.children[0]).toMatchObject({ tag: 'div' }) }) test('self closing multiple tag', () => { - const ast = parse( + const ast = baseParse( `
\n` + `

` ) @@ -1488,7 +1488,7 @@ describe('compiler: parse', () => { }) test('valid html', () => { - const ast = parse( + const ast = baseParse( `

\n` + `

\n` + ` \n` + @@ -1513,11 +1513,11 @@ describe('compiler: parse', () => { test('invalid html', () => { expect(() => { - parse(`

\n\n
\n`) + baseParse(`
\n\n
\n`) }).toThrow('Element is missing end tag.') const spy = jest.fn() - const ast = parse(`
\n\n
\n`, { + const ast = baseParse(`
\n\n
\n`, { onError: spy }) @@ -1552,7 +1552,7 @@ describe('compiler: parse', () => { }) test('parse with correct location info', () => { - const [foo, bar, but, baz] = parse( + const [foo, bar, but, baz] = baseParse( ` foo is {{ bar }} but {{ baz }}`.trim() @@ -1588,7 +1588,7 @@ foo describe('namedCharacterReferences option', () => { test('use the given map', () => { - const ast: any = parse('&∪︀', { + const ast: any = baseParse('&∪︀', { namedCharacterReferences: { 'cups;': '\u222A\uFE00' // UNION with serifs }, @@ -1603,18 +1603,18 @@ foo describe('whitespace management', () => { it('should remove whitespaces at start/end inside an element', () => { - const ast = parse(`
`) + const ast = baseParse(`
`) expect((ast.children[0] as ElementNode).children.length).toBe(1) }) it('should remove whitespaces w/ newline between elements', () => { - const ast = parse(`
\n
\n
`) + const ast = baseParse(`
\n
\n
`) expect(ast.children.length).toBe(3) expect(ast.children.every(c => c.type === NodeTypes.ELEMENT)).toBe(true) }) it('should remove whitespaces adjacent to comments', () => { - const ast = parse(`
\n
`) + const ast = baseParse(`
\n
`) expect(ast.children.length).toBe(3) expect(ast.children[0].type).toBe(NodeTypes.ELEMENT) expect(ast.children[1].type).toBe(NodeTypes.COMMENT) @@ -1622,7 +1622,7 @@ foo }) it('should remove whitespaces w/ newline between comments and elements', () => { - const ast = parse(`
\n \n
`) + const ast = baseParse(`
\n \n
`) expect(ast.children.length).toBe(3) expect(ast.children[0].type).toBe(NodeTypes.ELEMENT) expect(ast.children[1].type).toBe(NodeTypes.COMMENT) @@ -1630,7 +1630,7 @@ foo }) it('should NOT remove whitespaces w/ newline between interpolations', () => { - const ast = parse(`{{ foo }} \n {{ bar }}`) + const ast = baseParse(`{{ foo }} \n {{ bar }}`) expect(ast.children.length).toBe(3) expect(ast.children[0].type).toBe(NodeTypes.INTERPOLATION) expect(ast.children[1]).toMatchObject({ @@ -1641,7 +1641,7 @@ foo }) it('should NOT remove whitespaces w/o newline between elements', () => { - const ast = parse(`
`) + const ast = baseParse(`
`) expect(ast.children.length).toBe(5) expect(ast.children.map(c => c.type)).toMatchObject([ NodeTypes.ELEMENT, @@ -1653,7 +1653,7 @@ foo }) it('should condense consecutive whitespaces in text', () => { - const ast = parse(` foo \n bar baz `) + const ast = baseParse(` foo \n bar baz `) expect((ast.children[0] as TextNode).content).toBe(` foo bar baz `) }) }) @@ -2716,7 +2716,7 @@ foo ), () => { const spy = jest.fn() - const ast = parse(code, { + const ast = baseParse(code, { getNamespace: (tag, parent) => { const ns = parent ? parent.ns : Namespaces.HTML if (ns === Namespaces.HTML) { diff --git a/packages/compiler-core/__tests__/transform.spec.ts b/packages/compiler-core/__tests__/transform.spec.ts index fb67a5d1..2e1c1e80 100644 --- a/packages/compiler-core/__tests__/transform.spec.ts +++ b/packages/compiler-core/__tests__/transform.spec.ts @@ -1,4 +1,4 @@ -import { parse } from '../src/parse' +import { baseParse } from '../src/parse' import { transform, NodeTransform } from '../src/transform' import { ElementNode, @@ -26,7 +26,7 @@ import { PatchFlags } from '@vue/shared' describe('compiler: transform', () => { test('context state', () => { - const ast = parse(`
hello {{ world }}
`) + const ast = baseParse(`
hello {{ world }}
`) // manually store call arguments because context is mutable and shared // across calls @@ -72,7 +72,7 @@ describe('compiler: transform', () => { }) test('context.replaceNode', () => { - const ast = parse(`
`) + const ast = baseParse(`
`) const plugin: NodeTransform = (node, context) => { if (node.type === NodeTypes.ELEMENT && node.tag === 'div') { // change the node to

@@ -106,7 +106,7 @@ describe('compiler: transform', () => { }) test('context.removeNode', () => { - const ast = parse(`

hello
`) + const ast = baseParse(`
hello
`) const c1 = ast.children[0] const c2 = ast.children[2] @@ -132,7 +132,7 @@ describe('compiler: transform', () => { }) test('context.removeNode (prev sibling)', () => { - const ast = parse(`
`) + const ast = baseParse(`
`) const c1 = ast.children[0] const c2 = ast.children[2] @@ -159,7 +159,7 @@ describe('compiler: transform', () => { }) test('context.removeNode (next sibling)', () => { - const ast = parse(`
`) + const ast = baseParse(`
`) const c1 = ast.children[0] const d1 = ast.children[1] @@ -186,7 +186,7 @@ describe('compiler: transform', () => { }) test('context.hoist', () => { - const ast = parse(`
`) + const ast = baseParse(`
`) const hoisted: ExpressionNode[] = [] const mock: NodeTransform = (node, context) => { if (node.type === NodeTypes.ELEMENT) { @@ -204,7 +204,7 @@ describe('compiler: transform', () => { }) test('onError option', () => { - const ast = parse(`
`) + const ast = baseParse(`
`) const loc = ast.children[0].loc const plugin: NodeTransform = (node, context) => { context.onError( @@ -225,20 +225,20 @@ describe('compiler: transform', () => { }) test('should inject toString helper for interpolations', () => { - const ast = parse(`{{ foo }}`) + const ast = baseParse(`{{ foo }}`) transform(ast, {}) expect(ast.helpers).toContain(TO_STRING) }) test('should inject createVNode and Comment for comments', () => { - const ast = parse(``) + const ast = baseParse(``) transform(ast, {}) expect(ast.helpers).toContain(CREATE_COMMENT) }) describe('root codegenNode', () => { function transformWithCodegen(template: string) { - const ast = parse(template) + const ast = baseParse(template) transform(ast, { nodeTransforms: [ transformIf, diff --git a/packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts b/packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts index b0058485..3989805e 100644 --- a/packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts +++ b/packages/compiler-core/__tests__/transforms/hoistStatic.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, NodeTypes, generate, diff --git a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts index 17ee4724..92e2b346 100644 --- a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts @@ -1,4 +1,9 @@ -import { CompilerOptions, parse, transform, ErrorCodes } from '../../src' +import { + CompilerOptions, + baseParse as parse, + transform, + ErrorCodes +} from '../../src' import { RESOLVE_COMPONENT, CREATE_VNODE, diff --git a/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts b/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts index 09f6ecbf..6f1f280b 100644 --- a/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformExpressions.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, ElementNode, DirectiveNode, diff --git a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts index 1e6a4b54..1bcd52d0 100644 --- a/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformSlotOutlet.spec.ts @@ -1,6 +1,6 @@ import { CompilerOptions, - parse, + baseParse as parse, transform, ElementNode, NodeTypes, diff --git a/packages/compiler-core/__tests__/transforms/transformText.spec.ts b/packages/compiler-core/__tests__/transforms/transformText.spec.ts index d11f4b61..ab5341c3 100644 --- a/packages/compiler-core/__tests__/transforms/transformText.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformText.spec.ts @@ -1,6 +1,6 @@ import { CompilerOptions, - parse, + baseParse as parse, transform, NodeTypes, generate, diff --git a/packages/compiler-core/__tests__/transforms/vBind.spec.ts b/packages/compiler-core/__tests__/transforms/vBind.spec.ts index 2f1c9aba..d2fa15ef 100644 --- a/packages/compiler-core/__tests__/transforms/vBind.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vBind.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, ElementNode, ObjectExpression, diff --git a/packages/compiler-core/__tests__/transforms/vFor.spec.ts b/packages/compiler-core/__tests__/transforms/vFor.spec.ts index 93b6bc90..05fc6147 100644 --- a/packages/compiler-core/__tests__/transforms/vFor.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vFor.spec.ts @@ -1,4 +1,4 @@ -import { parse } from '../../src/parse' +import { baseParse as parse } from '../../src/parse' import { transform } from '../../src/transform' import { transformIf } from '../../src/transforms/vIf' import { transformFor } from '../../src/transforms/vFor' diff --git a/packages/compiler-core/__tests__/transforms/vIf.spec.ts b/packages/compiler-core/__tests__/transforms/vIf.spec.ts index 7e347023..f50ad662 100644 --- a/packages/compiler-core/__tests__/transforms/vIf.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vIf.spec.ts @@ -1,4 +1,4 @@ -import { parse } from '../../src/parse' +import { baseParse as parse } from '../../src/parse' import { transform } from '../../src/transform' import { transformIf } from '../../src/transforms/vIf' import { transformElement } from '../../src/transforms/transformElement' diff --git a/packages/compiler-core/__tests__/transforms/vModel.spec.ts b/packages/compiler-core/__tests__/transforms/vModel.spec.ts index c2ce8dae..5f2721f8 100644 --- a/packages/compiler-core/__tests__/transforms/vModel.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vModel.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, generate, ElementNode, diff --git a/packages/compiler-core/__tests__/transforms/vOn.spec.ts b/packages/compiler-core/__tests__/transforms/vOn.spec.ts index 57b7c4f8..7dfe92a0 100644 --- a/packages/compiler-core/__tests__/transforms/vOn.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vOn.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, ElementNode, ObjectExpression, diff --git a/packages/compiler-core/__tests__/transforms/vOnce.spec.ts b/packages/compiler-core/__tests__/transforms/vOnce.spec.ts index 5d2a2a05..1c9f9ace 100644 --- a/packages/compiler-core/__tests__/transforms/vOnce.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vOnce.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, NodeTypes, generate, diff --git a/packages/compiler-core/__tests__/transforms/vSlot.spec.ts b/packages/compiler-core/__tests__/transforms/vSlot.spec.ts index bf48b6cb..56be19aa 100644 --- a/packages/compiler-core/__tests__/transforms/vSlot.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vSlot.spec.ts @@ -1,6 +1,6 @@ import { CompilerOptions, - parse, + baseParse as parse, transform, generate, ElementNode, diff --git a/packages/compiler-core/src/compile.ts b/packages/compiler-core/src/compile.ts index d6214137..7699dae8 100644 --- a/packages/compiler-core/src/compile.ts +++ b/packages/compiler-core/src/compile.ts @@ -1,5 +1,5 @@ import { CompilerOptions } from './options' -import { parse } from './parse' +import { baseParse } from './parse' import { transform } from './transform' import { generate, CodegenResult } from './codegen' import { RootNode } from './ast' @@ -43,7 +43,7 @@ export function baseCompile( onError(createCompilerError(ErrorCodes.X_SCOPE_ID_NOT_SUPPORTED)) } - const ast = isString(template) ? parse(template, options) : template + const ast = isString(template) ? baseParse(template, options) : template transform(ast, { ...options, prefixIdentifiers, diff --git a/packages/compiler-core/src/index.ts b/packages/compiler-core/src/index.ts index 723fe8c3..78a1dd3e 100644 --- a/packages/compiler-core/src/index.ts +++ b/packages/compiler-core/src/index.ts @@ -7,7 +7,7 @@ export { TransformOptions, CodegenOptions } from './options' -export { parse, TextModes } from './parse' +export { baseParse, TextModes } from './parse' export { transform, createStructuralDirectiveTransform, diff --git a/packages/compiler-core/src/parse.ts b/packages/compiler-core/src/parse.ts index fa31036d..b9b37953 100644 --- a/packages/compiler-core/src/parse.ts +++ b/packages/compiler-core/src/parse.ts @@ -66,7 +66,10 @@ interface ParserContext { inPre: boolean } -export function parse(content: string, options: ParserOptions = {}): RootNode { +export function baseParse( + content: string, + options: ParserOptions = {} +): RootNode { const context = createParserContext(content, options) const start = getCursor(context) diff --git a/packages/compiler-dom/__tests__/parse.spec.ts b/packages/compiler-dom/__tests__/parse.spec.ts index 52f142e1..e10cf255 100644 --- a/packages/compiler-dom/__tests__/parse.spec.ts +++ b/packages/compiler-dom/__tests__/parse.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, NodeTypes, ElementNode, TextNode, diff --git a/packages/compiler-dom/__tests__/transforms/transformStyle.spec.ts b/packages/compiler-dom/__tests__/transforms/transformStyle.spec.ts index 5c568c27..aabe94d4 100644 --- a/packages/compiler-dom/__tests__/transforms/transformStyle.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/transformStyle.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, CompilerOptions, ElementNode, diff --git a/packages/compiler-dom/__tests__/transforms/vCloak.spec.ts b/packages/compiler-dom/__tests__/transforms/vCloak.spec.ts index 955dde73..03d7f716 100644 --- a/packages/compiler-dom/__tests__/transforms/vCloak.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vCloak.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, ElementNode, CallExpression diff --git a/packages/compiler-dom/__tests__/transforms/vHtml.spec.ts b/packages/compiler-dom/__tests__/transforms/vHtml.spec.ts index 12d3d6b3..7d81fcb4 100644 --- a/packages/compiler-dom/__tests__/transforms/vHtml.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vHtml.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, PlainElementNode, CompilerOptions diff --git a/packages/compiler-dom/__tests__/transforms/vModel.spec.ts b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts index 393b62d9..a70e117a 100644 --- a/packages/compiler-dom/__tests__/transforms/vModel.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vModel.spec.ts @@ -1,4 +1,9 @@ -import { parse, transform, CompilerOptions, generate } from '@vue/compiler-core' +import { + baseParse as parse, + transform, + CompilerOptions, + generate +} from '@vue/compiler-core' import { transformModel } from '../../src/transforms/vModel' import { transformElement } from '../../../compiler-core/src/transforms/transformElement' import { DOMErrorCodes } from '../../src/errors' diff --git a/packages/compiler-dom/__tests__/transforms/vOn.spec.ts b/packages/compiler-dom/__tests__/transforms/vOn.spec.ts index 20001b49..806c80fe 100644 --- a/packages/compiler-dom/__tests__/transforms/vOn.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vOn.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, CompilerOptions, ElementNode, diff --git a/packages/compiler-dom/__tests__/transforms/vShow.spec.ts b/packages/compiler-dom/__tests__/transforms/vShow.spec.ts index 3bac6bbe..3c70741c 100644 --- a/packages/compiler-dom/__tests__/transforms/vShow.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vShow.spec.ts @@ -1,4 +1,9 @@ -import { parse, transform, generate, CompilerOptions } from '@vue/compiler-core' +import { + baseParse as parse, + transform, + generate, + CompilerOptions +} from '@vue/compiler-core' import { transformElement } from '../../../compiler-core/src/transforms/transformElement' import { transformShow } from '../../src/transforms/vShow' import { DOMErrorCodes } from '../../src/errors' diff --git a/packages/compiler-dom/__tests__/transforms/vText.spec.ts b/packages/compiler-dom/__tests__/transforms/vText.spec.ts index ef27ec50..83f052cb 100644 --- a/packages/compiler-dom/__tests__/transforms/vText.spec.ts +++ b/packages/compiler-dom/__tests__/transforms/vText.spec.ts @@ -1,5 +1,5 @@ import { - parse, + baseParse as parse, transform, PlainElementNode, CompilerOptions diff --git a/packages/compiler-dom/src/index.ts b/packages/compiler-dom/src/index.ts index 0c42dfee..8bbc774c 100644 --- a/packages/compiler-dom/src/index.ts +++ b/packages/compiler-dom/src/index.ts @@ -1,8 +1,10 @@ import { baseCompile, + baseParse, CompilerOptions, CodegenResult, - isBuiltInType + isBuiltInType, + ParserOptions } from '@vue/compiler-core' import { parserOptionsMinimal } from './parserOptionsMinimal' import { parserOptionsStandard } from './parserOptionsStandard' @@ -15,13 +17,15 @@ import { transformOn } from './transforms/vOn' import { transformShow } from './transforms/vShow' import { TRANSITION, TRANSITION_GROUP } from './runtimeHelpers' +const parserOptions = __BROWSER__ ? parserOptionsMinimal : parserOptionsStandard + export function compile( template: string, options: CompilerOptions = {} ): CodegenResult { return baseCompile(template, { + ...parserOptions, ...options, - ...(__BROWSER__ ? parserOptionsMinimal : parserOptionsStandard), nodeTransforms: [transformStyle, ...(options.nodeTransforms || [])], directiveTransforms: { cloak: transformCloak, @@ -42,4 +46,11 @@ export function compile( }) } +export function parse(template: string, options: ParserOptions = {}) { + return baseParse(template, { + ...parserOptions, + ...options + }) +} + export * from '@vue/compiler-core' diff --git a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts index c6e0df02..03a32ba0 100644 --- a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts +++ b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts @@ -23,7 +23,7 @@ body `, { filename: 'example.vue', sourceMap: true } - ).template as SFCTemplateBlock + ).descriptor.template as SFCTemplateBlock const result = compileTemplate({ filename: 'example.vue', @@ -35,10 +35,10 @@ body }) test('warn missing preprocessor', () => { - const template = parse(`\n`, { + const template = parse(`\n`, { filename: 'example.vue', sourceMap: true - }).template as SFCTemplateBlock + }).descriptor.template as SFCTemplateBlock const result = compileTemplate({ filename: 'example.vue', @@ -70,10 +70,10 @@ test('source map', () => { ` + `, { filename: 'example.vue', sourceMap: true } - ).template as SFCTemplateBlock + ).descriptor.template as SFCTemplateBlock const result = compileTemplate({ filename: 'example.vue', @@ -86,7 +86,7 @@ test('source map', () => { test('template errors', () => { const result = compileTemplate({ filename: 'example.vue', - source: `
` }) expect(result.errors).toMatchSnapshot() @@ -100,7 +100,7 @@ test('preprocessor errors', () => { `, { filename: 'example.vue', sourceMap: true } - ).template as SFCTemplateBlock + ).descriptor.template as SFCTemplateBlock const result = compileTemplate({ filename: 'example.vue', diff --git a/packages/compiler-sfc/__tests__/parse.spec.ts b/packages/compiler-sfc/__tests__/parse.spec.ts index a3bd86b7..6a4534c1 100644 --- a/packages/compiler-sfc/__tests__/parse.spec.ts +++ b/packages/compiler-sfc/__tests__/parse.spec.ts @@ -1,5 +1,6 @@ import { parse } from '../src' import { mockWarn } from '@vue/runtime-test' +import { baseParse, baseCompile } from '@vue/compiler-core' describe('compiler:sfc', () => { mockWarn() @@ -7,13 +8,14 @@ describe('compiler:sfc', () => { describe('source map', () => { test('style block', () => { const style = parse(`\n`) - .styles[0] + .descriptor.styles[0] // TODO need to actually test this with SourceMapConsumer expect(style.map).not.toBeUndefined() }) test('script block', () => { - const script = parse(`\n`).script + const script = parse(`\n`) + .descriptor.script // TODO need to actually test this with SourceMapConsumer expect(script!.map).not.toBeUndefined() }) @@ -30,12 +32,12 @@ export default {} ` - const padFalse = parse(content.trim(), { pad: false }) + const padFalse = parse(content.trim(), { pad: false }).descriptor expect(padFalse.template!.content).toBe('\n
\n') expect(padFalse.script!.content).toBe('\nexport default {}\n') expect(padFalse.styles[0].content).toBe('\nh1 { color: red }\n') - const padTrue = parse(content.trim(), { pad: true }) + const padTrue = parse(content.trim(), { pad: true }).descriptor expect(padTrue.script!.content).toBe( Array(3 + 1).join('//\n') + '\nexport default {}\n' ) @@ -43,7 +45,7 @@ h1 { color: red } Array(6 + 1).join('\n') + '\nh1 { color: red }\n' ) - const padLine = parse(content.trim(), { pad: 'line' }) + const padLine = parse(content.trim(), { pad: 'line' }).descriptor expect(padLine.script!.content).toBe( Array(3 + 1).join('//\n') + '\nexport default {}\n' ) @@ -51,7 +53,7 @@ h1 { color: red } Array(6 + 1).join('\n') + '\nh1 { color: red }\n' ) - const padSpace = parse(content.trim(), { pad: 'space' }) + const padSpace = parse(content.trim(), { pad: 'space' }).descriptor expect(padSpace.script!.content).toBe( `\n