Skip to content

Commit 6cbf0f7

Browse files
authored
Fork ReactSymbols (#24484)
* Fork ReactSymbols * Fix tests * Update jest config
1 parent a10a9a6 commit 6cbf0f7

File tree

5 files changed

+134
-65
lines changed

5 files changed

+134
-65
lines changed

packages/shared/ReactSymbols.js

+25-64
Original file line numberDiff line numberDiff line change
@@ -11,72 +11,33 @@
1111
// When adding new symbols to this file,
1212
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
1313

14-
import {enableSymbolFallbackForWWW} from './ReactFeatureFlags';
15-
16-
const usePolyfill =
17-
enableSymbolFallbackForWWW && (typeof Symbol !== 'function' || !Symbol.for);
18-
1914
// The Symbol used to tag the ReactElement-like types.
20-
export const REACT_ELEMENT_TYPE = usePolyfill
21-
? 0xeac7
22-
: Symbol.for('react.element');
23-
export const REACT_PORTAL_TYPE = usePolyfill
24-
? 0xeaca
25-
: Symbol.for('react.portal');
26-
export const REACT_FRAGMENT_TYPE = usePolyfill
27-
? 0xeacb
28-
: Symbol.for('react.fragment');
29-
export const REACT_STRICT_MODE_TYPE = usePolyfill
30-
? 0xeacc
31-
: Symbol.for('react.strict_mode');
32-
export const REACT_PROFILER_TYPE = usePolyfill
33-
? 0xead2
34-
: Symbol.for('react.profiler');
35-
export const REACT_PROVIDER_TYPE = usePolyfill
36-
? 0xeacd
37-
: Symbol.for('react.provider');
38-
export const REACT_CONTEXT_TYPE = usePolyfill
39-
? 0xeace
40-
: Symbol.for('react.context');
41-
export const REACT_SERVER_CONTEXT_TYPE = usePolyfill
42-
? 0xeae6
43-
: Symbol.for('react.server_context');
44-
export const REACT_FORWARD_REF_TYPE = usePolyfill
45-
? 0xead0
46-
: Symbol.for('react.forward_ref');
47-
export const REACT_SUSPENSE_TYPE = usePolyfill
48-
? 0xead1
49-
: Symbol.for('react.suspense');
50-
export const REACT_SUSPENSE_LIST_TYPE = usePolyfill
51-
? 0xead8
52-
: Symbol.for('react.suspense_list');
53-
export const REACT_MEMO_TYPE = usePolyfill ? 0xead3 : Symbol.for('react.memo');
54-
export const REACT_LAZY_TYPE = usePolyfill ? 0xead4 : Symbol.for('react.lazy');
55-
export const REACT_SCOPE_TYPE = usePolyfill
56-
? 0xead7
57-
: Symbol.for('react.scope');
58-
export const REACT_DEBUG_TRACING_MODE_TYPE = usePolyfill
59-
? 0xeae1
60-
: Symbol.for('react.debug_trace_mode');
61-
export const REACT_OFFSCREEN_TYPE = usePolyfill
62-
? 0xeae2
63-
: Symbol.for('react.offscreen');
64-
export const REACT_LEGACY_HIDDEN_TYPE = usePolyfill
65-
? 0xeae3
66-
: Symbol.for('react.legacy_hidden');
67-
export const REACT_CACHE_TYPE = usePolyfill
68-
? 0xeae4
69-
: Symbol.for('react.cache');
70-
export const REACT_TRACING_MARKER_TYPE = usePolyfill
71-
? 0xeae5
72-
: Symbol.for('react.tracing_marker');
73-
export const REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED = usePolyfill
74-
? 0xeae7
75-
: Symbol.for('react.default_value');
76-
const MAYBE_ITERATOR_SYMBOL = usePolyfill
77-
? typeof Symbol === 'function' && Symbol.iterator
78-
: Symbol.iterator;
15+
export const REACT_ELEMENT_TYPE = Symbol.for('react.element');
16+
export const REACT_PORTAL_TYPE = Symbol.for('react.portal');
17+
export const REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');
18+
export const REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');
19+
export const REACT_PROFILER_TYPE = Symbol.for('react.profiler');
20+
export const REACT_PROVIDER_TYPE = Symbol.for('react.provider');
21+
export const REACT_CONTEXT_TYPE = Symbol.for('react.context');
22+
export const REACT_SERVER_CONTEXT_TYPE = Symbol.for('react.server_context');
23+
export const REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');
24+
export const REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');
25+
export const REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');
26+
export const REACT_MEMO_TYPE = Symbol.for('react.memo');
27+
export const REACT_LAZY_TYPE = Symbol.for('react.lazy');
28+
export const REACT_SCOPE_TYPE = Symbol.for('react.scope');
29+
export const REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for(
30+
'react.debug_trace_mode',
31+
);
32+
export const REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');
33+
export const REACT_LEGACY_HIDDEN_TYPE = Symbol.for('react.legacy_hidden');
34+
export const REACT_CACHE_TYPE = Symbol.for('react.cache');
35+
export const REACT_TRACING_MARKER_TYPE = Symbol.for('react.tracing_marker');
36+
export const REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED = Symbol.for(
37+
'react.default_value',
38+
);
7939

40+
const MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
8041
const FAUX_ITERATOR_SYMBOL = '@@iterator';
8142

8243
export function getIteratorFn(maybeIterable: ?any): ?() => ?Iterator<*> {

packages/shared/ReactSymbols.www.js

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
// ATTENTION
11+
// When adding new symbols to this file,
12+
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
13+
14+
import {enableSymbolFallbackForWWW} from './ReactFeatureFlags';
15+
16+
const usePolyfill =
17+
enableSymbolFallbackForWWW && (typeof Symbol !== 'function' || !Symbol.for);
18+
19+
// The Symbol used to tag the ReactElement-like types.
20+
export const REACT_ELEMENT_TYPE = usePolyfill
21+
? 0xeac7
22+
: Symbol.for('react.element');
23+
export const REACT_PORTAL_TYPE = usePolyfill
24+
? 0xeaca
25+
: Symbol.for('react.portal');
26+
export const REACT_FRAGMENT_TYPE = usePolyfill
27+
? 0xeacb
28+
: Symbol.for('react.fragment');
29+
export const REACT_STRICT_MODE_TYPE = usePolyfill
30+
? 0xeacc
31+
: Symbol.for('react.strict_mode');
32+
export const REACT_PROFILER_TYPE = usePolyfill
33+
? 0xead2
34+
: Symbol.for('react.profiler');
35+
export const REACT_PROVIDER_TYPE = usePolyfill
36+
? 0xeacd
37+
: Symbol.for('react.provider');
38+
export const REACT_CONTEXT_TYPE = usePolyfill
39+
? 0xeace
40+
: Symbol.for('react.context');
41+
export const REACT_SERVER_CONTEXT_TYPE = usePolyfill
42+
? 0xeae6
43+
: Symbol.for('react.server_context');
44+
export const REACT_FORWARD_REF_TYPE = usePolyfill
45+
? 0xead0
46+
: Symbol.for('react.forward_ref');
47+
export const REACT_SUSPENSE_TYPE = usePolyfill
48+
? 0xead1
49+
: Symbol.for('react.suspense');
50+
export const REACT_SUSPENSE_LIST_TYPE = usePolyfill
51+
? 0xead8
52+
: Symbol.for('react.suspense_list');
53+
export const REACT_MEMO_TYPE = usePolyfill ? 0xead3 : Symbol.for('react.memo');
54+
export const REACT_LAZY_TYPE = usePolyfill ? 0xead4 : Symbol.for('react.lazy');
55+
export const REACT_SCOPE_TYPE = usePolyfill
56+
? 0xead7
57+
: Symbol.for('react.scope');
58+
export const REACT_DEBUG_TRACING_MODE_TYPE = usePolyfill
59+
? 0xeae1
60+
: Symbol.for('react.debug_trace_mode');
61+
export const REACT_OFFSCREEN_TYPE = usePolyfill
62+
? 0xeae2
63+
: Symbol.for('react.offscreen');
64+
export const REACT_LEGACY_HIDDEN_TYPE = usePolyfill
65+
? 0xeae3
66+
: Symbol.for('react.legacy_hidden');
67+
export const REACT_CACHE_TYPE = usePolyfill
68+
? 0xeae4
69+
: Symbol.for('react.cache');
70+
export const REACT_TRACING_MARKER_TYPE = usePolyfill
71+
? 0xeae5
72+
: Symbol.for('react.tracing_marker');
73+
export const REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED = usePolyfill
74+
? 0xeae7
75+
: Symbol.for('react.default_value');
76+
const MAYBE_ITERATOR_SYMBOL = usePolyfill
77+
? typeof Symbol === 'function' && Symbol.iterator
78+
: Symbol.iterator;
79+
80+
const FAUX_ITERATOR_SYMBOL = '@@iterator';
81+
82+
export function getIteratorFn(maybeIterable: ?any): ?() => ?Iterator<*> {
83+
if (maybeIterable === null || typeof maybeIterable !== 'object') {
84+
return null;
85+
}
86+
const maybeIterator =
87+
(MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||
88+
maybeIterable[FAUX_ITERATOR_SYMBOL];
89+
if (typeof maybeIterator === 'function') {
90+
return maybeIterator;
91+
}
92+
return null;
93+
}

packages/shared/__tests__/ReactSymbols-test.internal.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ describe('ReactSymbols', () => {
3232
const originalSymbolFor = global.Symbol.for;
3333
global.Symbol.for = null;
3434
try {
35-
const entries = Object.entries(require('shared/ReactSymbols')).filter(
35+
const entries = Object.entries(require('shared/ReactSymbols.www')).filter(
3636
// REACT_ASYNC_MODE_TYPE and REACT_CONCURRENT_MODE_TYPE have the same numeric value
3737
// for legacy backwards compatibility
3838
([key]) => key !== 'REACT_ASYNC_MODE_TYPE',

scripts/jest/setupTests.www.js

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ jest.mock('shared/ReactFeatureFlags', () => {
1919
return wwwFlags;
2020
});
2121

22+
jest.mock('shared/ReactSymbols', () => {
23+
return jest.requireActual('shared/ReactSymbols.www');
24+
});
25+
2226
jest.mock('scheduler/src/SchedulerFeatureFlags', () => {
2327
const schedulerSrcPath = process.cwd() + '/packages/scheduler';
2428
jest.mock(

scripts/rollup/forks.js

+11
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,17 @@ const forks = Object.freeze({
138138
return null;
139139
},
140140

141+
'./packages/shared/ReactSymbols.js': bundleType => {
142+
switch (bundleType) {
143+
case FB_WWW_DEV:
144+
case FB_WWW_PROD:
145+
case FB_WWW_PROFILING:
146+
return './packages/shared/ReactSymbols.www.js';
147+
default:
148+
return './packages/shared/ReactSymbols.js';
149+
}
150+
},
151+
141152
'./packages/scheduler/index.js': (bundleType, entry, dependencies) => {
142153
switch (bundleType) {
143154
case UMD_DEV:

0 commit comments

Comments
 (0)