Skip to content

Commit 159e3d4

Browse files
committed
refactor: diffSpec 시 변경된 hash값만 리턴하도록 수정
1 parent 35cf528 commit 159e3d4

10 files changed

Lines changed: 37 additions & 204 deletions

File tree

packages/patchlogr-core/src/diff/__tests__/diffChildNodes.test.ts

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,6 @@ describe("diffChildNodes", () => {
6262
baseNodeType: "node",
6363
});
6464
});
65-
66-
test("removed leaf의 value가 있으면 baseValue 포함", () => {
67-
const removedChild = createLeafNode("item", "hash-removed", {
68-
data: "value",
69-
});
70-
const base = createNode("root", "hash-old", [removedChild]);
71-
const head = createNode("root", "hash-new", []);
72-
73-
if (base.type !== "node" || head.type !== "node") {
74-
throw new Error("Expected node types");
75-
}
76-
77-
const result = diffChildNodes(base, head, ["root"]);
78-
79-
expect(result.changes[0]?.baseValue).toEqual({ data: "value" });
80-
});
8165
});
8266

8367
describe("added detection (head에만 존재)", () => {
@@ -139,22 +123,6 @@ describe("diffChildNodes", () => {
139123
headNodeType: "node",
140124
});
141125
});
142-
143-
test("added leaf의 value가 있으면 headValue 포함", () => {
144-
const addedChild = createLeafNode("item", "hash-added", {
145-
data: "value",
146-
});
147-
const base = createNode("root", "hash-old", []);
148-
const head = createNode("root", "hash-new", [addedChild]);
149-
150-
if (base.type !== "node" || head.type !== "node") {
151-
throw new Error("Expected node types");
152-
}
153-
154-
const result = diffChildNodes(base, head, ["root"]);
155-
156-
expect(result.changes[0]?.headValue).toEqual({ data: "value" });
157-
});
158126
});
159127

160128
describe("modifiedPairs (공통 자식 중 hash가 다른 경우)", () => {

packages/patchlogr-core/src/diff/__tests__/diffLeafNodes.test.ts

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,6 @@ describe("diffLeafNodes", () => {
1616
expect(result.path).toEqual(["root", "user"]);
1717
});
1818

19-
test("value가 있는 경우 baseValue, headValue 포함", () => {
20-
const baseValue = { email: "old@test.com" };
21-
const headValue = { email: "new@test.com" };
22-
const base = createLeafNode("config", "hash-v1", baseValue);
23-
const head = createLeafNode("config", "hash-v2", headValue);
24-
25-
const result = diffLeafNodes(base, head, ["root", "config"]);
26-
27-
expect(result.baseValue).toEqual(baseValue);
28-
expect(result.headValue).toEqual(headValue);
29-
});
30-
31-
test("base에만 value가 있는 경우 baseValue만 포함", () => {
32-
const baseValue = { data: "old" };
33-
const base = createLeafNode("item", "hash-old", baseValue);
34-
const head = createLeafNode("item", "hash-new", undefined);
35-
36-
const result = diffLeafNodes(base, head, ["root", "item"]);
37-
38-
expect(result.baseValue).toEqual(baseValue);
39-
expect(result.headValue).toBeUndefined();
40-
});
41-
42-
test("head에만 value가 있는 경우 headValue만 포함", () => {
43-
const headValue = { data: "new" };
44-
const base = createLeafNode("item", "hash-old", undefined);
45-
const head = createLeafNode("item", "hash-new", headValue);
46-
47-
const result = diffLeafNodes(base, head, ["root", "item"]);
48-
49-
expect(result.baseValue).toBeUndefined();
50-
expect(result.headValue).toEqual(headValue);
51-
});
52-
5319
test("path는 전달받은 그대로 사용", () => {
5420
const base = createLeafNode("endpoint", "hash-a", { v: 1 });
5521
const head = createLeafNode("endpoint", "hash-b", { v: 2 });

packages/patchlogr-core/src/diff/__tests__/diffNode.test.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,6 @@ describe("diffNode", () => {
3131
});
3232
});
3333

34-
test("둘 다 leaf인데 key가 동일하고 hash가 다른 경우 modified 1건 + value 포함", () => {
35-
const baseValue = { email: "old@test.com" };
36-
const headValue = { email: "new@test.com" };
37-
const base = createLeafNode("config", "hash-v1", baseValue);
38-
const head = createLeafNode("config", "hash-v2", headValue);
39-
40-
const result = diffNode(base, head);
41-
42-
expect(result.changes).toHaveLength(1);
43-
expect(result.changes[0]).toMatchObject({
44-
type: "modified",
45-
key: "config",
46-
baseValue,
47-
headValue,
48-
});
49-
});
50-
5134
test("base와 head가 둘 다 node이고 hash가 다른 경우 children을 key 기준으로 비교", () => {
5235
const baseChild = createLeafNode("child1", "hash-child-old", {
5336
v: 1,
@@ -227,7 +210,7 @@ describe("diffNode", () => {
227210
});
228211
});
229212

230-
test("D13: base가 leaf이고 head가 node인 경우 type_changed 1건", () => {
213+
test("base가 leaf이고 head가 node인 경우 type_changed 1건", () => {
231214
const child = createLeafNode("child", "hash-child", { v: 1 });
232215
const base = createLeafNode<string, unknown>("target", "hash-leaf", {
233216
v: "simple",
@@ -250,7 +233,7 @@ describe("diffNode", () => {
250233
});
251234
});
252235

253-
describe("Path / key 기록 규칙", () => {
236+
describe("path / key", () => {
254237
test("모든 change에는 path가 있어야 함 (root부터 변화 노드까지)", () => {
255238
const baseLeaf = createLeafNode("endpoint", "hash-old", {
256239
method: "GET",

packages/patchlogr-core/src/diff/__tests__/diffTypeChange.test.ts

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -39,59 +39,6 @@ describe("diffTypeChange", () => {
3939
expect(result.headNodeType).toBe("node");
4040
});
4141

42-
test("base가 leaf일 때 baseValue 포함", () => {
43-
const baseValue = { data: "original" };
44-
const base = createLeafNode<string, unknown>(
45-
"item",
46-
"hash-leaf",
47-
baseValue,
48-
);
49-
const head = createNode<string, unknown>("item", "hash-node", []);
50-
51-
const result = diffTypeChange(base, head, ["root", "item"]);
52-
53-
expect(result.baseValue).toEqual(baseValue);
54-
expect(result.headValue).toBeUndefined();
55-
});
56-
57-
test("head가 leaf일 때 headValue 포함", () => {
58-
const headValue = { data: "collapsed" };
59-
const base = createNode<string, unknown>("item", "hash-node", []);
60-
const head = createLeafNode<string, unknown>(
61-
"item",
62-
"hash-leaf",
63-
headValue,
64-
);
65-
66-
const result = diffTypeChange(base, head, ["root", "item"]);
67-
68-
expect(result.baseValue).toBeUndefined();
69-
expect(result.headValue).toEqual(headValue);
70-
});
71-
72-
test("양쪽 모두 leaf에서 다른 leaf일 때", () => {
73-
const baseValue = { v: 1 };
74-
const headValue = { v: 2 };
75-
const base = createLeafNode<string, unknown>(
76-
"item",
77-
"hash-old",
78-
baseValue,
79-
);
80-
const head = createLeafNode<string, unknown>(
81-
"item",
82-
"hash-new",
83-
headValue,
84-
);
85-
86-
const result = diffTypeChange(base, head, ["root", "item"]);
87-
88-
expect(result.type).toBe("type_changed");
89-
expect(result.baseNodeType).toBe("leaf");
90-
expect(result.headNodeType).toBe("leaf");
91-
expect(result.baseValue).toEqual(baseValue);
92-
expect(result.headValue).toEqual(headValue);
93-
});
94-
9542
test("path는 전달받은 그대로 사용", () => {
9643
const base = createNode<string, unknown>("target", "hash-node", []);
9744
const head = createLeafNode<string, unknown>("target", "hash-leaf", {});

packages/patchlogr-core/src/diff/diffChangeSet.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,19 @@ export type ChangeType = "added" | "removed" | "modified" | "type_changed";
22

33
export type ChangePath<K> = K[];
44

5-
export type SpecChange<K = string, V = unknown> = {
5+
export type SpecChange<K = string> = {
66
type: ChangeType;
77
path: ChangePath<K>;
88
key: K;
99
baseHash?: string;
1010
headHash?: string;
1111

12-
baseValue?: V;
13-
headValue?: V;
14-
1512
baseNodeType?: "node" | "leaf";
1613
headNodeType?: "node" | "leaf";
1714
};
1815

19-
export type SpecChangeSet<K = string, V = unknown> = {
16+
export type SpecChangeSet<K = string> = {
2017
baseHash: string;
2118
headHash: string;
22-
changes: SpecChange<K, V>[];
19+
changes: SpecChange<K>[];
2320
};

packages/patchlogr-core/src/diff/diffChildNodes.ts

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,21 @@ import type { ChangePath, SpecChange } from "./diffChangeSet.js";
88
* @param head 비교 대상 node
99
* @param path 현재 경로 (base.key 포함)
1010
*/
11-
export function diffChildNodes<K, V>(
12-
base: HashNode<K, V>,
13-
head: HashNode<K, V>,
11+
export function diffChildNodes<K>(
12+
base: HashNode<K>,
13+
head: HashNode<K>,
1414
path: ChangePath<K>,
1515
): {
16-
changes: SpecChange<K, V>[];
16+
changes: SpecChange<K>[];
1717
modifiedPairs: Array<{
18-
base: HashNode<K, V>;
19-
head: HashNode<K, V>;
18+
base: HashNode<K>;
19+
head: HashNode<K>;
2020
}>;
2121
} {
22-
const changes: SpecChange<K, V>[] = [];
22+
const changes: SpecChange<K>[] = [];
2323
const modifiedPairs: Array<{
24-
base: HashNode<K, V>;
25-
head: HashNode<K, V>;
24+
base: HashNode<K>;
25+
head: HashNode<K>;
2626
}> = [];
2727

2828
const baseChildMap = new Map(
@@ -36,37 +36,27 @@ export function diffChildNodes<K, V>(
3636
for (const [key, baseChild] of baseChildMap) {
3737
if (!headChildMap.has(key)) {
3838
const childPath = [...path, key];
39-
const change: SpecChange<K, V> = {
39+
changes.push({
4040
type: "removed",
4141
path: childPath,
4242
key: key,
4343
baseHash: baseChild.hash,
4444
baseNodeType: baseChild.type,
45-
};
46-
47-
if (baseChild.type === "leaf" && baseChild.value !== undefined) {
48-
change.baseValue = baseChild.value;
49-
}
50-
changes.push(change);
45+
});
5146
}
5247
}
5348

5449
// Added children (head에만 존재)
5550
for (const [key, headChild] of headChildMap) {
5651
if (!baseChildMap.has(key)) {
5752
const childPath = [...path, key];
58-
const change: SpecChange<K, V> = {
53+
changes.push({
5954
type: "added",
6055
path: childPath,
6156
key: key,
6257
headHash: headChild.hash,
6358
headNodeType: headChild.type,
64-
};
65-
66-
if (headChild.type === "leaf" && headChild.value !== undefined) {
67-
change.headValue = headChild.value;
68-
}
69-
changes.push(change);
59+
});
7060
}
7161
}
7262

packages/patchlogr-core/src/diff/diffLeafNodes.ts

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,16 @@ import type { ChangePath, SpecChange } from "./diffChangeSet.js";
77
* @param head 비교 대상 leaf 노드
88
* @param path 현재 경로 (base.key 포함)
99
*/
10-
export function diffLeafNodes<K, V>(
11-
base: HashNode<K, V>,
12-
head: HashNode<K, V>,
10+
export function diffLeafNodes<K>(
11+
base: HashNode<K>,
12+
head: HashNode<K>,
1313
path: ChangePath<K>,
14-
): SpecChange<K, V> {
15-
const change: SpecChange<K, V> = {
14+
): SpecChange<K> {
15+
return {
1616
type: "modified",
1717
path,
1818
key: base.key,
1919
baseHash: base.hash,
2020
headHash: head.hash,
2121
};
22-
23-
if (base.value !== undefined) {
24-
change.baseValue = base.value;
25-
}
26-
if (head.value !== undefined) {
27-
change.headValue = head.value;
28-
}
29-
30-
return change;
3122
}

packages/patchlogr-core/src/diff/diffNode.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import { diffLeafNodes } from "./diffLeafNodes";
44
import { diffTypeChange } from "./diffTypeChange";
55
import { diffChildNodes } from "./diffChildNodes";
66

7-
export function diffNode<K, V>(
8-
base: HashNode<K, V>,
9-
head: HashNode<K, V>,
7+
export function diffNode<K>(
8+
base: HashNode<K>,
9+
head: HashNode<K>,
1010
path: ChangePath<K> = [],
11-
): SpecChangeSet<K, V> {
12-
const changes: SpecChange<K, V>[] = [];
11+
): SpecChangeSet<K> {
12+
const changes: SpecChange<K>[] = [];
1313
const currentPath = [...path, base.key];
1414

1515
if (base.hash === head.hash) {

packages/patchlogr-core/src/diff/diffSpec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import type { PartitionedSpec } from "../partition/index.js";
22
import type { SpecChangeSet } from "./diffChangeSet.js";
33
import { diffNode } from "./diffNode.js";
44

5-
export function diffSpec<K extends string = string, V = unknown>(
6-
base: PartitionedSpec<K, V>,
7-
head: PartitionedSpec<K, V>,
8-
): SpecChangeSet<K, V> {
5+
export function diffSpec<K extends string = string>(
6+
base: PartitionedSpec<K>,
7+
head: PartitionedSpec<K>,
8+
): SpecChangeSet<K> {
99
return diffNode(base.root, head.root);
1010
}

packages/patchlogr-core/src/diff/diffTypeChange.ts

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import type { ChangePath, SpecChange } from "./diffChangeSet.js";
77
* @param head 비교 대상 노드
88
* @param path 현재 경로 (base.key 포함)
99
*/
10-
export function diffTypeChange<K, V>(
11-
base: HashNode<K, V>,
12-
head: HashNode<K, V>,
10+
export function diffTypeChange<K>(
11+
base: HashNode<K>,
12+
head: HashNode<K>,
1313
path: ChangePath<K>,
14-
): SpecChange<K, V> {
15-
const change: SpecChange<K, V> = {
14+
): SpecChange<K> {
15+
return {
1616
type: "type_changed",
1717
path,
1818
key: base.key,
@@ -21,13 +21,4 @@ export function diffTypeChange<K, V>(
2121
baseNodeType: base.type,
2222
headNodeType: head.type,
2323
};
24-
25-
if (base.type === "leaf" && base.value !== undefined) {
26-
change.baseValue = base.value;
27-
}
28-
if (head.type === "leaf" && head.value !== undefined) {
29-
change.headValue = head.value;
30-
}
31-
32-
return change;
3324
}

0 commit comments

Comments
 (0)