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 ", 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') }) }) 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