From: Evan You Date: Sat, 30 Dec 2023 00:42:43 +0000 (+0800) Subject: feat(compiler-sfc): support passing template parsing options when parsing sfc X-Git-Tag: v3.4.1~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6fab8551e4aeef4610987640de8b435b1ae321bb;p=thirdparty%2Fvuejs%2Fcore.git feat(compiler-sfc): support passing template parsing options when parsing sfc - This is released in a patch because it is an relatively internal API but required to properly fix https://github.com/vitejs/vite-plugin-vue/issues/322 - `parseExpressions` is now deprecated because it can be passed using original template parsing options (`prefixIdentifiers`) --- diff --git a/packages/compiler-sfc/__tests__/parse.spec.ts b/packages/compiler-sfc/__tests__/parse.spec.ts index e650a850ab..3d5ec8604b 100644 --- a/packages/compiler-sfc/__tests__/parse.spec.ts +++ b/packages/compiler-sfc/__tests__/parse.spec.ts @@ -1,5 +1,10 @@ import { parse } from '../src' -import { baseCompile, createRoot } from '@vue/compiler-core' +import { + ElementTypes, + NodeTypes, + baseCompile, + createRoot, +} from '@vue/compiler-core' import { SourceMapConsumer } from 'source-map-js' describe('compiler:sfc', () => { @@ -350,6 +355,20 @@ h1 { color: red } expect(descriptor.customBlocks[0].content).toBe(` <-& `) }) + test('should accept parser options', () => { + const { errors, descriptor } = parse(``, { + templateParseOptions: { + isCustomElement: t => t === 'hello', + }, + }) + expect(errors.length).toBe(0) + expect(descriptor.template!.ast!.children[0]).toMatchObject({ + type: NodeTypes.ELEMENT, + tag: 'hello', + tagType: ElementTypes.ELEMENT, + }) + }) + describe('warnings', () => { function assertWarning(errors: Error[], msg: string) { expect(errors.some(e => e.message.match(msg))).toBe(true) diff --git a/packages/compiler-sfc/src/parse.ts b/packages/compiler-sfc/src/parse.ts index 0c891e8215..0acceb1fab 100644 --- a/packages/compiler-sfc/src/parse.ts +++ b/packages/compiler-sfc/src/parse.ts @@ -3,6 +3,7 @@ import { type CompilerError, type ElementNode, NodeTypes, + type ParserOptions, type RootNode, type SourceLocation, createRoot, @@ -24,6 +25,11 @@ export interface SFCParseOptions { pad?: boolean | 'line' | 'space' ignoreEmpty?: boolean compiler?: TemplateCompiler + templateParseOptions?: ParserOptions + /** + * TODO remove in 3.5 + * @deprecated use `templateParseOptions: { prefixIdentifiers: false }` instead + */ parseExpressions?: boolean } @@ -106,6 +112,7 @@ export function parse( pad = false, ignoreEmpty = true, compiler = CompilerDOM, + templateParseOptions = {}, parseExpressions = true, }: SFCParseOptions = {}, ): SFCParseResult { @@ -133,6 +140,7 @@ export function parse( const ast = compiler.parse(source, { parseMode: 'sfc', prefixIdentifiers: parseExpressions, + ...templateParseOptions, onError: e => { errors.push(e) },