From 835fc8213f61afef04366031016c039caed20464 Mon Sep 17 00:00:00 2001 From: baiwusanyu-c <740132583@qq.com> Date: Mon, 7 Jul 2025 11:01:52 +0800 Subject: [PATCH 1/7] chore: Synchronize the main branch code --- .../transforms/transformElement.spec.ts | 10 +++++ packages/compiler-core/src/ast.ts | 5 +++ packages/compiler-core/src/codegen.ts | 3 ++ packages/compiler-core/src/runtimeHelpers.ts | 4 ++ .../src/transforms/transformElement.ts | 6 ++- .../runtime-core/src/helpers/resolveAssets.ts | 42 ++++++++++++++++--- packages/runtime-core/src/index.ts | 1 + packages/shared/src/domTagConfig.ts | 5 +++ 8 files changed, 69 insertions(+), 7 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts index bf3510a052d..e4ab776a764 100644 --- a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts @@ -99,6 +99,16 @@ describe('compiler: element transform', () => { expect(node.tag).toBe(`$setup["Example"]`) }) + test('resolve component from setup bindings & component', () => { + const { root, node } = parseWithElementTransform(``, { + bindingMetadata: { + Example: BindingTypes.SETUP_CONST, + }, + }) + expect(root.helpers).not.toContain(RESOLVE_COMPONENT) + expect(node.tag).toBe(`_resolveSetupReturned("Example", $setup)`) + }) + test('resolve component from setup bindings (inline)', () => { const { root, node } = parseWithElementTransform(``, { inline: true, diff --git a/packages/compiler-core/src/ast.ts b/packages/compiler-core/src/ast.ts index bae13372a98..65d291610e4 100644 --- a/packages/compiler-core/src/ast.ts +++ b/packages/compiler-core/src/ast.ts @@ -9,6 +9,7 @@ import { OPEN_BLOCK, type RENDER_LIST, type RENDER_SLOT, + RESOLVE_SETUP_RETURNED, WITH_DIRECTIVES, type WITH_MEMO, } from './runtimeHelpers' @@ -875,6 +876,10 @@ export function getVNodeBlockHelper( return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK } +export function getSetupReturnedHelper() { + return RESOLVE_SETUP_RETURNED +} + export function convertToBlock( node: VNodeCall, { helper, removeHelper, inSSR }: TransformContext, diff --git a/packages/compiler-core/src/codegen.ts b/packages/compiler-core/src/codegen.ts index 99020bcf1ae..fe600e5e044 100644 --- a/packages/compiler-core/src/codegen.ts +++ b/packages/compiler-core/src/codegen.ts @@ -24,6 +24,7 @@ import { type TemplateLiteral, type TextNode, type VNodeCall, + getSetupReturnedHelper, getVNodeBlockHelper, getVNodeHelper, locStub, @@ -336,6 +337,8 @@ export function generate( if (!__BROWSER__ && options.bindingMetadata && !options.inline) { // binding optimization args args.push('$props', '$setup', '$data', '$options') + // Add helper 'getSetupReturnedHelper' for $setup + context.helper(getSetupReturnedHelper()) } const signature = !__BROWSER__ && options.isTS diff --git a/packages/compiler-core/src/runtimeHelpers.ts b/packages/compiler-core/src/runtimeHelpers.ts index 7cf3757b249..410ee29bd4c 100644 --- a/packages/compiler-core/src/runtimeHelpers.ts +++ b/packages/compiler-core/src/runtimeHelpers.ts @@ -26,6 +26,9 @@ export const CREATE_STATIC: unique symbol = Symbol( export const RESOLVE_COMPONENT: unique symbol = Symbol( __DEV__ ? `resolveComponent` : ``, ) +export const RESOLVE_SETUP_RETURNED: unique symbol = Symbol( + __DEV__ ? `resolveSetupReturned` : ``, +) export const RESOLVE_DYNAMIC_COMPONENT: unique symbol = Symbol( __DEV__ ? `resolveDynamicComponent` : ``, ) @@ -98,6 +101,7 @@ export const helperNameMap: Record = { [CREATE_TEXT]: `createTextVNode`, [CREATE_STATIC]: `createStaticVNode`, [RESOLVE_COMPONENT]: `resolveComponent`, + [RESOLVE_SETUP_RETURNED]: `resolveSetupReturned`, [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`, [RESOLVE_DIRECTIVE]: `resolveDirective`, [RESOLVE_FILTER]: `resolveFilter`, diff --git a/packages/compiler-core/src/transforms/transformElement.ts b/packages/compiler-core/src/transforms/transformElement.ts index 1dca0c514c1..50938a318cf 100644 --- a/packages/compiler-core/src/transforms/transformElement.ts +++ b/packages/compiler-core/src/transforms/transformElement.ts @@ -21,6 +21,7 @@ import { createObjectProperty, createSimpleExpression, createVNodeCall, + getSetupReturnedHelper, } from '../ast' import { PatchFlags, @@ -344,10 +345,13 @@ function resolveSetupReference(name: string, context: TransformContext) { checkType(BindingTypes.SETUP_REACTIVE_CONST) || checkType(BindingTypes.LITERAL_CONST) if (fromConst) { + const helper = context.helperString return context.inline ? // in inline mode, const setup bindings (e.g. imports) can be used as-is fromConst - : `$setup[${JSON.stringify(fromConst)}]` + : `${helper(getSetupReturnedHelper())}(${JSON.stringify( + fromConst, + )}, $setup)` } const fromMaybeRef = diff --git a/packages/runtime-core/src/helpers/resolveAssets.ts b/packages/runtime-core/src/helpers/resolveAssets.ts index 910fab33424..5d900eae8f6 100644 --- a/packages/runtime-core/src/helpers/resolveAssets.ts +++ b/packages/runtime-core/src/helpers/resolveAssets.ts @@ -1,5 +1,6 @@ import { type ComponentInternalInstance, + type ComponentInternalOptions, type ComponentOptions, type ConcreteComponent, currentInstance, @@ -7,7 +8,7 @@ import { } from '../component' import { currentRenderingInstance } from '../componentRenderContext' import type { Directive } from '../directives' -import { camelize, capitalize, isString } from '@vue/shared' +import { camelize, capitalize, isLateTag, isString } from '@vue/shared' import { warn } from '../warning' import type { VNodeTypes } from '../vnode' @@ -118,12 +119,21 @@ function resolveAsset( return Component } - if (__DEV__ && warnMissing && !res) { - const extra = - type === COMPONENTS - ? `\nIf this is a native custom element, make sure to exclude it from ` + + if ( + __DEV__ && + warnMissing && + ((!res && !isLateTag(name)) || (res && isLateTag(name))) + ) { + let extra = '' + if (type === COMPONENTS) { + if (isLateTag(name)) { + extra = `\nplease do not use built-in tag names as component names.` + } else { + extra = + `\nIf this is a native custom element, make sure to exclude it from ` + `component resolution via compilerOptions.isCustomElement.` - : `` + } + } warn(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`) } @@ -144,3 +154,23 @@ function resolve(registry: Record | undefined, name: string) { registry[capitalize(camelize(name))]) ) } + +/** + * @private + */ +export function resolveSetupReturned( + name: string, + setupReturn: ComponentInternalInstance['setupState'], +): unknown { + if (!setupReturn) return name + const returnValue = setupReturn[name] + if ( + returnValue && + (returnValue as ComponentInternalOptions).__file && + isLateTag(name as string) + ) { + const extra = `\nplease do not use built-in tag names as component names.` + warn(`Failed to resolve component: ${name},${extra}`) + } + return returnValue +} diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index 1ed6f21df77..bdf41cf08b4 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -144,6 +144,7 @@ export { resolveComponent, resolveDirective, resolveDynamicComponent, + resolveSetupReturned, } from './helpers/resolveAssets' // For integration with runtime compiler export { registerRuntimeCompiler, isRuntimeOnly } from './component' diff --git a/packages/shared/src/domTagConfig.ts b/packages/shared/src/domTagConfig.ts index 7f9d198e569..da23b36e3dc 100644 --- a/packages/shared/src/domTagConfig.ts +++ b/packages/shared/src/domTagConfig.ts @@ -14,6 +14,8 @@ const HTML_TAGS = 'option,output,progress,select,textarea,details,dialog,menu,' + 'summary,template,blockquote,iframe,tfoot' +const LATE_ADDED_TAGS = 'search' + // https://developer.mozilla.org/en-US/docs/Web/SVG/Element const SVG_TAGS = 'svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,' + @@ -62,3 +64,6 @@ export const isMathMLTag: (key: string) => boolean = */ export const isVoidTag: (key: string) => boolean = /*@__PURE__*/ makeMap(VOID_TAGS) + +export const isLateTag: (key: string) => boolean = + /*#__PURE__*/ makeMap(LATE_ADDED_TAGS) From 5fe3299a1e353d64e5a3f4a604467efc94429b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E9=9B=BE=E4=B8=89=E8=AF=AD?= <32354856+baiwusanyu-c@users.noreply.github.com> Date: Mon, 7 Jul 2025 21:13:01 +0800 Subject: [PATCH 2/7] chore: added getSetupReturnedHelper typo --- packages/compiler-core/src/ast.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-core/src/ast.ts b/packages/compiler-core/src/ast.ts index 65d291610e4..de0569e8edd 100644 --- a/packages/compiler-core/src/ast.ts +++ b/packages/compiler-core/src/ast.ts @@ -876,7 +876,7 @@ export function getVNodeBlockHelper( return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK } -export function getSetupReturnedHelper() { +export function getSetupReturnedHelper(): typeof RESOLVE_SETUP_RETURNED { return RESOLVE_SETUP_RETURNED } From 912853f55ceb75a15667184c641e213b6dafdef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E9=9B=BE=E4=B8=89=E8=AF=AD?= <32354856+baiwusanyu-c@users.noreply.github.com> Date: Mon, 7 Jul 2025 21:23:56 +0800 Subject: [PATCH 3/7] chore: modify resolveSetupReturned typo --- packages/runtime-core/src/helpers/resolveAssets.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/src/helpers/resolveAssets.ts b/packages/runtime-core/src/helpers/resolveAssets.ts index 5d900eae8f6..986c2e96e9c 100644 --- a/packages/runtime-core/src/helpers/resolveAssets.ts +++ b/packages/runtime-core/src/helpers/resolveAssets.ts @@ -160,7 +160,7 @@ function resolve(registry: Record | undefined, name: string) { */ export function resolveSetupReturned( name: string, - setupReturn: ComponentInternalInstance['setupState'], + setupReturn: Record, ): unknown { if (!setupReturn) return name const returnValue = setupReturn[name] From b66dd91997bea7c129db80e287f36427aa51aedd Mon Sep 17 00:00:00 2001 From: edison Date: Tue, 8 Jul 2025 11:05:15 +0800 Subject: [PATCH 4/7] Apply suggestions from code review --- packages/runtime-core/src/helpers/resolveAssets.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/runtime-core/src/helpers/resolveAssets.ts b/packages/runtime-core/src/helpers/resolveAssets.ts index 986c2e96e9c..d6f3d0fba99 100644 --- a/packages/runtime-core/src/helpers/resolveAssets.ts +++ b/packages/runtime-core/src/helpers/resolveAssets.ts @@ -165,6 +165,7 @@ export function resolveSetupReturned( if (!setupReturn) return name const returnValue = setupReturn[name] if ( + __DEV__ && returnValue && (returnValue as ComponentInternalOptions).__file && isLateTag(name as string) From bf3a41d36739bf8626de3a96c8eb5964a307a911 Mon Sep 17 00:00:00 2001 From: baiwusanyu-c <740132583@qq.com> Date: Tue, 8 Jul 2025 13:46:10 +0800 Subject: [PATCH 5/7] chore: More reasonable parameter design and transformation judgment --- .../__tests__/transforms/transformElement.spec.ts | 2 +- packages/compiler-core/src/ast.ts | 6 +++--- packages/compiler-core/src/runtimeHelpers.ts | 6 +++--- .../compiler-core/src/transforms/transformElement.ts | 7 ++++--- packages/runtime-core/src/helpers/resolveAssets.ts | 11 +++++------ packages/runtime-core/src/index.ts | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts index e4ab776a764..860d85a170c 100644 --- a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts @@ -106,7 +106,7 @@ describe('compiler: element transform', () => { }, }) expect(root.helpers).not.toContain(RESOLVE_COMPONENT) - expect(node.tag).toBe(`_resolveSetupReturned("Example", $setup)`) + expect(node.tag).toBe(`_resolveLateAddedTag("Example", $setup)`) }) test('resolve component from setup bindings (inline)', () => { diff --git a/packages/compiler-core/src/ast.ts b/packages/compiler-core/src/ast.ts index de0569e8edd..42bd364e68a 100644 --- a/packages/compiler-core/src/ast.ts +++ b/packages/compiler-core/src/ast.ts @@ -9,7 +9,7 @@ import { OPEN_BLOCK, type RENDER_LIST, type RENDER_SLOT, - RESOLVE_SETUP_RETURNED, + RESOLVE_LATE_ADDED_TAG, WITH_DIRECTIVES, type WITH_MEMO, } from './runtimeHelpers' @@ -876,8 +876,8 @@ export function getVNodeBlockHelper( return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK } -export function getSetupReturnedHelper(): typeof RESOLVE_SETUP_RETURNED { - return RESOLVE_SETUP_RETURNED +export function getSetupReturnedHelper(): typeof RESOLVE_LATE_ADDED_TAG { + return RESOLVE_LATE_ADDED_TAG } export function convertToBlock( diff --git a/packages/compiler-core/src/runtimeHelpers.ts b/packages/compiler-core/src/runtimeHelpers.ts index 410ee29bd4c..21d4de02de8 100644 --- a/packages/compiler-core/src/runtimeHelpers.ts +++ b/packages/compiler-core/src/runtimeHelpers.ts @@ -26,8 +26,8 @@ export const CREATE_STATIC: unique symbol = Symbol( export const RESOLVE_COMPONENT: unique symbol = Symbol( __DEV__ ? `resolveComponent` : ``, ) -export const RESOLVE_SETUP_RETURNED: unique symbol = Symbol( - __DEV__ ? `resolveSetupReturned` : ``, +export const RESOLVE_LATE_ADDED_TAG: unique symbol = Symbol( + __DEV__ ? `resolveLateAddedTag` : ``, ) export const RESOLVE_DYNAMIC_COMPONENT: unique symbol = Symbol( __DEV__ ? `resolveDynamicComponent` : ``, @@ -101,7 +101,7 @@ export const helperNameMap: Record = { [CREATE_TEXT]: `createTextVNode`, [CREATE_STATIC]: `createStaticVNode`, [RESOLVE_COMPONENT]: `resolveComponent`, - [RESOLVE_SETUP_RETURNED]: `resolveSetupReturned`, + [RESOLVE_LATE_ADDED_TAG]: `resolveLateAddedTag`, [RESOLVE_DYNAMIC_COMPONENT]: `resolveDynamicComponent`, [RESOLVE_DIRECTIVE]: `resolveDirective`, [RESOLVE_FILTER]: `resolveFilter`, diff --git a/packages/compiler-core/src/transforms/transformElement.ts b/packages/compiler-core/src/transforms/transformElement.ts index 50938a318cf..5327ac6d676 100644 --- a/packages/compiler-core/src/transforms/transformElement.ts +++ b/packages/compiler-core/src/transforms/transformElement.ts @@ -28,6 +28,7 @@ import { camelize, capitalize, isBuiltInDirective, + isLateTag, isObject, isOn, isReservedProp, @@ -349,9 +350,9 @@ function resolveSetupReference(name: string, context: TransformContext) { return context.inline ? // in inline mode, const setup bindings (e.g. imports) can be used as-is fromConst - : `${helper(getSetupReturnedHelper())}(${JSON.stringify( - fromConst, - )}, $setup)` + : isLateTag(fromConst) + ? `${helper(getSetupReturnedHelper())}(${JSON.stringify(fromConst)})` + : `$setup[${JSON.stringify(fromConst)}]` } const fromMaybeRef = diff --git a/packages/runtime-core/src/helpers/resolveAssets.ts b/packages/runtime-core/src/helpers/resolveAssets.ts index d6f3d0fba99..4fbbc8fc723 100644 --- a/packages/runtime-core/src/helpers/resolveAssets.ts +++ b/packages/runtime-core/src/helpers/resolveAssets.ts @@ -158,12 +158,11 @@ function resolve(registry: Record | undefined, name: string) { /** * @private */ -export function resolveSetupReturned( - name: string, - setupReturn: Record, -): unknown { - if (!setupReturn) return name - const returnValue = setupReturn[name] +export function resolveLateAddedTag(name: string): unknown { + if (!currentRenderingInstance || !currentRenderingInstance.setupState) + return name + const setupState = currentRenderingInstance.setupState + const returnValue = setupState[name] if ( __DEV__ && returnValue && diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index bdf41cf08b4..42683fd4abc 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -144,7 +144,7 @@ export { resolveComponent, resolveDirective, resolveDynamicComponent, - resolveSetupReturned, + resolveLateAddedTag, } from './helpers/resolveAssets' // For integration with runtime compiler export { registerRuntimeCompiler, isRuntimeOnly } from './component' From db7875254545c2d72deb93491d9e330d7fc9f238 Mon Sep 17 00:00:00 2001 From: baiwusanyu-c <740132583@qq.com> Date: Tue, 8 Jul 2025 16:33:48 +0800 Subject: [PATCH 6/7] chore: compatible with scenarios where values are taken from props --- packages/compiler-core/src/ast.ts | 2 +- packages/compiler-core/src/codegen.ts | 6 +++--- .../src/transforms/transformElement.ts | 21 ++++++++++++------- .../runtime-core/src/helpers/resolveAssets.ts | 21 +++++++++++-------- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/packages/compiler-core/src/ast.ts b/packages/compiler-core/src/ast.ts index 42bd364e68a..26c86f1175c 100644 --- a/packages/compiler-core/src/ast.ts +++ b/packages/compiler-core/src/ast.ts @@ -876,7 +876,7 @@ export function getVNodeBlockHelper( return ssr || isComponent ? CREATE_BLOCK : CREATE_ELEMENT_BLOCK } -export function getSetupReturnedHelper(): typeof RESOLVE_LATE_ADDED_TAG { +export function getResolveLateAddedTagHelper(): typeof RESOLVE_LATE_ADDED_TAG { return RESOLVE_LATE_ADDED_TAG } diff --git a/packages/compiler-core/src/codegen.ts b/packages/compiler-core/src/codegen.ts index fe600e5e044..ed3feb1341f 100644 --- a/packages/compiler-core/src/codegen.ts +++ b/packages/compiler-core/src/codegen.ts @@ -24,7 +24,7 @@ import { type TemplateLiteral, type TextNode, type VNodeCall, - getSetupReturnedHelper, + getResolveLateAddedTagHelper, getVNodeBlockHelper, getVNodeHelper, locStub, @@ -337,8 +337,8 @@ export function generate( if (!__BROWSER__ && options.bindingMetadata && !options.inline) { // binding optimization args args.push('$props', '$setup', '$data', '$options') - // Add helper 'getSetupReturnedHelper' for $setup - context.helper(getSetupReturnedHelper()) + // Add helper 'getResolveLateAddedTagHelper' for $setup + context.helper(getResolveLateAddedTagHelper()) } const signature = !__BROWSER__ && options.isTS diff --git a/packages/compiler-core/src/transforms/transformElement.ts b/packages/compiler-core/src/transforms/transformElement.ts index 5327ac6d676..4bb62909c66 100644 --- a/packages/compiler-core/src/transforms/transformElement.ts +++ b/packages/compiler-core/src/transforms/transformElement.ts @@ -21,7 +21,7 @@ import { createObjectProperty, createSimpleExpression, createVNodeCall, - getSetupReturnedHelper, + getResolveLateAddedTagHelper, } from '../ast' import { PatchFlags, @@ -87,7 +87,6 @@ export const transformElement: NodeTransform = (node, context) => { ) { return } - const { tag, props } = node const isComponent = node.tagType === ElementTypes.COMPONENT @@ -351,7 +350,7 @@ function resolveSetupReference(name: string, context: TransformContext) { ? // in inline mode, const setup bindings (e.g. imports) can be used as-is fromConst : isLateTag(fromConst) - ? `${helper(getSetupReturnedHelper())}(${JSON.stringify(fromConst)})` + ? `${helper(getResolveLateAddedTagHelper())}(${JSON.stringify(fromConst)}, 'setupState')` : `$setup[${JSON.stringify(fromConst)}]` } @@ -360,17 +359,25 @@ function resolveSetupReference(name: string, context: TransformContext) { checkType(BindingTypes.SETUP_REF) || checkType(BindingTypes.SETUP_MAYBE_REF) if (fromMaybeRef) { + const helper = context.helperString return context.inline ? // setup scope bindings that may be refs need to be unrefed `${context.helperString(UNREF)}(${fromMaybeRef})` - : `$setup[${JSON.stringify(fromMaybeRef)}]` + : isLateTag(fromMaybeRef) + ? `${helper(getResolveLateAddedTagHelper())}(${JSON.stringify(fromMaybeRef)}, 'setupState')` + : `$setup[${JSON.stringify(fromMaybeRef)}]` } const fromProps = checkType(BindingTypes.PROPS) if (fromProps) { - return `${context.helperString(UNREF)}(${ - context.inline ? '__props' : '$props' - }[${JSON.stringify(fromProps)}])` + const helper = context.helperString + const fromPropsStr = JSON.stringify(fromProps) + let propsCode = context.inline + ? `__props[${fromPropsStr}]` + : isLateTag(fromProps) + ? `${helper(getResolveLateAddedTagHelper())}(${fromPropsStr}, 'props')` + : `$props[${fromPropsStr}]` + return `${helper(UNREF)}(${propsCode})` } } diff --git a/packages/runtime-core/src/helpers/resolveAssets.ts b/packages/runtime-core/src/helpers/resolveAssets.ts index 4fbbc8fc723..57a74d4e72c 100644 --- a/packages/runtime-core/src/helpers/resolveAssets.ts +++ b/packages/runtime-core/src/helpers/resolveAssets.ts @@ -1,6 +1,5 @@ import { type ComponentInternalInstance, - type ComponentInternalOptions, type ComponentOptions, type ConcreteComponent, currentInstance, @@ -158,19 +157,23 @@ function resolve(registry: Record | undefined, name: string) { /** * @private */ -export function resolveLateAddedTag(name: string): unknown { - if (!currentRenderingInstance || !currentRenderingInstance.setupState) - return name - const setupState = currentRenderingInstance.setupState - const returnValue = setupState[name] +export function resolveLateAddedTag( + name: string, + key: 'setupState' | 'props', +): unknown { + if (!currentRenderingInstance || !currentRenderingInstance[key]) return name + const data = currentRenderingInstance[key] + const value = data[name] + // Only the render function for the value is parsed as a component + // and a warning is reported if ( __DEV__ && - returnValue && - (returnValue as ComponentInternalOptions).__file && + value && + (value as ComponentInternalInstance).render && isLateTag(name as string) ) { const extra = `\nplease do not use built-in tag names as component names.` warn(`Failed to resolve component: ${name},${extra}`) } - return returnValue + return value } From 52369c2c0487b09a63b88285abd7171493df49af Mon Sep 17 00:00:00 2001 From: baiwusanyu-c <740132583@qq.com> Date: Tue, 8 Jul 2025 16:48:42 +0800 Subject: [PATCH 7/7] chore: added unit test --- .../transforms/transformElement.spec.ts | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts index 860d85a170c..f93e1131b6d 100644 --- a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts +++ b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts @@ -100,13 +100,37 @@ describe('compiler: element transform', () => { }) test('resolve component from setup bindings & component', () => { - const { root, node } = parseWithElementTransform(``, { + const { root, node } = parseWithElementTransform(``, { bindingMetadata: { - Example: BindingTypes.SETUP_CONST, + search: BindingTypes.SETUP_CONST, + }, + isNativeTag: (tag: string) => tag !== 'search', + }) + expect(root.helpers).not.toContain(RESOLVE_COMPONENT) + expect(node.tag).toBe(`_resolveLateAddedTag("search", 'setupState')`) + + const { root: root2, node: node2 } = parseWithElementTransform( + ``, + { + bindingMetadata: { + search: BindingTypes.SETUP_LET, + }, + isNativeTag: (tag: string) => tag !== 'search', + }, + ) + expect(root2.helpers).not.toContain(RESOLVE_COMPONENT) + expect(node2.tag).toBe(`_resolveLateAddedTag("search", 'setupState')`) + }) + + test('resolve component from props', () => { + const { root, node } = parseWithElementTransform(``, { + bindingMetadata: { + search: BindingTypes.PROPS, }, + isNativeTag: (tag: string) => tag !== 'search', }) expect(root.helpers).not.toContain(RESOLVE_COMPONENT) - expect(node.tag).toBe(`_resolveLateAddedTag("Example", $setup)`) + expect(node.tag).toBe(`_unref(_resolveLateAddedTag("search", 'props'))`) }) test('resolve component from setup bindings (inline)', () => {