76 lines
11 KiB
JavaScript
76 lines
11 KiB
JavaScript
"use strict";
|
|||
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
|
exports.createIgnoreMatcher = createIgnoreMatcher;
|
||
|
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||
|
|
const picomatch = require("picomatch");
|
||
|
|
/**
|
||
|
|
* Normalizes a pattern to ensure it matches files within directories.
|
||
|
|
* If a pattern doesn't contain glob characters, it's treated as a directory
|
||
|
|
* and `/**` is appended to match all files within it.
|
||
|
|
*
|
||
|
|
* @param pattern - The pattern to normalize
|
||
|
|
* @returns The normalized pattern
|
||
|
|
*/
|
||
|
|
function normalizePattern(pattern) {
|
||
|
|
// If pattern already contains glob characters, use as-is
|
||
|
|
if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {
|
||
|
|
return pattern;
|
||
|
|
}
|
||
|
|
// Otherwise, treat as a directory and match all files within
|
||
|
|
// Remove trailing slash if present, then append /**
|
||
|
|
const normalized = pattern.replace(/\/+$/, '');
|
||
|
|
return `${normalized}/**`;
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Creates a function that returns true if a file should be ignored.
|
||
|
|
* A file is ignored if:
|
||
|
|
* - It matches any exclude pattern, OR
|
||
|
|
* - It does NOT match any include pattern
|
||
|
|
*
|
||
|
|
* This replicates the behavior of chokidar v3's glob pattern support.
|
||
|
|
*
|
||
|
|
* @param options - The include and exclude patterns
|
||
|
|
* @returns A function that takes a file path and returns true if it should be ignored
|
||
|
|
*/
|
||
|
|
function createIgnoreMatcher(options) {
|
||
|
|
const includePatterns = options.include && options.include.length > 0
|
||
|
|
? options.include.map(normalizePattern)
|
||
|
|
: ['**'];
|
||
|
|
const excludePatterns = (options.exclude ?? []).map(normalizePattern);
|
||
|
|
const rootDir = options.rootDir ? options.rootDir.replace(/\\/g, '/').replace(/\/+$/, '') : undefined;
|
||
|
|
// Compile patterns into matchers for better performance
|
||
|
|
const picomatchOptions = {
|
||
|
|
dot: true, // Match dotfiles when pattern explicitly includes them
|
||
|
|
};
|
||
|
|
const includeMatcher = picomatch(includePatterns, picomatchOptions);
|
||
|
|
const excludeMatcher = excludePatterns.length > 0
|
||
|
|
? picomatch(excludePatterns, picomatchOptions)
|
||
|
|
: () => false;
|
||
|
|
return (filePath) => {
|
||
|
|
// Normalize path separators for cross-platform compatibility
|
||
|
|
let normalizedPath = filePath.replace(/\\/g, '/');
|
||
|
|
// If rootDir is provided and the path appears to be absolute, make it relative
|
||
|
|
// This is necessary because chokidar v4 passes absolute paths to the
|
||
|
|
// ignored callback even when a cwd is specified
|
||
|
|
if (rootDir) {
|
||
|
|
if (normalizedPath.startsWith(rootDir + '/')) {
|
||
|
|
normalizedPath = normalizedPath.slice(rootDir.length + 1);
|
||
|
|
}
|
||
|
|
else if (normalizedPath === rootDir) {
|
||
|
|
// The root directory itself - don't ignore it
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// A file is ignored if:
|
||
|
|
// 1. It matches any exclude pattern, OR
|
||
|
|
// 2. It does NOT match any include pattern
|
||
|
|
if (excludeMatcher(normalizedPath)) {
|
||
|
|
return true; // Ignore: matches exclude
|
||
|
|
}
|
||
|
|
if (!includeMatcher(normalizedPath)) {
|
||
|
|
return true; // Ignore: doesn't match include
|
||
|
|
}
|
||
|
|
return false; // Don't ignore: matches include and doesn't match exclude
|
||
|
|
};
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYi1tYXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2xvYi1tYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeURBLGtEQThDQztBQXZHRCxpRUFBaUU7QUFDakUsdUNBQXdDO0FBMEJ4Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFlO0lBQ3ZDLHlEQUF5RDtJQUN6RCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUUsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUNELDZEQUE2RDtJQUM3RCxvREFBb0Q7SUFDcEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsT0FBTyxHQUFHLFVBQVUsS0FBSyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsT0FBMkI7SUFDN0QsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNYLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN0RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRXRHLHdEQUF3RDtJQUN4RCxNQUFNLGdCQUFnQixHQUErQjtRQUNuRCxHQUFHLEVBQUUsSUFBSSxFQUFFLHVEQUF1RDtLQUNuRSxDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUMvQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQztRQUM5QyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBRWhCLE9BQU8sQ0FBQyxRQUFnQixFQUFXLEVBQUU7UUFDbkMsNkRBQTZEO1FBQzdELElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRWxELCtFQUErRTtRQUMvRSxxRUFBcUU7UUFDckUsZ0RBQWdEO1FBQ2hELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLGNBQWMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUQsQ0FBQztpQkFBTSxJQUFJLGNBQWMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDdEMsOENBQThDO2dCQUM5QyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLHdDQUF3QztRQUN4QywyQ0FBMkM7UUFDM0MsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtRQUN6QyxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLENBQUMsZ0NBQWdDO1FBQy9DLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxDQUFDLDBEQUEwRDtJQUMxRSxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmltcG9ydCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhIGdsb2IgbWF0Y2hlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdsb2JNYXRjaGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQYXR0ZXJucyBmb3IgZmlsZXMgdG8gaW5jbHVkZSAoZ2xvYiBwYXR0ZXJucylcbiAgICogQGRlZmF1bHQgWycqKiddIC0gbWF0Y2ggYWxsIGZpbGVzXG4gICAqL1xuICBpbmNsdWRlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFBhdHRlcm5zIGZvciBmaWxlcyB0byBleGNsdWRlIChnbG9iIHBhdHRlcm5zKVxuICAgKi9cbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9vdCBkaXJlY3RvcnkgZm9yIG1hdGNoaW5nLiBJZiBwcm92aWRlZCwgYWJzb2x1dGUgcGF0aHMgd2lsbCBiZVxuICAgKiBjb252ZXJ0ZWQgdG8gcmVsYXRpdmUgcGF0aHMgYmVmb3JlIG1hdGNoaW5nIGFnYWluc3QgcGF0dGVybnMuXG4gICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgY2hva2lkYXIgdjQgcGFzc2VzIGFic29sdXRlIHBhdGhzIHRvIHRoZVxuICAgKiBpZ25vcmVkIGNhbGxiYWNrIGV2ZW4gd2hlbiBhIGN3ZCBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICByb290RGlyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwYXR0ZXJuIHRvIGVuc3VyZSBpdCBtYXRjaGVzIGZpbGVzIHdpdGhpbiBkaXJlY3Rvcmllcy5cbiAqIElmIGEgcGF0dGVybiBkb2Vzbid0IGNvbnRhaW4gZ2xvYiBjaGFyYWN0ZXJzLCBpdCdzIHRyZWF0ZWQgYXMgYSBkaXJlY3RvcnlcbiAqIGFuZCBgLyoqYCBpcyBhcHBlbmRlZCB0byBtYXRjaCBhbGwgZmlsZXMgd2l0aGluIGl0LlxuICpcbiAqIEBwYXJhbSBwYXR0ZXJuIC0gVGhlIHBhdHRlcm4gdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBwYXR0ZXJuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSWYgcGF0dGVyb
|