From 5669faba60f9e1bfc10542231d9c7d83fc122e65 Mon Sep 17 00:00:00 2001 From: mrmlnc Date: Fri, 7 Jan 2022 10:47:37 +0300 Subject: [PATCH 1/2] fix: remove performance cliff for brace expransions regex --- src/utils/pattern.spec.ts | 4 ++++ src/utils/pattern.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utils/pattern.spec.ts b/src/utils/pattern.spec.ts index e667ec16..4a2c61fa 100644 --- a/src/utils/pattern.spec.ts +++ b/src/utils/pattern.spec.ts @@ -132,10 +132,14 @@ describe('Utils → Pattern', () => { it('should return false for unfinished brace expansions', () => { assert.ok(!util.isDynamicPattern('{')); + assert.ok(!util.isDynamicPattern('{'.repeat(999999))); assert.ok(!util.isDynamicPattern('{a')); assert.ok(!util.isDynamicPattern('{,')); assert.ok(!util.isDynamicPattern('{a,')); assert.ok(!util.isDynamicPattern('{a,b')); + assert.ok(!util.isDynamicPattern('{a' + ','.repeat(999999) + 'b')); + assert.ok(!util.isDynamicPattern('{1..')); + assert.ok(!util.isDynamicPattern('{1.' + '.'.repeat(999999) + '2')); }); }); diff --git a/src/utils/pattern.ts b/src/utils/pattern.ts index f0e0412f..532a2e64 100644 --- a/src/utils/pattern.ts +++ b/src/utils/pattern.ts @@ -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_EXPANSIONS_SYMBOLS_RE = /{[^,.{]*(?:,|\.\.)[^,.{]*}/; type PatternTypeOptions = { braceExpansion?: boolean; From 4f5ff66eac49c600e8256aa1a5f877b63235192e Mon Sep 17 00:00:00 2001 From: mrmlnc Date: Fri, 7 Jan 2022 11:02:27 +0300 Subject: [PATCH 2/2] fix: remove performance cliff for glob extension regex --- src/utils/pattern.spec.ts | 1 + src/utils/pattern.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/pattern.spec.ts b/src/utils/pattern.spec.ts index 4a2c61fa..95bf3303 100644 --- a/src/utils/pattern.spec.ts +++ b/src/utils/pattern.spec.ts @@ -125,6 +125,7 @@ describe('Utils → Pattern', () => { it('should return false for unfinished glob extension', () => { assert.ok(!util.isDynamicPattern('@(')); + assert.ok(!util.isDynamicPattern('@' + '('.repeat(999999) + 'a')); assert.ok(!util.isDynamicPattern('@(a')); assert.ok(!util.isDynamicPattern('@(a|')); assert.ok(!util.isDynamicPattern('@(a|b')); diff --git a/src/utils/pattern.ts b/src/utils/pattern.ts index 532a2e64..1c3ab54f 100644 --- a/src/utils/pattern.ts +++ b/src/utils/pattern.ts @@ -11,7 +11,7 @@ const ESCAPE_SYMBOL = '\\'; const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[[^[]*]/; const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\([^(]*\|[^|]*\)/; -const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\(.*\)/; +const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\([^(]*\)/; const BRACE_EXPANSIONS_SYMBOLS_RE = /{[^,.{]*(?:,|\.\.)[^,.{]*}/; type PatternTypeOptions = {