diff --git a/packages/language-core/lib/codegen/script/component.ts b/packages/language-core/lib/codegen/script/component.ts index 74722a7156..4d5bbe4215 100644 --- a/packages/language-core/lib/codegen/script/component.ts +++ b/packages/language-core/lib/codegen/script/component.ts @@ -36,6 +36,9 @@ export function* generateComponent( if (options.sfc.script && options.scriptRanges) { yield* generateScriptOptions(options.sfc.script, options.scriptRanges); } + if (options.vueCompilerOptions.target >= 3.5 && scriptSetupRanges.templateRefs.length) { + yield `__typeRefs: {} as __VLS_Refs,${newLine}`; + } yield `})`; } @@ -83,10 +86,10 @@ export function* generatePropsOption( if (options.vueCompilerOptions.target >= 3.5) { const types = []; if (inheritAttrs && options.templateCodegen?.inheritedAttrVars.size) { - types.push('typeof __VLS_template>[1]'); + types.push(`ReturnType['attrs']`); } if (ctx.generatedPropsType) { - types.push('{} as __VLS_PublicProps'); + types.push(`{} as __VLS_PublicProps`); } if (types.length) { yield `__typeProps: ${types.join(' & ')},${newLine}`; @@ -97,7 +100,7 @@ export function* generatePropsOption( if (inheritAttrs && options.templateCodegen?.inheritedAttrVars.size) { codegens.push(function* () { - yield `{} as ${ctx.helperTypes.TypePropsToOption.name}<__VLS_PickNotAny<${ctx.helperTypes.OmitIndexSignature.name}[1]>, {}>>`; + yield `{} as ${ctx.helperTypes.TypePropsToOption.name}<__VLS_PickNotAny<${ctx.helperTypes.OmitIndexSignature.name}['attrs']>, {}>>`; }); } diff --git a/packages/language-core/lib/codegen/script/globalTypes.ts b/packages/language-core/lib/codegen/script/globalTypes.ts index 923d971aa9..987dfba52c 100644 --- a/packages/language-core/lib/codegen/script/globalTypes.ts +++ b/packages/language-core/lib/codegen/script/globalTypes.ts @@ -129,6 +129,13 @@ declare global { > >; type __VLS_PrettifyGlobal = { [K in keyof T]: T[K]; } & {}; + type __VLS_PickRefsExpose = T extends object + ? { [K in keyof T]: (T[K] extends any[] + ? Parameters[0][] + : T[K] extends { expose?: (exposed: infer E) => void } + ? E + : T[K]) | null } + : never; } export const __VLS_globalTypesEnd = {}; `; diff --git a/packages/language-core/lib/codegen/script/internalComponent.ts b/packages/language-core/lib/codegen/script/internalComponent.ts index 458adaf8b8..af8859709c 100644 --- a/packages/language-core/lib/codegen/script/internalComponent.ts +++ b/packages/language-core/lib/codegen/script/internalComponent.ts @@ -48,6 +48,9 @@ export function* generateInternalComponent( } yield `}${endOfLine}`; // return { yield `},${newLine}`; // setup() { + if (options.vueCompilerOptions.target >= 3.5) { + yield `__typeRefs: {} as __VLS_Refs,${newLine}`; + } if (options.sfc.scriptSetup && options.scriptSetupRanges && !ctx.bypassDefineComponent) { yield* generateScriptSetupOptions(options, ctx, options.sfc.scriptSetup, options.scriptSetupRanges, false); } diff --git a/packages/language-core/lib/codegen/script/scriptSetup.ts b/packages/language-core/lib/codegen/script/scriptSetup.ts index 131d6a497e..84fbeb991e 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[0],${newLine}` + + ` slots: __VLS_Slots,${newLine}` + ` emit: ${emitTypes.join(' & ')},${newLine}` + ` }${endOfLine}`; yield ` })(),${newLine}`; // __VLS_setup = (async () => { @@ -116,7 +116,7 @@ function* generateSetupFunction( if (options.vueCompilerOptions.target >= 3.3) { yield `const { `; for (const macro of Object.keys(options.vueCompilerOptions.macros)) { - if (!ctx.bindingNames.has(macro)) { + if (!ctx.bindingNames.has(macro) && macro !== 'templateRef') { yield macro + `, `; } } @@ -211,6 +211,11 @@ function* generateSetupFunction( ]); } } + for (const { define } of scriptSetupRanges.templateRefs) { + if (define?.arg) { + setupCodeModifies.push([[`<__VLS_Refs[${scriptSetup.content.slice(define.arg.start, define.arg.end)}], keyof __VLS_Refs>`], define.arg.start - 1, define.arg.start - 1]); + } + } setupCodeModifies = setupCodeModifies.sort((a, b) => a[1] - b[1]); if (setupCodeModifies.length) { @@ -243,6 +248,8 @@ function* generateSetupFunction( yield* generateComponentProps(options, ctx, scriptSetup, scriptSetupRanges, definePropMirrors); yield* generateModelEmits(options, scriptSetup, scriptSetupRanges); yield* generateTemplate(options, ctx, false); + yield `type __VLS_Refs = ReturnType['refs']${endOfLine}`; + yield `type __VLS_Slots = ReturnType['slots']${endOfLine}`; if (syntax) { if (!options.vueCompilerOptions.skipTemplateCodegen && (options.templateCodegen?.hasSlot || scriptSetupRanges?.slots.define)) { @@ -250,7 +257,7 @@ function* generateSetupFunction( yield* generateComponent(options, ctx, scriptSetup, scriptSetupRanges); yield endOfLine; yield `${syntax} `; - yield `{} as ${ctx.helperTypes.WithTemplateSlots.name}[0]>${endOfLine}`; + yield `{} as ${ctx.helperTypes.WithTemplateSlots.name}${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 9ca16a8791..a0e124226e 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -165,11 +165,16 @@ function* generateTemplateContext( yield `// no template${newLine}`; if (!options.scriptSetupRanges?.slots.define) { yield `const __VLS_slots = {}${endOfLine}`; + yield `const __VLS_refs = {}${endOfLine}`; yield `const __VLS_inheritedAttrs = {}${endOfLine}`; } } - yield `return [${options.scriptSetupRanges?.slots.name ?? '__VLS_slots'}, __VLS_inheritedAttrs] as const${endOfLine}`; + yield `return {${newLine}`; + yield `slots: ${options.scriptSetupRanges?.slots.name ?? '__VLS_slots'},${newLine}`; + yield `refs: __VLS_refs as __VLS_PickRefsExpose,${newLine}`; + yield `attrs: __VLS_inheritedAttrs,${newLine}`; + yield `}${endOfLine}`; } function* generateCssClassProperty( diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index 4bb0f87c87..9a97c81f9b 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -259,13 +259,26 @@ export function* generateComponent( yield endOfLine; } - yield* generateVScope(options, ctx, node, props); + const refName = yield* generateVScope(options, ctx, node, props); ctx.usedComponentCtxVars.add(componentCtxVar); const usedComponentEventsVar = yield* generateElementEvents(options, ctx, node, var_functionalComponent, var_componentInstance, var_componentEmit, var_componentEvents); if (var_defineComponentCtx && ctx.usedComponentCtxVars.has(var_defineComponentCtx)) { yield `const ${componentCtxVar} = __VLS_nonNullable(__VLS_pickFunctionalComponentCtx(${var_originalComponent}, ${var_componentInstance}))${endOfLine}`; + if (refName) { + yield `// @ts-ignore${newLine}`; + if (node.codegenNode?.type === CompilerDOM.NodeTypes.VNODE_CALL + && node.codegenNode.props?.type === CompilerDOM.NodeTypes.JS_OBJECT_EXPRESSION + && node.codegenNode.props.properties.find(({ key }) => key.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION && key.content === 'ref_for') + ) { + yield `(${refName} ??= []).push(${var_defineComponentCtx})`; + } else { + yield `${refName} = ${var_defineComponentCtx}`; + } + + yield endOfLine; + } } if (usedComponentEventsVar) { yield `let ${var_componentEmit}!: typeof ${componentCtxVar}.emit${endOfLine}`; @@ -350,7 +363,17 @@ export function* generateElement( yield endOfLine; } - yield* generateVScope(options, ctx, node, node.props); + const refName = yield* generateVScope(options, ctx, node, node.props); + if (refName) { + yield `// @ts-ignore${newLine}`; + yield `${refName} = __VLS_intrinsicElements`; + yield* generatePropertyAccess( + options, + ctx, + node.tag + ); + yield endOfLine; + } const slotDir = node.props.find(p => p.type === CompilerDOM.NodeTypes.DIRECTIVE && p.name === 'slot') as CompilerDOM.DirectiveNode; if (slotDir && componentCtxVar) { @@ -397,13 +420,14 @@ function* generateVScope( } yield* generateElementDirectives(options, ctx, node); - yield* generateReferencesForElements(options, ctx, node); // + const refName = yield* generateReferencesForElements(options, ctx, node); // yield* generateReferencesForScopedCssClasses(options, ctx, node); if (inScope) { yield `}${newLine}`; ctx.blockConditions.length = originalConditionsNum; } + return refName; } export function getCanonicalComponentName(tagText: string) { @@ -571,6 +595,10 @@ function* generateReferencesForElements( ')' ); yield endOfLine; + + const refName = CompilerDOM.toValidAssetId(prop.value.content, '_VLS_refs' as any); + options.templateRefNames.set(prop.value.content, refName); + return refName; } } } diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index 6f70173f97..a338437e97 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -15,6 +15,7 @@ export interface TemplateCodegenOptions { template: NonNullable; scriptSetupBindingNames: Set; scriptSetupImportComponentNames: Set; + templateRefNames: Map; hasDefineSlots?: boolean; slotsAssignName?: string; propsAssignName?: string; @@ -49,8 +50,21 @@ export function* generateTemplate(options: TemplateCodegenOptions): Generator { + for (const [, validId] of options.templateRefNames) { + yield `let ${validId}${newLine}`; + } + yield `const __VLS_refs = {${newLine}`; + for (const [name, validId] of options.templateRefNames) { + yield `'${name}': ${validId}!,${newLine}`; + } + yield `}${endOfLine}`; + } + function* generateSlotsType(): Generator { for (const { expVar, varName } of ctx.dynamicSlots) { ctx.hasSlot = true; diff --git a/packages/language-core/lib/parsers/scriptSetupRanges.ts b/packages/language-core/lib/parsers/scriptSetupRanges.ts index a696920e49..ef3858993c 100644 --- a/packages/language-core/lib/parsers/scriptSetupRanges.ts +++ b/packages/language-core/lib/parsers/scriptSetupRanges.ts @@ -42,6 +42,10 @@ export function parseScriptSetupRanges( name?: string; inheritAttrs?: string; } = {}; + const templateRefs: { + name?: string; + define?: ReturnType; + }[] = []; const definePropProposalA = vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=kevinEdition'); const definePropProposalB = vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=johnsonEdition'); @@ -104,6 +108,7 @@ export function parseScriptSetupRanges( expose, options, defineProp, + templateRefs, }; function _getStartEnd(node: ts.Node) { @@ -298,6 +303,17 @@ export function parseScriptSetupRanges( } } } + } else if (vueCompilerOptions.macros.templateRef.includes(callText) && node.arguments.length && !node.typeArguments?.length) { + const define = parseDefineFunction(node); + define.arg = _getStartEnd(node.arguments[0]); + let name; + if (ts.isVariableDeclaration(parent)) { + name = getNodeText(ts, parent.name, ast); + } + templateRefs.push({ + name, + define + }); } } ts.forEachChild(node, child => { diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index 42e59217e5..a84dfef4b2 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -94,6 +94,7 @@ function createTsx( template: _sfc.template, scriptSetupBindingNames: scriptSetupBindingNames(), scriptSetupImportComponentNames: scriptSetupImportComponentNames(), + templateRefNames: new Map(), hasDefineSlots: hasDefineSlots(), slotsAssignName: slotsAssignName(), propsAssignName: propsAssignName(), diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index ac0e9faca8..1b980e659f 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -41,6 +41,7 @@ export interface VueCompilerOptions { defineModel: string[]; defineOptions: string[]; withDefaults: string[]; + templateRef: string[]; }; plugins: VueLanguagePlugin[]; diff --git a/packages/language-core/lib/utils/ts.ts b/packages/language-core/lib/utils/ts.ts index 0c793d3645..5fd1d56a15 100644 --- a/packages/language-core/lib/utils/ts.ts +++ b/packages/language-core/lib/utils/ts.ts @@ -230,6 +230,7 @@ export function resolveVueCompilerOptions(vueOptions: Partial(__VLS_props: NonNullable & (import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps); expose(exposed: import("vue").ShallowUnwrapRef<{}>): void; attrs: any; - slots: ReturnType<() => readonly [{ + slots: { default?(_: { row: Row; }): any; - }, import("vue").HTMLAttributes & import("vue").ReservedProps]>[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<() => readonly [{}, {}]>[0]; + slots: {}; 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 [Readonly<{ + slots: 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 [Readonly<{ + slots: 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 Input: template-slots/component.vue, Output: template-slots/component.vue.d.ts 1`] = ` -"declare function __VLS_template(): readonly [{ - "no-bind"?(_: {}): any; - default?(_: { - num: number; - }): any; - "named-slot"?(_: { - str: string; - }): any; - vbind?(_: { - num: number; - str: string; - }): any; -}, {}]; +"declare function __VLS_template(): { + slots: { + "no-bind"?(_: {}): any; + default?(_: { + num: number; + }): any; + "named-slot"?(_: { + str: string; + }): any; + vbind?(_: { + num: number; + str: string; + }): any; + }; + refs: __VLS_PickRefsExpose<{}>; + attrs: {}; +}; +type __VLS_Slots = ReturnType['slots']; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; -declare const _default: __VLS_WithTemplateSlots[0]>; +declare const _default: __VLS_WithTemplateSlots; export default _default; type __VLS_WithTemplateSlots = T & { new (): { @@ -682,33 +687,38 @@ 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 [Readonly<{ - default: (props: { - num: number; - }) => VNode[]; - 'named-slot': (props: { - str: string; - }) => VNode[]; - vbind: (props: { - num: number; - str: string; - }) => VNode[]; - 'no-bind': () => VNode[]; -}> & { - default: (props: { - num: number; - }) => VNode[]; - 'named-slot': (props: { - str: string; - }) => VNode[]; - vbind: (props: { - num: number; - str: string; - }) => VNode[]; - 'no-bind': () => VNode[]; -}, {}]; +declare function __VLS_template(): { + slots: Readonly<{ + default: (props: { + num: number; + }) => VNode[]; + 'named-slot': (props: { + str: string; + }) => VNode[]; + vbind: (props: { + num: number; + str: string; + }) => VNode[]; + 'no-bind': () => VNode[]; + }> & { + default: (props: { + num: number; + }) => VNode[]; + 'named-slot': (props: { + str: string; + }) => VNode[]; + vbind: (props: { + num: number; + str: string; + }) => VNode[]; + 'no-bind': () => VNode[]; + }; + refs: __VLS_PickRefsExpose<{}>; + attrs: {}; +}; +type __VLS_Slots = ReturnType['slots']; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; -declare const _default: __VLS_WithTemplateSlots[0]>; +declare const _default: __VLS_WithTemplateSlots; export default _default; type __VLS_WithTemplateSlots = T & { new (): { @@ -719,17 +729,22 @@ 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 [Readonly<{ - bottom: (props: { - num: number; - }) => any[]; -}> & { - bottom: (props: { - num: number; - }) => any[]; -}, {}]; +"declare function __VLS_template(): { + slots: Readonly<{ + bottom: (props: { + num: number; + }) => any[]; + }> & { + bottom: (props: { + num: number; + }) => any[]; + }; + refs: __VLS_PickRefsExpose<{}>; + attrs: {}; +}; +type __VLS_Slots = ReturnType['slots']; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; -declare const _default: __VLS_WithTemplateSlots[0]>; +declare const _default: __VLS_WithTemplateSlots; export default _default; type __VLS_WithTemplateSlots = T & { new (): { @@ -740,21 +755,26 @@ 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(): readonly [{ - "no-bind"?(_: {}): any; - default?(_: { - num: number; - }): any; - "named-slot"?(_: { - str: string; - }): any; - vbind?(_: { - num: number; - str: string; - }): any; -}, {}]; +"declare function __VLS_template(): { + slots: { + "no-bind"?(_: {}): any; + default?(_: { + num: number; + }): any; + "named-slot"?(_: { + str: string; + }): any; + vbind?(_: { + num: number; + str: string; + }): any; + }; + refs: __VLS_PickRefsExpose<{}>; + attrs: {}; +}; +type __VLS_Slots = ReturnType['slots']; declare const __VLS_component: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly>, {}, {}>; -declare const _default: __VLS_WithTemplateSlots[0]>; +declare const _default: __VLS_WithTemplateSlots; export default _default; type __VLS_WithTemplateSlots = T & { new (): { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d4cdf7b7c3..94adcfbf0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -332,8 +332,8 @@ importers: specifier: npm:vue@3.3.13 version: vue@3.3.13(typescript@5.5.4) vue3.5: - specifier: npm:vue@3.5.0-alpha.3 - version: vue@3.5.0-alpha.3(typescript@5.5.4) + specifier: npm:vue@3.5.0-beta.1 + version: vue@3.5.0-beta.1(typescript@5.5.4) packages: @@ -1233,8 +1233,8 @@ packages: '@vue/compiler-core@3.4.38': resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} - '@vue/compiler-core@3.5.0-alpha.3': - resolution: {integrity: sha512-du7iRe9SE5HJ8XGaVtN4OnVsBuslCOINZUiRYykJjDvJERdjDcJglJ4YTfi0gmG80p6TmzQSXxPuBVT/JlqpuQ==} + '@vue/compiler-core@3.5.0-beta.1': + resolution: {integrity: sha512-MLP2yH21NFnVn+WhUsrRFR+wwXuBWHQ4YmXou1zVaXSfwqwGonf0KC7FBbXz3RbqPH0v2yksWpZFJYnTY++yNQ==} '@vue/compiler-dom@3.3.13': resolution: {integrity: sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==} @@ -1242,8 +1242,8 @@ packages: '@vue/compiler-dom@3.4.38': resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==} - '@vue/compiler-dom@3.5.0-alpha.3': - resolution: {integrity: sha512-SL/lSqZ/LgiFEyix1Z3SqvRvd1hfZqQ0RfaH0wRDLv/2lkqswl4qxnqFBEChoWS0BpMBIMkAmrAha7xIhELKug==} + '@vue/compiler-dom@3.5.0-beta.1': + resolution: {integrity: sha512-DAC/58eo5XlYdrUXRIf3eWDMbKWM1I85bQfIRIqt7vCE2a2yGmx2LIyI/BEio4uI1Sdf/g16kOzk3BDmFkr1GA==} '@vue/compiler-sfc@2.7.16': resolution: {integrity: sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==} @@ -1254,8 +1254,8 @@ packages: '@vue/compiler-sfc@3.4.38': resolution: {integrity: sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==} - '@vue/compiler-sfc@3.5.0-alpha.3': - resolution: {integrity: sha512-UVs18nFL365hea2P9iOHvQDBB8eZxymhGmEol6YMbwB3DjhOcGyzscVixRin/kNHyPr5dEKjRUKcfxwZ03a+9A==} + '@vue/compiler-sfc@3.5.0-beta.1': + resolution: {integrity: sha512-0139cGju9//Wpm90rtwDy6+/1s61Ba04Mn8+X1Xgo6D9xR3h7yLmgHU7OvG9Mh3LwtlB0sQIUeYZMvF995r4ww==} '@vue/compiler-ssr@3.3.13': resolution: {integrity: sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==} @@ -1263,8 +1263,8 @@ packages: '@vue/compiler-ssr@3.4.38': resolution: {integrity: sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==} - '@vue/compiler-ssr@3.5.0-alpha.3': - resolution: {integrity: sha512-cATOOLUjg9W86ZMT87DPsi3W4BZUZIIrIGZEUrRcC91lWs00PTtXiWxhQF4QGpxKpGLPr9GK3E2z5SeQWlk5Zw==} + '@vue/compiler-ssr@3.5.0-beta.1': + resolution: {integrity: sha512-aC58zZiLS//lqH6DdOPicv5crn8uSkBMilpGR1lKISViI09n5Gz0Ov0c35lYiVk9WifshTXU+BPQut3huKYySA==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -1278,8 +1278,8 @@ packages: '@vue/reactivity@3.4.38': resolution: {integrity: sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==} - '@vue/reactivity@3.5.0-alpha.3': - resolution: {integrity: sha512-Ju0okU4JHdBsxxu7RR3qOMssg4G11KX5vhmlyOwpH3bssp1fYZWQ9qyz+iadtOVsomc+b3WG0Jdx1KFgrGMHcg==} + '@vue/reactivity@3.5.0-beta.1': + resolution: {integrity: sha512-3dBZPdQxGcVCgeJv9KlGuK8a++PUj+OAJ8U89h+77SHMDAKXpLLjnpL+VfreAl37Z39ye4AJyfeYvaXV7fdlcA==} '@vue/runtime-core@3.3.13': resolution: {integrity: sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==} @@ -1287,8 +1287,8 @@ packages: '@vue/runtime-core@3.4.38': resolution: {integrity: sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==} - '@vue/runtime-core@3.5.0-alpha.3': - resolution: {integrity: sha512-RWo7KGycr0IIj1hjJ6xe5gsTeEMkhsW9wWc+lU4r8t7Tbg90F/wjBOcIXzFKhqI5+o9dExgozRhTYwrchbx/6g==} + '@vue/runtime-core@3.5.0-beta.1': + resolution: {integrity: sha512-j+ivXaIRSZbJJGf9ZZpcf+4vqM3DC3AMgmoRrQ8DJExYIU6mvpkSNUfPRBw3QROoD7BjcuImRN6Ia2QxnlwDfw==} '@vue/runtime-dom@3.3.13': resolution: {integrity: sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==} @@ -1296,8 +1296,8 @@ packages: '@vue/runtime-dom@3.4.38': resolution: {integrity: sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==} - '@vue/runtime-dom@3.5.0-alpha.3': - resolution: {integrity: sha512-IOM5wRRnEPYU2USpLtG1VbTyMkyj9Dk2xGnHKnqtjy/4Wdnp1pXifCTfa37rnFPZFAbKeXRJT74dLMdRIyH9Kw==} + '@vue/runtime-dom@3.5.0-beta.1': + resolution: {integrity: sha512-16xac1YVuQtSsIQsY+94fHlg9QsQOxIZrr66kcHXYN9bSA8SqrTmA6JpfdwQfp+xQMVyRt+xb/K1c8plec9rxQ==} '@vue/server-renderer@3.3.13': resolution: {integrity: sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==} @@ -1309,10 +1309,10 @@ packages: peerDependencies: vue: 3.4.38 - '@vue/server-renderer@3.5.0-alpha.3': - resolution: {integrity: sha512-w2ZOu7Q64BSotuyKReFEq5p/G0U1txTVgOsKq6+bTo3kPcUBYZV9yVCaePVf9kcU5tqjZoje5UBzNExe5DzZ3A==} + '@vue/server-renderer@3.5.0-beta.1': + resolution: {integrity: sha512-siDsHX84Yb9nF5H2Xp5h8mb/qXftNbgFiEN2Dr9N1RUaPXcz9Ai4grbMg6yTVm8aoC4gCXBgDVms+QRqSX3Xdg==} peerDependencies: - vue: 3.5.0-alpha.3 + vue: 3.5.0-beta.1 '@vue/shared@3.3.13': resolution: {integrity: sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==} @@ -1320,8 +1320,8 @@ packages: '@vue/shared@3.4.38': resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==} - '@vue/shared@3.5.0-alpha.3': - resolution: {integrity: sha512-TOd0zMchrmWoSWNddkx30wHTVRBkzemhgmbXMBUURv6HuyuddlVyqCMLDmYiklEurers3ILRp+e3b5QN838+kg==} + '@vue/shared@3.5.0-beta.1': + resolution: {integrity: sha512-RbjXOkVFA+92CWL8HLexUKIl3yUH0PGuzfjDtaNmr4WRP8vlA7xOyRm4iX+jl/KCbZb9JjC0r8yYWqNiMdeSJQ==} JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} @@ -1779,6 +1779,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@5.0.0: + resolution: {integrity: sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -3401,8 +3405,8 @@ packages: typescript: optional: true - vue@3.5.0-alpha.3: - resolution: {integrity: sha512-VrCHKUgxsiGMO1SCSrS9yHLwJYAwRrbKqrHdd32ruAWnMC5GVnbrjcrcMuvw5RnrfUc+9y7pBXpVbiO6+WsyMQ==} + vue@3.5.0-beta.1: + resolution: {integrity: sha512-17ZEyGr4411DWSNM9E0nNzQ4IPCkFPeDffTL17IFF+vCwinn9o5VyJmHexa2qKiwoLJ4Ib+3IGo+eAEgafW+fA==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4563,11 +4567,11 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.0 - '@vue/compiler-core@3.5.0-alpha.3': + '@vue/compiler-core@3.5.0-beta.1': dependencies: '@babel/parser': 7.25.4 - '@vue/shared': 3.5.0-alpha.3 - entities: 4.5.0 + '@vue/shared': 3.5.0-beta.1 + entities: 5.0.0 estree-walker: 2.0.2 source-map-js: 1.2.0 @@ -4581,10 +4585,10 @@ snapshots: '@vue/compiler-core': 3.4.38 '@vue/shared': 3.4.38 - '@vue/compiler-dom@3.5.0-alpha.3': + '@vue/compiler-dom@3.5.0-beta.1': dependencies: - '@vue/compiler-core': 3.5.0-alpha.3 - '@vue/shared': 3.5.0-alpha.3 + '@vue/compiler-core': 3.5.0-beta.1 + '@vue/shared': 3.5.0-beta.1 '@vue/compiler-sfc@2.7.16': dependencies: @@ -4619,13 +4623,13 @@ snapshots: postcss: 8.4.41 source-map-js: 1.2.0 - '@vue/compiler-sfc@3.5.0-alpha.3': + '@vue/compiler-sfc@3.5.0-beta.1': dependencies: '@babel/parser': 7.25.4 - '@vue/compiler-core': 3.5.0-alpha.3 - '@vue/compiler-dom': 3.5.0-alpha.3 - '@vue/compiler-ssr': 3.5.0-alpha.3 - '@vue/shared': 3.5.0-alpha.3 + '@vue/compiler-core': 3.5.0-beta.1 + '@vue/compiler-dom': 3.5.0-beta.1 + '@vue/compiler-ssr': 3.5.0-beta.1 + '@vue/shared': 3.5.0-beta.1 estree-walker: 2.0.2 magic-string: 0.30.11 postcss: 8.4.41 @@ -4641,10 +4645,10 @@ snapshots: '@vue/compiler-dom': 3.4.38 '@vue/shared': 3.4.38 - '@vue/compiler-ssr@3.5.0-alpha.3': + '@vue/compiler-ssr@3.5.0-beta.1': dependencies: - '@vue/compiler-dom': 3.5.0-alpha.3 - '@vue/shared': 3.5.0-alpha.3 + '@vue/compiler-dom': 3.5.0-beta.1 + '@vue/shared': 3.5.0-beta.1 '@vue/compiler-vue2@2.7.16': dependencies: @@ -4667,9 +4671,9 @@ snapshots: dependencies: '@vue/shared': 3.4.38 - '@vue/reactivity@3.5.0-alpha.3': + '@vue/reactivity@3.5.0-beta.1': dependencies: - '@vue/shared': 3.5.0-alpha.3 + '@vue/shared': 3.5.0-beta.1 '@vue/runtime-core@3.3.13': dependencies: @@ -4681,10 +4685,10 @@ snapshots: '@vue/reactivity': 3.4.38 '@vue/shared': 3.4.38 - '@vue/runtime-core@3.5.0-alpha.3': + '@vue/runtime-core@3.5.0-beta.1': dependencies: - '@vue/reactivity': 3.5.0-alpha.3 - '@vue/shared': 3.5.0-alpha.3 + '@vue/reactivity': 3.5.0-beta.1 + '@vue/shared': 3.5.0-beta.1 '@vue/runtime-dom@3.3.13': dependencies: @@ -4699,11 +4703,11 @@ snapshots: '@vue/shared': 3.4.38 csstype: 3.1.3 - '@vue/runtime-dom@3.5.0-alpha.3': + '@vue/runtime-dom@3.5.0-beta.1': dependencies: - '@vue/reactivity': 3.5.0-alpha.3 - '@vue/runtime-core': 3.5.0-alpha.3 - '@vue/shared': 3.5.0-alpha.3 + '@vue/reactivity': 3.5.0-beta.1 + '@vue/runtime-core': 3.5.0-beta.1 + '@vue/shared': 3.5.0-beta.1 csstype: 3.1.3 '@vue/server-renderer@3.3.13(vue@3.4.38(typescript@5.5.4))': @@ -4718,17 +4722,17 @@ snapshots: '@vue/shared': 3.4.38 vue: 3.4.38(typescript@5.5.4) - '@vue/server-renderer@3.5.0-alpha.3(vue@3.4.38(typescript@5.5.4))': + '@vue/server-renderer@3.5.0-beta.1(vue@3.4.38(typescript@5.5.4))': dependencies: - '@vue/compiler-ssr': 3.5.0-alpha.3 - '@vue/shared': 3.5.0-alpha.3 + '@vue/compiler-ssr': 3.5.0-beta.1 + '@vue/shared': 3.5.0-beta.1 vue: 3.4.38(typescript@5.5.4) '@vue/shared@3.3.13': {} '@vue/shared@3.4.38': {} - '@vue/shared@3.5.0-alpha.3': {} + '@vue/shared@3.5.0-beta.1': {} JSONStream@1.3.5: dependencies: @@ -5193,6 +5197,8 @@ snapshots: entities@4.5.0: {} + entities@5.0.0: {} + env-paths@2.2.1: {} err-code@2.0.3: {} @@ -6903,13 +6909,13 @@ snapshots: optionalDependencies: typescript: 5.5.4 - vue@3.5.0-alpha.3(typescript@5.5.4): + vue@3.5.0-beta.1(typescript@5.5.4): dependencies: - '@vue/compiler-dom': 3.5.0-alpha.3 - '@vue/compiler-sfc': 3.5.0-alpha.3 - '@vue/runtime-dom': 3.5.0-alpha.3 - '@vue/server-renderer': 3.5.0-alpha.3(vue@3.4.38(typescript@5.5.4)) - '@vue/shared': 3.5.0-alpha.3 + '@vue/compiler-dom': 3.5.0-beta.1 + '@vue/compiler-sfc': 3.5.0-beta.1 + '@vue/runtime-dom': 3.5.0-beta.1 + '@vue/server-renderer': 3.5.0-beta.1(vue@3.4.38(typescript@5.5.4)) + '@vue/shared': 3.5.0-beta.1 optionalDependencies: typescript: 5.5.4 diff --git a/test-workspace/package.json b/test-workspace/package.json index 2078ebacdb..74f1d5398e 100644 --- a/test-workspace/package.json +++ b/test-workspace/package.json @@ -8,6 +8,6 @@ "vue-component-type-helpers": "2.0.28", "vue2": "npm:vue@2.7.16", "vue3.3": "npm:vue@3.3.13", - "vue3.5": "npm:vue@3.5.0-alpha.3" + "vue3.5": "npm:vue@3.5.0-beta.1" } } diff --git a/test-workspace/tsc/passedFixtures/vue3.5/templateRef/generic.vue b/test-workspace/tsc/passedFixtures/vue3.5/templateRef/generic.vue new file mode 100644 index 0000000000..823347dae9 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3.5/templateRef/generic.vue @@ -0,0 +1,13 @@ + + + diff --git a/test-workspace/tsc/passedFixtures/vue3.5/templateRef/main.vue b/test-workspace/tsc/passedFixtures/vue3.5/templateRef/main.vue new file mode 100644 index 0000000000..7f871fac60 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3.5/templateRef/main.vue @@ -0,0 +1,10 @@ + + + diff --git a/test-workspace/tsc/passedFixtures/vue3.5/templateRef/template-ref.vue b/test-workspace/tsc/passedFixtures/vue3.5/templateRef/template-ref.vue new file mode 100644 index 0000000000..2a08b3ce79 --- /dev/null +++ b/test-workspace/tsc/passedFixtures/vue3.5/templateRef/template-ref.vue @@ -0,0 +1,22 @@ + + +