Skip to content

Commit

Permalink
feat(compiler-sfc): support passing template parsing options when par…
Browse files Browse the repository at this point in the history
…sing sfc

- This is released in a patch because it is an relatively internal API
  but required to properly fix vitejs/vite-plugin-vue#322

- `parseExpressions` is now deprecated because it can be passed using
  original template parsing options (`prefixIdentifiers`)
  • Loading branch information
yyx990803 committed Dec 30, 2023
1 parent a9be936 commit 6fab855
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
21 changes: 20 additions & 1 deletion packages/compiler-sfc/__tests__/parse.spec.ts
Original file line number Diff line number Diff line change
@@ -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', () => {
Expand Down Expand Up @@ -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)
Expand Down
8 changes: 8 additions & 0 deletions packages/compiler-sfc/src/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
type CompilerError,
type ElementNode,
NodeTypes,
type ParserOptions,
type RootNode,
type SourceLocation,
createRoot,
Expand All @@ -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
}

Expand Down Expand Up @@ -106,6 +112,7 @@ export function parse(
pad = false,
ignoreEmpty = true,
compiler = CompilerDOM,
templateParseOptions = {},
parseExpressions = true,
}: SFCParseOptions = {},
): SFCParseResult {
Expand Down Expand Up @@ -133,6 +140,7 @@ export function parse(
const ast = compiler.parse(source, {
parseMode: 'sfc',
prefixIdentifiers: parseExpressions,
...templateParseOptions,
onError: e => {
errors.push(e)
},
Expand Down

0 comments on commit 6fab855

Please sign in to comment.