From 48395273d28fc58ab450277681956b1b50f3f8ee Mon Sep 17 00:00:00 2001 From: Pavel Kornev Date: Mon, 7 Mar 2022 14:29:28 +0100 Subject: [PATCH] fix(functions): reset RegExp.lastIndex to zero when using cached RegExp objects (#2079) --- packages/functions/src/__tests__/pattern.test.ts | 6 ++++++ packages/functions/src/pattern.ts | 1 + 2 files changed, 7 insertions(+) diff --git a/packages/functions/src/__tests__/pattern.test.ts b/packages/functions/src/__tests__/pattern.test.ts index 200912099..7f2d2a9ad 100644 --- a/packages/functions/src/__tests__/pattern.test.ts +++ b/packages/functions/src/__tests__/pattern.test.ts @@ -18,6 +18,12 @@ describe('Core Functions / Pattern', () => { expect(await runPattern('aBc', { match: '/[abc]+/im' })).toEqual([]); }); + it('should return same results when given a global (g) marker (pattern cache usecase)', async () => { + expect(await runPattern('abc', { match: '/[abc]+/gi' })).toEqual([]); + expect(await runPattern('abc', { match: '/[abc]+/gi' })).toEqual([]); + expect(await runPattern('abc', { match: '/[abc]+/gi' })).toEqual([]); + }); + it('given string regex containing invalid flags, should throw an exception', async () => { await expect(runPattern('aBc', { match: '/[abc]+/invalid' })).rejects.toThrow( "Invalid flags supplied to RegExp constructor 'invalid'", diff --git a/packages/functions/src/pattern.ts b/packages/functions/src/pattern.ts index da0267326..82942b6e9 100644 --- a/packages/functions/src/pattern.ts +++ b/packages/functions/src/pattern.ts @@ -27,6 +27,7 @@ const cache = new Map(); function getFromCache(pattern: string): RegExp { const existingPattern = cache.get(pattern); if (existingPattern !== void 0) { + existingPattern.lastIndex = 0; return existingPattern; }