@@ -25,11 +25,17 @@ import type { FetchRequest, FetchResponse } from "./fetch.js";
25
25
export type ErrorInfo < T > = Omit < T , "code" | "name" | "message" | "shortMessage" > & { shortMessage ?: string } ;
26
26
27
27
28
- function stringify ( value : any ) : any {
28
+ function stringify ( value : any , seen ?: Set < any > ) : any {
29
29
if ( value == null ) { return "null" ; }
30
30
31
+ if ( seen == null ) { seen = new Set ( ) ; }
32
+ if ( typeof ( value ) === "object" ) {
33
+ if ( seen . has ( value ) ) { return "[Circular]" ; }
34
+ seen . add ( value ) ;
35
+ }
36
+
31
37
if ( Array . isArray ( value ) ) {
32
- return "[ " + ( value . map ( stringify ) ) . join ( ", " ) + " ]" ;
38
+ return "[ " + ( value . map ( ( v ) => stringify ( v , seen ) ) ) . join ( ", " ) + " ]" ;
33
39
}
34
40
35
41
if ( value instanceof Uint8Array ) {
@@ -43,22 +49,20 @@ function stringify(value: any): any {
43
49
}
44
50
45
51
if ( typeof ( value ) === "object" && typeof ( value . toJSON ) === "function" ) {
46
- return stringify ( value . toJSON ( ) ) ;
52
+ return stringify ( value . toJSON ( ) , seen ) ;
47
53
}
48
54
49
55
switch ( typeof ( value ) ) {
50
- case "boolean" : case "symbol" :
56
+ case "boolean" : case "number" : case " symbol" :
51
57
return value . toString ( ) ;
52
58
case "bigint" :
53
59
return BigInt ( value ) . toString ( ) ;
54
- case "number" :
55
- return ( value ) . toString ( ) ;
56
60
case "string" :
57
61
return JSON . stringify ( value ) ;
58
62
case "object" : {
59
63
const keys = Object . keys ( value ) ;
60
64
keys . sort ( ) ;
61
- return "{ " + keys . map ( ( k ) => `${ stringify ( k ) } : ${ stringify ( value [ k ] ) } ` ) . join ( ", " ) + " }" ;
65
+ return "{ " + keys . map ( ( k ) => `${ stringify ( k , seen ) } : ${ stringify ( value [ k ] , seen ) } ` ) . join ( ", " ) + " }" ;
62
66
}
63
67
}
64
68
0 commit comments