diff --git a/packages/language-core/lib/codegen/globalTypes.ts b/packages/language-core/lib/codegen/globalTypes.ts index 83befdd7fc..79a4e66f4a 100644 --- a/packages/language-core/lib/codegen/globalTypes.ts +++ b/packages/language-core/lib/codegen/globalTypes.ts @@ -42,6 +42,58 @@ export function generateGlobalTypes(options: VueCompilerOptions) { type __VLS_IsAny = 0 extends 1 & T ? true : false; type __VLS_PickNotAny = __VLS_IsAny extends true ? B : A; type __VLS_SpreadMerge = Omit & B; + type __VLS_PublicInstanceWithoutExpose = + T extends import('${lib}').CreateComponentPublicInstanceWithMixins< + infer P, + infer B, + infer D, + infer C extends import('${lib}').ComputedOptions, + infer M extends import('${lib}').MethodOptions, + infer Mixin extends import('${lib}').ComponentOptionsMixin, + infer Extends extends import('${lib}').ComponentOptionsMixin, + infer E extends import('${lib}').EmitsOptions, + infer PublicProps, + infer Defaults, + infer MakeDefaultsOptional extends boolean, + infer I extends import('${lib}').ComponentInjectOptions, + infer S extends import('${lib}').SlotsType, + infer LC extends Record, + infer Directives extends Record, + infer Exposed extends string, + infer TypeRefs extends Record, + infer TypeEl extends Element, + infer Provide extends import('${lib}').ComponentProvideOptions, + infer PublicMixin, + infer PublicP, + infer PublicB + > + ? '' extends Exposed + ? T + : import('${lib}').CreateComponentPublicInstanceWithMixins< + P, + B, + D, + C, + M, + Mixin, + Extends, + E, + PublicProps, + Defaults, + MakeDefaultsOptional, + I, + S, + LC, + Directives, + '', + TypeRefs, + TypeEl, + Provide, + PublicMixin, + PublicP, + PublicB + > + : T; type __VLS_WithComponent = N1 extends keyof LocalComponents ? { [K in N0]: LocalComponents[N1] } : N2 extends keyof LocalComponents ? { [K in N0]: LocalComponents[N2] } : diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index f0e2f937c7..2336de82a4 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -53,7 +53,13 @@ function* generateTemplateCtx( exps.push(`globalThis`); } if (options.sfc.script?.src || options.scriptRanges?.exportDefault) { - exps.push(`{} as InstanceType<__VLS_PickNotAny {}>>`); + yield `type __VLS_SelfInstance = InstanceType<__VLS_PickNotAny {}>>${endOfLine}`; + if (options.scriptRanges?.componentOptions?.hasExposeOption) { + exps.push(`{} as __VLS_PublicInstanceWithoutExpose<__VLS_SelfInstance>`); + } + else { + exps.push(`{} as __VLS_SelfInstance`); + } } else { exps.push(`{} as import('${options.vueCompilerOptions.lib}').ComponentPublicInstance`); diff --git a/packages/language-core/lib/parsers/scriptRanges.ts b/packages/language-core/lib/parsers/scriptRanges.ts index 72788c2551..9a6a389cbf 100644 --- a/packages/language-core/lib/parsers/scriptRanges.ts +++ b/packages/language-core/lib/parsers/scriptRanges.ts @@ -21,6 +21,7 @@ export function parseScriptRanges(ts: typeof import('typescript'), ast: ts.Sourc directives: TextRange | undefined; name: TextRange | undefined; inheritAttrs: string | undefined; + hasExposeOption: boolean; } | undefined; @@ -57,6 +58,7 @@ export function parseScriptRanges(ts: typeof import('typescript'), ast: ts.Sourc let directivesOptionNode: ts.ObjectLiteralExpression | undefined; let nameOptionNode: ts.Expression | undefined; let inheritAttrsOption: string | undefined; + let hasExposeOption = false; ts.forEachChild(obj, node => { if (ts.isPropertyAssignment(node) && ts.isIdentifier(node.name)) { const name = _getNodeText(node.name); @@ -72,6 +74,9 @@ export function parseScriptRanges(ts: typeof import('typescript'), ast: ts.Sourc else if (name === 'inheritAttrs') { inheritAttrsOption = _getNodeText(node.initializer); } + else if (name === 'expose') { + hasExposeOption = true; + } } }); componentOptions = { @@ -83,6 +88,7 @@ export function parseScriptRanges(ts: typeof import('typescript'), ast: ts.Sourc directives: directivesOptionNode ? _getStartEnd(directivesOptionNode) : undefined, name: nameOptionNode ? _getStartEnd(nameOptionNode) : undefined, inheritAttrs: inheritAttrsOption, + hasExposeOption, }; } } diff --git a/test-workspace/tsc/passedFixtures/vue3/#5069/main.vue b/test-workspace/tsc/passedFixtures/vue3/#5069/main.vue new file mode 100644 index 0000000000..50eea53086 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3/#5069/main.vue @@ -0,0 +1,42 @@ + + +