Skip to content

Commit 6351d38

Browse files
committed
Update to use identity ({}) as output for matching values
Also includes refactor to simplify code and updates tests to match new functionality.
1 parent e915ee1 commit 6351d38

File tree

2 files changed

+26
-44
lines changed

2 files changed

+26
-44
lines changed

lib/generate.js

Lines changed: 20 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -19,53 +19,35 @@ module.exports = function generate(before, after) {
1919
before = serialize(before);
2020
after = serialize(after);
2121

22+
if (!(before instanceof Object) &&
23+
!(after instanceof Object) &&
24+
before === after) { // Return no op when values match
25+
return {}
26+
}
27+
2228
if (before === null || after === null ||
2329
typeof before !== 'object' || typeof after !== 'object' ||
24-
Array.isArray(before) !== Array.isArray(after)) {
25-
return after;
30+
Array.isArray(before) || Array.isArray(after)) {
31+
return serialize(after);
2632
}
2733

28-
if (Array.isArray(before)) {
29-
if (!arrayEquals(before, after)) {
30-
return after;
34+
let patch = {};
35+
for (let key of Object.keys(before)) {
36+
let newVal = null;
37+
if (key in after) {
38+
newVal = generate(before[key], after[key]);
3139
}
32-
return undefined;
33-
}
34-
35-
var patch = {};
36-
var beforeKeys = Object.keys(before);
37-
var afterKeys = Object.keys(after);
38-
39-
var key, i;
40-
41-
// new elements
42-
var newKeys = {};
43-
for (i = 0; i < afterKeys.length; i++) {
44-
key = afterKeys[i];
45-
if (beforeKeys.indexOf(key) === -1) {
46-
newKeys[key] = true;
47-
patch[key] = serialize(after[key]);
40+
if (equal(newVal, {})) {
41+
continue;
4842
}
43+
patch[key] = serialize(newVal);
4944
}
5045

51-
// removed & modified elements
52-
var removedKeys = {};
53-
for (i = 0; i < beforeKeys.length; i++) {
54-
key = beforeKeys[i];
55-
if (afterKeys.indexOf(key) === -1) {
56-
removedKeys[key] = true;
57-
patch[key] = null;
58-
} else {
59-
if (before[key] !== null && typeof before[key] === 'object') {
60-
var subPatch = generate(before[key], after[key]);
61-
if (subPatch !== undefined) {
62-
patch[key] = subPatch;
63-
}
64-
} else if (before[key] !== after[key]) {
65-
patch[key] = serialize(after[key]);
66-
}
46+
for (let key of Object.keys(after)) {
47+
if (!(key in before)) {
48+
patch[key] = serialize(after[key]);
6749
}
6850
}
6951

70-
return (Object.keys(patch).length > 0 ? patch : undefined);
52+
return (Object.keys(patch).length > 0 ? patch : {});
7153
};

test/lib/generate.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,24 +126,24 @@ describe('generate', function() {
126126
);
127127
});
128128

129-
it('should return undefined if the object hasnt changed', function() {
129+
it('should return {} if the object hasnt changed', function() {
130130
assert.deepEqual(
131131
generate({a: 'a'}, {a: 'a'}),
132-
undefined
132+
{}
133133
);
134134
});
135135

136-
it('should return undefined if the object with sub attributes hasnt changed', function() {
136+
it('should return {} if the object with sub attributes hasnt changed', function() {
137137
assert.deepEqual(
138138
generate({a: {b: 'c'}}, {a: {b: 'c'}}),
139-
undefined
139+
{}
140140
);
141141
});
142142

143-
it('should return undefined if the array hasnt changed', function() {
143+
it('should return the target if the output is an array', function() {
144144
assert.deepEqual(
145145
generate([1, 2, 3], [1, 2, 3]),
146-
undefined
146+
[1,2,3]
147147
);
148148
});
149149

0 commit comments

Comments
 (0)