57 lines
2.0 KiB
TypeScript

import type { Matcher } from 'picomatch'
import { toArray, uniq } from '@pengzhanbo/utils'
import picomatch from 'picomatch'
/**
* Resolve include and exclude patterns into pattern and ignore arrays.
* Converts various pattern formats into a standardized format for matching.
*
* 将 include 和 exclude 模式解析为 pattern 和 ignore 数组。
* 将各种模式格式转换为用于匹配的标准化格式。
*
* @param include - Patterns to include, can be string or array / 要包含的模式,可以是字符串或数组
* @param exclude - Patterns to exclude, can be string or array / 要排除的模式,可以是字符串或数组
* @returns Object containing pattern and ignore arrays / 包含 pattern 和 ignore 数组的对象
*/
export function resolveMatcherPattern(include?: string | string[], exclude?: string | string[]): {
pattern: string[]
ignore: string[]
} {
const pattern: string[] = []
const ignore: string[] = uniq(toArray(exclude))
if (!include || include.length === 0) {
pattern.push('**/*.md')
}
else {
toArray(include).forEach((item) => {
if (item.startsWith('!')) {
ignore.push(item.slice(1))
}
else {
pattern.push(item)
}
})
}
return { pattern, ignore }
}
/**
* Create a file matcher function using picomatch.
* Returns a function that tests if a file path matches the given patterns.
*
* 使用 picomatch 创建文件匹配器函数。
* 返回一个测试文件路径是否匹配给定模式的函数。
*
* @param include - Patterns to include / 要包含的模式
* @param exclude - Patterns to exclude / 要排除的模式
* @returns Matcher function that tests file paths / 测试文件路径的匹配器函数
*/
export function createMatcher(include?: string | string[], exclude?: string | string[]): Matcher {
exclude = ['**/node_modules/**', '**/.vuepress/**', ...toArray(exclude)]
const { pattern, ignore } = resolveMatcherPattern(include, exclude)
return picomatch(pattern, { ignore })
}