Skip to content

Commit a89b340

Browse files
committed
feat: support transform user's resolveComponent usage, and enable by default
refer to nuxt/ui#3235
1 parent 1d2bb38 commit a89b340

File tree

6 files changed

+77
-10
lines changed

6 files changed

+77
-10
lines changed

src/core/options.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export const defaultOptions: Omit<Required<Options>, 'include' | 'exclude' | 'ex
1414
collapseSamePrefixes: false,
1515
globalNamespaces: [],
1616

17+
transformerUserResolveFunctions: true,
18+
1719
resolvers: [],
1820
globsExclude: [],
1921

src/core/transforms/component.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,20 @@ function resolveVue2(code: string, s: MagicString) {
2424
return results
2525
}
2626

27-
function resolveVue3(code: string, s: MagicString) {
27+
function resolveVue3(
28+
code: string,
29+
s: MagicString,
30+
transformerUserResolveFunctions: boolean,
31+
) {
2832
const results: ResolveResult[] = []
2933

3034
/**
3135
* when using some plugin like plugin-vue-jsx, resolveComponent will be imported as resolveComponent1 to avoid duplicate import
3236
*/
33-
for (const match of code.matchAll(/_resolveComponent\d*\("(.+?)"\)/g)) {
37+
for (const match of code.matchAll(/_?resolveComponent\d*\("(.+?)"\)/g)) {
38+
if (!transformerUserResolveFunctions && !match[0].startsWith('_')) {
39+
continue
40+
}
3441
const matchedName = match[1]
3542
if (match.index != null && matchedName && !matchedName.startsWith('_')) {
3643
const start = match.index
@@ -48,7 +55,9 @@ function resolveVue3(code: string, s: MagicString) {
4855
export default async function transformComponent(code: string, transformer: SupportedTransformer, s: MagicString, ctx: Context, sfcPath: string) {
4956
let no = 0
5057

51-
const results = transformer === 'vue2' ? resolveVue2(code, s) : resolveVue3(code, s)
58+
const results = transformer === 'vue2'
59+
? resolveVue2(code, s)
60+
: resolveVue3(code, s, ctx.options.transformerUserResolveFunctions)
5261

5362
for (const { rawName, replace } of results) {
5463
debug(`| ${rawName}`)

src/core/transforms/directive/vue3.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
import type MagicString from 'magic-string'
22
import type { ResolveResult } from '../../transformer'
33

4-
export default function resolveVue3(code: string, s: MagicString): ResolveResult[] {
4+
export default function resolveVue3(
5+
code: string,
6+
s: MagicString,
7+
transformerUserResolveFunctions?: boolean,
8+
): ResolveResult[] {
59
const results: ResolveResult[] = []
610

7-
for (const match of code.matchAll(/_resolveDirective\("(.+?)"\)/g)) {
11+
for (const match of code.matchAll(/_?resolveDirective\("(.+?)"\)/g)) {
812
const matchedName = match[1]
13+
if (!transformerUserResolveFunctions && !match[0].startsWith('_')) {
14+
continue
15+
}
916
if (match.index != null && matchedName && !matchedName.startsWith('_')) {
1017
const start = match.index
1118
const end = start + match[0].length

src/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,16 @@ export interface Options {
150150
*/
151151
transformer?: SupportedTransformer
152152

153+
/**
154+
* Tranform users' usage of resolveComponent/resolveDirective as well
155+
*
156+
* If disabled, only components inside templates (which compiles to `_resolveComponent` etc.)
157+
* will be transformed.
158+
*
159+
* @default true
160+
*/
161+
transformerUserResolveFunctions?: boolean
162+
153163
/**
154164
* Generate TypeScript declaration for global components
155165
*

test/__snapshots__/transform.test.ts.snap

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,43 @@ exports[`transform > vue2 transform with jsx should work 1`] = `
103103
}
104104
`;
105105

106-
exports[`transform > vue3 transform should work 1`] = `
106+
exports[`transform > vue3 transform should work > no-user-resolve 1`] = `
107107
{
108108
"code": "/* unplugin-vue-components disabled */import __unplugin_directives_0 from 'test/directive/Loading';
109109
import __unplugin_components_0 from 'test/component/TestComp';
110110
111111
const render = (_ctx, _cache) => {
112112
const _component_test_comp = __unplugin_components_0
113113
const _directive_loading = __unplugin_directives_0
114-
114+
115+
const _resolveNoUnderscore = resolveComponent("test-comp")
116+
117+
return _withDirectives(
118+
(_openBlock(),
119+
_createBlock(_resolveNoUnderscore, null, null, 512 /* NEED_PATCH */)),
120+
_createBlock(_component_test_comp, null, null, 512 /* NEED_PATCH */)),
121+
[[_directive_loading, 123]]
122+
)
123+
}
124+
",
125+
}
126+
`;
127+
128+
exports[`transform > vue3 transform should work > with-user-resolve 1`] = `
129+
{
130+
"code": "/* unplugin-vue-components disabled */import __unplugin_directives_0 from 'test/directive/Loading';
131+
import __unplugin_components_1 from 'test/component/TestComp';
132+
import __unplugin_components_0 from 'test/component/TestComp';
133+
134+
const render = (_ctx, _cache) => {
135+
const _component_test_comp = __unplugin_components_0
136+
const _directive_loading = __unplugin_directives_0
137+
138+
const _resolveNoUnderscore = __unplugin_components_1
139+
115140
return _withDirectives(
116141
(_openBlock(),
142+
_createBlock(_resolveNoUnderscore, null, null, 512 /* NEED_PATCH */)),
117143
_createBlock(_component_test_comp, null, null, 512 /* NEED_PATCH */)),
118144
[[_directive_loading, 123]]
119145
)

test/transform.test.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,35 @@ describe('transform', () => {
6767
const render = (_ctx, _cache) => {
6868
const _component_test_comp = _resolveComponent("test-comp")
6969
const _directive_loading = _resolveDirective("loading")
70-
70+
71+
const _resolveNoUnderscore = resolveComponent("test-comp")
72+
7173
return _withDirectives(
7274
(_openBlock(),
75+
_createBlock(_resolveNoUnderscore, null, null, 512 /* NEED_PATCH */)),
7376
_createBlock(_component_test_comp, null, null, 512 /* NEED_PATCH */)),
7477
[[_directive_loading, 123]]
7578
)
7679
}
7780
`
7881

79-
const ctx = new Context({
82+
let ctx = new Context({
8083
resolvers: [resolver],
8184
transformer: 'vue3',
85+
transformerUserResolveFunctions: false,
8286
directives: true,
8387
})
8488
ctx.sourcemap = false
85-
expect(await ctx.transform(code, '')).toMatchSnapshot()
89+
expect(await ctx.transform(code, '')).toMatchSnapshot('no-user-resolve')
90+
91+
ctx = new Context({
92+
resolvers: [resolver],
93+
transformer: 'vue3',
94+
transformerUserResolveFunctions: true,
95+
directives: true,
96+
})
97+
ctx.sourcemap = false
98+
expect(await ctx.transform(code, '')).toMatchSnapshot('with-user-resolve')
8699
})
87100
})
88101

0 commit comments

Comments
 (0)