@@ -11,15 +11,9 @@ jsonDiff.useLongestToken = true;
1111
1212jsonDiff . tokenize  =  lineDiff . tokenize ; 
1313jsonDiff . castInput  =  function ( value )  { 
14-   const  { undefinedReplacement}  =  this . options ; 
14+   const  { undefinedReplacement,  stringifyReplacer  =   ( k ,   v )   =>   typeof   v   ===   'undefined'  ?  undefinedReplacement  :  v }  =  this . options ; 
1515
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 ,  '  ' ) ; 
2317} ; 
2418jsonDiff . equals  =  function ( left ,  right )  { 
2519  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) {
2822export  function  diffJson ( oldObj ,  newObj ,  options )  {  return  jsonDiff . diff ( oldObj ,  newObj ,  options ) ;  } 
2923
3024// 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 )  { 
3327  stack  =  stack  ||  [ ] ; 
3428  replacementStack  =  replacementStack  ||  [ ] ; 
3529
30+   if  ( replacer )  { 
31+     obj  =  replacer ( key ,  obj ) ; 
32+   } 
33+ 
3634  let  i ; 
3735
3836  for  ( i  =  0 ;  i  <  stack . length ;  i  +=  1 )  { 
@@ -48,7 +46,7 @@ export function canonicalize(obj, stack, replacementStack) {
4846    canonicalizedObj  =  new  Array ( obj . length ) ; 
4947    replacementStack . push ( canonicalizedObj ) ; 
5048    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 ) ; 
5250    } 
5351    stack . pop ( ) ; 
5452    replacementStack . pop ( ) ; 
@@ -74,7 +72,7 @@ export function canonicalize(obj, stack, replacementStack) {
7472    sortedKeys . sort ( ) ; 
7573    for  ( i  =  0 ;  i  <  sortedKeys . length ;  i  +=  1 )  { 
7674      key  =  sortedKeys [ i ] ; 
77-       canonicalizedObj [ key ]  =  canonicalize ( obj [ key ] ,  stack ,  replacementStack ) ; 
75+       canonicalizedObj [ key ]  =  canonicalize ( obj [ key ] ,  stack ,  replacementStack ,   replacer ,   key ) ; 
7876    } 
7977    stack . pop ( ) ; 
8078    replacementStack . pop ( ) ; 
0 commit comments