@@ -11,15 +11,9 @@ jsonDiff.useLongestToken = true;
11
11
12
12
jsonDiff . tokenize = lineDiff . tokenize ;
13
13
jsonDiff . castInput = function ( value ) {
14
- const { undefinedReplacement} = this . options ;
14
+ const { undefinedReplacement, stringifyReplacer = ( k , v ) => typeof v === 'undefined' ? undefinedReplacement : v } = this . options ;
15
15
16
- return typeof value === 'string' ? value : JSON . stringify ( canonicalize ( value ) , function ( k , v ) {
17
- if ( typeof v === 'undefined' ) {
18
- return undefinedReplacement ;
19
- }
20
-
21
- return v ;
22
- } , ' ' ) ;
16
+ return typeof value === 'string' ? value : JSON . stringify ( canonicalize ( value , null , null , stringifyReplacer ) , stringifyReplacer , ' ' ) ;
23
17
} ;
24
18
jsonDiff . equals = function ( left , right ) {
25
19
return Diff . prototype . equals . call ( jsonDiff , left . replace ( / , ( [ \r \n ] ) / g, '$1' ) , right . replace ( / , ( [ \r \n ] ) / g, '$1' ) ) ;
@@ -28,11 +22,15 @@ jsonDiff.equals = function(left, right) {
28
22
export function diffJson ( oldObj , newObj , options ) { return jsonDiff . diff ( oldObj , newObj , options ) ; }
29
23
30
24
// This function handles the presence of circular references by bailing out when encountering an
31
- // object that is already on the "stack" of items being processed.
32
- export function canonicalize ( obj , stack , replacementStack ) {
25
+ // object that is already on the "stack" of items being processed. Accepts an optional replacer
26
+ export function canonicalize ( obj , stack , replacementStack , replacer , key ) {
33
27
stack = stack || [ ] ;
34
28
replacementStack = replacementStack || [ ] ;
35
29
30
+ if ( replacer ) {
31
+ obj = replacer ( key , obj ) ;
32
+ }
33
+
36
34
let i ;
37
35
38
36
for ( i = 0 ; i < stack . length ; i += 1 ) {
@@ -48,7 +46,7 @@ export function canonicalize(obj, stack, replacementStack) {
48
46
canonicalizedObj = new Array ( obj . length ) ;
49
47
replacementStack . push ( canonicalizedObj ) ;
50
48
for ( i = 0 ; i < obj . length ; i += 1 ) {
51
- canonicalizedObj [ i ] = canonicalize ( obj [ i ] , stack , replacementStack ) ;
49
+ canonicalizedObj [ i ] = canonicalize ( obj [ i ] , stack , replacementStack , replacer , key ) ;
52
50
}
53
51
stack . pop ( ) ;
54
52
replacementStack . pop ( ) ;
@@ -74,7 +72,7 @@ export function canonicalize(obj, stack, replacementStack) {
74
72
sortedKeys . sort ( ) ;
75
73
for ( i = 0 ; i < sortedKeys . length ; i += 1 ) {
76
74
key = sortedKeys [ i ] ;
77
- canonicalizedObj [ key ] = canonicalize ( obj [ key ] , stack , replacementStack ) ;
75
+ canonicalizedObj [ key ] = canonicalize ( obj [ key ] , stack , replacementStack , replacer , key ) ;
78
76
}
79
77
stack . pop ( ) ;
80
78
replacementStack . pop ( ) ;
0 commit comments