55 lines
2.1 KiB
JavaScript
55 lines
2.1 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.findMaxDepth = exports.findDirectoryPatterns = exports.findCommonRoots = void 0;
|
|
// Glob Optimizations:
|
|
// 1. Find common roots and only iterate on them
|
|
// For example:
|
|
// 1. "node_modules/**/*.ts" only requires us to search in node_modules
|
|
// folder.
|
|
// 2. Similarly, multiple glob patterns can have common deterministic roots
|
|
// The optimizer's job is to find these roots and only crawl them.
|
|
// 3. If any of the glob patterns have a globstar i.e. **/ in them, we
|
|
// should bail out.
|
|
// 2. Find out if glob is requesting only directories
|
|
// 3. Find maximum depth requested
|
|
// 4. If glob contains a root that doesn't exist, bail out
|
|
const braces_1 = require("braces");
|
|
const glob_parent_1 = __importDefault(require("glob-parent"));
|
|
function findCommonRoots(patterns) {
|
|
const allRoots = new Set();
|
|
patterns = patterns.map((p) => (p.includes("{") ? (0, braces_1.expand)(p) : p)).flat();
|
|
for (const pattern of patterns) {
|
|
const parent = (0, glob_parent_1.default)(pattern);
|
|
if (parent === ".")
|
|
return [];
|
|
allRoots.add(parent);
|
|
}
|
|
return Array.from(allRoots.values()).filter((root) => {
|
|
for (const r of allRoots) {
|
|
if (r === root)
|
|
continue;
|
|
if (root.startsWith(r))
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
}
|
|
exports.findCommonRoots = findCommonRoots;
|
|
function findDirectoryPatterns(patterns) {
|
|
return patterns.filter((p) => p.endsWith("/"));
|
|
}
|
|
exports.findDirectoryPatterns = findDirectoryPatterns;
|
|
function findMaxDepth(patterns) {
|
|
const isGlobstar = patterns.some((p) => p.includes("**/") || p.includes("/**") || p === "**");
|
|
if (isGlobstar)
|
|
return false;
|
|
const maxDepth = patterns.reduce((depth, p) => {
|
|
return Math.max(depth, p.split("/").filter(Boolean).length);
|
|
}, 0);
|
|
return maxDepth;
|
|
}
|
|
exports.findMaxDepth = findMaxDepth;
|