Skip to content

Commit ca51b2c

Browse files
committed
Added support for more class types like regex
1 parent de62aca commit ca51b2c

File tree

3 files changed

+53
-5
lines changed

3 files changed

+53
-5
lines changed

index.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ interface Difference {
33
path: string[];
44
value?: any;
55
}
6-
6+
const t = true;
7+
const richTypes = { Date: t, RegExp: t, String: t, Number: t };
78
export default function diff(
89
obj: Record<string, any> | any[],
910
newObj: Record<string, any> | any[]
@@ -18,7 +19,7 @@ export default function diff(
1819
} else if (
1920
obj[key] &&
2021
typeof obj[key] === "object" &&
21-
!(obj[key] instanceof Date)
22+
!richTypes[Object.getPrototypeOf(obj[key]).constructor.name]
2223
) {
2324
const nestedDiffs = diff(obj[key], newObj[key]);
2425
diffs.push(
@@ -30,9 +31,11 @@ export default function diff(
3031
} else if (
3132
obj[key] !== newObj[key] &&
3233
!(
33-
obj[key] instanceof Date &&
34-
newObj[key] instanceof Date &&
35-
+obj[key] === +newObj[key]
34+
typeof obj[key] === "object" &&
35+
typeof newObj[key] === "object" &&
36+
(isNaN(obj[key])
37+
? obj[key] + "" === newObj[key] + ""
38+
: +obj[key] === +newObj[key])
3639
)
3740
) {
3841
diffs.push({

tests/class-primitives.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { test } from "uvu";
2+
import * as assert from "uvu/assert";
3+
import diff from "../dist/index.js";
4+
5+
test("Handles equal string classes", () => {
6+
assert.equal(
7+
diff({ string: new String("hi") }, { string: new String("hi") }),
8+
[]
9+
);
10+
});
11+
12+
test("Handles equal number classes", () => {
13+
assert.equal(diff({ number: new Number(1) }, { number: new Number(1) }), []);
14+
});
15+
16+
test("Handles unequal number classes", () => {
17+
assert.equal(diff({ number: new Number(1) }, { number: new Number(2) }), [
18+
{
19+
type: "CHANGE",
20+
path: ["number"],
21+
value: 2,
22+
},
23+
]);
24+
});
25+
26+
test.run();

tests/regex.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { test } from "uvu";
2+
import * as assert from "uvu/assert";
3+
import diff from "../dist/index.js";
4+
5+
test("Handles equal regex", () => {
6+
assert.equal(diff({ regex: /a/ }, { regex: /a/ }), []);
7+
});
8+
9+
test("Handles unequal regex", () => {
10+
assert.equal(diff({ regex: /a/ }, { regex: /b/ }), [
11+
{
12+
type: "CHANGE",
13+
path: ["regex"],
14+
value: /b/,
15+
},
16+
]);
17+
});
18+
19+
test.run();

0 commit comments

Comments
 (0)