From 37a78188a30704aef9a4691c86b31c054a33bc7f Mon Sep 17 00:00:00 2001 From: Alex MacArthur Date: Wed, 23 Mar 2022 20:54:41 -0500 Subject: [PATCH] Properly escape strings before converting to RegExp pattern. --- package.json | 2 +- src/index.test.ts | 7 +++++++ src/index.ts | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 71df66c..ff2a433 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "striff", "description": "Real simple string diffing.", "author": "Alex MacArthur (https://macarthur.me)", - "version": "1.0.1", + "version": "1.0.2", "main": "dist/index.umd.js", "module": "dist/index.es.js", "types": "dist/index.d.ts", diff --git a/src/index.test.ts b/src/index.test.ts index 47f568a..a7b2d20 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -7,6 +7,13 @@ it("Correctly diffs when strings are identical.", () => { expect(removed).toHaveLength(0); }); +it("Strings are RegEx-escaped", () => { + const { added, removed } = striff("Hi?", "Hi!"); + + expect(removed).toEqual([{ value: "?", index: 2 }]); + expect(added).toEqual([{ value: "!", index: 2 }]); +}); + describe("characters are added", () => { it("Correctly diffs when characters are added to end.", () => { const { added, removed } = striff("abc", "abcd"); diff --git a/src/index.ts b/src/index.ts index 7c136e9..679908e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,9 @@ const getDiff = (partsArr: Character[][], arr1: Character[], arr2: Character[]) partsArr.forEach((part: Character[]) => { let partString = fromCharacters(part); - let pattern = new RegExp(partString); + + // One day, `RegExp.replace` will hopefully be built-in. + let pattern = new RegExp(partString.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); // If this little thing matches ANY part of the string, it's in. let result = pattern.exec(str2);