diff --git a/packages/language-core/lib/codegen/script/scriptSetup.ts b/packages/language-core/lib/codegen/script/scriptSetup.ts index 05ffaa74f9..f6e9116165 100644 --- a/packages/language-core/lib/codegen/script/scriptSetup.ts +++ b/packages/language-core/lib/codegen/script/scriptSetup.ts @@ -87,25 +87,37 @@ export function* generateGeneric( emitTypes.push(`typeof ${names.modelEmit}`); } - yield `return {} as {${newLine}` - + ` props: ${propTypes.length ? `${ctx.localTypes.PrettifyLocal}<${propTypes.join(` & `)}> & ` : ``}${ - vueCompilerOptions.target >= 3.4 - ? `import('${vueCompilerOptions.lib}').PublicProps` - : vueCompilerOptions.target >= 3 - ? `import('${vueCompilerOptions.lib}').VNodeProps` - + ` & import('${vueCompilerOptions.lib}').AllowedComponentProps` - + ` & import('${vueCompilerOptions.lib}').ComponentCustomProps` - : `globalThis.JSX.IntrinsicAttributes` - } & (typeof globalThis extends { ${names.PROPS_FALLBACK}: infer P } ? P : {})${endOfLine}` - + ` expose: (exposed: ${ - scriptSetupRanges.defineExpose - ? `import('${vueCompilerOptions.lib}').ShallowUnwrapRef` - : `{}` - }) => void${endOfLine}` - + ` attrs: any${endOfLine}` - + ` slots: ${names.Slots}${endOfLine}` - + ` emit: ${emitTypes.length ? emitTypes.join(` & `) : `{}`}${endOfLine}` - + `}${endOfLine}`; + yield `return {} as {${newLine}`; + yield ` props: ${propTypes.length ? `${ctx.localTypes.PrettifyLocal}<${propTypes.join(` & `)}> & ` : ``}${ + vueCompilerOptions.target >= 3.4 + ? `import('${vueCompilerOptions.lib}').PublicProps` + : vueCompilerOptions.target >= 3 + ? `import('${vueCompilerOptions.lib}').VNodeProps` + + ` & import('${vueCompilerOptions.lib}').AllowedComponentProps` + + ` & import('${vueCompilerOptions.lib}').ComponentCustomProps` + : `globalThis.JSX.IntrinsicAttributes` + } & (typeof globalThis extends { ${names.PROPS_FALLBACK}: infer P } ? P : {})${endOfLine}`; + yield ` expose: (exposed: `; + yield scriptSetupRanges.defineExpose + ? `import('${vueCompilerOptions.lib}').ShallowUnwrapRef` + : `{}`; + if ( + options.vueCompilerOptions.inferComponentDollarRefs + && options.templateCodegen?.generatedTypes.has(names.TemplateRefs) + ) { + yield ` & { $refs: ${names.TemplateRefs}; }`; + } + if ( + options.vueCompilerOptions.inferComponentDollarEl + && options.templateCodegen?.generatedTypes.has(names.RootEl) + ) { + yield ` & { $el: ${names.RootEl}; }`; + } + yield `) => void${endOfLine}`; + yield ` attrs: any${endOfLine}`; + yield ` slots: ${names.Slots}${endOfLine}`; + yield ` emit: ${emitTypes.length ? emitTypes.join(` & `) : `{}`}${endOfLine}`; + yield `}${endOfLine}`; yield `})(),${newLine}`; // __VLS_setup = (async () => { yield `) => ({} as import('${vueCompilerOptions.lib}').VNode & { __ctx?: Awaited }))${endOfLine}`; } diff --git a/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json b/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json index a95c4b9874..4f8dc7d741 100644 --- a/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json +++ b/test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json @@ -14,6 +14,7 @@ "../vue3/#4820", "../vue3/#4826", "../vue3/#4828", + "../vue3/#5120", "../vue3/rootEl", "../vue3/templateRef", "../vue3/templateRef_native", diff --git a/test-workspace/tsc/passedFixtures/vue3/#5120/comp.vue b/test-workspace/tsc/passedFixtures/vue3/#5120/comp.vue new file mode 100644 index 0000000000..8a161b5c86 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3/#5120/comp.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/test-workspace/tsc/passedFixtures/vue3/#5120/main.vue b/test-workspace/tsc/passedFixtures/vue3/#5120/main.vue new file mode 100644 index 0000000000..096496ed38 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3/#5120/main.vue @@ -0,0 +1,13 @@ + + +