Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5679da6

Browse files
authored
Fix recursion with react elements (#883)
* Remove check for React.isValidElement * Remove _owner key from react elements * split test in to two
1 parent b6cbd90 commit 5679da6

File tree

2 files changed

+55
-9
lines changed

2 files changed

+55
-9
lines changed

‎src/formatter/sortObject.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,18 @@ function safeSortObject(value: any, seen: WeakSet<any>): any {
77
return value;
88
}
99

10-
// return date, regexp and react element values as is
11-
if (
12-
value instanceof Date ||
13-
value instanceof RegExp ||
14-
React.isValidElement(value)
15-
) {
10+
// return date and regexp values as is
11+
if (value instanceof Date || value instanceof RegExp) {
1612
return value;
1713
}
1814

15+
// return react element as is but remove _owner key because it can lead to recursion
16+
if (React.isValidElement(value)) {
17+
const copyObj = { ...value };
18+
delete copyObj._owner;
19+
return copyObj;
20+
}
21+
1922
seen.add(value);
2023

2124
// make a copy of array with each item passed through the sorting algorithm
@@ -27,9 +30,6 @@ function safeSortObject(value: any, seen: WeakSet<any>): any {
2730
return Object.keys(value)
2831
.sort()
2932
.reduce((result, key) => {
30-
if (key === '_owner') {
31-
return result;
32-
}
3333
if (key === 'current' || seen.has(value[key])) {
3434
// eslint-disable-next-line no-param-reassign
3535
result[key] = '[Circular]';

‎src/formatter/sortObject.spec.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* @flow */
22

3+
import React from 'react';
34
import sortObject from './sortObject';
45

56
describe('sortObject', () => {
@@ -42,4 +43,49 @@ describe('sortObject', () => {
4243
c: date,
4344
});
4445
});
46+
47+
describe('_owner key', () => {
48+
it('should preserve the _owner key for objects that are not react elements', () => {
49+
const fixture = {
50+
_owner: "_owner that doesn't belong to react element",
51+
foo: 'bar',
52+
};
53+
54+
expect(JSON.stringify(sortObject(fixture))).toEqual(
55+
JSON.stringify({
56+
_owner: "_owner that doesn't belong to react element",
57+
foo: 'bar',
58+
})
59+
);
60+
});
61+
62+
it('should remove the _owner key from top level react element', () => {
63+
const fixture = {
64+
reactElement: (
65+
<div>
66+
<span></span>
67+
</div>
68+
),
69+
};
70+
71+
expect(JSON.stringify(sortObject(fixture))).toEqual(
72+
JSON.stringify({
73+
reactElement: {
74+
type: 'div',
75+
key: null,
76+
props: {
77+
children: {
78+
type: 'span',
79+
key: null,
80+
props: {},
81+
_owner: null,
82+
_store: {},
83+
},
84+
},
85+
_store: {},
86+
},
87+
})
88+
);
89+
});
90+
});
4591
});

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /