Skip to content

Commit d60d2d8

Browse files
fix: Map & Set size diff
1 parent 2864517 commit d60d2d8

File tree

6 files changed

+91
-3
lines changed

6 files changed

+91
-3
lines changed

.changeset/heavy-buttons-smile.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@opentf/obj-diff": minor
3+
---
4+
5+
Fixed Map & Set size diff.

apps/demo/src/App.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ function replacer(key, value) {
2323
return `__INTERNAL__UNDEFINED`;
2424
}
2525

26+
if (value instanceof Map) {
27+
const arr = Array.from(value);
28+
return `Map(${value.size}) ${JSON.stringify(arr)}`;
29+
}
30+
31+
if (value instanceof Set) {
32+
const arr = Array.from(value);
33+
return `Set(${value.size}) ${JSON.stringify(arr)}`;
34+
}
35+
2636
return value;
2737
}
2838

@@ -142,7 +152,8 @@ function App() {
142152
<Box sx={{ display: "flex", justifyContent: "center", mt: 2 }}>
143153
<Card size="sm">
144154
<Typography level="body-lg">
145-
🚀 The Fast, Accurate, JavaScript Objects Diffing & Patching Library.
155+
🚀 The Fast, Accurate, JavaScript Objects Diffing & Patching
156+
Library.
146157
</Typography>
147158
</Card>
148159
</Box>

apps/demo/src/Visualizer.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,37 @@ function getRows(k, o: unknown, path = [], diff) {
192192
);
193193
}
194194

195+
if (o instanceof Date) {
196+
rows.push(
197+
<Row key={randomUUID()} path={path} diff={diff}>
198+
<Box sx={{ display: "inline" }}>{k}:</Box>
199+
<Box sx={{ display: "inline", ml: 2 }}>{o.toString()}</Box>,
200+
</Row>
201+
);
202+
}
203+
204+
if (o instanceof Map) {
205+
const arr = Array.from(o);
206+
const str = `Map(${o.size}) ${JSON.stringify(arr, null, 2)}`;
207+
rows.push(
208+
<Row key={randomUUID()} path={path} diff={diff}>
209+
<Box sx={{ display: "inline" }}>{k}:</Box>
210+
<Box sx={{ display: "inline", ml: 2 }}>{str}</Box>,
211+
</Row>
212+
);
213+
}
214+
215+
if (o instanceof Set) {
216+
const arr = Array.from(o);
217+
const str = `Set(${o.size}) ${JSON.stringify(arr, null, 2)}`;
218+
rows.push(
219+
<Row key={randomUUID()} path={path} diff={diff}>
220+
<Box sx={{ display: "inline" }}>{k}:</Box>
221+
<Box sx={{ display: "inline", ml: 2 }}>{str}</Box>,
222+
</Row>
223+
);
224+
}
225+
195226
return rows;
196227
}
197228

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"private": true,
33
"scripts": {
4+
"dev": "pnpm --filter=demo run dev",
45
"build": "pnpm --filter=@opentf/obj-diff run build",
56
"test": "pnpm --filter=@opentf/obj-diff run test",
67
"ci": "pnpm --filter=@opentf/obj-diff run ci",

packages/obj-diff/__tests__/diff.test.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe("diff", () => {
3333

3434
test("compare object with null", () => {
3535
expect(diff({}, null)).toEqual([{ t: 2, p: [], v: null }]);
36-
expect(diff(null, { a: 1 })).toEqual([{ t: 2, p: [], v: {a: 1} }]);
36+
expect(diff(null, { a: 1 })).toEqual([{ t: 2, p: [], v: { a: 1 } }]);
3737
});
3838

3939
test("empty objects", () => {
@@ -320,6 +320,34 @@ describe("diff", () => {
320320
)
321321
).toEqual([]);
322322

323+
expect(
324+
diff(
325+
{
326+
m: new Map([
327+
["x", 1],
328+
["y", 2],
329+
]),
330+
},
331+
{
332+
m: new Map([
333+
["x", 1],
334+
["y", 2],
335+
["z", 3],
336+
]),
337+
}
338+
)
339+
).toEqual([
340+
{
341+
p: ["m"],
342+
t: 2,
343+
v: new Map([
344+
["x", 1],
345+
["y", 2],
346+
["z", 3],
347+
]),
348+
},
349+
]);
350+
323351
expect(
324352
diff(
325353
{
@@ -352,6 +380,10 @@ describe("diff", () => {
352380
let b = { s: new Set([1, 2, 3]) };
353381
expect(diff(a, b)).toEqual([]);
354382

383+
a = { s: new Set([1, 2, 3]) };
384+
b = { s: new Set([1, 2, 3, 4]) };
385+
expect(diff(a, b)).toEqual([{ t: 2, p: ["s"], v: new Set([1, 2, 3, 4]) }]);
386+
355387
a = { s: new Set([1, 3, 5, 2, 4]) };
356388
b = { s: new Set([1, 2, 3]) };
357389
expect(diff(a, b)).toEqual([{ t: 2, p: ["s"], v: new Set([1, 2, 3]) }]);

packages/obj-diff/src/diff.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,22 @@ function objDiff(
9090
}
9191

9292
if (a instanceof Map) {
93+
if (a.size !== (b as Map<unknown, unknown>).size) {
94+
return [{ t: CHANGED, p: path, v: b }];
95+
}
96+
9397
for (const k of a.keys()) {
94-
if (a.get(k) !== (b as Map<unknown, unknown>).get(k)) {
98+
if (!Object.is(a.get(k), (b as Map<unknown, unknown>).get(k))) {
9599
return [{ t: CHANGED, p: path, v: b }];
96100
}
97101
}
98102
}
99103

100104
if (a instanceof Set) {
105+
if (a.size !== (b as Set<unknown>).size) {
106+
return [{ t: CHANGED, p: path, v: b }];
107+
}
108+
101109
for (const v of a) {
102110
if (!(b as Set<unknown>).has(v)) {
103111
return [{ t: CHANGED, p: path, v: b }];

0 commit comments

Comments
 (0)