93 lines
3.3 KiB
JavaScript
93 lines
3.3 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.globSync = globSync;
|
|
const pathModule = require("path");
|
|
const glob_to_regex_js_1 = require("glob-to-regex.js");
|
|
const util_1 = require("./util");
|
|
const { join, relative, resolve } = pathModule.posix;
|
|
/**
|
|
* Check if a path matches a glob pattern
|
|
*/
|
|
function matchesPattern(path, pattern) {
|
|
const regex = (0, glob_to_regex_js_1.toRegex)(pattern);
|
|
return regex.test(path);
|
|
}
|
|
/**
|
|
* Check if a path should be excluded based on exclude patterns
|
|
*/
|
|
function isExcluded(path, exclude) {
|
|
if (!exclude)
|
|
return false;
|
|
if (typeof exclude === 'function') {
|
|
return exclude(path);
|
|
}
|
|
const patterns = Array.isArray(exclude) ? exclude : [exclude];
|
|
return patterns.some(pattern => matchesPattern(path, pattern));
|
|
}
|
|
/**
|
|
* Walk directory tree and collect matching paths
|
|
*/
|
|
function walkDirectory(fs, dir, patterns, options, currentDepth = 0) {
|
|
var _a;
|
|
const results = [];
|
|
const maxDepth = (_a = options.maxdepth) !== null && _a !== void 0 ? _a : Infinity;
|
|
const baseCwd = options.cwd ? (0, util_1.pathToFilename)(options.cwd) : process.cwd();
|
|
if (currentDepth > maxDepth) {
|
|
return results;
|
|
}
|
|
try {
|
|
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
for (const entry of entries) {
|
|
const fullPath = join(dir, entry.name.toString());
|
|
const relativePath = relative(baseCwd, fullPath);
|
|
// Skip if excluded
|
|
if (isExcluded(relativePath, options.exclude)) {
|
|
continue;
|
|
}
|
|
// Check if this path matches any pattern
|
|
const matches = patterns.some(pattern => matchesPattern(relativePath, pattern));
|
|
if (matches) {
|
|
results.push(relativePath);
|
|
}
|
|
// Recurse into directories
|
|
if (entry.isDirectory() && currentDepth < maxDepth) {
|
|
const subResults = walkDirectory(fs, fullPath, patterns, options, currentDepth + 1);
|
|
results.push(...subResults);
|
|
}
|
|
}
|
|
}
|
|
catch (err) {
|
|
// Skip directories we can't read
|
|
}
|
|
return results;
|
|
}
|
|
/**
|
|
* Main glob implementation
|
|
*/
|
|
function globSync(fs, pattern, options = {}) {
|
|
const cwd = options.cwd ? (0, util_1.pathToFilename)(options.cwd) : process.cwd();
|
|
const resolvedCwd = resolve(cwd);
|
|
const globOptions = {
|
|
cwd: resolvedCwd,
|
|
exclude: options.exclude,
|
|
maxdepth: options.maxdepth,
|
|
withFileTypes: options.withFileTypes || false,
|
|
};
|
|
let results = [];
|
|
// Handle absolute patterns
|
|
if (pathModule.posix.isAbsolute(pattern)) {
|
|
const dir = pathModule.posix.dirname(pattern);
|
|
const basename = pathModule.posix.basename(pattern);
|
|
const dirResults = walkDirectory(fs, dir, [basename], Object.assign(Object.assign({}, globOptions), { cwd: dir }));
|
|
results.push(...dirResults.map(r => pathModule.posix.resolve(dir, r)));
|
|
}
|
|
else {
|
|
// Handle relative patterns
|
|
const dirResults = walkDirectory(fs, resolvedCwd, [pattern], globOptions);
|
|
results.push(...dirResults);
|
|
}
|
|
// Remove duplicates and sort
|
|
results = [...new Set(results)].sort();
|
|
return results;
|
|
}
|
|
//# sourceMappingURL=glob.js.map
|