diff --git a/src/core/options.ts b/src/core/options.ts index 4ac7cd9c..699062bc 100644 --- a/src/core/options.ts +++ b/src/core/options.ts @@ -3,6 +3,7 @@ import { join, resolve } from 'node:path' import { slash, toArray } from '@antfu/utils' import { getPackageInfoSync, isPackageExists } from 'local-pkg' import { detectTypeImports } from './type-imports/detect' +import { escapeSpecialChars } from './utils' export const defaultOptions: Omit, 'include' | 'exclude' | 'excludeNames' | 'transformer' | 'globs' | 'globsExclude' | 'directives' | 'types' | 'version'> = { dirs: 'src/components', @@ -63,8 +64,8 @@ export function resolveOptions(options: Options, root: string): ResolvedOptions i = i.slice(1) } return resolved.deep - ? prefix + slash(join(i, `**/*.${extsGlob}`)) - : prefix + slash(join(i, `*.${extsGlob}`)) + ? prefix + escapeSpecialChars(slash(join(i, `**/*.${extsGlob}`))) + : prefix + escapeSpecialChars(slash(join(i, `*.${extsGlob}`))) }) if (!resolved.extensions.length) diff --git a/src/core/utils.ts b/src/core/utils.ts index 53e1c132..ab86231d 100644 --- a/src/core/utils.ts +++ b/src/core/utils.ts @@ -242,3 +242,9 @@ export function isExclude(name: string, exclude?: FilterPattern): boolean { } return false } + +const ESCAPE_PARENTHESES_REGEX = /[()]/g + +export function escapeSpecialChars(str: string): string { + return str.replace(ESCAPE_PARENTHESES_REGEX, '\\$&') +} diff --git a/test/utils.test.ts b/test/utils.test.ts index cdabab87..a9f38bf2 100644 --- a/test/utils.test.ts +++ b/test/utils.test.ts @@ -1,6 +1,6 @@ import type { ResolvedOptions } from '../src' import { describe, expect, it } from 'vitest' -import { getNameFromFilePath } from '../src/core/utils' +import { escapeSpecialChars, getNameFromFilePath } from '../src/core/utils' describe('getNameFromFilePath', () => { const options: Partial = { @@ -20,3 +20,9 @@ describe('getNameFromFilePath', () => { expect(getNameFromFilePath(inComponentFilePath, options as ResolvedOptions)).toBe('a1-b2-c3-d4-ef-ghi') }) }) + +describe('escapeSpecialChars', () => { + it('should escape parentheses', () => { + expect(escapeSpecialChars('component()')).toBe('component\\(\\)') + }) +})