@@ -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} ;
0 commit comments