1
1
/* @flow */
2
2
import * as React from 'react' ;
3
3
4
- export default function sortObject ( value : any ) : any {
4
+ function safeSortObject ( value : any , seen : WeakSet < any > ) : any {
5
5
// return non-object value as is
6
6
if ( value === null || typeof value !== 'object' ) {
7
7
return value ;
@@ -16,9 +16,11 @@ export default function sortObject(value: any): any {
16
16
return value ;
17
17
}
18
18
19
- // make a copy of array with each item passed through sortObject()
19
+ seen . add ( value ) ;
20
+
21
+ // make a copy of array with each item passed through the sorting algorithm
20
22
if ( Array . isArray ( value ) ) {
21
- return value . map ( sortObject ) ;
23
+ return value . map ( v => safeSortObject ( v , seen ) ) ;
22
24
}
23
25
24
26
// make a copy of object with key sorted
@@ -28,13 +30,17 @@ export default function sortObject(value: any): any {
28
30
if ( key === '_owner' ) {
29
31
return result ;
30
32
}
31
- if ( key === 'current' ) {
33
+ if ( key === 'current' || seen . has ( value [ key ] ) ) {
32
34
// eslint-disable-next-line no-param-reassign
33
35
result [ key ] = '[Circular]' ;
34
36
} else {
35
37
// eslint-disable-next-line no-param-reassign
36
- result [ key ] = sortObject ( value [ key ] ) ;
38
+ result [ key ] = safeSortObject ( value [ key ] , seen ) ;
37
39
}
38
40
return result ;
39
41
} , { } ) ;
40
42
}
43
+
44
+ export default function sortObject ( value : any ) : any {
45
+ return safeSortObject ( value , new WeakSet ( ) ) ;
46
+ }
0 commit comments