1- import  {  anyArrayKeys ,  getNodeRules ,  JsonPath ,  syncCrawl ,  SyncCrawlHook  }  from  '@netcracker/qubership-apihub-json-crawl' 
1+ import  { 
2+   anyArrayKeys , 
3+   getNodeRules , 
4+   JsonPath , 
5+   syncClone , 
6+   syncCrawl , 
7+   SyncCrawlHook , 
8+ }  from  '@netcracker/qubership-apihub-json-crawl' 
29
310import  { 
411  ChainItem , 
@@ -16,6 +23,7 @@ import { deepEqual } from 'fast-equals'
1623import  { 
1724  AdapterContext , 
1825  AdapterResolver , 
26+   AGGREGATE_DIFFS_HERE_RULE , 
1927  CompareContext , 
2028  CompareResult , 
2129  CompareRule , 
@@ -473,7 +481,7 @@ export const compare = (before: unknown, after: unknown, options: InternalCompar
473481    return  { 
474482      diffs : rawDiffs , 
475483      ownerDiffEntry : undefined , 
476-       merged, 
484+       merged :  aggregateDiffs ( merged ,   options ) , 
477485    } 
478486  } 
479487  const  diffFlags  =  Symbol ( 'diffs' ) 
@@ -491,8 +499,66 @@ export const compare = (before: unknown, after: unknown, options: InternalCompar
491499  return  { 
492500    diffs : denormalizedDiffs , 
493501    ownerDiffEntry : undefined , 
494-     merged, 
502+     merged : merged , 
503+   } 
504+ } 
505+ 
506+ export  function  aggregateDiffs ( merged : unknown ,  options : InternalCompareOptions ) : unknown  { 
507+   let  activeDataCycleGuard : Set < unknown >  =  new  Set ( ) 
508+ 
509+   const  collectCurrentNodeDiffs  =  ( value : Record < string  |  symbol ,  unknown > ,  operationDiffs : Set < Diff > )  =>  { 
510+     if  ( options . metaKey  in  value )  { 
511+       const  diffs  =  value [ options . metaKey ]  as  Record < PropertyKey ,  unknown >  |  undefined 
512+       for  ( const  key  in  diffs )  { 
513+         // @ts -ignore 
514+         if  ( operationDiffs )  { 
515+           // @ts -ignore 
516+           operationDiffs . add ( diffs [ key ] ) 
517+         } 
518+       } 
519+     } 
495520  } 
521+ 
522+   syncClone ( 
523+     merged , 
524+     [ 
525+       ( {  key,  value,  state,  rules } )  =>  { 
526+         if  ( ! isObject ( value ) )  { 
527+           return  {  value } 
528+         } 
529+         if  ( typeof  key  ===  'symbol' )  { 
530+           // return { value } 
531+           return  {  done : true  } 
532+         } 
533+         if  ( activeDataCycleGuard . has ( value ) )  { 
534+           return  {  done : true  } 
535+         } 
536+         activeDataCycleGuard . add ( value ) 
537+ 
538+         // @ts -ignore 
539+         collectCurrentNodeDiffs ( value ,  state . operationDiffs ) 
540+ 
541+         if  ( rules  &&  AGGREGATE_DIFFS_HERE_RULE  in  rules )  { 
542+           activeDataCycleGuard  =  new  Set ( ) 
543+           const  operationDiffs  =  new  Set < Diff > ( ) 
544+           collectCurrentNodeDiffs ( value ,  operationDiffs ) 
545+           return  { 
546+             value, 
547+             state : {  ...state ,  operationDiffs } , 
548+             exitHook : ( )  =>  { 
549+               value [ options . diffsAggregatedFlag ]  =  operationDiffs 
550+             } , 
551+           } 
552+         } 
553+         return  {  value } 
554+       } , 
555+     ] , 
556+     { 
557+       rules : options . rules 
558+     } , 
559+   ) 
560+ 
561+   return  merged 
496562} 
497563
498564export  const  nestedCompare  =  ( before : unknown ,  after : unknown ,  options : InternalCompareOptions ) : CompareResult  =>  { 
0 commit comments