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`)
This commit is contained in:
Evan You 2023-12-30 08:42:43 +08:00
parent a9be936acf
commit 6fab8551e4
2 changed files with 28 additions and 1 deletions

View File

@ -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(`<template><hello/></template>`, {
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)

View File

@ -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)
},