From 66ab4fc57217af6a939c8a86fc0c25a8e088150e Mon Sep 17 00:00:00 2001 From: Pavel Kornev Date: Sun, 6 Mar 2022 18:35:46 +0100 Subject: [PATCH] fix(functions): reset RegExp.lastIndex to zero when using cached RegExp objects --- 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; }