From 27f2960b565f5cbafe50107ebd2032f06df33007 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Sat, 18 Feb 2023 23:28:16 +0800 Subject: [PATCH] fix: `strictTemplates did not check for unknown components close #2291 --- .../src/generators/template.ts | 35 ++++++++++++------- .../vue-language-core/src/utils/localTypes.ts | 10 +++--- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/packages/vue-language-core/src/generators/template.ts b/packages/vue-language-core/src/generators/template.ts index ee7e9e3ce..066aac03d 100644 --- a/packages/vue-language-core/src/generators/template.ts +++ b/packages/vue-language-core/src/generators/template.ts @@ -144,7 +144,7 @@ export function generate( const data: Record = {}; - codeGen.push(`let __VLS_templateComponents!: {\n`); + codeGen.push(`let __VLS_templateComponents!: {}\n`); for (const tagName in tagNames) { @@ -163,12 +163,12 @@ export function generate( ]); const varName = validTsVar.test(tagName) ? tagName : capitalize(camelize(tagName.replace(/:/g, '-'))); - codeGen.push(`${varName}: import('./__VLS_types.js').GetComponents `'${name}'`).join(', ')}>;\n`); + codeGen.push(`& import('./__VLS_types.js').WithComponent<'${varName}', typeof __VLS_components, ${[...names].map(name => `'${name}'`).join(', ')}>\n`); data[tagName] = varName; } - codeGen.push(`};\n`); + codeGen.push(`;\n`); for (const tagName in tagNames) { @@ -541,7 +541,13 @@ export function generate( codeGen.push(`;\n`); } - codeGen.push(`let __VLS_${elementIndex++}: JSX.IntrinsicElements = { `); + codeGen.push(`(__VLS_x as JSX.IntrinsicElements)[`); + writeCodeWithQuotes( + node.tag, + tagOffsets[0], + capabilitiesPresets.diagnosticOnly, + ); + codeGen.push(`] = `); } else if (_isNamespacedTag) { @@ -555,7 +561,7 @@ export function generate( codeGen.push(`;\n`); } - codeGen.push(`const __VLS_${elementIndex++}: import('./__VLS_types.js').ComponentProps = { `); + codeGen.push(`(__VLS_x as import('./__VLS_types.js').ComponentProps) = `); } else { @@ -567,12 +573,15 @@ export function generate( componentVars[node.tag] ?? node.tag, 'template', [endTagOffset, endTagOffset + node.tag.length], - capabilitiesPresets.tagHover, + { + ...capabilitiesPresets.tagHover, + ...capabilitiesPresets.diagnosticOnly, + }, ]); codeGen.push(`;\n`); } - codeGen.push(`const __VLS_${elementIndex++}: { '${node.tag}': import('./__VLS_types.js').ComponentProps } = { `); + codeGen.push(`>) = `); } - writeObjectProperty(node.tag, startTagOffset, capabilitiesPresets.diagnosticOnly, node); - codeGen.push(` : { `); + codeGen.push(`{ `); const { unWriteExps } = writeProps(node, 'class', 'props'); _unWriteExps = unWriteExps; - codeGen.push(` } };\n`); + codeGen.push(`};\n`); } { diff --git a/packages/vue-language-core/src/utils/localTypes.ts b/packages/vue-language-core/src/utils/localTypes.ts index 0cf953ef2..2b8e595bd 100644 --- a/packages/vue-language-core/src/utils/localTypes.ts +++ b/packages/vue-language-core/src/utils/localTypes.ts @@ -102,11 +102,11 @@ export type FirstFunction NonNullable extends (Function | AnyArray) ? F4 : unknown; export type SelfComponent = string extends N ? {} : N extends string ? { [P in N]: C } : {}; -export type GetComponents = - N1 extends keyof Components ? Components[N1] : - N2 extends keyof Components ? Components[N2] : - N3 extends keyof Components ? Components[N3] : - ${vueCompilerOptions.strictTemplates ? 'unknown' : 'any'}; +export type WithComponent = + N1 extends keyof Components ? { [K in N0]: Components[N1] } : + N2 extends keyof Components ? { [K in N0]: Components[N2] } : + N3 extends keyof Components ? { [K in N0]: Components[N3] } : + ${vueCompilerOptions.strictTemplates ? '{}' : '{ [K in N0]: any }'}; export type ComponentProps = ${vueCompilerOptions.strictTemplates ? '' : 'Record &'} (