Skip to content

Commit d824eb7

Browse files
authored
fix: escape special characters in glob patterns (#858)
1 parent 881f82d commit d824eb7

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

src/core/options.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { join, resolve } from 'node:path'
33
import { slash, toArray } from '@antfu/utils'
44
import { getPackageInfoSync, isPackageExists } from 'local-pkg'
55
import { detectTypeImports } from './type-imports/detect'
6+
import { escapeSpecialChars } from './utils'
67

78
export const defaultOptions: Omit<Required<Options>, 'include' | 'exclude' | 'excludeNames' | 'transformer' | 'globs' | 'globsExclude' | 'directives' | 'types' | 'version'> = {
89
dirs: 'src/components',
@@ -63,8 +64,8 @@ export function resolveOptions(options: Options, root: string): ResolvedOptions
6364
i = i.slice(1)
6465
}
6566
return resolved.deep
66-
? prefix + slash(join(i, `**/*.${extsGlob}`))
67-
: prefix + slash(join(i, `*.${extsGlob}`))
67+
? prefix + escapeSpecialChars(slash(join(i, `**/*.${extsGlob}`)))
68+
: prefix + escapeSpecialChars(slash(join(i, `*.${extsGlob}`)))
6869
})
6970

7071
if (!resolved.extensions.length)

src/core/utils.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,3 +242,9 @@ export function isExclude(name: string, exclude?: FilterPattern): boolean {
242242
}
243243
return false
244244
}
245+
246+
const ESCAPE_PARENTHESES_REGEX = /[()]/g
247+
248+
export function escapeSpecialChars(str: string): string {
249+
return str.replace(ESCAPE_PARENTHESES_REGEX, '\\$&')
250+
}

test/utils.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { ResolvedOptions } from '../src'
22
import { describe, expect, it } from 'vitest'
3-
import { getNameFromFilePath } from '../src/core/utils'
3+
import { escapeSpecialChars, getNameFromFilePath } from '../src/core/utils'
44

55
describe('getNameFromFilePath', () => {
66
const options: Partial<ResolvedOptions> = {
@@ -20,3 +20,9 @@ describe('getNameFromFilePath', () => {
2020
expect(getNameFromFilePath(inComponentFilePath, options as ResolvedOptions)).toBe('a1-b2-c3-d4-ef-ghi')
2121
})
2222
})
23+
24+
describe('escapeSpecialChars', () => {
25+
it('should escape parentheses', () => {
26+
expect(escapeSpecialChars('component()')).toBe('component\\(\\)')
27+
})
28+
})

0 commit comments

Comments
 (0)