From 1a61a59e79cbdd5e6f424a402d622f67dae515c5 Mon Sep 17 00:00:00 2001 From: so1ve Date: Fri, 15 Mar 2024 17:25:27 +0800 Subject: [PATCH 01/16] wip Co-authored-by: A5rocks --- packages/language-core/lib/generators/template.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/language-core/lib/generators/template.ts b/packages/language-core/lib/generators/template.ts index 477b64adbd..91ec38a6db 100644 --- a/packages/language-core/lib/generators/template.ts +++ b/packages/language-core/lib/generators/template.ts @@ -134,6 +134,7 @@ export function* generate( const scopedClasses: { className: string, offset: number; }[] = []; const blockConditions: string[] = []; const hasSlotElements = new Set(); + const inheritAttrElements = new Set(); const usedComponentCtxVars = new Set(); let hasSlot = false; @@ -430,6 +431,7 @@ export function* generate( else if (node.type === CompilerDOM.NodeTypes.ELEMENT) { const vForNode = getVForNode(node); const vIfNode = getVIfNode(node); + const vbindAttrsNode = getVbindAttrsNode(node); if (vForNode) { yield* generateVFor(vForNode, parentEl, componentCtxVar); } @@ -437,6 +439,9 @@ export function* generate( yield* generateVIf(vIfNode, parentEl, componentCtxVar); } else { + if (vbindAttrsNode) { + inheritAttrElements.add(node); + } yield* generateElement(node, parentEl, componentCtxVar); } } @@ -2136,3 +2141,13 @@ function getVIfNode(node: CompilerDOM.ElementNode) { } } } + +function getVbindAttrsNode(node: CompilerDOM.ElementNode) { + const bindDirective = node.props.find( + (prop): prop is CompilerDOM.DirectiveNode => + prop.type === CompilerDOM.NodeTypes.DIRECTIVE + && prop.name === 'bind' + && prop.arg?.loc.source === 'attrs' + ); + return bindDirective; +} From 9807cc3a098579dddd65b488c84bb25fc09c80d7 Mon Sep 17 00:00:00 2001 From: so1ve Date: Fri, 15 Mar 2024 17:31:59 +0800 Subject: [PATCH 02/16] parser --- packages/language-core/lib/parsers/scriptRanges.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/language-core/lib/parsers/scriptRanges.ts b/packages/language-core/lib/parsers/scriptRanges.ts index c31ca6e161..5712071949 100644 --- a/packages/language-core/lib/parsers/scriptRanges.ts +++ b/packages/language-core/lib/parsers/scriptRanges.ts @@ -13,6 +13,7 @@ export function parseScriptRanges(ts: typeof import('typescript'), ast: ts.Sourc componentsOption: TextRange | undefined, componentsOptionNode: ts.ObjectLiteralExpression | undefined, nameOption: TextRange | undefined, + inheritAttrsOption: string | undefined, }) | undefined; const bindings = hasScriptSetup ? parseBindingRanges(ts, ast) : []; @@ -39,6 +40,7 @@ export function parseScriptRanges(ts: typeof import('typescript'), ast: ts.Sourc if (obj) { let componentsOptionNode: ts.ObjectLiteralExpression | undefined; let nameOptionNode: ts.Expression | undefined; + let inheritAttrsOption: string | undefined; ts.forEachChild(obj, node => { if (ts.isPropertyAssignment(node) && ts.isIdentifier(node.name)) { const name = getNodeText(ts, node.name, ast); @@ -48,6 +50,9 @@ export function parseScriptRanges(ts: typeof import('typescript'), ast: ts.Sourc if (name === 'name') { nameOptionNode = node.initializer; } + if (name === 'inheritAttrs') { + inheritAttrsOption = getNodeText(ts, node.initializer, ast); + } } }); exportDefault = { @@ -58,6 +63,7 @@ export function parseScriptRanges(ts: typeof import('typescript'), ast: ts.Sourc componentsOption: componentsOptionNode ? _getStartEnd(componentsOptionNode) : undefined, componentsOptionNode: withNode ? componentsOptionNode : undefined, nameOption: nameOptionNode ? _getStartEnd(nameOptionNode) : undefined, + inheritAttrsOption, }; } } From 8a6931f435ad86033150bb76f4b2cc90e9d00e5d Mon Sep 17 00:00:00 2001 From: so1ve Date: Tue, 19 Mar 2024 12:13:11 +0800 Subject: [PATCH 03/16] feat: parse `defineOptions` --- packages/language-core/lib/generators/script.ts | 1 + .../language-core/lib/generators/template.ts | 10 +++++++--- .../lib/parsers/scriptSetupRanges.ts | 17 +++++++++++++++++ packages/language-core/lib/plugins/vue-tsx.ts | 8 ++------ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/language-core/lib/generators/script.ts b/packages/language-core/lib/generators/script.ts index f8f919bfa7..6ab504fe64 100644 --- a/packages/language-core/lib/generators/script.ts +++ b/packages/language-core/lib/generators/script.ts @@ -60,6 +60,7 @@ export function* generate( emits: {}, expose: {}, slots: {}, + options: {}, defineProp: [], importSectionEndOffset: 0, leadingCommentEndOffset: 0, diff --git a/packages/language-core/lib/generators/template.ts b/packages/language-core/lib/generators/template.ts index 91ec38a6db..e79b384ea4 100644 --- a/packages/language-core/lib/generators/template.ts +++ b/packages/language-core/lib/generators/template.ts @@ -7,6 +7,8 @@ import type { Code, CodeAndStack, Sfc, VueCodeInformation, VueCompilerOptions } import { hyphenateAttr, hyphenateTag } from '../utils/shared'; import { collectVars, eachInterpolationSegment } from '../utils/transform'; import { disableAllFeatures, enableAllFeatures, getStack, mergeFeatureSettings } from './utils'; +import type { ScriptRanges } from '../parsers/scriptRanges'; +import type { ScriptSetupRanges } from '../parsers/scriptSetupRanges'; const presetInfos = { disabledAll: disableAllFeatures({}), @@ -72,9 +74,8 @@ export function* generate( template: NonNullable, shouldGenerateScopedClasses: boolean, stylesScopedClasses: Set, - hasScriptSetupSlots: boolean, - slotsAssignName: string | undefined, - propsAssignName: string | undefined, + scriptRanges: ScriptRanges | undefined, + scriptSetupRanges: ScriptSetupRanges | undefined, codegenStack: boolean, ) { @@ -115,6 +116,9 @@ export function* generate( ? (code: Code): _CodeAndStack => ['inlineCss', code, getStack()] : (code: Code): _CodeAndStack => ['inlineCss', code, '']; const nativeTags = new Set(vueCompilerOptions.nativeTags); + const hasScriptSetupSlots = scriptSetupRanges?.slots.define; + const slotsAssignName = scriptSetupRanges?.slots.name; + const propsAssignName = scriptSetupRanges?.props.name; const slots = new Map; } = {}; + const options: { + inheritAttrs?: string; + } = {}; const definePropProposalA = vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=kevinEdition'); const definePropProposalB = vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=johnsonEdition'); @@ -79,6 +82,7 @@ export function parseScriptSetupRanges( slots, emits, expose, + options, defineProp, }; @@ -238,6 +242,19 @@ export function parseScriptSetupRanges( props.name = getNodeText(ts, parent.name, ast); } } + else if (vueCompilerOptions.macros.defineOptions.includes(callText)) { + if (node.arguments.length && ts.isObjectLiteralExpression(node.arguments[0])) { + const obj = node.arguments[0]; + ts.forEachChild(obj, node => { + if (ts.isPropertyAssignment(node) && ts.isIdentifier(node.name)) { + const name = getNodeText(ts, node.name, ast); + if (name === 'inheritAttrs') { + options.inheritAttrs = getNodeText(ts, node.initializer, ast); + } + } + }); + } + } } ts.forEachChild(node, child => { parents.push(node); diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index 8babdc34bf..52a200654a 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -179,9 +179,8 @@ function createTsx( _sfc.template, shouldGenerateScopedClasses(), stylesScopedClasses(), - hasScriptSetupSlots(), - slotsAssignName(), - propsAssignName(), + scriptRanges(), + scriptSetupRanges(), ctx.codegenStack, ); @@ -222,9 +221,6 @@ function createTsx( cssCodeStacks: inlineCssCodegenStacks, }; }); - const hasScriptSetupSlots = computed(() => !!scriptSetupRanges()?.slots.define); - const slotsAssignName = computed(() => scriptSetupRanges()?.slots.name); - const propsAssignName = computed(() => scriptSetupRanges()?.props.name); const generatedScript = computed(() => { const codes: Code[] = []; const codeStacks: StackNode[] = []; From 6ea87f55cec3a626e8cff973755ae34471ebd72e Mon Sep 17 00:00:00 2001 From: so1ve Date: Wed, 20 Mar 2024 12:46:35 +0800 Subject: [PATCH 04/16] it works --- .../language-core/lib/generators/script.ts | 29 ++++++++--- .../language-core/lib/generators/template.ts | 52 +++++++++++++------ packages/language-core/lib/plugins/vue-tsx.ts | 1 + test-workspace/tsc/vue2/tsconfig.json | 1 + .../tsc/vue3/inherit-attrs/basic.vue | 7 +++ .../tsc/vue3/inherit-attrs/child.vue | 9 ++++ .../inherit-attrs/inherit-attrs-false.vue | 15 ++++++ .../tsc/vue3/inherit-attrs/main.vue | 10 ++++ 8 files changed, 101 insertions(+), 23 deletions(-) create mode 100644 test-workspace/tsc/vue3/inherit-attrs/basic.vue create mode 100644 test-workspace/tsc/vue3/inherit-attrs/child.vue create mode 100644 test-workspace/tsc/vue3/inherit-attrs/inherit-attrs-false.vue create mode 100644 test-workspace/tsc/vue3/inherit-attrs/main.vue diff --git a/packages/language-core/lib/generators/script.ts b/packages/language-core/lib/generators/script.ts index 6ab504fe64..4903d9860d 100644 --- a/packages/language-core/lib/generators/script.ts +++ b/packages/language-core/lib/generators/script.ts @@ -30,6 +30,7 @@ export function* generate( tagNames: Set; accessedGlobalVariables: Set; hasSlot: boolean; + inheritedAttrVars: Set; } | undefined, compilerOptions: ts.CompilerOptions, vueCompilerOptions: VueCompilerOptions, @@ -163,6 +164,15 @@ export function* generate( };`; }, } satisfies HelperType as HelperType, + OmitIndexSignature: { + get name() { + this.usage = true; + return `__VLS_OmitIndexSignature`; + }, + get code() { + return `type __VLS_OmitIndexSignature = { [K in keyof T as {} extends Record ? never : K]: T[K]; };`; + } + } satisfies HelperType as HelperType, }; let generatedTemplate = false; @@ -582,7 +592,7 @@ type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; + ` props: ${helperTypes.Prettify.name}<${helperTypes.OmitKeepDiscriminatedUnion.name}> & typeof __VLS_fnPropsSlots & typeof __VLS_defaultProps,\n` + ` expose(exposed: import('${vueCompilerOptions.lib}').ShallowUnwrapRef<${scriptSetupRanges.expose.define ? 'typeof __VLS_exposed' : '{}'}>): void,\n` + ` attrs: any,\n` - + ` slots: ReturnType,\n` + + ` slots: ReturnType[0],\n` + ` emit: typeof ${scriptSetupRanges.emits.name ?? '__VLS_emit'} & typeof __VLS_modelEmitsType,\n` + ` };\n`); yield _(` })(),\n`); // __VLS_setup = (async () => { @@ -780,7 +790,7 @@ type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; yield* generateComponent(functional); yield _(`;\n`); yield _(mode === 'return' ? 'return ' : 'export default '); - yield _(`{} as ${helperTypes.WithTemplateSlots.name}>;\n`); + yield _(`{} as ${helperTypes.WithTemplateSlots.name}[0]>;\n`); } else { yield _(mode === 'return' ? 'return ' : 'export default '); @@ -811,10 +821,10 @@ type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; } yield _(`};\n`); yield _(`},\n`); - yield* generateComponentOptions(functional); + yield* generateComponentOptions(functional, true); yield _(`})`); } - function* generateComponentOptions(functional: boolean): Generator { + function* generateComponentOptions(functional: boolean, inheritAttrs: boolean): Generator { if (scriptSetup && scriptSetupRanges && !bypassDefineComponent) { const ranges = scriptSetupRanges; @@ -856,6 +866,11 @@ type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; yield _(`__VLS_propsOption_defineProp`); }); } + if (inheritAttrs && templateCodegen?.inheritedAttrVars.size) { + propsCodegens.push(function* () { + yield _(`{} as ${helperTypes.TypePropsToOption.name}<__VLS_PickNotAny<${helperTypes.OmitIndexSignature.name}[1]>, {}>>`); + }); + } if (propsCodegens.length === 1) { yield _(`props: `); @@ -916,7 +931,7 @@ type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; const templateUsageVars = [...getTemplateUsageVars()]; yield _(`// @ts-ignore\n`); yield _(`[${templateUsageVars.join(', ')}]\n`); - yield _(`return {};\n`); + yield _(`return [{}, {}] as const;\n`); yield _(`}\n`); } } @@ -959,7 +974,7 @@ type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; } yield _(`};\n`); // return { yield _(`},\n`); // setup() { - yield* generateComponentOptions(functional); + yield* generateComponentOptions(functional, false); yield _(`});\n`); // defineComponent { } else if (script) { @@ -1078,7 +1093,7 @@ type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; } } - yield _(`return ${scriptSetupRanges?.slots.name ?? '__VLS_slots'};\n`); + yield _(`return [${scriptSetupRanges?.slots.name ?? '__VLS_slots'}, __VLS_inheritedAttrs] as const;\n`); } function* generateCssClassProperty( diff --git a/packages/language-core/lib/generators/template.ts b/packages/language-core/lib/generators/template.ts index e79b384ea4..eba939f721 100644 --- a/packages/language-core/lib/generators/template.ts +++ b/packages/language-core/lib/generators/template.ts @@ -126,6 +126,7 @@ export function* generate( varName: string; nodeLoc: any; }>(); + const inheritedAttrVars = new Set(); const slotExps = new Map(); const tagOffsetsMap = collectTagOffsets(); const localVars = new Map(); @@ -138,7 +139,6 @@ export function* generate( const scopedClasses: { className: string, offset: number; }[] = []; const blockConditions: string[] = []; const hasSlotElements = new Set(); - const inheritAttrElements = new Set(); const usedComponentCtxVars = new Set(); let hasSlot = false; @@ -146,6 +146,7 @@ export function* generate( let expectErrorToken: { errors: number; } | undefined; let expectedErrorNode: CompilerDOM.CommentNode | undefined; let elementIndex = 0; + let singleRootNode: CompilerDOM.ElementNode | undefined; if (slotsAssignName) { localVars.set(slotsAssignName, 1); @@ -169,12 +170,17 @@ export function* generate( yield _ts(';\n'); } + yield _ts('var __VLS_inheritedAttrs!: {}'); + yield* generateInheritedAttrsType(); + yield _ts(';\n'); + yield* generateExtraAutoImport(); return { tagOffsetsMap, accessedGlobalVariables, hasSlot, + inheritedAttrVars, }; function collectTagOffsets() { @@ -291,6 +297,12 @@ export function* generate( yield _ts(`}`); } + function* generateInheritedAttrsType(): Generator<_CodeAndStack> { + for (const varName of inheritedAttrVars) { + yield _ts(` & typeof ${varName}`); + } + } + function* generateStyleScopedClasses(): Generator<_CodeAndStack> { yield _ts(`if (typeof __VLS_styleScopedClasses === 'object' && !Array.isArray(__VLS_styleScopedClasses)) {\n`); for (const { className, offset } of scopedClasses) { @@ -424,8 +436,13 @@ export function* generate( } } + const shouldInheritRootNodeAttrs = (scriptSetupRanges?.options.inheritAttrs ?? scriptRanges?.exportDefault?.inheritAttrsOption) !== 'false'; + if (node.type === CompilerDOM.NodeTypes.ROOT) { let prev: CompilerDOM.TemplateChildNode | undefined; + if (shouldInheritRootNodeAttrs && node.children.length === 1 && node.children[0].type === CompilerDOM.NodeTypes.ELEMENT) { + singleRootNode = node.children[0]; + } for (const childNode of node.children) { yield* generateAstNode(childNode, parentEl, prev, componentCtxVar); prev = childNode; @@ -435,7 +452,6 @@ export function* generate( else if (node.type === CompilerDOM.NodeTypes.ELEMENT) { const vForNode = getVForNode(node); const vIfNode = getVIfNode(node); - const vbindAttrsNode = getVbindAttrsNode(node); if (vForNode) { yield* generateVFor(vForNode, parentEl, componentCtxVar); } @@ -443,9 +459,6 @@ export function* generate( yield* generateVIf(vIfNode, parentEl, componentCtxVar); } else { - if (vbindAttrsNode) { - inheritAttrElements.add(node); - } yield* generateElement(node, parentEl, componentCtxVar); } } @@ -767,7 +780,7 @@ export function* generate( yield _ts(`, ...__VLS_functionalComponentArgsRest(${var_functionalComponent}));\n`); } else { - // without strictTemplates, this only for instacne type + // without strictTemplates, this only for instance type yield _ts(`const ${var_componentInstance} = ${var_functionalComponent}(`); yield _ts('{ '); yield* generateProps(node, props, 'extraReferences'); @@ -994,6 +1007,16 @@ export function* generate( yield _ts(`let ${componentEventsVar}!: __VLS_NormalizeEmits;\n`); } + const vBindAttrsNode = node.props.some( + (prop): prop is CompilerDOM.DirectiveNode => + prop.type === CompilerDOM.NodeTypes.DIRECTIVE + && prop.name === 'bind' + && prop.arg?.loc.source === 'attrs' + ); + if (vBindAttrsNode || node === singleRootNode) { + yield* generateInheritAttrs(var_functionalComponent); + } + yield _ts(`}\n`); } @@ -1763,6 +1786,13 @@ export function* generate( } } + function* generateInheritAttrs(functionalComponent: string): Generator<_CodeAndStack> { + + const varAttrs = `__VLS_${elementIndex++}`; + inheritedAttrVars.add(varAttrs); + yield _ts(`var ${varAttrs}!: Parameters[0];\n`); + } + function* generateExtraAutoImport(): Generator<_CodeAndStack> { if (!tempVars.length) { @@ -2145,13 +2175,3 @@ function getVIfNode(node: CompilerDOM.ElementNode) { } } } - -function getVbindAttrsNode(node: CompilerDOM.ElementNode) { - const bindDirective = node.props.find( - (prop): prop is CompilerDOM.DirectiveNode => - prop.type === CompilerDOM.NodeTypes.DIRECTIVE - && prop.name === 'bind' - && prop.arg?.loc.source === 'attrs' - ); - return bindDirective; -} diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index 52a200654a..668413e417 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -242,6 +242,7 @@ function createTsx( accessedGlobalVariables: _template.accessedGlobalVariables, hasSlot: _template.hasSlot, tagNames: new Set(_template.tagOffsetsMap.keys()), + inheritedAttrVars: _template.inheritedAttrVars, } : undefined, ctx.compilerOptions, ctx.vueCompilerOptions, diff --git a/test-workspace/tsc/vue2/tsconfig.json b/test-workspace/tsc/vue2/tsconfig.json index b5c07b027b..2db7677493 100644 --- a/test-workspace/tsc/vue2/tsconfig.json +++ b/test-workspace/tsc/vue2/tsconfig.json @@ -24,5 +24,6 @@ "../vue3/events", "../vue3/no-script-block", "../vue3/slots", + "../vue3/inherit-attrs" ] } diff --git a/test-workspace/tsc/vue3/inherit-attrs/basic.vue b/test-workspace/tsc/vue3/inherit-attrs/basic.vue new file mode 100644 index 0000000000..493930a9f8 --- /dev/null +++ b/test-workspace/tsc/vue3/inherit-attrs/basic.vue @@ -0,0 +1,7 @@ + + + diff --git a/test-workspace/tsc/vue3/inherit-attrs/child.vue b/test-workspace/tsc/vue3/inherit-attrs/child.vue new file mode 100644 index 0000000000..0e78448d63 --- /dev/null +++ b/test-workspace/tsc/vue3/inherit-attrs/child.vue @@ -0,0 +1,9 @@ + diff --git a/test-workspace/tsc/vue3/inherit-attrs/inherit-attrs-false.vue b/test-workspace/tsc/vue3/inherit-attrs/inherit-attrs-false.vue new file mode 100644 index 0000000000..1545e2db5c --- /dev/null +++ b/test-workspace/tsc/vue3/inherit-attrs/inherit-attrs-false.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/test-workspace/tsc/vue3/inherit-attrs/main.vue b/test-workspace/tsc/vue3/inherit-attrs/main.vue new file mode 100644 index 0000000000..3022ab4ff3 --- /dev/null +++ b/test-workspace/tsc/vue3/inherit-attrs/main.vue @@ -0,0 +1,10 @@ + + + \ No newline at end of file From cf525ca792993d455b737448243e46bd883fc56f Mon Sep 17 00:00:00 2001 From: so1ve Date: Thu, 21 Mar 2024 12:07:12 +0800 Subject: [PATCH 05/16] refactor --- packages/language-core/lib/generators/template.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/language-core/lib/generators/template.ts b/packages/language-core/lib/generators/template.ts index eba939f721..f171616bea 100644 --- a/packages/language-core/lib/generators/template.ts +++ b/packages/language-core/lib/generators/template.ts @@ -170,9 +170,7 @@ export function* generate( yield _ts(';\n'); } - yield _ts('var __VLS_inheritedAttrs!: {}'); - yield* generateInheritedAttrsType(); - yield _ts(';\n'); + yield* generateInheritedAttrs(); yield* generateExtraAutoImport(); @@ -297,10 +295,12 @@ export function* generate( yield _ts(`}`); } - function* generateInheritedAttrsType(): Generator<_CodeAndStack> { + function* generateInheritedAttrs(): Generator<_CodeAndStack> { + yield _ts('var __VLS_inheritedAttrs!: {}'); for (const varName of inheritedAttrVars) { yield _ts(` & typeof ${varName}`); } + yield _ts(';\n'); } function* generateStyleScopedClasses(): Generator<_CodeAndStack> { From eb233339093848e59a39946b428713c366c24c81 Mon Sep 17 00:00:00 2001 From: so1ve Date: Thu, 21 Mar 2024 12:21:29 +0800 Subject: [PATCH 06/16] move tests to strictTemplates --- test-workspace/tsc/vue2/tsconfig.json | 1 - .../tsc/vue2_strictTemplate/tsconfig.json | 1 + test-workspace/tsc/vue3/inherit-attrs/main.vue | 10 ---------- .../inherit-attrs/basic.vue | 2 +- .../inherit-attrs/child.vue | 2 +- .../define-options-inherit-attrs-false.vue | 11 +++++++++++ .../inherit-attrs/inherit-attrs-false-v-bind.vue | 15 +++++++++++++++ .../inherit-attrs/inherit-attrs-false.vue | 2 +- .../vue3_strictTemplate/inherit-attrs/main.vue | 16 ++++++++++++++++ 9 files changed, 46 insertions(+), 14 deletions(-) delete mode 100644 test-workspace/tsc/vue3/inherit-attrs/main.vue rename test-workspace/tsc/{vue3 => vue3_strictTemplate}/inherit-attrs/basic.vue (76%) rename test-workspace/tsc/{vue3 => vue3_strictTemplate}/inherit-attrs/child.vue (85%) create mode 100644 test-workspace/tsc/vue3_strictTemplate/inherit-attrs/define-options-inherit-attrs-false.vue create mode 100644 test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false-v-bind.vue rename test-workspace/tsc/{vue3 => vue3_strictTemplate}/inherit-attrs/inherit-attrs-false.vue (87%) create mode 100644 test-workspace/tsc/vue3_strictTemplate/inherit-attrs/main.vue diff --git a/test-workspace/tsc/vue2/tsconfig.json b/test-workspace/tsc/vue2/tsconfig.json index 2db7677493..b5c07b027b 100644 --- a/test-workspace/tsc/vue2/tsconfig.json +++ b/test-workspace/tsc/vue2/tsconfig.json @@ -24,6 +24,5 @@ "../vue3/events", "../vue3/no-script-block", "../vue3/slots", - "../vue3/inherit-attrs" ] } diff --git a/test-workspace/tsc/vue2_strictTemplate/tsconfig.json b/test-workspace/tsc/vue2_strictTemplate/tsconfig.json index 6be48aa2f6..852f905058 100644 --- a/test-workspace/tsc/vue2_strictTemplate/tsconfig.json +++ b/test-workspace/tsc/vue2_strictTemplate/tsconfig.json @@ -11,5 +11,6 @@ "exclude": [ "../vue3_strictTemplate/#3140", "../vue3_strictTemplate/intrinsicProps", + "../vue3_strictTemplate/inherit-attrs", ] } diff --git a/test-workspace/tsc/vue3/inherit-attrs/main.vue b/test-workspace/tsc/vue3/inherit-attrs/main.vue deleted file mode 100644 index 3022ab4ff3..0000000000 --- a/test-workspace/tsc/vue3/inherit-attrs/main.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - \ No newline at end of file diff --git a/test-workspace/tsc/vue3/inherit-attrs/basic.vue b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/basic.vue similarity index 76% rename from test-workspace/tsc/vue3/inherit-attrs/basic.vue rename to test-workspace/tsc/vue3_strictTemplate/inherit-attrs/basic.vue index 493930a9f8..638d60b11f 100644 --- a/test-workspace/tsc/vue3/inherit-attrs/basic.vue +++ b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/basic.vue @@ -3,5 +3,5 @@ import child from './child.vue'; diff --git a/test-workspace/tsc/vue3/inherit-attrs/child.vue b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/child.vue similarity index 85% rename from test-workspace/tsc/vue3/inherit-attrs/child.vue rename to test-workspace/tsc/vue3_strictTemplate/inherit-attrs/child.vue index 0e78448d63..b788b48f99 100644 --- a/test-workspace/tsc/vue3/inherit-attrs/child.vue +++ b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/child.vue @@ -1,6 +1,6 @@ + + diff --git a/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false-v-bind.vue b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false-v-bind.vue new file mode 100644 index 0000000000..0aad51f4fd --- /dev/null +++ b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false-v-bind.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/test-workspace/tsc/vue3/inherit-attrs/inherit-attrs-false.vue b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false.vue similarity index 87% rename from test-workspace/tsc/vue3/inherit-attrs/inherit-attrs-false.vue rename to test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false.vue index 1545e2db5c..c2ce35f349 100644 --- a/test-workspace/tsc/vue3/inherit-attrs/inherit-attrs-false.vue +++ b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false.vue @@ -11,5 +11,5 @@ import child from './child.vue'; diff --git a/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/main.vue b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/main.vue new file mode 100644 index 0000000000..5613f5f4d0 --- /dev/null +++ b/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/main.vue @@ -0,0 +1,16 @@ + + + \ No newline at end of file From 924422604675eebf8a2d18d7abe8c31d84e34430 Mon Sep 17 00:00:00 2001 From: so1ve Date: Thu, 21 Mar 2024 12:21:43 +0800 Subject: [PATCH 07/16] fix condition with v-bind="$attrs" --- packages/language-core/lib/generators/template.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/language-core/lib/generators/template.ts b/packages/language-core/lib/generators/template.ts index f171616bea..06f3720a04 100644 --- a/packages/language-core/lib/generators/template.ts +++ b/packages/language-core/lib/generators/template.ts @@ -1007,13 +1007,10 @@ export function* generate( yield _ts(`let ${componentEventsVar}!: __VLS_NormalizeEmits;\n`); } - const vBindAttrsNode = node.props.some( - (prop): prop is CompilerDOM.DirectiveNode => - prop.type === CompilerDOM.NodeTypes.DIRECTIVE - && prop.name === 'bind' - && prop.arg?.loc.source === 'attrs' - ); - if (vBindAttrsNode || node === singleRootNode) { + if ( + node.props.some(prop => prop.type === CompilerDOM.NodeTypes.DIRECTIVE && prop.name === 'bind' && prop.exp?.loc.source === '$attrs') + || node === singleRootNode + ) { yield* generateInheritAttrs(var_functionalComponent); } From 1c5f8133c494179fed5a01dbe76c9478209fb8d9 Mon Sep 17 00:00:00 2001 From: so1ve Date: Thu, 21 Mar 2024 12:25:30 +0800 Subject: [PATCH 08/16] add an experimental option --- packages/language-core/lib/generators/template.ts | 6 ++++-- packages/language-core/lib/types.ts | 1 + packages/language-core/lib/utils/ts.ts | 1 + packages/language-core/schemas/vue-tsconfig.schema.json | 5 +++++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/language-core/lib/generators/template.ts b/packages/language-core/lib/generators/template.ts index 06f3720a04..7c00bd5d4c 100644 --- a/packages/language-core/lib/generators/template.ts +++ b/packages/language-core/lib/generators/template.ts @@ -297,8 +297,10 @@ export function* generate( function* generateInheritedAttrs(): Generator<_CodeAndStack> { yield _ts('var __VLS_inheritedAttrs!: {}'); - for (const varName of inheritedAttrVars) { - yield _ts(` & typeof ${varName}`); + if (vueCompilerOptions.experimentalInheritAttrs) { + for (const varName of inheritedAttrVars) { + yield _ts(` & typeof ${varName}`); + } } yield _ts(';\n'); } diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index 42900598a7..4a8363bbb5 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -55,6 +55,7 @@ export interface VueCompilerOptions { experimentalResolveStyleCssClasses: 'scoped' | 'always' | 'never'; experimentalModelPropName: Record | Record[]>>; experimentalUseElementAccessInTemplate: boolean; + experimentalInheritAttrs: boolean; } export const pluginVersion = 2; diff --git a/packages/language-core/lib/utils/ts.ts b/packages/language-core/lib/utils/ts.ts index 0766fc84d1..5a654bab4c 100644 --- a/packages/language-core/lib/utils/ts.ts +++ b/packages/language-core/lib/utils/ts.ts @@ -279,5 +279,6 @@ export function resolveVueCompilerOptions(vueOptions: Partial Date: Thu, 21 Mar 2024 12:28:29 +0800 Subject: [PATCH 09/16] rename param --- packages/language-core/lib/generators/script.ts | 4 ++-- packages/language-core/lib/generators/template.ts | 2 +- packages/language-core/lib/plugins/vue-tsx.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/language-core/lib/generators/script.ts b/packages/language-core/lib/generators/script.ts index bfb0d66b79..70ac20d464 100644 --- a/packages/language-core/lib/generators/script.ts +++ b/packages/language-core/lib/generators/script.ts @@ -30,7 +30,7 @@ export function* generate( tagNames: Set; accessedGlobalVariables: Set; hasSlot: boolean; - inheritedAttrVars: Set; + hasInheritedAttrs: boolean; } | undefined, compilerOptions: ts.CompilerOptions, vueCompilerOptions: VueCompilerOptions, @@ -872,7 +872,7 @@ type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; yield _(`__VLS_propsOption_defineProp`); }); } - if (inheritAttrs && templateCodegen?.inheritedAttrVars.size) { + if (inheritAttrs && templateCodegen?.hasInheritedAttrs) { propsCodegens.push(function* () { yield _(`{} as ${helperTypes.TypePropsToOption.name}<__VLS_PickNotAny<${helperTypes.OmitIndexSignature.name}[1]>, {}>>`); }); diff --git a/packages/language-core/lib/generators/template.ts b/packages/language-core/lib/generators/template.ts index 7c00bd5d4c..d8a918be90 100644 --- a/packages/language-core/lib/generators/template.ts +++ b/packages/language-core/lib/generators/template.ts @@ -178,7 +178,7 @@ export function* generate( tagOffsetsMap, accessedGlobalVariables, hasSlot, - inheritedAttrVars, + hasInheritedAttrs: inheritedAttrVars.size > 0, }; function collectTagOffsets() { diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index 668413e417..90d2f13a64 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -242,7 +242,7 @@ function createTsx( accessedGlobalVariables: _template.accessedGlobalVariables, hasSlot: _template.hasSlot, tagNames: new Set(_template.tagOffsetsMap.keys()), - inheritedAttrVars: _template.inheritedAttrVars, + hasInheritedAttrs: _template.hasInheritedAttrs, } : undefined, ctx.compilerOptions, ctx.vueCompilerOptions, From a2657775afab3feaa6bff9d9ed4f11c52a8845f0 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 04:12:43 +0800 Subject: [PATCH 10/16] asdf --- .../lib/codegen/script/component.ts | 30 +++++++++--- .../lib/codegen/script/context.ts | 9 ++++ .../lib/codegen/script/internalComponent.ts | 2 +- .../lib/codegen/script/scriptSetup.ts | 4 +- .../lib/codegen/script/template.ts | 5 +- .../lib/codegen/template/context.ts | 2 + .../lib/codegen/template/element.ts | 11 ++++- .../lib/codegen/template/index.ts | 13 ++++++ .../lib/codegen/template/templateChild.ts | 5 ++ .../lib/parsers/scriptSetupRanges.ts | 1 - packages/language-core/lib/plugins/vue-tsx.ts | 5 ++ .../tsc/tests/__snapshots__/dts.spec.ts.snap | 46 +++++++++++-------- .../vue2_strictTemplate/tsconfig.json | 2 +- .../inheritAttrs}/basic.vue | 0 .../inheritAttrs}/child.vue | 0 .../define-options-inherit-attrs-false.vue | 0 .../inherit-attrs-false-v-bind.vue | 0 .../inheritAttrs}/inherit-attrs-false.vue | 0 .../inheritAttrs}/main.vue | 8 ++-- .../vue3_strictTemplate/tsconfig.json | 3 +- 20 files changed, 107 insertions(+), 39 deletions(-) rename test-workspace/tsc/{vue3_strictTemplate/inherit-attrs => passedFixtures/vue3_strictTemplate/inheritAttrs}/basic.vue (100%) rename test-workspace/tsc/{vue3_strictTemplate/inherit-attrs => passedFixtures/vue3_strictTemplate/inheritAttrs}/child.vue (100%) rename test-workspace/tsc/{vue3_strictTemplate/inherit-attrs => passedFixtures/vue3_strictTemplate/inheritAttrs}/define-options-inherit-attrs-false.vue (100%) rename test-workspace/tsc/{vue3_strictTemplate/inherit-attrs => passedFixtures/vue3_strictTemplate/inheritAttrs}/inherit-attrs-false-v-bind.vue (100%) rename test-workspace/tsc/{vue3_strictTemplate/inherit-attrs => passedFixtures/vue3_strictTemplate/inheritAttrs}/inherit-attrs-false.vue (100%) rename test-workspace/tsc/{vue3_strictTemplate/inherit-attrs => passedFixtures/vue3_strictTemplate/inheritAttrs}/main.vue (50%) diff --git a/packages/language-core/lib/codegen/script/component.ts b/packages/language-core/lib/codegen/script/component.ts index db9305102c..74722a7156 100644 --- a/packages/language-core/lib/codegen/script/component.ts +++ b/packages/language-core/lib/codegen/script/component.ts @@ -31,7 +31,7 @@ export function* generateComponent( yield `}${endOfLine}`; yield `},${newLine}`; if (!ctx.bypassDefineComponent) { - yield* generateScriptSetupOptions(options, ctx, scriptSetup, scriptSetupRanges); + yield* generateScriptSetupOptions(options, ctx, scriptSetup, scriptSetupRanges, true); } if (options.sfc.script && options.scriptRanges) { yield* generateScriptOptions(options.sfc.script, options.scriptRanges); @@ -65,9 +65,10 @@ export function* generateScriptSetupOptions( options: ScriptCodegenOptions, ctx: ScriptCodegenContext, scriptSetup: NonNullable, - scriptSetupRanges: ScriptSetupRanges + scriptSetupRanges: ScriptSetupRanges, + inheritAttrs: boolean ): Generator { - yield* generatePropsOption(options, ctx, scriptSetup, scriptSetupRanges); + yield* generatePropsOption(options, ctx, scriptSetup, scriptSetupRanges, inheritAttrs); yield* generateEmitsOption(options, scriptSetup, scriptSetupRanges); } @@ -75,14 +76,31 @@ export function* generatePropsOption( options: ScriptCodegenOptions, ctx: ScriptCodegenContext, scriptSetup: NonNullable, - scriptSetupRanges: ScriptSetupRanges + scriptSetupRanges: ScriptSetupRanges, + inheritAttrs: boolean ) { - if (options.vueCompilerOptions.target >= 3.5 && ctx.generatedPropsType) { - yield `__typeProps: {} as __VLS_PublicProps,${newLine}`; + + if (options.vueCompilerOptions.target >= 3.5) { + const types = []; + if (inheritAttrs && options.templateCodegen?.inheritedAttrVars.size) { + types.push('typeof __VLS_template>[1]'); + } + if (ctx.generatedPropsType) { + types.push('{} as __VLS_PublicProps'); + } + if (types.length) { + yield `__typeProps: ${types.join(' & ')},${newLine}`; + } } if (options.vueCompilerOptions.target < 3.5 || !ctx.generatedPropsType || scriptSetupRanges.props.withDefaults) { const codegens: (() => Generator)[] = []; + if (inheritAttrs && options.templateCodegen?.inheritedAttrVars.size) { + codegens.push(function* () { + yield `{} as ${ctx.helperTypes.TypePropsToOption.name}<__VLS_PickNotAny<${ctx.helperTypes.OmitIndexSignature.name}[1]>, {}>>`; + }); + } + if (ctx.generatedPropsType) { codegens.push(function* () { yield `{} as `; diff --git a/packages/language-core/lib/codegen/script/context.ts b/packages/language-core/lib/codegen/script/context.ts index 968ba61e33..8bb0ad2176 100644 --- a/packages/language-core/lib/codegen/script/context.ts +++ b/packages/language-core/lib/codegen/script/context.ts @@ -102,6 +102,15 @@ export function createScriptCodegenContext(options: ScriptCodegenOptions) { };`; }, } satisfies HelperType as HelperType, + OmitIndexSignature: { + get name() { + this.used = true; + return `__VLS_OmitIndexSignature`; + }, + get code() { + return `type __VLS_OmitIndexSignature = { [K in keyof T as {} extends Record ? never : K]: T[K]; };`; + } + } satisfies HelperType as HelperType, }; const inlayHints: InlayHintInfo[] = []; diff --git a/packages/language-core/lib/codegen/script/internalComponent.ts b/packages/language-core/lib/codegen/script/internalComponent.ts index 207cd8daa9..458adaf8b8 100644 --- a/packages/language-core/lib/codegen/script/internalComponent.ts +++ b/packages/language-core/lib/codegen/script/internalComponent.ts @@ -49,7 +49,7 @@ export function* generateInternalComponent( yield `}${endOfLine}`; // return { yield `},${newLine}`; // setup() { if (options.sfc.scriptSetup && options.scriptSetupRanges && !ctx.bypassDefineComponent) { - yield* generateScriptSetupOptions(options, ctx, options.sfc.scriptSetup, options.scriptSetupRanges); + yield* generateScriptSetupOptions(options, ctx, options.sfc.scriptSetup, options.scriptSetupRanges, false); } if (options.sfc.script && options.scriptRanges) { yield* generateScriptOptions(options.sfc.script, options.scriptRanges); diff --git a/packages/language-core/lib/codegen/script/scriptSetup.ts b/packages/language-core/lib/codegen/script/scriptSetup.ts index 36cdb4aa15..131d6a497e 100644 --- a/packages/language-core/lib/codegen/script/scriptSetup.ts +++ b/packages/language-core/lib/codegen/script/scriptSetup.ts @@ -67,7 +67,7 @@ export function* generateScriptSetup( + ` props: ${ctx.helperTypes.Prettify.name} & __VLS_BuiltInPublicProps,${newLine}` + ` expose(exposed: import('${options.vueCompilerOptions.lib}').ShallowUnwrapRef<${scriptSetupRanges.expose.define ? 'typeof __VLS_exposed' : '{}'}>): void,${newLine}` + ` attrs: any,${newLine}` - + ` slots: ReturnType,${newLine}` + + ` slots: ReturnType[0],${newLine}` + ` emit: ${emitTypes.join(' & ')},${newLine}` + ` }${endOfLine}`; yield ` })(),${newLine}`; // __VLS_setup = (async () => { @@ -250,7 +250,7 @@ function* generateSetupFunction( yield* generateComponent(options, ctx, scriptSetup, scriptSetupRanges); yield endOfLine; yield `${syntax} `; - yield `{} as ${ctx.helperTypes.WithTemplateSlots.name}>${endOfLine}`; + yield `{} as ${ctx.helperTypes.WithTemplateSlots.name}[0]>${endOfLine}`; } else { yield `${syntax} `; diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index 8d0dbc85a3..f273a6ddac 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -35,7 +35,7 @@ export function* generateTemplate( const templateUsageVars = [...getTemplateUsageVars(options, ctx)]; yield `// @ts-ignore${newLine}`; yield `[${templateUsageVars.join(', ')}]${newLine}`; - yield `return {}${endOfLine}`; + yield `return [{}, {}] as const${endOfLine}`; yield `}${newLine}`; } } @@ -154,10 +154,11 @@ function* generateTemplateContext( yield `// no template${newLine}`; if (!options.scriptSetupRanges?.slots.define) { yield `const __VLS_slots = {}${endOfLine}`; + yield `const __VLS_inheritedAttrs = {}${endOfLine}`; } } - yield `return ${options.scriptSetupRanges?.slots.name ?? '__VLS_slots'}${endOfLine}`; + yield `return [${options.scriptSetupRanges?.slots.name ?? '__VLS_slots'}, __VLS_inheritedAttrs] as const${endOfLine}`; } function* generateCssClassProperty( diff --git a/packages/language-core/lib/codegen/template/context.ts b/packages/language-core/lib/codegen/template/context.ts index 54b3c5ef03..10d1a7addd 100644 --- a/packages/language-core/lib/codegen/template/context.ts +++ b/packages/language-core/lib/codegen/template/context.ts @@ -125,6 +125,8 @@ export function createTemplateCodegenContext(scriptSetupBindingNames: TemplateCo emptyClassOffsets, inlayHints, hasSlot: false, + inheritedAttrVars: new Set(), + singleRootNode: undefined as CompilerDOM.ElementNode | undefined, accessExternalVariable(name: string, offset?: number) { let arr = accessExternalVariables.get(name); if (!arr) { diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index 73fa83d5f6..c53338f462 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -224,7 +224,7 @@ export function* generateComponent( yield `, ...__VLS_functionalComponentArgsRest(${var_functionalComponent}))${endOfLine}`; } else { - // without strictTemplates, this only for instacne type + // without strictTemplates, this only for instance type yield `const ${var_componentInstance} = ${var_functionalComponent}({`; yield* generateElementProps(options, ctx, node, props, false); yield `}, ...__VLS_functionalComponentArgsRest(${var_functionalComponent}))${endOfLine}`; @@ -271,6 +271,15 @@ export function* generateComponent( yield `let ${var_componentEvents}!: __VLS_NormalizeEmits${endOfLine}`; } + if ( + node.props.some(prop => prop.type === CompilerDOM.NodeTypes.DIRECTIVE && prop.name === 'bind' && prop.exp?.loc.source === '$attrs') + || node === ctx.singleRootNode + ) { + const varAttrs = ctx.getInternalVariable(); + ctx.inheritedAttrVars.add(varAttrs); + yield `var ${varAttrs}!: Parameters[0];\n`; + } + const slotDir = node.props.find(p => p.type === CompilerDOM.NodeTypes.DIRECTIVE && p.name === 'slot') as CompilerDOM.DirectiveNode; if (slotDir) { yield* generateComponentSlot(options, ctx, node, slotDir, currentComponent, componentCtxVar); diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index c78716c3b3..05732e5681 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -17,6 +17,7 @@ export interface TemplateCodegenOptions { hasDefineSlots?: boolean; slotsAssignName?: string; propsAssignName?: string; + inheritAttrs: boolean; } export function* generateTemplate(options: TemplateCodegenOptions): Generator { @@ -43,6 +44,8 @@ export function* generateTemplate(options: TemplateCodegenOptions): Generator { + yield 'var __VLS_inheritedAttrs!: {}'; + if (options.vueCompilerOptions.experimentalInheritAttrs) { + for (const varName of ctx.inheritedAttrVars) { + yield ` & typeof ${varName}`; + } + } + yield endOfLine; + } + function* generateStyleScopedClasses(): Generator { yield `if (typeof __VLS_styleScopedClasses === 'object' && !Array.isArray(__VLS_styleScopedClasses)) {${newLine}`; for (const offset of ctx.emptyClassOffsets) { diff --git a/packages/language-core/lib/codegen/template/templateChild.ts b/packages/language-core/lib/codegen/template/templateChild.ts index b03f366930..999c0d4709 100644 --- a/packages/language-core/lib/codegen/template/templateChild.ts +++ b/packages/language-core/lib/codegen/template/templateChild.ts @@ -47,8 +47,13 @@ export function* generateTemplateChild( } } + const shouldInheritRootNodeAttrs = options.inheritAttrs; + if (node.type === CompilerDOM.NodeTypes.ROOT) { let prev: CompilerDOM.TemplateChildNode | undefined; + if (shouldInheritRootNodeAttrs && node.children.length === 1 && node.children[0].type === CompilerDOM.NodeTypes.ELEMENT) { + ctx.singleRootNode = node.children[0]; + } for (const childNode of node.children) { yield* generateTemplateChild(options, ctx, childNode, currentComponent, prev, componentCtxVar); prev = childNode; diff --git a/packages/language-core/lib/parsers/scriptSetupRanges.ts b/packages/language-core/lib/parsers/scriptSetupRanges.ts index 3cd6a125b0..a696920e49 100644 --- a/packages/language-core/lib/parsers/scriptSetupRanges.ts +++ b/packages/language-core/lib/parsers/scriptSetupRanges.ts @@ -104,7 +104,6 @@ export function parseScriptSetupRanges( expose, options, defineProp, - options, }; function _getStartEnd(node: ts.Node) { diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index fcbb3a4208..46877d2964 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -97,6 +97,7 @@ function createTsx( hasDefineSlots: hasDefineSlots(), slotsAssignName: slotsAssignName(), propsAssignName: propsAssignName(), + inheritAttrs: inheritAttrs(), }); let current = codegen.next(); @@ -135,6 +136,10 @@ function createTsx( }); const slotsAssignName = computed(() => scriptSetupRanges()?.slots.name); const propsAssignName = computed(() => scriptSetupRanges()?.props.name); + const inheritAttrs = computed(() => { + const value = scriptSetupRanges()?.options.inheritAttrs ?? scriptRanges()?.exportDefault?.inheritAttrsOption; + return value === 'false'; + }); const generatedScript = computed(() => { const codes: Code[] = []; const linkedCodeMappings: Mapping[] = []; diff --git a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap index cb65071221..c6fb1be54d 100644 --- a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap +++ b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap @@ -11,11 +11,11 @@ declare const _default: (__VLS_props: NonNullable & (import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps); expose(exposed: import("vue").ShallowUnwrapRef<{}>): void; attrs: any; - slots: ReturnType<() => { + slots: ReturnType<() => readonly [{ default?(_: { row: Row; }): any; - }>; + }, {}]>[0]; emit: {}; }>) => import("vue").VNode Input: events/component-generic.vue, Output: events/compo }, never>, "onFoo"> & {}> & (import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps); expose(exposed: import("vue").ShallowUnwrapRef<{}>): void; attrs: any; - slots: ReturnType<() => {}>; + slots: ReturnType<() => readonly [{}, {}]>[0]; emit: ((evt: "foo", value: string) => void) & {}; }>) => import("vue").VNode Input: generic/component.vue, Output: generic/component.v baz: number; }>): void; attrs: any; - slots: ReturnType<() => Readonly<{ + slots: ReturnType<() => readonly [Readonly<{ default?(data: { foo: number; }): any; @@ -116,7 +116,7 @@ exports[`vue-tsc-dts > Input: generic/component.vue, Output: generic/component.v default?(data: { foo: number; }): any; - }>; + }, any]>[0]; emit: ((e: "bar", data: number) => void) & ((evt: "update:title", title: string) => void); }>) => import("vue").VNode Input: generic/custom-extension-component.cext, Output: g baz: number; }>): void; attrs: any; - slots: ReturnType<() => Readonly<{ + slots: ReturnType<() => readonly [Readonly<{ default?(data: { foo: number; }): any; @@ -155,7 +155,7 @@ exports[`vue-tsc-dts > Input: generic/custom-extension-component.cext, Output: g default?(data: { foo: number; }): any; - }>; + }, any]>[0]; emit: ((e: "bar", data: number) => void) & ((evt: "update:title", title: string) => void); }>) => import("vue").VNode = { `; exports[`vue-tsc-dts > Input: generic/main.vue, Output: generic/main.vue.d.ts 1`] = ` -"declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; +"declare const _default: import("vue").DefineComponent>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, readonly string[] | Readonly>>>, { + readonly [x: number]: string; +} | {}, {}>; export default _default; " `; @@ -634,7 +640,7 @@ export {}; `; exports[`vue-tsc-dts > Input: template-slots/component.vue, Output: template-slots/component.vue.d.ts 1`] = ` -"declare function __VLS_template(): { +"declare function __VLS_template(): readonly [{ "no-bind"?(_: {}): any; default?(_: { num: number; @@ -646,9 +652,9 @@ exports[`vue-tsc-dts > Input: template-slots/component.vue, Output: template-slo num: number; str: string; }): any; -}; +}, {}]; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; -declare const _default: __VLS_WithTemplateSlots>; +declare const _default: __VLS_WithTemplateSlots[0]>; export default _default; type __VLS_WithTemplateSlots = T & { new (): { @@ -660,7 +666,7 @@ type __VLS_WithTemplateSlots = T & { exports[`vue-tsc-dts > Input: template-slots/component-define-slots.vue, Output: template-slots/component-define-slots.vue.d.ts 1`] = ` "import { VNode } from 'vue'; -declare function __VLS_template(): Readonly<{ +declare function __VLS_template(): readonly [Readonly<{ default: (props: { num: number; }) => VNode[]; @@ -684,9 +690,9 @@ declare function __VLS_template(): Readonly<{ str: string; }) => VNode[]; 'no-bind': () => VNode[]; -}; +}, {}]; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; -declare const _default: __VLS_WithTemplateSlots>; +declare const _default: __VLS_WithTemplateSlots[0]>; export default _default; type __VLS_WithTemplateSlots = T & { new (): { @@ -697,7 +703,7 @@ type __VLS_WithTemplateSlots = T & { `; exports[`vue-tsc-dts > Input: template-slots/component-destructuring.vue, Output: template-slots/component-destructuring.vue.d.ts 1`] = ` -"declare function __VLS_template(): Readonly<{ +"declare function __VLS_template(): readonly [Readonly<{ bottom: (props: { num: number; }) => any[]; @@ -705,9 +711,9 @@ exports[`vue-tsc-dts > Input: template-slots/component-destructuring.vue, Output bottom: (props: { num: number; }) => any[]; -}; +}, {}]; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; -declare const _default: __VLS_WithTemplateSlots>; +declare const _default: __VLS_WithTemplateSlots[0]>; export default _default; type __VLS_WithTemplateSlots = T & { new (): { @@ -718,7 +724,7 @@ type __VLS_WithTemplateSlots = T & { `; exports[`vue-tsc-dts > Input: template-slots/component-no-script.vue, Output: template-slots/component-no-script.vue.d.ts 1`] = ` -"declare function __VLS_template(): { +"declare function __VLS_template(): readonly [{ "no-bind"?(_: {}): any; default?(_: { num: number; @@ -730,9 +736,9 @@ exports[`vue-tsc-dts > Input: template-slots/component-no-script.vue, Output: te num: number; str: string; }): any; -}; +}, {}]; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; -declare const _default: __VLS_WithTemplateSlots>; +declare const _default: __VLS_WithTemplateSlots[0]>; export default _default; type __VLS_WithTemplateSlots = T & { new (): { diff --git a/test-workspace/tsc/passedFixtures/vue2_strictTemplate/tsconfig.json b/test-workspace/tsc/passedFixtures/vue2_strictTemplate/tsconfig.json index e1c5e8017f..2011fc02db 100644 --- a/test-workspace/tsc/passedFixtures/vue2_strictTemplate/tsconfig.json +++ b/test-workspace/tsc/passedFixtures/vue2_strictTemplate/tsconfig.json @@ -12,6 +12,6 @@ "../vue3_strictTemplate/#3140", "../vue3_strictTemplate/#3718", "../vue3_strictTemplate/intrinsicProps", - "../vue3_strictTemplate/inherit-attrs", + "../vue3_strictTemplate/inheritAttrs", ] } diff --git a/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/basic.vue b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/basic.vue similarity index 100% rename from test-workspace/tsc/vue3_strictTemplate/inherit-attrs/basic.vue rename to test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/basic.vue diff --git a/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/child.vue b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/child.vue similarity index 100% rename from test-workspace/tsc/vue3_strictTemplate/inherit-attrs/child.vue rename to test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/child.vue diff --git a/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/define-options-inherit-attrs-false.vue b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/define-options-inherit-attrs-false.vue similarity index 100% rename from test-workspace/tsc/vue3_strictTemplate/inherit-attrs/define-options-inherit-attrs-false.vue rename to test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/define-options-inherit-attrs-false.vue diff --git a/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false-v-bind.vue b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/inherit-attrs-false-v-bind.vue similarity index 100% rename from test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false-v-bind.vue rename to test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/inherit-attrs-false-v-bind.vue diff --git a/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false.vue b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/inherit-attrs-false.vue similarity index 100% rename from test-workspace/tsc/vue3_strictTemplate/inherit-attrs/inherit-attrs-false.vue rename to test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/inherit-attrs-false.vue diff --git a/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/main.vue b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/main.vue similarity index 50% rename from test-workspace/tsc/vue3_strictTemplate/inherit-attrs/main.vue rename to test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/main.vue index 5613f5f4d0..b9a545507a 100644 --- a/test-workspace/tsc/vue3_strictTemplate/inherit-attrs/main.vue +++ b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/inheritAttrs/main.vue @@ -1,9 +1,9 @@ \ No newline at end of file + diff --git a/test-workspace/tsc/passedFixtures/vue3_strictTemplate/tsconfig.json b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/tsconfig.json index 61ae6aab5d..9b5784a058 100644 --- a/test-workspace/tsc/passedFixtures/vue3_strictTemplate/tsconfig.json +++ b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../../../tsconfig.base.json", "vueCompilerOptions": { - "strictTemplates": true + "strictTemplates": true, + "experimentalInheritAttrs": true, }, "include": [ "**/*" ], } From 3127299d09d6ced52cefd76906cf0d9adf2b8d5b Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 04:13:58 +0800 Subject: [PATCH 11/16] Update dts.spec.ts.snap --- packages/tsc/tests/__snapshots__/dts.spec.ts.snap | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap index c6fb1be54d..7c288f3be0 100644 --- a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap +++ b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap @@ -170,13 +170,7 @@ type __VLS_Prettify = { `; exports[`vue-tsc-dts > Input: generic/main.vue, Output: generic/main.vue.d.ts 1`] = ` -"declare const _default: import("vue").DefineComponent>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, readonly string[] | Readonly>>>, { - readonly [x: number]: string; -} | {}, {}>; +"declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; export default _default; " `; From 2bfd49f0b77207e185a304aa62089d79736ee6f2 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 04:15:16 +0800 Subject: [PATCH 12/16] Update vue-tsx.ts --- packages/language-core/lib/plugins/vue-tsx.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index 46877d2964..42e59217e5 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -138,7 +138,7 @@ function createTsx( const propsAssignName = computed(() => scriptSetupRanges()?.props.name); const inheritAttrs = computed(() => { const value = scriptSetupRanges()?.options.inheritAttrs ?? scriptRanges()?.exportDefault?.inheritAttrsOption; - return value === 'false'; + return value !== 'false'; }); const generatedScript = computed(() => { const codes: Code[] = []; From 5cc7cc530b236547d2364d002203cae32731db5f Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 04:15:58 +0800 Subject: [PATCH 13/16] Update dts.spec.ts.snap --- packages/tsc/tests/__snapshots__/dts.spec.ts.snap | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap index 7c288f3be0..c6fb1be54d 100644 --- a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap +++ b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap @@ -170,7 +170,13 @@ type __VLS_Prettify = { `; exports[`vue-tsc-dts > Input: generic/main.vue, Output: generic/main.vue.d.ts 1`] = ` -"declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; +"declare const _default: import("vue").DefineComponent>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, readonly string[] | Readonly>>>, { + readonly [x: number]: string; +} | {}, {}>; export default _default; " `; From c734ee9646cbe348040ce5be87ea3d61d88a9458 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 04:24:28 +0800 Subject: [PATCH 14/16] Remove experimentalInheritAttrs --- .../lib/codegen/template/index.ts | 6 ++-- packages/language-core/lib/types.ts | 1 - packages/language-core/lib/utils/ts.ts | 1 - .../schemas/vue-tsconfig.schema.json | 5 ---- .../tsc/tests/__snapshots__/dts.spec.ts.snap | 30 ++++++++++++++----- .../vue3_strictTemplate/tsconfig.json | 1 - 6 files changed, 25 insertions(+), 19 deletions(-) diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index 05732e5681..5c5665e168 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -83,10 +83,8 @@ export function* generateTemplate(options: TemplateCodegenOptions): Generator { yield 'var __VLS_inheritedAttrs!: {}'; - if (options.vueCompilerOptions.experimentalInheritAttrs) { - for (const varName of ctx.inheritedAttrVars) { - yield ` & typeof ${varName}`; - } + for (const varName of ctx.inheritedAttrVars) { + yield ` & typeof ${varName}`; } yield endOfLine; } diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index 70b1b44b8f..ac0e9faca8 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -48,7 +48,6 @@ export interface VueCompilerOptions { experimentalDefinePropProposal: 'kevinEdition' | 'johnsonEdition' | false; experimentalResolveStyleCssClasses: 'scoped' | 'always' | 'never'; experimentalModelPropName: Record | Record[]>>; - experimentalInheritAttrs: boolean; } export const validVersions = [2, 2.1] as const; diff --git a/packages/language-core/lib/utils/ts.ts b/packages/language-core/lib/utils/ts.ts index 94214a9509..0c793d3645 100644 --- a/packages/language-core/lib/utils/ts.ts +++ b/packages/language-core/lib/utils/ts.ts @@ -249,6 +249,5 @@ export function resolveVueCompilerOptions(vueOptions: Partial = { `; exports[`vue-tsc-dts > Input: generic/main.vue, Output: generic/main.vue.d.ts 1`] = ` -"declare const _default: import("vue").DefineComponent>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, readonly string[] | Readonly>>>, { - readonly [x: number]: string; -} | {}, {}>; +"declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_OmitIndexSignature<{ + "onUpdate:title"?: (title: string) => any; + onBar?: (data: number) => any; + title?: string; + foo: number; +} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps>>, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly any; + onBar?: (data: number) => any; + title?: string; + foo: number; +} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps>>>>, {}, {}>; export default _default; +type __VLS_NonUndefinedable = T extends undefined ? never : T; +type __VLS_TypePropsToOption = { + [K in keyof T]-?: {} extends Pick ? { + type: import('vue').PropType<__VLS_NonUndefinedable>; + } : { + type: import('vue').PropType; + required: true; + }; +}; +type __VLS_OmitIndexSignature = { + [K in keyof T as {} extends Record ? never : K]: T[K]; +}; " `; diff --git a/test-workspace/tsc/passedFixtures/vue3_strictTemplate/tsconfig.json b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/tsconfig.json index 9b5784a058..13bbce6e2e 100644 --- a/test-workspace/tsc/passedFixtures/vue3_strictTemplate/tsconfig.json +++ b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../../tsconfig.base.json", "vueCompilerOptions": { "strictTemplates": true, - "experimentalInheritAttrs": true, }, "include": [ "**/*" ], } From 5a89862390bdd9df02ef5a5f63e972ed0bb17f1c Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 04:31:55 +0800 Subject: [PATCH 15/16] Fixes #4699 --- .../lib/codegen/template/element.ts | 7 ++++ .../vue3_strictTemplate/#4699/HelloWorld.vue | 42 +++++++++++++++++++ .../vue3_strictTemplate/#4699/main.vue | 9 ++++ 3 files changed, 58 insertions(+) create mode 100644 test-workspace/tsc/passedFixtures/vue3_strictTemplate/#4699/HelloWorld.vue create mode 100644 test-workspace/tsc/passedFixtures/vue3_strictTemplate/#4699/main.vue diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index c53338f462..91af8b4bdb 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -358,6 +358,13 @@ export function* generateElement( else { yield* generateElementChildren(options, ctx, node, currentComponent, componentCtxVar); } + + if ( + node.props.some(prop => prop.type === CompilerDOM.NodeTypes.DIRECTIVE && prop.name === 'bind' && prop.exp?.loc.source === '$attrs') + || node === ctx.singleRootNode + ) { + ctx.inheritedAttrVars.add(`__VLS_intrinsicElements.${node.tag}`); + } } function* generateVScope( diff --git a/test-workspace/tsc/passedFixtures/vue3_strictTemplate/#4699/HelloWorld.vue b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/#4699/HelloWorld.vue new file mode 100644 index 0000000000..b91a472477 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/#4699/HelloWorld.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/test-workspace/tsc/passedFixtures/vue3_strictTemplate/#4699/main.vue b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/#4699/main.vue new file mode 100644 index 0000000000..724454b611 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3_strictTemplate/#4699/main.vue @@ -0,0 +1,9 @@ + + + From 938208ea9c7af6506963efab45174bd7cac13052 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 04:34:12 +0800 Subject: [PATCH 16/16] Update dts.spec.ts.snap --- packages/tsc/tests/__snapshots__/dts.spec.ts.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap index fcdce39034..22142cecc0 100644 --- a/packages/tsc/tests/__snapshots__/dts.spec.ts.snap +++ b/packages/tsc/tests/__snapshots__/dts.spec.ts.snap @@ -15,7 +15,7 @@ declare const _default: (__VLS_props: NonNullable[0]; + }, import("vue").HTMLAttributes & import("vue").ReservedProps]>[0]; emit: {}; }>) => import("vue").VNode