Skip to content

Commit a522afa

Browse files
authored
fix(language-core): avoid defineModel breaking ast in lang="js" (#5935)
1 parent 17394f4 commit a522afa

File tree

6 files changed

+23
-3
lines changed

6 files changed

+23
-3
lines changed

packages/language-core/lib/codegen/script/scriptSetup.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,9 @@ function* generateModels(
472472
yield* codes;
473473
}
474474
yield `}${endOfLine}`;
475-
yield `const ${names.modelEmit} = defineEmits<${names.ModelEmit}>()${endOfLine}`;
475+
476+
// avoid `defineModel<...>()` to prevent JS AST issues
477+
yield `let ${names.modelEmit}!: __VLS_ShortEmits<${names.ModelEmit}>${endOfLine}`;
476478
}
477479

478480
function* generateModelProp(

packages/language-core/types/template-helpers.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ declare global {
9393
) => any;
9494
}
9595
>;
96+
type __VLS_ShortEmits<E extends Record<string, any[]>> = __VLS_UnionToIntersection<
97+
{ [K in keyof E]: (event: K, ...args: E[K]) => void }[keyof E]
98+
>;
9699
type __VLS_ShortEmitsToObject<E> = E extends Record<string, any[]> ? { [K in keyof E]: (...args: E[K]) => any }
97100
: E;
98101
type __VLS_ResolveEmits<

packages/tsc/tests/__snapshots__/dts.spec.ts.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ exports[`Input: generic/component.vue, Output: generic/component.vue.d.ts 1`] =
186186
foo: number;
187187
}) => any;
188188
};
189-
emit: ((e: "bar", data: number) => void) & ((evt: "update:title", value: string) => void);
189+
emit: ((e: "bar", data: number) => void) & ((event: "update:title", value: string) => void);
190190
}>) => import("vue").VNode & {
191191
__ctx?: Awaited<typeof __VLS_setup>;
192192
};
@@ -221,7 +221,7 @@ exports[`Input: generic/custom-extension-component.cext, Output: generic/custom-
221221
foo: number;
222222
}) => any;
223223
};
224-
emit: ((e: "bar", data: number) => void) & ((evt: "update:title", value: string) => void);
224+
emit: ((e: "bar", data: number) => void) & ((event: "update:title", value: string) => void);
225225
}>) => import("vue").VNode & {
226226
__ctx?: Awaited<typeof __VLS_setup>;
227227
};

test-workspace/tsc/#5934/main.vue

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script setup>
2+
// @ts-check
3+
defineModel('foo');
4+
</script>
5+
6+
<template>
7+
{{ $emit('update:foo', 'bar') }}
8+
</template>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"extends": "../../tsconfig.base.json",
3+
"include": ["**/*"]
4+
}

test-workspace/tsc/tsconfig.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,9 @@
511511
{
512512
"path": "./#5899/tsconfig.json"
513513
},
514+
{
515+
"path": "./#5934/tsconfig.json"
516+
},
514517
{
515518
"path": "./#625/tsconfig.json"
516519
},

0 commit comments

Comments
 (0)