2025-04-02 06:50:39 -04:00

160 lines
5.5 KiB
JavaScript

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
exports.convertPatternGroupToTask =
exports.convertPatternGroupsToTasks =
exports.groupPatternsByBaseDirectory =
exports.getNegativePatternsAsPositive =
exports.getPositivePatterns =
exports.convertPatternsToTasks =
exports.generate =
void 0;
const utils = require('../utils');
function generate(input, settings) {
const patterns = processPatterns(input, settings);
const ignore = processPatterns(settings.ignore, settings);
const positivePatterns = getPositivePatterns(patterns);
const negativePatterns = getNegativePatternsAsPositive(patterns, ignore);
const staticPatterns = positivePatterns.filter((pattern) =>
utils.pattern.isStaticPattern(pattern, settings)
);
const dynamicPatterns = positivePatterns.filter((pattern) =>
utils.pattern.isDynamicPattern(pattern, settings)
);
const staticTasks = convertPatternsToTasks(
staticPatterns,
negativePatterns,
/* dynamic */ false
);
const dynamicTasks = convertPatternsToTasks(
dynamicPatterns,
negativePatterns,
/* dynamic */ true
);
return staticTasks.concat(dynamicTasks);
}
exports.generate = generate;
function processPatterns(input, settings) {
let patterns = input;
/**
* The original pattern like `{,*,**,a/*}` can lead to problems checking the depth when matching entry
* and some problems with the micromatch package (see fast-glob issues: #365, #394).
*
* To solve this problem, we expand all patterns containing brace expansion. This can lead to a slight slowdown
* in matching in the case of a large set of patterns after expansion.
*/
if (settings.braceExpansion) {
patterns = utils.pattern.expandPatternsWithBraceExpansion(patterns);
}
/**
* If the `baseNameMatch` option is enabled, we must add globstar to patterns, so that they can be used
* at any nesting level.
*
* We do this here, because otherwise we have to complicate the filtering logic. For example, we need to change
* the pattern in the filter before creating a regular expression. There is no need to change the patterns
* in the application. Only on the input.
*/
if (settings.baseNameMatch) {
patterns = patterns.map((pattern) =>
pattern.includes('/') ? pattern : `**/${pattern}`
);
}
/**
* This method also removes duplicate slashes that may have been in the pattern or formed as a result of expansion.
*/
return patterns.map((pattern) =>
utils.pattern.removeDuplicateSlashes(pattern)
);
}
/**
* Returns tasks grouped by basic pattern directories.
*
* Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately.
* This is necessary because directory traversal starts at the base directory and goes deeper.
*/
function convertPatternsToTasks(positive, negative, dynamic) {
const tasks = [];
const patternsOutsideCurrentDirectory =
utils.pattern.getPatternsOutsideCurrentDirectory(positive);
const patternsInsideCurrentDirectory =
utils.pattern.getPatternsInsideCurrentDirectory(positive);
const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(
patternsOutsideCurrentDirectory
);
const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(
patternsInsideCurrentDirectory
);
tasks.push(
...convertPatternGroupsToTasks(
outsideCurrentDirectoryGroup,
negative,
dynamic
)
);
/*
* For the sake of reducing future accesses to the file system, we merge all tasks within the current directory
* into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest.
*/
if ('.' in insideCurrentDirectoryGroup) {
tasks.push(
convertPatternGroupToTask(
'.',
patternsInsideCurrentDirectory,
negative,
dynamic
)
);
} else {
tasks.push(
...convertPatternGroupsToTasks(
insideCurrentDirectoryGroup,
negative,
dynamic
)
);
}
return tasks;
}
exports.convertPatternsToTasks = convertPatternsToTasks;
function getPositivePatterns(patterns) {
return utils.pattern.getPositivePatterns(patterns);
}
exports.getPositivePatterns = getPositivePatterns;
function getNegativePatternsAsPositive(patterns, ignore) {
const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore);
const positive = negative.map(utils.pattern.convertToPositivePattern);
return positive;
}
exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive;
function groupPatternsByBaseDirectory(patterns) {
const group = {};
return patterns.reduce((collection, pattern) => {
const base = utils.pattern.getBaseDirectory(pattern);
if (base in collection) {
collection[base].push(pattern);
} else {
collection[base] = [pattern];
}
return collection;
}, group);
}
exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;
function convertPatternGroupsToTasks(positive, negative, dynamic) {
return Object.keys(positive).map((base) => {
return convertPatternGroupToTask(base, positive[base], negative, dynamic);
});
}
exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks;
function convertPatternGroupToTask(base, positive, negative, dynamic) {
return {
dynamic,
positive,
negative,
base,
patterns: [].concat(
positive,
negative.map(utils.pattern.convertToNegativePattern)
),
};
}
exports.convertPatternGroupToTask = convertPatternGroupToTask;