| "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(patterns, settings) { |
| const positivePatterns = getPositivePatterns(patterns); |
| const negativePatterns = getNegativePatternsAsPositive(patterns, settings.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; |
| /** |
| * 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; |