@@ -41,15 +41,15 @@ function filterUserFile(data: any): any {
4141const DISPLAY_FILTERS = [ filterUserFile ]
4242
4343export function filterForDisplay ( data : any ) : any {
44- const seen = new WeakSet ( )
44+ const seen = new Set < object > ( )
4545 return filterForDisplayInternal ( data , seen , 0 )
4646}
4747
4848function getObjectType ( data : unknown ) : string {
4949 return Object . prototype . toString . call ( data ) . slice ( 8 , - 1 )
5050}
5151
52- function filterForDisplayInternal ( data : any , seen : WeakSet < object > , depth : number ) : any {
52+ function filterForDisplayInternal ( data : any , seen : Set < object > , depth : number ) : any {
5353 try {
5454 if ( data === null || data === undefined ) {
5555 return data
@@ -93,6 +93,7 @@ function filterForDisplayInternal(data: any, seen: WeakSet<object>, depth: numbe
9393 return '[Unknown Type]'
9494 }
9595
96+ // True circular reference: object is an ancestor in the current path
9697 if ( seen . has ( data ) ) {
9798 return '[Circular Reference]'
9899 }
@@ -131,18 +132,24 @@ function filterForDisplayInternal(data: any, seen: WeakSet<object>, depth: numbe
131132 return `[ArrayBuffer: ${ ( data as ArrayBuffer ) . byteLength } bytes]`
132133
133134 case 'Map' : {
135+ seen . add ( data )
134136 const obj : Record < string , any > = { }
135137 for ( const [ key , value ] of ( data as Map < any , any > ) . entries ( ) ) {
136138 const keyStr = typeof key === 'string' ? key : String ( key )
137139 obj [ keyStr ] = filterForDisplayInternal ( value , seen , depth + 1 )
138140 }
141+ seen . delete ( data )
139142 return obj
140143 }
141144
142- case 'Set' :
143- return Array . from ( data as Set < any > ) . map ( ( item ) =>
145+ case 'Set' : {
146+ seen . add ( data )
147+ const result = Array . from ( data as Set < any > ) . map ( ( item ) =>
144148 filterForDisplayInternal ( item , seen , depth + 1 )
145149 )
150+ seen . delete ( data )
151+ return result
152+ }
146153
147154 case 'WeakMap' :
148155 return '[WeakMap]'
@@ -161,17 +168,22 @@ function filterForDisplayInternal(data: any, seen: WeakSet<object>, depth: numbe
161168 return `[${ objectType } : ${ ( data as ArrayBufferView ) . byteLength } bytes]`
162169 }
163170
171+ // Add to current path before processing children
164172 seen . add ( data )
165173
166174 for ( const filterFn of DISPLAY_FILTERS ) {
167- const result = filterFn ( data )
168- if ( result !== data ) {
169- return filterForDisplayInternal ( result , seen , depth + 1 )
175+ const filtered = filterFn ( data )
176+ if ( filtered !== data ) {
177+ const result = filterForDisplayInternal ( filtered , seen , depth + 1 )
178+ seen . delete ( data )
179+ return result
170180 }
171181 }
172182
173183 if ( Array . isArray ( data ) ) {
174- return data . map ( ( item ) => filterForDisplayInternal ( item , seen , depth + 1 ) )
184+ const result = data . map ( ( item ) => filterForDisplayInternal ( item , seen , depth + 1 ) )
185+ seen . delete ( data )
186+ return result
175187 }
176188
177189 const result : Record < string , any > = { }
@@ -182,6 +194,8 @@ function filterForDisplayInternal(data: any, seen: WeakSet<object>, depth: numbe
182194 result [ key ] = '[Error accessing property]'
183195 }
184196 }
197+ // Remove from current path after processing children
198+ seen . delete ( data )
185199 return result
186200 } catch {
187201 return '[Unserializable]'
0 commit comments