84 lines
3.5 KiB
JavaScript
84 lines
3.5 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var pathUtils = require("../../utils/path");
|
|
var patternUtils = require("../../utils/pattern");
|
|
var DeepFilter = /** @class */ (function () {
|
|
function DeepFilter(options, micromatchOptions) {
|
|
this.options = options;
|
|
this.micromatchOptions = micromatchOptions;
|
|
}
|
|
/**
|
|
* Returns filter for directories.
|
|
*/
|
|
DeepFilter.prototype.getFilter = function (positive, negative) {
|
|
var _this = this;
|
|
var maxPatternDepth = this.getMaxPatternDepth(positive);
|
|
var negativeRe = this.getNegativePatternsRe(negative);
|
|
return function (entry) { return _this.filter(entry, negativeRe, maxPatternDepth); };
|
|
};
|
|
/**
|
|
* Returns max depth of the provided patterns.
|
|
*/
|
|
DeepFilter.prototype.getMaxPatternDepth = function (patterns) {
|
|
var globstar = patterns.some(patternUtils.hasGlobStar);
|
|
return globstar ? Infinity : patternUtils.getMaxNaivePatternsDepth(patterns);
|
|
};
|
|
/**
|
|
* Returns RegExp's for patterns that can affect the depth of reading.
|
|
*/
|
|
DeepFilter.prototype.getNegativePatternsRe = function (patterns) {
|
|
var affectDepthOfReadingPatterns = patterns.filter(patternUtils.isAffectDepthOfReadingPattern);
|
|
return patternUtils.convertPatternsToRe(affectDepthOfReadingPatterns, this.micromatchOptions);
|
|
};
|
|
/**
|
|
* Returns «true» for directory that should be read.
|
|
*/
|
|
DeepFilter.prototype.filter = function (entry, negativeRe, maxPatternDepth) {
|
|
if (this.isSkippedByDeepOption(entry.depth)) {
|
|
return false;
|
|
}
|
|
if (this.isSkippedByMaxPatternDepth(entry.depth, maxPatternDepth)) {
|
|
return false;
|
|
}
|
|
if (this.isSkippedSymlinkedDirectory(entry)) {
|
|
return false;
|
|
}
|
|
if (this.isSkippedDotDirectory(entry)) {
|
|
return false;
|
|
}
|
|
return this.isSkippedByNegativePatterns(entry, negativeRe);
|
|
};
|
|
/**
|
|
* Returns «true» when the «deep» option is disabled or number and depth of the entry is greater that the option value.
|
|
*/
|
|
DeepFilter.prototype.isSkippedByDeepOption = function (entryDepth) {
|
|
return !this.options.deep || (typeof this.options.deep === 'number' && entryDepth >= this.options.deep);
|
|
};
|
|
/**
|
|
* Returns «true» when depth parameter is not an Infinity and entry depth greater that the parameter value.
|
|
*/
|
|
DeepFilter.prototype.isSkippedByMaxPatternDepth = function (entryDepth, maxPatternDepth) {
|
|
return maxPatternDepth !== Infinity && entryDepth >= maxPatternDepth;
|
|
};
|
|
/**
|
|
* Returns «true» for symlinked directory if the «followSymlinkedDirectories» option is disabled.
|
|
*/
|
|
DeepFilter.prototype.isSkippedSymlinkedDirectory = function (entry) {
|
|
return !this.options.followSymlinkedDirectories && entry.isSymbolicLink();
|
|
};
|
|
/**
|
|
* Returns «true» for a directory whose name starts with a period if «dot» option is disabled.
|
|
*/
|
|
DeepFilter.prototype.isSkippedDotDirectory = function (entry) {
|
|
return !this.options.dot && pathUtils.isDotDirectory(entry.path);
|
|
};
|
|
/**
|
|
* Returns «true» for a directory whose path math to any negative pattern.
|
|
*/
|
|
DeepFilter.prototype.isSkippedByNegativePatterns = function (entry, negativeRe) {
|
|
return !patternUtils.matchAny(entry.path, negativeRe);
|
|
};
|
|
return DeepFilter;
|
|
}());
|
|
exports.default = DeepFilter;
|