@@ -19,53 +19,35 @@ module.exports = function generate(before, after) {
19
19
before = serialize ( before ) ;
20
20
after = serialize ( after ) ;
21
21
22
+ if ( ! ( before instanceof Object ) &&
23
+ ! ( after instanceof Object ) &&
24
+ before === after ) { // Return no op when values match
25
+ return { }
26
+ }
27
+
22
28
if ( before === null || after === null ||
23
29
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 ) ;
26
32
}
27
33
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 ] ) ;
31
39
}
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 ;
48
42
}
43
+ patch [ key ] = serialize ( newVal ) ;
49
44
}
50
45
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 ] ) ;
67
49
}
68
50
}
69
51
70
- return ( Object . keys ( patch ) . length > 0 ? patch : undefined ) ;
52
+ return ( Object . keys ( patch ) . length > 0 ? patch : { } ) ;
71
53
} ;
0 commit comments