Skip to content

Commit

Permalink
fix: re-implement brace expansion checker without regex
Browse files Browse the repository at this point in the history
  • Loading branch information
mrmlnc committed Jan 14, 2022
1 parent 0677271 commit 028cfe7
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
3 changes: 3 additions & 0 deletions src/utils/pattern.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ describe('Utils → Pattern', () => {

it('should return true for patterns that include brace expansions symbols', () => {
assert.ok(util.isDynamicPattern('{,}'));
assert.ok(util.isDynamicPattern('abc/{a.txt,}'));
assert.ok(util.isDynamicPattern('{a,}'));
assert.ok(util.isDynamicPattern('{,b}'));
assert.ok(util.isDynamicPattern('{a,b}'));
Expand All @@ -88,6 +89,7 @@ describe('Utils → Pattern', () => {
// The second braces pass
assert.ok(util.isDynamicPattern('{a,b,{c,d}'));
assert.ok(util.isDynamicPattern('{1..3}'));
assert.ok(util.isDynamicPattern('abc/{1..3}'));
assert.ok(util.isDynamicPattern('{2..10..2}'));
});

Expand Down Expand Up @@ -141,6 +143,7 @@ describe('Utils → Pattern', () => {
assert.ok(!util.isDynamicPattern('{'));
assert.ok(!util.isDynamicPattern('{'.repeat(999999)));
assert.ok(!util.isDynamicPattern('{a'));
assert.ok(!util.isDynamicPattern('{a}'));
assert.ok(!util.isDynamicPattern('{,'));
assert.ok(!util.isDynamicPattern('{a,'));
assert.ok(!util.isDynamicPattern('{a,b'));
Expand Down
22 changes: 20 additions & 2 deletions src/utils/pattern.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;
const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[[^[]*]/;
const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\([^(]*\|[^|]*\)/;
const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\([^(]*\)/;
const BRACE_EXPANSIONS_SYMBOLS_RE = /{[^,.{]*(?:,|\.\.)[^{]*}/;
const BRACE_EXPANSION_SEPARATORS_RE = /,|\.\./;

type PatternTypeOptions = {
braceExpansion?: boolean;
Expand Down Expand Up @@ -50,13 +50,31 @@ export function isDynamicPattern(pattern: Pattern, options: PatternTypeOptions =
return true;
}

if (options.braceExpansion !== false && BRACE_EXPANSIONS_SYMBOLS_RE.test(pattern)) {
if (options.braceExpansion !== false && hasBraceExpansion(pattern)) {
return true;
}

return false;
}

function hasBraceExpansion(pattern: string): boolean {
const openingBraceIndex = pattern.indexOf('{');

if (openingBraceIndex === -1) {
return false;
}

const closingBraceIndex = pattern.indexOf('}', openingBraceIndex + 1);

if (closingBraceIndex === -1) {
return false;
}

const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex);

return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent);
}

export function convertToPositivePattern(pattern: Pattern): Pattern {
return isNegativePattern(pattern) ? pattern.slice(1) : pattern;
}
Expand Down

0 comments on commit 028cfe7

Please sign in to comment.