source: frontend/node_modules/fast-glob/out/utils/pattern.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 13 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 8.3 KB
Line 
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.isAbsolute = exports.partitionAbsoluteAndRelative = exports.removeDuplicateSlashes = exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;
4const path = require("path");
5const globParent = require("glob-parent");
6const micromatch = require("micromatch");
7const GLOBSTAR = '**';
8const ESCAPE_SYMBOL = '\\';
9const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;
10const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[[^[]*]/;
11const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\([^(]*\|[^|]*\)/;
12const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\([^(]*\)/;
13const BRACE_EXPANSION_SEPARATORS_RE = /,|\.\./;
14/**
15 * Matches a sequence of two or more consecutive slashes, excluding the first two slashes at the beginning of the string.
16 * The latter is due to the presence of the device path at the beginning of the UNC path.
17 */
18const DOUBLE_SLASH_RE = /(?!^)\/{2,}/g;
19function isStaticPattern(pattern, options = {}) {
20 return !isDynamicPattern(pattern, options);
21}
22exports.isStaticPattern = isStaticPattern;
23function isDynamicPattern(pattern, options = {}) {
24 /**
25 * A special case with an empty string is necessary for matching patterns that start with a forward slash.
26 * An empty string cannot be a dynamic pattern.
27 * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'.
28 */
29 if (pattern === '') {
30 return false;
31 }
32 /**
33 * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check
34 * filepath directly (without read directory).
35 */
36 if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) {
37 return true;
38 }
39 if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) {
40 return true;
41 }
42 if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) {
43 return true;
44 }
45 if (options.braceExpansion !== false && hasBraceExpansion(pattern)) {
46 return true;
47 }
48 return false;
49}
50exports.isDynamicPattern = isDynamicPattern;
51function hasBraceExpansion(pattern) {
52 const openingBraceIndex = pattern.indexOf('{');
53 if (openingBraceIndex === -1) {
54 return false;
55 }
56 const closingBraceIndex = pattern.indexOf('}', openingBraceIndex + 1);
57 if (closingBraceIndex === -1) {
58 return false;
59 }
60 const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex);
61 return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent);
62}
63function convertToPositivePattern(pattern) {
64 return isNegativePattern(pattern) ? pattern.slice(1) : pattern;
65}
66exports.convertToPositivePattern = convertToPositivePattern;
67function convertToNegativePattern(pattern) {
68 return '!' + pattern;
69}
70exports.convertToNegativePattern = convertToNegativePattern;
71function isNegativePattern(pattern) {
72 return pattern.startsWith('!') && pattern[1] !== '(';
73}
74exports.isNegativePattern = isNegativePattern;
75function isPositivePattern(pattern) {
76 return !isNegativePattern(pattern);
77}
78exports.isPositivePattern = isPositivePattern;
79function getNegativePatterns(patterns) {
80 return patterns.filter(isNegativePattern);
81}
82exports.getNegativePatterns = getNegativePatterns;
83function getPositivePatterns(patterns) {
84 return patterns.filter(isPositivePattern);
85}
86exports.getPositivePatterns = getPositivePatterns;
87/**
88 * Returns patterns that can be applied inside the current directory.
89 *
90 * @example
91 * // ['./*', '*', 'a/*']
92 * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])
93 */
94function getPatternsInsideCurrentDirectory(patterns) {
95 return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern));
96}
97exports.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory;
98/**
99 * Returns patterns to be expanded relative to (outside) the current directory.
100 *
101 * @example
102 * // ['../*', './../*']
103 * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])
104 */
105function getPatternsOutsideCurrentDirectory(patterns) {
106 return patterns.filter(isPatternRelatedToParentDirectory);
107}
108exports.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory;
109function isPatternRelatedToParentDirectory(pattern) {
110 return pattern.startsWith('..') || pattern.startsWith('./..');
111}
112exports.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory;
113function getBaseDirectory(pattern) {
114 return globParent(pattern, { flipBackslashes: false });
115}
116exports.getBaseDirectory = getBaseDirectory;
117function hasGlobStar(pattern) {
118 return pattern.includes(GLOBSTAR);
119}
120exports.hasGlobStar = hasGlobStar;
121function endsWithSlashGlobStar(pattern) {
122 return pattern.endsWith('/' + GLOBSTAR);
123}
124exports.endsWithSlashGlobStar = endsWithSlashGlobStar;
125function isAffectDepthOfReadingPattern(pattern) {
126 const basename = path.basename(pattern);
127 return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);
128}
129exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;
130function expandPatternsWithBraceExpansion(patterns) {
131 return patterns.reduce((collection, pattern) => {
132 return collection.concat(expandBraceExpansion(pattern));
133 }, []);
134}
135exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion;
136function expandBraceExpansion(pattern) {
137 const patterns = micromatch.braces(pattern, { expand: true, nodupes: true, keepEscaping: true });
138 /**
139 * Sort the patterns by length so that the same depth patterns are processed side by side.
140 * `a/{b,}/{c,}/*` – `['a///*', 'a/b//*', 'a//c/*', 'a/b/c/*']`
141 */
142 patterns.sort((a, b) => a.length - b.length);
143 /**
144 * Micromatch can return an empty string in the case of patterns like `{a,}`.
145 */
146 return patterns.filter((pattern) => pattern !== '');
147}
148exports.expandBraceExpansion = expandBraceExpansion;
149function getPatternParts(pattern, options) {
150 let { parts } = micromatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true }));
151 /**
152 * The scan method returns an empty array in some cases.
153 * See micromatch/picomatch#58 for more details.
154 */
155 if (parts.length === 0) {
156 parts = [pattern];
157 }
158 /**
159 * The scan method does not return an empty part for the pattern with a forward slash.
160 * This is another part of micromatch/picomatch#58.
161 */
162 if (parts[0].startsWith('/')) {
163 parts[0] = parts[0].slice(1);
164 parts.unshift('');
165 }
166 return parts;
167}
168exports.getPatternParts = getPatternParts;
169function makeRe(pattern, options) {
170 return micromatch.makeRe(pattern, options);
171}
172exports.makeRe = makeRe;
173function convertPatternsToRe(patterns, options) {
174 return patterns.map((pattern) => makeRe(pattern, options));
175}
176exports.convertPatternsToRe = convertPatternsToRe;
177function matchAny(entry, patternsRe) {
178 return patternsRe.some((patternRe) => patternRe.test(entry));
179}
180exports.matchAny = matchAny;
181/**
182 * This package only works with forward slashes as a path separator.
183 * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes.
184 */
185function removeDuplicateSlashes(pattern) {
186 return pattern.replace(DOUBLE_SLASH_RE, '/');
187}
188exports.removeDuplicateSlashes = removeDuplicateSlashes;
189function partitionAbsoluteAndRelative(patterns) {
190 const absolute = [];
191 const relative = [];
192 for (const pattern of patterns) {
193 if (isAbsolute(pattern)) {
194 absolute.push(pattern);
195 }
196 else {
197 relative.push(pattern);
198 }
199 }
200 return [absolute, relative];
201}
202exports.partitionAbsoluteAndRelative = partitionAbsoluteAndRelative;
203function isAbsolute(pattern) {
204 return path.isAbsolute(pattern);
205}
206exports.isAbsolute = isAbsolute;
Note: See TracBrowser for help on using the repository browser.