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)', () => {