diff --git a/src/match-pattern.ts b/src/match-pattern.ts index cb4896b..fcdc900 100644 --- a/src/match-pattern.ts +++ b/src/match-pattern.ts @@ -36,7 +36,7 @@ export function match(value: any, patterns: MatchPatterns): } else if (isNone(value) && patterns.None !== undefined) { return patterns.None as T; } - + for (const p in patterns) { if (p === "Some" || p === "None") continue; @@ -44,8 +44,14 @@ export function match(value: any, patterns: MatchPatterns): const patternKey = String(p); const isRange = patternKey.includes("..="); const isOr = patternKey.includes("|"); - const isRegex = patternKey.startsWith("/") && patternKey.endsWith("/"); - + + const lastSlashIndex = patternKey.lastIndexOf("/"); + const foundFlags = patternKey.slice(lastSlashIndex + 1).split(""); + + const isRegex = !!foundFlags.length + ? patternKey.startsWith("/") && [ 'g', 'i', 'm', 'u', 's', 'y' ].some((flag) => foundFlags.includes(flag)) + : patternKey.startsWith("/") && patternKey.endsWith("/"); + if (isRange) { const [start, end] = patternKey.split("..=").map(s => isNaN(Number(s)) ? s : Number(s)); @@ -55,12 +61,12 @@ export function match(value: any, patterns: MatchPatterns): } } else if (isOr) { const patternValues = patternKey.split("|").map(s => isNaN(Number(s)) ? s : Number(s)); - + if (patternValues.includes(value)) { return patterns[p](); } } else if (isRegex) { - const regex = new RegExp(patternKey.slice(1, -1)); + const regex = new RegExp(patternKey.slice(1, lastSlashIndex), foundFlags.join("")); if (regex.test(value)) { return patterns[p](); diff --git a/tests/match-pattern.test.ts b/tests/match-pattern.test.ts index 640cc20..a5e851b 100644 --- a/tests/match-pattern.test.ts +++ b/tests/match-pattern.test.ts @@ -13,6 +13,7 @@ describe('testing match pattern function', () => { "1..=13": () => "Between 1 and 13", "25 | 50 | 100": () => "A bill", "/[a-z]/": () => "A lowercase letter", + "/boost/i": () => "case ignored", "_": () => "default", }; @@ -34,6 +35,7 @@ describe('testing match pattern function', () => { expect(match(10, matchValidates)).toBe("Between 1 and 13"); expect(match(25, matchValidates)).toBe("A bill"); expect(match("z", matchValidates)).toBe("A lowercase letter"); + expect(match("BOOST", matchValidates)).toBe("case ignored"); expect(match("1", matchValidates)).toBe("default"); }); @@ -45,4 +47,4 @@ describe('testing match pattern function', () => { [Coin.Quarter]: () => 25, })).toBe(10); }); -}); \ No newline at end of file +});