Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Update to use identity ({}) as output for matching values
Also includes refactor to simplify code and updates tests
to match new functionality.
  • Loading branch information
blottn committed Jan 22, 2024
commit 6351d38ae6e6edbb9567f0d32eabd47d02e806a0
58 changes: 20 additions & 38 deletions lib/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,53 +19,35 @@ module.exports = function generate(before, after) {
before = serialize(before);
after = serialize(after);

if (!(before instanceof Object) &&
!(after instanceof Object) &&
before === after) { // Return no op when values match
return {}
}

if (before === null || after === null ||
typeof before !== 'object' || typeof after !== 'object' ||
Array.isArray(before) !== Array.isArray(after)) {
return after;
Array.isArray(before) || Array.isArray(after)) {
return serialize(after);
}

if (Array.isArray(before)) {
if (!arrayEquals(before, after)) {
return after;
let patch = {};
for (let key of Object.keys(before)) {
let newVal = null;
if (key in after) {
newVal = generate(before[key], after[key]);
}
return undefined;
}

var patch = {};
var beforeKeys = Object.keys(before);
var afterKeys = Object.keys(after);

var key, i;

// new elements
var newKeys = {};
for (i = 0; i < afterKeys.length; i++) {
key = afterKeys[i];
if (beforeKeys.indexOf(key) === -1) {
newKeys[key] = true;
patch[key] = serialize(after[key]);
if (equal(newVal, {})) {
continue;
}
patch[key] = serialize(newVal);
}

// removed & modified elements
var removedKeys = {};
for (i = 0; i < beforeKeys.length; i++) {
key = beforeKeys[i];
if (afterKeys.indexOf(key) === -1) {
removedKeys[key] = true;
patch[key] = null;
} else {
if (before[key] !== null && typeof before[key] === 'object') {
var subPatch = generate(before[key], after[key]);
if (subPatch !== undefined) {
patch[key] = subPatch;
}
} else if (before[key] !== after[key]) {
patch[key] = serialize(after[key]);
}
for (let key of Object.keys(after)) {
if (!(key in before)) {
patch[key] = serialize(after[key]);
}
}

return (Object.keys(patch).length > 0 ? patch : undefined);
return (Object.keys(patch).length > 0 ? patch : {});
};
12 changes: 6 additions & 6 deletions test/lib/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -126,24 +126,24 @@ describe('generate', function() {
);
});

it('should return undefined if the object hasnt changed', function() {
it('should return {} if the object hasnt changed', function() {
assert.deepEqual(
generate({a: 'a'}, {a: 'a'}),
undefined
{}
);
});

it('should return undefined if the object with sub attributes hasnt changed', function() {
it('should return {} if the object with sub attributes hasnt changed', function() {
assert.deepEqual(
generate({a: {b: 'c'}}, {a: {b: 'c'}}),
undefined
{}
);
});

it('should return undefined if the array hasnt changed', function() {
it('should return the target if the output is an array', function() {
assert.deepEqual(
generate([1, 2, 3], [1, 2, 3]),
undefined
[1,2,3]
);
});

Expand Down