)
})
+ test('should not error', () => {
+ const onError = vi.fn()
+ parseWithExpressionTransform(
+ `<p :id="undefined /* force override the id */"/>`,
+ {
+ onError,
+ },
+ )
+ expect(onError).not.toHaveBeenCalled()
+ })
+
test('should prefix in assignment', () => {
const node = parseWithExpressionTransform(
`{{ x = 1 }}`,
root: Node,
onIdentifier: (
node: Identifier,
- parent: Node,
+ parent: Node | null,
parentStack: Node[],
isReference: boolean,
isLocal: boolean,
: root
walk(root, {
- enter(node: Node & { scopeIds?: Set<string> }, parent: Node | undefined) {
+ enter(node: Node & { scopeIds?: Set<string> }, parent: Node | null) {
parent && parentStack.push(parent)
if (
parent &&
}
if (node.type === 'Identifier') {
const isLocal = !!knownIds[node.name]
- const isRefed = isReferencedIdentifier(node, parent!, parentStack)
+ const isRefed = isReferencedIdentifier(node, parent, parentStack)
if (includeAll || (isRefed && !isLocal)) {
- onIdentifier(node, parent!, parentStack, isRefed, isLocal)
+ onIdentifier(node, parent, parentStack, isRefed, isLocal)
}
} else if (
node.type === 'ObjectProperty' &&
}
}
},
- leave(node: Node & { scopeIds?: Set<string> }, parent: Node | undefined) {
+ leave(node: Node & { scopeIds?: Set<string> }, parent: Node | null) {
parent && parentStack.pop()
if (node !== rootExp && node.scopeIds) {
for (const id of node.scopeIds) {
}
const { inline, bindingMetadata } = context
- const rewriteIdentifier = (raw: string, parent?: Node, id?: Identifier) => {
+ const rewriteIdentifier = (
+ raw: string,
+ parent?: Node | null,
+ id?: Identifier,
+ ) => {
const type = hasOwn(bindingMetadata, raw) && bindingMetadata[raw]
if (inline) {
// x = y
// local scope variable (a v-for alias, or a v-slot prop)
if (
!(needPrefix && isLocal) &&
- parent.type !== 'CallExpression' &&
- parent.type !== 'NewExpression' &&
- parent.type !== 'MemberExpression'
+ (!parent ||
+ (parent.type !== 'CallExpression' &&
+ parent.type !== 'NewExpression' &&
+ parent.type !== 'MemberExpression'))
) {
;(node as QualifiedId).isConstant = true
}
) {
const scope: Statement[][] = [scriptSetupAst.body]
walk(node, {
- enter(child: Node, parent: Node | undefined) {
+ enter(child: Node, parent: Node | null) {
if (isFunctionType(child)) {
this.skip()
}
const ast = ctx.scriptSetupAst!
walkScope(ast, true)
walk(ast, {
- enter(node: Node, parent?: Node) {
+ enter(node: Node, parent: Node | null) {
parent && parentStack.push(parent)
// skip type nodes
}
}
},
- leave(node: Node, parent?: Node) {
+ leave(node: Node, parent: Node | null) {
parent && parentStack.pop()
if (
(node.type === 'BlockStatement' && !isFunctionType(parent!)) ||
export function walk<T>(
root: T,
options: {
- enter?: (node: T, parent: T | undefined) => any
- leave?: (node: T, parent: T | undefined) => any
+ enter?: (node: T, parent: T | null) => any
+ leave?: (node: T, parent: T | null) => any
exit?: (node: T) => any
} & ThisType<{ skip: () => void }>,
)