Skip to content

Commit a5e106d

Browse files
authored
fix(compiler-vapor): handle special characters in cached variable names (#13626)
1 parent f04c9c3 commit a5e106d

File tree

4 files changed

+30
-2
lines changed

4 files changed

+30
-2
lines changed

packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@ export function render(_ctx) {
1212
}"
1313
`;
1414

15+
exports[`v-on > component event with special characters 1`] = `
16+
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
17+
18+
export function render(_ctx) {
19+
const _component_Foo = _resolveComponent("Foo")
20+
const _on_update_model = () => {}
21+
const _on_update_model1 = () => {}
22+
const n0 = _createComponentWithFallback(_component_Foo, {
23+
"onUpdate:model": () => _on_update_model,
24+
"onUpdate-model": () => _on_update_model1
25+
}, null, true)
26+
return n0
27+
}"
28+
`;
29+
1530
exports[`v-on > dynamic arg 1`] = `
1631
"import { on as _on, renderEffect as _renderEffect, template as _template } from 'vue';
1732
const t0 = _template("<div></div>", true)

packages/compiler-vapor/__tests__/transforms/vOn.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,4 +695,16 @@ describe('v-on', () => {
695695
expect(code).matchSnapshot()
696696
expect(code).include('n0.$evtclick = e => _ctx.handleClick(e)')
697697
})
698+
699+
test('component event with special characters', () => {
700+
const { code } = compileWithVOn(
701+
`<Foo @update:model="() => {}" @update-model="() => {}" />`,
702+
)
703+
704+
expect(code).matchSnapshot()
705+
expect(code).contains('const _on_update_model = () => {}')
706+
expect(code).contains('const _on_update_model1 = () => {}')
707+
expect(code).contains('"onUpdate:model": () => _on_update_model')
708+
expect(code).contains('"onUpdate-model": () => _on_update_model1')
709+
})
698710
})

packages/compiler-vapor/src/generators/component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
genCall,
2727
genMulti,
2828
} from './utils'
29-
import { genExpression } from './expression'
29+
import { genExpression, genVarName } from './expression'
3030
import { genPropKey, genPropValue } from './prop'
3131
import {
3232
type SimpleExpressionNode,
@@ -102,6 +102,7 @@ export function genCreateComponent(
102102

103103
function getUniqueHandlerName(context: CodegenContext, name: string): string {
104104
const { seenInlineHandlerNames } = context
105+
name = genVarName(name)
105106
const count = seenInlineHandlerNames[name] || 0
106107
seenInlineHandlerNames[name] = count + 1
107108
return count === 0 ? name : `${name}${count}`

packages/compiler-vapor/src/generators/expression.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ function parseExp(context: CodegenContext, content: string): Node {
647647
return parseExpression(`(${content})`, options)
648648
}
649649

650-
function genVarName(exp: string): string {
650+
export function genVarName(exp: string): string {
651651
return `${exp
652652
.replace(/[^a-zA-Z0-9]/g, '_')
653653
.replace(/_+/g, '_')

0 commit comments

Comments
 (0)