Skip to content

Commit f0c1c03

Browse files
committed
feat(compiler-vapor): resolve implicitly self-referencing component
1 parent 1ef6e6e commit f0c1c03

File tree

5 files changed

+33
-5
lines changed

5 files changed

+33
-5
lines changed

packages/compiler-core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export {
1717
createTransformContext,
1818
traverseNode,
1919
createStructuralDirectiveTransform,
20+
getSelfName,
2021
type NodeTransform,
2122
type StructuralDirectiveTransform,
2223
type DirectiveTransform,

packages/compiler-core/src/transform.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ export interface TransformContext
123123
filters?: Set<string>
124124
}
125125

126+
export function getSelfName(filename: string): string | null {
127+
const nameMatch = filename.replace(/\?.*$/, '').match(/([^/\\]+)\.\w+$/)
128+
return nameMatch ? capitalize(camelize(nameMatch[1])) : null
129+
}
130+
126131
export function createTransformContext(
127132
root: RootNode,
128133
{
@@ -150,11 +155,10 @@ export function createTransformContext(
150155
compatConfig,
151156
}: TransformOptions,
152157
): TransformContext {
153-
const nameMatch = filename.replace(/\?.*$/, '').match(/([^/\\]+)\.\w+$/)
154158
const context: TransformContext = {
155159
// options
156160
filename,
157-
selfName: nameMatch && capitalize(camelize(nameMatch[1])),
161+
selfName: getSelfName(filename),
158162
prefixIdentifiers,
159163
hoistStatic,
160164
hmr,

packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,16 @@ export function render(_ctx, $props, $emit, $attrs, $slots) {
7777
}"
7878
`;
7979

80+
exports[`compiler: element transform > component > resolve implicitly self-referencing component 1`] = `
81+
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
82+
83+
export function render(_ctx) {
84+
const _component_Example = _resolveComponent("Example", true)
85+
const n0 = _createComponentWithFallback(_component_Example, null, null, true)
86+
return n0
87+
}"
88+
`;
89+
8090
exports[`compiler: element transform > component > resolve namespaced component from props bindings (inline) 1`] = `
8191
"
8292
const n0 = _createComponent(Foo.Example, null, null, true)

packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@ describe('compiler: element transform', () => {
3939
})
4040
})
4141

42-
test.todo('resolve implicitly self-referencing component', () => {
42+
test('resolve implicitly self-referencing component', () => {
4343
const { code, helpers } = compileWithElementTransform(`<Example/>`, {
4444
filename: `/foo/bar/Example.vue?vue&type=template`,
4545
})
4646
expect(code).toMatchSnapshot()
47+
expect(code).toContain('_resolveComponent("Example", true)')
4748
expect(helpers).toContain('resolveComponent')
4849
})
4950

packages/compiler-vapor/src/generators/block.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
import type { CodegenContext } from '../generate'
1313
import { genEffects, genOperations } from './operation'
1414
import { genChildren, genSelf } from './template'
15-
import { toValidAssetId } from '@vue/compiler-dom'
15+
import { getSelfName, toValidAssetId } from '@vue/compiler-dom'
1616

1717
export function genBlock(
1818
oper: BlockIRNode,
@@ -44,7 +44,19 @@ export function genBlockContent(
4444
const resetBlock = context.enterBlock(block)
4545

4646
if (root) {
47-
genResolveAssets('component', 'resolveComponent')
47+
const selfName = getSelfName(context.options.filename)
48+
for (const name of context.ir.component) {
49+
push(
50+
NEWLINE,
51+
`const ${toValidAssetId(name, 'component')} = `,
52+
...genCall(
53+
context.helper('resolveComponent'),
54+
JSON.stringify(name),
55+
// pass additional `maybeSelfReference` flag
56+
selfName === name ? 'true' : undefined,
57+
),
58+
)
59+
}
4860
genResolveAssets('directive', 'resolveDirective')
4961
}
5062

0 commit comments

Comments
 (0)