diff --git a/packages/compiler-sfc/__tests__/parse.spec.ts b/packages/compiler-sfc/__tests__/parse.spec.ts index e650a850abd..3d5ec8604b9 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 0c891e82159..0acceb1faba 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) },