diff --git a/src/core/resolvers/tdesign.ts b/src/core/resolvers/tdesign.ts index 8ea9e404..2fbb5122 100644 --- a/src/core/resolvers/tdesign.ts +++ b/src/core/resolvers/tdesign.ts @@ -25,6 +25,12 @@ export interface TDesignResolverOptions { * @default false */ esm?: boolean + + /** + * exclude component name, if match do not resolve the name + * + */ + exclude?: string | RegExp | (string | RegExp)[] } function getSideEffects(importName: string, options: TDesignResolverOptions): SideEffectsInfo | undefined { @@ -91,9 +97,12 @@ export function TDesignResolver(options: TDesignResolverOptions = {}): Component return { type: 'component', resolve: (name: string) => { - const { library = 'vue' } = options + const { library = 'vue', exclude } = options const importFrom = options.esm ? '/esm' : '' + if (options.exclude && isExclude(name, exclude)) + return + if (options.resolveIcons && name.match(/[a-z]Icon$/)) { return { name, @@ -113,3 +122,19 @@ export function TDesignResolver(options: TDesignResolverOptions = {}): Component }, } } + +function isExclude(name: string, exclude: string | RegExp | (string | RegExp)[] | undefined): boolean { + if (typeof exclude === 'string') + return name === exclude + + if (exclude instanceof RegExp) + return !!name.match(exclude) + + if (Array.isArray(exclude)) { + for (const item of exclude) { + if (name === item || name.match(item)) + return true + } + } + return false +} diff --git a/test/resolvers/tdesign.test.ts b/test/resolvers/tdesign.test.ts new file mode 100644 index 00000000..c3a86b4e --- /dev/null +++ b/test/resolvers/tdesign.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest' +import { TDesignResolver } from '../../src/resolvers' + +import type { ComponentResolveResult, ComponentResolverObject } from '../../src' + +describe('TDesignResolver', () => { + it('name matching string rule should not be resolved', async () => { + const resolver = TDesignResolver({ exclude: 'TString' }) as ComponentResolverObject + expect(resolver.resolve('TString')).toBeFalsy() + }) + + it('name matching RegExp rule should not be resolved', async () => { + const resolver = TDesignResolver({ exclude: /^TDoc[A-Z]/ }) as ComponentResolverObject + expect(resolver.resolve('TDocRegExp')).toBeFalsy() + }) + + it('name matching Array rule should not be resolved', async () => { + const resolver = TDesignResolver({ exclude: ['TString', /^TDoc[A-Z]/] }) as ComponentResolverObject + expect(resolver.resolve('TString')).toBeFalsy() + expect(resolver.resolve('TDocRegExp')).toBeFalsy() + }) +})