@@ -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