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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy