From a89b340b3de7162a42cd9e7c1298cfc8aa3e3805 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Wed, 19 Feb 2025 13:16:02 +0800 Subject: [PATCH 1/2] feat: support transform user's `resolveComponent` usage, and enable by default refer to https://github.com/nuxt/ui/issues/3235 --- src/core/options.ts | 2 ++ src/core/transforms/component.ts | 15 +++++++++--- src/core/transforms/directive/vue3.ts | 11 +++++++-- src/types.ts | 10 ++++++++ test/__snapshots__/transform.test.ts.snap | 30 +++++++++++++++++++++-- test/transform.test.ts | 19 +++++++++++--- 6 files changed, 77 insertions(+), 10 deletions(-) diff --git a/src/core/options.ts b/src/core/options.ts index 1c3277cd..2c3939dc 100644 --- a/src/core/options.ts +++ b/src/core/options.ts @@ -14,6 +14,8 @@ export const defaultOptions: Omit, 'include' | 'exclude' | 'ex collapseSamePrefixes: false, globalNamespaces: [], + transformerUserResolveFunctions: true, + resolvers: [], globsExclude: [], diff --git a/src/core/transforms/component.ts b/src/core/transforms/component.ts index 7d2bc2ce..8ca78d51 100644 --- a/src/core/transforms/component.ts +++ b/src/core/transforms/component.ts @@ -24,13 +24,20 @@ function resolveVue2(code: string, s: MagicString) { return results } -function resolveVue3(code: string, s: MagicString) { +function resolveVue3( + code: string, + s: MagicString, + transformerUserResolveFunctions: boolean, +) { const results: ResolveResult[] = [] /** * when using some plugin like plugin-vue-jsx, resolveComponent will be imported as resolveComponent1 to avoid duplicate import */ - for (const match of code.matchAll(/_resolveComponent\d*\("(.+?)"\)/g)) { + for (const match of code.matchAll(/_?resolveComponent\d*\("(.+?)"\)/g)) { + if (!transformerUserResolveFunctions && !match[0].startsWith('_')) { + continue + } const matchedName = match[1] if (match.index != null && matchedName && !matchedName.startsWith('_')) { const start = match.index @@ -48,7 +55,9 @@ function resolveVue3(code: string, s: MagicString) { export default async function transformComponent(code: string, transformer: SupportedTransformer, s: MagicString, ctx: Context, sfcPath: string) { let no = 0 - const results = transformer === 'vue2' ? resolveVue2(code, s) : resolveVue3(code, s) + const results = transformer === 'vue2' + ? resolveVue2(code, s) + : resolveVue3(code, s, ctx.options.transformerUserResolveFunctions) for (const { rawName, replace } of results) { debug(`| ${rawName}`) diff --git a/src/core/transforms/directive/vue3.ts b/src/core/transforms/directive/vue3.ts index 20236517..d62aa53a 100644 --- a/src/core/transforms/directive/vue3.ts +++ b/src/core/transforms/directive/vue3.ts @@ -1,11 +1,18 @@ import type MagicString from 'magic-string' import type { ResolveResult } from '../../transformer' -export default function resolveVue3(code: string, s: MagicString): ResolveResult[] { +export default function resolveVue3( + code: string, + s: MagicString, + transformerUserResolveFunctions?: boolean, +): ResolveResult[] { const results: ResolveResult[] = [] - for (const match of code.matchAll(/_resolveDirective\("(.+?)"\)/g)) { + for (const match of code.matchAll(/_?resolveDirective\("(.+?)"\)/g)) { const matchedName = match[1] + if (!transformerUserResolveFunctions && !match[0].startsWith('_')) { + continue + } if (match.index != null && matchedName && !matchedName.startsWith('_')) { const start = match.index const end = start + match[0].length diff --git a/src/types.ts b/src/types.ts index 4fe0adac..f16133a7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -150,6 +150,16 @@ export interface Options { */ transformer?: SupportedTransformer + /** + * Tranform users' usage of resolveComponent/resolveDirective as well + * + * If disabled, only components inside templates (which compiles to `_resolveComponent` etc.) + * will be transformed. + * + * @default true + */ + transformerUserResolveFunctions?: boolean + /** * Generate TypeScript declaration for global components * diff --git a/test/__snapshots__/transform.test.ts.snap b/test/__snapshots__/transform.test.ts.snap index c30dcf39..14fb2184 100644 --- a/test/__snapshots__/transform.test.ts.snap +++ b/test/__snapshots__/transform.test.ts.snap @@ -103,7 +103,7 @@ exports[`transform > vue2 transform with jsx should work 1`] = ` } `; -exports[`transform > vue3 transform should work 1`] = ` +exports[`transform > vue3 transform should work > no-user-resolve 1`] = ` { "code": "/* unplugin-vue-components disabled */import __unplugin_directives_0 from 'test/directive/Loading'; import __unplugin_components_0 from 'test/component/TestComp'; @@ -111,9 +111,35 @@ import __unplugin_components_0 from 'test/component/TestComp'; const render = (_ctx, _cache) => { const _component_test_comp = __unplugin_components_0 const _directive_loading = __unplugin_directives_0 - + + const _resolveNoUnderscore = resolveComponent("test-comp") + + return _withDirectives( + (_openBlock(), + _createBlock(_resolveNoUnderscore, null, null, 512 /* NEED_PATCH */)), + _createBlock(_component_test_comp, null, null, 512 /* NEED_PATCH */)), + [[_directive_loading, 123]] + ) + } + ", +} +`; + +exports[`transform > vue3 transform should work > with-user-resolve 1`] = ` +{ + "code": "/* unplugin-vue-components disabled */import __unplugin_directives_0 from 'test/directive/Loading'; +import __unplugin_components_1 from 'test/component/TestComp'; +import __unplugin_components_0 from 'test/component/TestComp'; + + const render = (_ctx, _cache) => { + const _component_test_comp = __unplugin_components_0 + const _directive_loading = __unplugin_directives_0 + + const _resolveNoUnderscore = __unplugin_components_1 + return _withDirectives( (_openBlock(), + _createBlock(_resolveNoUnderscore, null, null, 512 /* NEED_PATCH */)), _createBlock(_component_test_comp, null, null, 512 /* NEED_PATCH */)), [[_directive_loading, 123]] ) diff --git a/test/transform.test.ts b/test/transform.test.ts index 5909896f..6544e5e1 100644 --- a/test/transform.test.ts +++ b/test/transform.test.ts @@ -67,22 +67,35 @@ describe('transform', () => { const render = (_ctx, _cache) => { const _component_test_comp = _resolveComponent("test-comp") const _directive_loading = _resolveDirective("loading") - + + const _resolveNoUnderscore = resolveComponent("test-comp") + return _withDirectives( (_openBlock(), + _createBlock(_resolveNoUnderscore, null, null, 512 /* NEED_PATCH */)), _createBlock(_component_test_comp, null, null, 512 /* NEED_PATCH */)), [[_directive_loading, 123]] ) } ` - const ctx = new Context({ + let ctx = new Context({ resolvers: [resolver], transformer: 'vue3', + transformerUserResolveFunctions: false, directives: true, }) ctx.sourcemap = false - expect(await ctx.transform(code, '')).toMatchSnapshot() + expect(await ctx.transform(code, '')).toMatchSnapshot('no-user-resolve') + + ctx = new Context({ + resolvers: [resolver], + transformer: 'vue3', + transformerUserResolveFunctions: true, + directives: true, + }) + ctx.sourcemap = false + expect(await ctx.transform(code, '')).toMatchSnapshot('with-user-resolve') }) }) From 5591658092d0aec6932b3613343c80af0686623d Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Wed, 19 Feb 2025 13:17:15 +0800 Subject: [PATCH 2/2] chore: release v28.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4516bb9c..19c0076b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "unplugin-vue-components", "type": "module", - "version": "28.2.0", + "version": "28.3.0", "packageManager": "pnpm@10.4.0", "description": "Components auto importing for Vue", "author": "antfu ", 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