/** * 表示一个路径匹配器 * @example * const matcher = new Matcher() * matcher.include("*.js") * matcher.include("*.jsx") * matcher.exclude("y.js") * matcher.test("x.js") // true * matcher.test("x.jsx") // true * matcher.test("y.js") // false */ export declare class Matcher { /** 获取通配符的根文件夹路径 */ readonly baseDir: string; /** 判断是否忽略路径的大小写 */ readonly ignoreCase: boolean; /** * 初始化新的匹配器 * @param pattern 要添加的匹配模式 * @param baseDir 如果需要匹配绝对路径,则设置匹配的根绝对路径 * @param ignoreCase 是否忽略路径的大小写 */ constructor(pattern?: Pattern, baseDir?: string, ignoreCase?: boolean); /** 所有已解析的模式 */ private patterns?; /** 获取排除匹配器 */ excludeMatcher?: Matcher; /** * 添加一个匹配模式 * @param pattern 要添加的匹配模式 */ include(pattern: Pattern | undefined): void; /** 底层添加一个模式 */ private _addPattern; /** * 添加一个排除模式 * @param pattern 要排除的模式 */ exclude(pattern: Pattern | undefined): void; /** * 判断当前匹配器是否可以匹配指定的路径 * @param path 要判断的路径 * @param args 传递给自定义函数的参数 */ test(path: string, ...args: readonly any[]): boolean; /** 获取所有模式的公共基路径 */ get base(): string; /** 获取所有模式的所有公共基路径 */ getBases(): string[]; /** * 获取匹配结果的基路径 * @param path 要获取的路径 * @returns 如果没有匹配的基路径则返回 `null` */ baseOf(path: string): string; /** * 获取匹配结果对应的相对路径 * @param path 要获取的路径 * @returns 如果没有匹配的基路径则返回原路径 */ relative(path: string): string; } /** * 表示一个匹配模式,可以是通配符、正则表达式、自定义函数、匹配器或以上模式组成的数组 * @description * ##### 通配符 * 在通配符中可以使用以下特殊字符: * - `?`: 匹配固定一个字符,但 `/` 和文件名开头的 `.` 除外 * - `*`: 匹配任意个字符,但 `/` 和文件名开头的 `.` 除外 * - `**`: 匹配任意个字符,但文件名开头的 `.` 除外 * - `[abc]`: 匹配方括号中的任一个字符 * - `[a-z]`: 匹配 a 到 z 的任一个字符 * - `[!abc]`: 匹配方括号中的任一个字符以外的字符 * - `{abc,xyz}`: 匹配大括号中的任一种模式 * - `\`: 表示转义字符,如 `\[` 表示 `[` 按普通字符处理 * - `!xyz`:如果通配符以 `!` 开头,表示排除匹配的项,注意如果排除了父文件夹,出于性能考虑,无法重新包含其中的子文件 * - `;`: 分割多个通配符 * * `*` 和 `**` 的区别在于 `**` 可以匹配任意级文件夹,而 `*` 只能匹配一级, * 但如果通配符中没有 `/`(末尾的除外),则通配符只需匹配文件名部分 * * 通配符\路径 | `foo.js` | `dir/foo.js` | `dir/sub/foo.js` * ------------------|------------------|------------------|------------------ * *.js | 匹配 | 匹配 | 匹配 * ./*.js | 匹配 | 不匹配 | 不匹配 * dir/*.js | 不匹配 | 匹配 | 不匹配 * dir/**.js | 不匹配 | 匹配 | 匹配 * dir/*‌/foo.js | 不匹配 | 不匹配 | 匹配 * dir/**‌/foo.js | 不匹配 | 匹配 | 匹配 * * `*`、`**` 和 `?` 不匹配以 `.` 开头的文件名,要允许匹配,应写成 `{.,}*` * * 通配符 | 路径 | 结果 * -------------------|--------------------|-------------- * * | .js | 不匹配 * .* | .js | 匹配 * x*y | x.y | 匹配 * * | .git/config | 匹配 * **‌‌/* | .git/config | 不匹配 * * 如果通配符以 `/` 结尾,表示匹配文件夹;如果匹配了文件夹,等价于匹配内部的所有子文件 * * 默认地,通配符只负责逐字匹配,所以 `./`、`../` 等符号不会被特殊处理(除了开头的 `./`) * * 如果设置了 `baseDir`,则通配符只匹配绝对路径: * 1. 支持前缀 `../` * 2. Windows 下改用 `\` 作为分隔符 * 3. 如果通配符也是绝对路径,则 `[]`、`{}`、`\`(仅 Windows)作普通字符匹配 * * ##### 正则表达式 * 正则表达式的源是一个固定以 `/` 为分隔符的相对路径 * * ##### 自定义函数 * 函数接收原始路径为参数,如果函数返回 `true` 表示匹配该路径,如: * ```js * function match(path) { * return path.endsWith(".js") * } * ``` * * ##### 匹配器 * 可以从现成匹配器复制新的匹配器 * * ##### 数组 * 可以将以上模式自由组合成数组,只要匹配数组中任一个模式,就认定匹配当前模式 */ export declare type Pattern = string | RegExp | ResolvedPattern["test"] | Matcher | Pattern[]; /** 表示一个已解析的模式 */ interface ResolvedPattern { /** * 测试当前模式是否匹配指定的路径 * @param path 要测试的路径 * @param args 传递给自定义函数的参数 */ test(path: string, ...args: any[]): boolean; /** 当前模式的基路径 */ base: string; /** 下一个解析模式 */ next?: ResolvedPattern; } /** * 测试指定的路径是否匹配指定的模式 * @param path 要测试的路径 * @param pattern 要测试的匹配模式 * @param baseDir 如果需要匹配绝对路径,则设置匹配的根绝对路径 * @param ignoreCase 是否忽略路径的大小写 */ export declare function match(path: string, pattern: Pattern, baseDir?: string, ignoreCase?: boolean): boolean; /** * 判断指定的模式是否是通配符 * @param pattern 要判断的模式 */ export declare function isGlob(pattern: string): boolean; export {};