@samitouri / QOS-React / commits / 72196da829

Replace shims with explicit React access from the renderers for shared global state (#9366)

* Remove non-existent /lib/ from souce files * Replace all shims with explicit access This deletes shims and changes to access require('react').__DO_NOT_USE__ from renderers for global shared state. I cloned flattenChildren() and traverseAllChildren() because they relied on CurrentOwner but were used both from Stack and Isomorphic. The stack implementations will die, and the isomorphic ones can be changed to be optimized for Children specifically in the future. I also deleted UMD shims because they are now unnecessary. I moved the internals assignment to main modules since they're now used in tests, and made them direct UMD entry points.

Dan Abramov committed Apr 7, 2017 at 22:07 UTC 72196da82915bee400edb1599d4223926aa2a8a0
48 files changed +509 -398
scripts/rollup/bundles.js
+5 -14
@@ -44,7 +44,7 @@ const bundles = [
44 moduleName: 'React',
45 sourceMap: false,
46 },
47 - entry: 'src/umd/ReactUMDEntry.js',
47 + entry: 'src/isomorphic/React.js',
48 externals: [],
49 fbEntry: 'src/fb/ReactFBEntry.js',
50 hasteName: 'React',
@@ -53,9 +53,6 @@ const bundles = [
53 manglePropertiesOnProd: false,
54 name: 'react',
55 paths: [
56 - 'src/umd/ReactUMDEntry.js',
57 - 'src/umd/shims/**/*.js',
58 -
56 'src/isomorphic/**/*.js',
57 'src/addons/**/*.js',
58
@@ -76,7 +73,7 @@ const bundles = [
73 moduleName: 'ReactDOM',
74 sourceMap: false,
75 },
79 - entry: 'src/umd/ReactDOMUMDEntry.js',
76 + entry: 'src/renderers/dom/ReactDOM.js',
77 externals: [],
78 fbEntry: 'src/fb/ReactDOMFBEntry.js',
79 hasteName: 'ReactDOMStack',
@@ -85,8 +82,6 @@ const bundles = [
82 manglePropertiesOnProd: false,
83 name: 'react-dom-stack',
84 paths: [
88 - 'src/umd/ReactDOMUMDEntry.js',
89 -
85 'src/renderers/dom/**/*.js',
86 'src/renderers/shared/**/*.js',
87 'src/test/**/*.js', // ReactTestUtils is currently very coupled to DOM.
@@ -106,7 +101,7 @@ const bundles = [
101 moduleName: 'ReactDOM',
102 sourceMap: false,
103 },
109 - entry: 'src/umd/ReactDOMUMDEntry.js',
104 + entry: 'src/renderers/dom/fiber/ReactDOMFiber.js',
105 externals: [],
106 fbEntry: 'src/fb/ReactDOMFiberFBEntry.js',
107 hasteName: 'ReactDOMFiber',
@@ -115,8 +110,6 @@ const bundles = [
110 manglePropertiesOnProd: false,
111 name: 'react-dom',
112 paths: [
118 - 'src/umd/ReactDOMUMDEntry.js',
119 -
113 'src/renderers/dom/**/*.js',
114 'src/renderers/shared/**/*.js',
115 'src/test/**/*.js', // ReactTestUtils is currently very coupled to DOM.
@@ -139,17 +132,15 @@ const bundles = [
132 moduleName: 'ReactDOMServer',
133 sourceMap: false,
134 },
142 - entry: 'src/umd/ReactDOMServerUMDEntry.js',
135 + entry: 'src/renderers/dom/ReactDOMServer.js',
136 externals: [],
144 - fbEntry: 'src/umd/ReactDOMServerUMDEntry.js',
137 + fbEntry: 'src/renderers/dom/ReactDOMServer.js',
138 hasteName: 'ReactDOMServerStack',
139 isRenderer: true,
140 label: 'dom-server',
141 manglePropertiesOnProd: false,
142 name: 'react-dom/server',
143 paths: [
151 - 'src/umd/ReactDOMServerUMDEntry.js',
152 -
144 'src/renderers/dom/**/*.js',
145 'src/renderers/shared/**/*.js',
146
scripts/rollup/modules.js
+8 -93
@@ -48,10 +48,8 @@ const fbjsModules = [
48 const devOnlyFilesToStubOut = [
49 "'ReactDebugCurrentFrame'",
50 "'ReactComponentTreeHook'",
51 - "'react/lib/ReactDebugCurrentFrame'",
52 - "'react/lib/ReactComponentTreeHook'",
53 - "'react-dom/lib/ReactPerf'",
54 - "'react-dom/lib/ReactTestUtils'",
51 + "'ReactPerf'",
52 + "'ReactTestUtils'",
53 ];
54
55 // this function builds up a very niave Haste-like moduleMap
@@ -114,7 +112,6 @@ function ignoreFBModules() {
112 'ReactDOMFeatureFlags',
113 // In FB bundles, we preserve an inline require to ReactCurrentOwner.
114 // See the explanation in FB version of ReactCurrentOwner in www:
117 - 'react/lib/ReactCurrentOwner',
115 'ReactCurrentOwner',
116 ];
117 }
@@ -157,7 +154,7 @@ function getExternalModules(externals, bundleType, isRenderer) {
154 case FB_DEV:
155 case FB_PROD:
156 fbjsModules.forEach(module => externalModules.push(module));
160 - externalModules.push('react/lib/ReactCurrentOwner', 'ReactCurrentOwner');
157 + externalModules.push('ReactCurrentOwner');
158 if (isRenderer) {
159 externalModules.push('React');
160 }
@@ -177,9 +174,6 @@ function getInternalModules() {
174 function replaceInternalModules() {
175 // we inline these modules in the bundles rather than leave them as external
176 return {
180 - "'react-dom/lib/ReactPerf'": `'${resolve('./src/renderers/shared/ReactPerf.js')}'`,
181 - "'react-dom/lib/ReactTestUtils'": `'${resolve('./src/test/ReactTestUtils.js')}'`,
182 - "'react-dom/lib/ReactInstanceMap'": `'${resolve('./src/renderers/shared/shared/ReactInstanceMap.js')}'`,
177 "'react-dom'": `'${resolve('./src/renderers/dom/ReactDOM.js')}'`,
178 };
179 }
@@ -209,92 +203,16 @@ function getFbjsModuleAliases(bundleType) {
203
204 function replaceFbjsModuleAliases(bundleType) {
205 switch (bundleType) {
212 - case UMD_DEV:
213 - case UMD_PROD:
214 - case NODE_DEV:
215 - case NODE_PROD:
216 - case RN_DEV:
217 - case RN_PROD:
218 - return {};
206 case FB_DEV:
207 case FB_PROD:
221 - // additionally we add mappings for "react"
222 - // so they work correctly on FB, this will change soon
208 + // Haste at FB doesn't currently allow case sensitive names,
209 + // and product code already uses "React". In the future,
210 + // we will either allow both variants or migrate to lowercase.
211 return {
212 "'react'": "'React'",
213 };
226 - }
227 -}
228 -
229 -// for renderers, we want them to require the __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner
230 -// on the React bundle itself rather than require module directly.
231 -// For the React bundle, ReactCurrentOwner should be bundled as part of the bundle
232 -// itself and exposed on __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
233 -const shimReactCurrentOwner = resolve(
234 - './scripts/rollup/shims/rollup/ReactCurrentOwnerRollupShim.js'
235 -);
236 -const realReactCurrentOwner = resolve(
237 - './src/isomorphic/classic/element/ReactCurrentOwner.js'
238 -);
239 -
240 -function getReactCurrentOwnerModuleAlias(bundleType, isRenderer) {
241 - if (bundleType === FB_DEV || bundleType === FB_DEV) {
242 - return {};
243 - }
244 - if (isRenderer) {
245 - return {
246 - ReactCurrentOwner: shimReactCurrentOwner,
247 - 'react/lib/ReactCurrentOwner': shimReactCurrentOwner,
248 - };
249 - } else {
250 - return {
251 - ReactCurrentOwner: realReactCurrentOwner,
252 - 'react/lib/ReactCurrentOwner': realReactCurrentOwner,
253 - };
254 - }
255 -}
256 -
257 -// this works almost identically to the ReactCurrentOwner shim above
258 -const shimReactComponentTreeHook = resolve(
259 - './scripts/rollup/shims/rollup/ReactComponentTreeHookRollupShim.js'
260 -);
261 -const realReactComponentTreeHook = resolve(
262 - './src/isomorphic/hooks/ReactComponentTreeHook.js'
263 -);
264 -
265 -function getReactComponentTreeHookModuleAlias(bundleType, isRenderer) {
266 - if (isRenderer) {
267 - return {
268 - ReactComponentTreeHook: shimReactComponentTreeHook,
269 - 'react/lib/ReactComponentTreeHook': shimReactComponentTreeHook,
270 - };
271 - } else {
272 - return {
273 - ReactComponentTreeHook: realReactComponentTreeHook,
274 - 'react/lib/ReactComponentTreeHook': realReactComponentTreeHook,
275 - };
276 - }
277 -}
278 -
279 -// this works almost identically to the ReactCurrentOwner shim above
280 -const shimReactDebugCurrentFrame = resolve(
281 - './scripts/rollup/shims/rollup/ReactDebugCurrentFrameRollupShim.js'
282 -);
283 -const realReactDebugCurrentFrame = resolve(
284 - './src/isomorphic/classic/element/ReactDebugCurrentFrame.js'
285 -);
286 -
287 -function getReactDebugCurrentFrameModuleAlias(bundleType, isRenderer) {
288 - if (isRenderer) {
289 - return {
290 - ReactDebugCurrentFrame: shimReactDebugCurrentFrame,
291 - 'react/lib/ReactDebugCurrentFrame': shimReactDebugCurrentFrame,
292 - };
293 - } else {
294 - return {
295 - ReactDebugCurrentFrame: realReactDebugCurrentFrame,
296 - 'react/lib/ReactDebugCurrentFrame': realReactDebugCurrentFrame,
297 - };
214 + default:
215 + return {};
216 }
217 }
218
@@ -321,9 +239,6 @@ function replaceDevOnlyStubbedModules(bundleType) {
239
240 function getAliases(paths, bundleType, isRenderer, extractErrors) {
241 return Object.assign(
324 - getReactCurrentOwnerModuleAlias(bundleType, isRenderer),
325 - getReactComponentTreeHookModuleAlias(bundleType, isRenderer),
326 - getReactDebugCurrentFrameModuleAlias(bundleType, isRenderer),
242 createModuleMap(
243 paths,
244 extractErrors && extractErrorCodes(errorCodeOpts),
scripts/rollup/results.json
+53 -53
@@ -1,29 +1,29 @@
1 {
2 - "branch": "master",
2 + "branch": "remove-lib-in-source",
3 "bundleSizes": {
4 "react.development.js (UMD_DEV)": {
5 - "size": 116245,
6 - "gzip": 29572
5 + "size": 116098,
6 + "gzip": 29520
7 },
8 "react.production.min.js (UMD_PROD)": {
9 - "size": 13719,
10 - "gzip": 5080
9 + "size": 13707,
10 + "gzip": 5073
11 },
12 "react-dom.development.js (UMD_DEV)": {
13 - "size": 563524,
14 - "gzip": 130148
13 + "size": 563844,
14 + "gzip": 130190
15 },
16 "react-dom.production.min.js (UMD_PROD)": {
17 - "size": 120123,
18 - "gzip": 37844
17 + "size": 120191,
18 + "gzip": 37860
19 },
20 "react-dom-server.development.js (UMD_DEV)": {
21 - "size": 475780,
22 - "gzip": 115177
21 + "size": 476049,
22 + "gzip": 115267
23 },
24 "react-dom-server.production.min.js (UMD_PROD)": {
25 - "size": 106349,
26 - "gzip": 32997
25 + "size": 106489,
26 + "gzip": 33035
27 },
28 "react-art.development.js (UMD_DEV)": {
29 "size": 339599,
@@ -34,68 +34,68 @@
34 "gzip": 28977
35 },
36 "react.development.js (NODE_DEV)": {
37 - "size": 109259,
38 - "gzip": 27527
37 + "size": 109110,
38 + "gzip": 27479
39 },
40 "react.production.min.js (NODE_PROD)": {
41 - "size": 12615,
42 - "gzip": 4659
41 + "size": 12598,
42 + "gzip": 4649
43 },
44 "React-dev.js (FB_DEV)": {
45 - "size": 110742,
46 - "gzip": 28082
45 + "size": 110875,
46 + "gzip": 28140
47 },
48 "React-prod.js (FB_PROD)": {
49 - "size": 56205,
50 - "gzip": 14329
49 + "size": 56406,
50 + "gzip": 14416
51 },
52 "ReactDOMStack-dev.js (FB_DEV)": {
53 - "size": 521957,
54 - "gzip": 124586
53 + "size": 522626,
54 + "gzip": 124708
55 },
56 "ReactDOMStack-prod.js (FB_PROD)": {
57 - "size": 351707,
58 - "gzip": 84366
57 + "size": 352708,
58 + "gzip": 84660
59 },
60 "react-dom.development.js (NODE_DEV)": {
61 - "size": 541898,
62 - "gzip": 125114
61 + "size": 542218,
62 + "gzip": 125162
63 },
64 "react-dom.production.min.js (NODE_PROD)": {
65 - "size": 116802,
66 - "gzip": 36707
65 + "size": 116858,
66 + "gzip": 36717
67 },
68 "ReactDOMFiber-dev.js (FB_DEV)": {
69 - "size": 796380,
70 - "gzip": 183920
69 + "size": 797268,
70 + "gzip": 184134
71 },
72 "ReactDOMFiber-prod.js (FB_PROD)": {
73 - "size": 407360,
74 - "gzip": 93460
73 + "size": 407540,
74 + "gzip": 93567
75 },
76 "react-dom-server.development.js (NODE_DEV)": {
77 - "size": 445181,
78 - "gzip": 107467
77 + "size": 445452,
78 + "gzip": 107574
79 },
80 "react-dom-server.production.min.js (NODE_PROD)": {
81 - "size": 101204,
82 - "gzip": 31227
81 + "size": 101344,
82 + "gzip": 31273
83 },
84 "ReactDOMServerStack-dev.js (FB_DEV)": {
85 - "size": 443932,
86 - "gzip": 107406
85 + "size": 444144,
86 + "gzip": 107423
87 },
88 "ReactDOMServerStack-prod.js (FB_PROD)": {
89 - "size": 332974,
90 - "gzip": 80217
89 + "size": 333744,
90 + "gzip": 80424
91 },
92 "ReactARTStack-dev.js (FB_DEV)": {
93 - "size": 492711,
94 - "gzip": 118489
93 + "size": 492651,
94 + "gzip": 118470
95 },
96 "ReactARTStack-prod.js (FB_PROD)": {
97 - "size": 365115,
98 - "gzip": 87596
97 + "size": 365055,
98 + "gzip": 87582
99 },
100 "react-art.development.js (NODE_DEV)": {
101 "size": 264816,
@@ -106,12 +106,12 @@
106 "gzip": 17109
107 },
108 "ReactARTFiber-dev.js (FB_DEV)": {
109 - "size": 263991,
110 - "gzip": 56709
109 + "size": 263951,
110 + "gzip": 56683
111 },
112 "ReactARTFiber-prod.js (FB_PROD)": {
113 - "size": 205194,
114 - "gzip": 43039
113 + "size": 205154,
114 + "gzip": 43017
115 },
116 "ReactNativeStack.js (RN)": {
117 "size": 233993,
@@ -122,12 +122,12 @@
122 "gzip": 84001
123 },
124 "ReactTestRendererFiber-dev.js (FB_DEV)": {
125 - "size": 261900,
126 - "gzip": 55671
125 + "size": 261860,
126 + "gzip": 55645
127 },
128 "ReactTestRendererStack-dev.js (FB_DEV)": {
129 - "size": 151142,
130 - "gzip": 34709
129 + "size": 151102,
130 + "gzip": 34699
131 },
132 "react-noop-renderer.development.js (NODE_DEV)": {
133 "size": 253895,
scripts/rollup/shims/rollup/ReactCheckPropTypesRollupShim.js deleted
-3
@@ -1,3 +0,0 @@
1 -var React = require('react');
2 -
3 -module.exports = React.checkPropTypes;
scripts/rollup/shims/rollup/ReactComponentTreeHookRollupShim.js deleted
-3
@@ -1,3 +0,0 @@
1 -var ReactInternals = require('react').__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
2 -
3 -module.exports = ReactInternals.ReactComponentTreeHook;
scripts/rollup/shims/rollup/ReactCurrentOwnerRollupShim.js deleted
-3
@@ -1,3 +0,0 @@
1 -var ReactInternals = require('react').__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
2 -
3 -module.exports = ReactInternals.ReactCurrentOwner;
src/fb/ReactDOMFBEntry.js
+5 -6
@@ -11,7 +11,7 @@
11
12 var ReactDOM = require('ReactDOM');
13
14 -ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = {
14 +Object.assign(ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, {
15 // These should be easy to copy into react_contrib and remove from here:
16 adler32: require('adler32'),
17 getVendorPrefixedEventName: require('getVendorPrefixedEventName'),
@@ -29,25 +29,24 @@ ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = {
29 SyntheticKeyboardEvent: require('SyntheticKeyboardEvent'),
30 SyntheticMouseEvent: require('SyntheticMouseEvent'),
31 // These are real internal dependencies that are trickier to remove:
32 - EventPluginHub: require('EventPluginHub'),
32 ReactBrowserEventEmitter: require('ReactBrowserEventEmitter'),
33 ReactErrorUtils: require('ReactErrorUtils'),
34 ReactDOMComponentTree: require('ReactDOMComponentTree'),
36 - ReactInstanceMap: require('react-dom/lib/ReactInstanceMap'),
35 + ReactInstanceMap: require('ReactInstanceMap'),
36 // This is used for ajaxify on www:
37 DOMProperty: require('DOMProperty'),
38 // These are dependencies of TapEventPlugin:
39 EventPluginUtils: require('EventPluginUtils'),
40 EventPropagators: require('EventPropagators'),
41 SyntheticUIEvent: require('SyntheticUIEvent'),
43 -};
42 +});
43
44 if (__DEV__) {
45 Object.assign(ReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, {
46 // ReactPerf and ReactTestUtils currently only work with the DOM renderer
47 // so we expose them from here, but only in DEV mode.
49 - ReactPerf: require('react-dom/lib/ReactPerf'),
50 - ReactTestUtils: require('react-dom/lib/ReactTestUtils'),
48 + ReactPerf: require('ReactPerf'),
49 + ReactTestUtils: require('ReactTestUtils'),
50 });
51 }
52
src/fb/ReactDOMFiberFBEntry.js
+34 -32
@@ -11,37 +11,39 @@
11
12 var ReactDOMFiber = require('ReactDOMFiber');
13
14 -ReactDOMFiber.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = {
15 - // These should be easy to copy into react_contrib and remove from here:
16 - adler32: require('adler32'),
17 - getVendorPrefixedEventName: require('getVendorPrefixedEventName'),
18 - getEventCharCode: require('getEventCharCode'),
19 - getEventKey: require('getEventKey'),
20 - getEventTarget: require('getEventTarget'),
21 - isEventSupported: require('isEventSupported'),
22 - setInnerHTML: require('setInnerHTML'),
23 - setTextContent: require('setTextContent'),
24 - PooledClass: require('PooledClass'),
25 - ReactDOMSelection: require('ReactDOMSelection'),
26 - ReactInputSelection: require('ReactInputSelection'),
27 - // These are mostly used in incorrect Flow typings and are codemoddable:
28 - SyntheticEvent: require('SyntheticEvent'),
29 - SyntheticKeyboardEvent: require('SyntheticKeyboardEvent'),
30 - SyntheticMouseEvent: require('SyntheticMouseEvent'),
31 - // These are real internal dependencies that are trickier to remove:
32 - EventPluginHub: require('EventPluginHub'),
33 - ReactBrowserEventEmitter: require('ReactBrowserEventEmitter'),
34 - ReactErrorUtils: require('ReactErrorUtils'),
35 - ReactFiberErrorLogger: require('ReactFiberErrorLogger'),
36 - ReactDOMComponentTree: require('ReactDOMComponentTree'),
37 - ReactInstanceMap: require('react-dom/lib/ReactInstanceMap'),
38 - // This is used for ajaxify on www:
39 - DOMProperty: require('DOMProperty'),
40 - // These are dependencies of TapEventPlugin:
41 - EventPluginUtils: require('EventPluginUtils'),
42 - EventPropagators: require('EventPropagators'),
43 - SyntheticUIEvent: require('SyntheticUIEvent'),
44 -};
14 +Object.assign(
15 + ReactDOMFiber.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
16 + {
17 + // These should be easy to copy into react_contrib and remove from here:
18 + adler32: require('adler32'),
19 + getVendorPrefixedEventName: require('getVendorPrefixedEventName'),
20 + getEventCharCode: require('getEventCharCode'),
21 + getEventKey: require('getEventKey'),
22 + getEventTarget: require('getEventTarget'),
23 + isEventSupported: require('isEventSupported'),
24 + setInnerHTML: require('setInnerHTML'),
25 + setTextContent: require('setTextContent'),
26 + PooledClass: require('PooledClass'),
27 + ReactDOMSelection: require('ReactDOMSelection'),
28 + ReactInputSelection: require('ReactInputSelection'),
29 + // These are mostly used in incorrect Flow typings and are codemoddable:
30 + SyntheticEvent: require('SyntheticEvent'),
31 + SyntheticKeyboardEvent: require('SyntheticKeyboardEvent'),
32 + SyntheticMouseEvent: require('SyntheticMouseEvent'),
33 + // These are real internal dependencies that are trickier to remove:
34 + ReactBrowserEventEmitter: require('ReactBrowserEventEmitter'),
35 + ReactErrorUtils: require('ReactErrorUtils'),
36 + ReactFiberErrorLogger: require('ReactFiberErrorLogger'),
37 + ReactDOMComponentTree: require('ReactDOMComponentTree'),
38 + ReactInstanceMap: require('ReactInstanceMap'),
39 + // This is used for ajaxify on www:
40 + DOMProperty: require('DOMProperty'),
41 + // These are dependencies of TapEventPlugin:
42 + EventPluginUtils: require('EventPluginUtils'),
43 + EventPropagators: require('EventPropagators'),
44 + SyntheticUIEvent: require('SyntheticUIEvent'),
45 + },
46 +);
47
48 if (__DEV__) {
49 Object.assign(
@@ -49,7 +51,7 @@ if (__DEV__) {
51 {
52 // ReactPerf and ReactTestUtils currently only work with the DOM renderer
53 // so we expose them from here, but only in DEV mode.
52 - ReactTestUtils: require('react-dom/lib/ReactTestUtils'),
54 + ReactTestUtils: require('ReactTestUtils'),
55 },
56 );
57 }
src/fb/ReactFBEntry.js
+8 -23
@@ -11,27 +11,12 @@
11
12 var React = require('React');
13
14 -// `version` will be added here by the React module.
15 -var ReactFBEntry = Object.assign(
16 - {
17 - __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
18 - ReactChildren: require('ReactChildren'),
19 - getComponentName: require('getComponentName'),
20 - flattenChildren: require('flattenChildren'),
21 - },
22 - },
23 - React,
24 -);
14 +// Add existing internal dependencies from www codebase.
15 +// The goal is to get rid of these with time or turn them into public APIs.
16 +Object.assign(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, {
17 + ReactChildren: require('ReactChildren'),
18 + getComponentName: require('getComponentName'),
19 + flattenChildren: require('flattenChildren'),
20 +});
21
26 -if (__DEV__) {
27 - Object.assign(
28 - ReactFBEntry.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
29 - {
30 - // These should not be included in production.
31 - ReactComponentTreeHook: require('react/lib/ReactComponentTreeHook'),
32 - ReactDebugCurrentFrame: require('react/lib/ReactDebugCurrentFrame'),
33 - },
34 - );
35 -}
36 -
37 -module.exports = ReactFBEntry;
22 +module.exports = React;
src/isomorphic/React.js
+12
@@ -84,6 +84,18 @@ var React = {
84 DOM: ReactDOMFactories,
85
86 version: ReactVersion,
87 +
88 + __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
89 + ReactCurrentOwner: require('ReactCurrentOwner'),
90 + },
91 };
92
93 +if (__DEV__) {
94 + Object.assign(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, {
95 + // These should not be included in production.
96 + ReactComponentTreeHook: require('ReactComponentTreeHook'),
97 + ReactDebugCurrentFrame: require('ReactDebugCurrentFrame'),
98 + });
99 +}
100 +
101 module.exports = React;
src/isomorphic/children/flattenChildren.js renamed
+2 -2
@@ -28,7 +28,7 @@ if (
28 // https://github.com/facebook/react/issues/7240
29 // Remove the inline requires when we don't need them anymore:
30 // https://github.com/facebook/react/pull/7178
31 - ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
31 + ReactComponentTreeHook = require('ReactComponentTreeHook');
32 }
33
34 /**
@@ -49,7 +49,7 @@ function flattenSingleChildIntoContext(
49 const keyUnique = result[name] === undefined;
50 if (__DEV__) {
51 if (!ReactComponentTreeHook) {
52 - ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
52 + ReactComponentTreeHook = require('ReactComponentTreeHook');
53 }
54 if (!keyUnique) {
55 warning(
src/isomorphic/children/traverseAllChildren.js renamed
+1 -1
@@ -11,8 +11,8 @@
11
12 'use strict';
13
14 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
14 var REACT_ELEMENT_TYPE = require('ReactElementSymbol');
15 +var ReactCurrentOwner = require('ReactCurrentOwner');
16
17 var getIteratorFn = require('getIteratorFn');
18 var invariant = require('fbjs/lib/invariant');
src/renderers/__tests__/ReactComponentTreeHook-test.js
+2 -2
@@ -29,7 +29,7 @@ describe('ReactComponentTreeHook', () => {
29 ReactDOM = require('react-dom');
30 ReactDOMServer = require('react-dom/server');
31 ReactInstanceMap = require('ReactInstanceMap');
32 - ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
32 + ReactComponentTreeHook = require('ReactComponentTreeHook');
33 ReactComponentTreeTestUtils = require('ReactComponentTreeTestUtils');
34 });
35
@@ -2123,7 +2123,7 @@ describe('ReactComponentTreeHook', () => {
2123 ReactDOM = require('react-dom');
2124 ReactDOMServer = require('react-dom/server');
2125 ReactInstanceMap = require('ReactInstanceMap');
2126 - ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
2126 + ReactComponentTreeHook = require('ReactComponentTreeHook');
2127 ReactComponentTreeTestUtils = require('ReactComponentTreeTestUtils');
2128 });
2129
src/renderers/__tests__/ReactComponentTreeHook-test.native.js
+1 -1
@@ -36,7 +36,7 @@ describeStack('ReactComponentTreeHook', () => {
36 React = require('react');
37 ReactNative = require('ReactNative');
38 ReactInstanceMap = require('ReactInstanceMap');
39 - ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
39 + ReactComponentTreeHook = require('ReactComponentTreeHook');
40 ReactComponentTreeTestUtils = require('ReactComponentTreeTestUtils');
41 View = require('View');
42 createReactNativeComponentClass = require('createReactNativeComponentClass');
src/renderers/__tests__/ReactCompositeComponent-test.js
+1 -1
@@ -30,7 +30,7 @@ describe('ReactCompositeComponent', () => {
30 ReactDOM = require('react-dom');
31 ReactDOMFeatureFlags = require('ReactDOMFeatureFlags');
32 ReactDOMServer = require('react-dom/server');
33 - ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
33 + ReactCurrentOwner = require('ReactCurrentOwner');
34 ReactPropTypes = require('ReactPropTypes');
35 ReactTestUtils = require('ReactTestUtils');
36 shallowEqual = require('fbjs/lib/shallowEqual');
src/renderers/__tests__/ReactHostOperationHistoryHook-test.js
+1 -1
@@ -27,7 +27,7 @@ describeStack('ReactHostOperationHistoryHook', () => {
27 jest.resetModules();
28
29 React = require('react');
30 - ReactPerf = require('react-dom/lib/ReactPerf');
30 + ReactPerf = require('ReactPerf');
31 ReactDOM = require('react-dom');
32 ReactDOMComponentTree = require('ReactDOMComponentTree');
33 ReactHostOperationHistoryHook = require('ReactHostOperationHistoryHook');
src/renderers/__tests__/ReactPerf-test.js
+1 -1
@@ -41,7 +41,7 @@ describeStack('ReactPerf', () => {
41
42 React = require('react');
43 ReactDOM = require('react-dom');
44 - ReactPerf = require('react-dom/lib/ReactPerf');
44 + ReactPerf = require('ReactPerf');
45 ReactTestUtils = require('ReactTestUtils');
46 emptyFunction = require('fbjs/lib/emptyFunction');
47
src/renderers/__tests__/refs-test.js
+2 -2
@@ -317,7 +317,7 @@ describe('string refs between fiber and stack', () => {
317
318 it('attaches, detaches from fiber component with stack layer', () => {
319 spyOn(console, 'error');
320 - const ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
320 + const ReactCurrentOwner = require('ReactCurrentOwner');
321 const ReactDOM = require('react-dom');
322 const ReactDOMFiber = require('ReactDOMFiber');
323 const ReactInstanceMap = require('ReactInstanceMap');
@@ -364,7 +364,7 @@ describe('string refs between fiber and stack', () => {
364
365 it('attaches, detaches from stack component with fiber layer', () => {
366 spyOn(console, 'error');
367 - const ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
367 + const ReactCurrentOwner = require('ReactCurrentOwner');
368 const ReactDOM = require('react-dom');
369 const ReactDOMFiber = require('ReactDOMFiber');
370 const ReactInstanceMap = require('ReactInstanceMap');
src/renderers/dom/ReactDOM.js
+5
@@ -38,6 +38,11 @@ var ReactDOM = {
38 unstable_batchedUpdates: ReactGenericBatching.batchedUpdates,
39 unstable_renderSubtreeIntoContainer: ReactMount.renderSubtreeIntoContainer,
40 /* eslint-enable camelcase */
41 +
42 + __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
43 + // For TapEventPlugin which is popular in open source
44 + EventPluginHub: require('EventPluginHub'),
45 + },
46 };
47
48 // Inject the runtime into a devtools global hook regardless of browser.
src/renderers/dom/fiber/ReactDOMFiber.js
+5
@@ -539,6 +539,11 @@ var ReactDOM = {
539 unstable_batchedUpdates: ReactGenericBatching.batchedUpdates,
540
541 unstable_deferredUpdates: DOMRenderer.deferredUpdates,
542 +
543 + __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
544 + // For TapEventPlugin which is popular in open source
545 + EventPluginHub: require('EventPluginHub'),
546 + },
547 };
548
549 if (typeof injectInternals === 'function') {
src/renderers/dom/shared/findDOMNode.js
+1 -1
@@ -10,8 +10,8 @@
10 * @flow
11 */
12
13 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
13 var ReactInstanceMap = require('ReactInstanceMap');
14 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
15
16 var getComponentName = require('getComponentName');
17 var invariant = require('fbjs/lib/invariant');
src/renderers/dom/shared/hooks/ReactDOMInvalidARIAHook.js
+2 -1
@@ -20,9 +20,10 @@ var warnedProperties = {};
20 var rARIA = new RegExp('^(aria)-[' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$');
21
22 if (__DEV__) {
23 + var {ReactComponentTreeHook} = require('ReactGlobalSharedState');
24 var {
25 getStackAddendumByID,
25 - } = require('react/lib/ReactComponentTreeHook');
26 + } = ReactComponentTreeHook;
27 }
28
29 function getStackAddendum(debugID) {
src/renderers/dom/shared/hooks/ReactDOMNullInputValuePropHook.js
+2 -3
@@ -15,9 +15,8 @@ var ReactDebugCurrentFiber = require('ReactDebugCurrentFiber');
15 var warning = require('fbjs/lib/warning');
16
17 if (__DEV__) {
18 - var {
19 - getStackAddendumByID,
20 - } = require('react/lib/ReactComponentTreeHook');
18 + var {ReactComponentTreeHook} = require('ReactGlobalSharedState');
19 + var {getStackAddendumByID} = ReactComponentTreeHook;
20 }
21
22 var didWarnValueNull = false;
src/renderers/dom/shared/hooks/ReactDOMUnknownPropertyHook.js
+1 -1
@@ -13,8 +13,8 @@
13
14 var DOMProperty = require('DOMProperty');
15 var EventPluginRegistry = require('EventPluginRegistry');
16 -var ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
16 var ReactDebugCurrentFiber = require('ReactDebugCurrentFiber');
17 +var {ReactComponentTreeHook} = require('ReactGlobalSharedState');
18
19 var warning = require('fbjs/lib/warning');
20
src/renderers/dom/stack/client/ReactMount.js
+1 -1
@@ -14,7 +14,6 @@
14 var DOMLazyTree = require('DOMLazyTree');
15 var DOMProperty = require('DOMProperty');
16 var React = require('react');
17 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
17 var ReactDOMComponentTree = require('ReactDOMComponentTree');
18 var ReactDOMContainerInfo = require('ReactDOMContainerInfo');
19 var ReactDOMFeatureFlags = require('ReactDOMFeatureFlags');
@@ -25,6 +24,7 @@ var ReactMarkupChecksum = require('ReactMarkupChecksum');
24 var ReactReconciler = require('ReactReconciler');
25 var ReactUpdateQueue = require('ReactUpdateQueue');
26 var ReactUpdates = require('ReactUpdates');
27 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
28
29 var getContextForSubtree = require('getContextForSubtree');
30 var instantiateReactComponent = require('instantiateReactComponent');
src/renderers/native/findNodeHandle.js
+1 -1
@@ -12,8 +12,8 @@
12
13 'use strict';
14
15 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
15 var ReactInstanceMap = require('ReactInstanceMap');
16 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
17
18 var invariant = require('fbjs/lib/invariant');
19 var warning = require('fbjs/lib/warning');
src/renderers/shared/ReactDebugTool.js
+1 -1
@@ -14,8 +14,8 @@
14
15 var ReactInvalidSetStateWarningHook = require('ReactInvalidSetStateWarningHook');
16 var ReactHostOperationHistoryHook = require('ReactHostOperationHistoryHook');
17 -var ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
17 var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
18 +var {ReactComponentTreeHook} = require('ReactGlobalSharedState');
19
20 var performanceNow = require('fbjs/lib/performanceNow');
21 var warning = require('fbjs/lib/warning');
src/renderers/shared/ReactGlobalSharedState.js new
+27
@@ -0,0 +1,27 @@
1 +/**
2 + * Copyright 2013-present, Facebook, Inc.
3 + * All rights reserved.
4 + *
5 + * This source code is licensed under the BSD-style license found in the
6 + * LICENSE file in the root directory of this source tree. An additional grant
7 + * of patent rights can be found in the PATENTS file in the same directory.
8 + *
9 + * @providesModule ReactGlobalSharedState
10 + */
11 +
12 +'use strict';
13 +
14 +var ReactInternals = require('react').__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
15 +
16 +var ReactGlobalSharedState = {
17 + ReactCurrentOwner: ReactInternals.ReactCurrentOwner,
18 +};
19 +
20 +if (__DEV__) {
21 + Object.assign(ReactGlobalSharedState, {
22 + ReactComponentTreeHook: ReactInternals.ReactComponentTreeHook,
23 + ReactDebugCurrentFrame: ReactInternals.ReactDebugCurrentFrame,
24 + });
25 +}
26 +
27 +module.exports = ReactGlobalSharedState;
src/renderers/shared/fiber/ReactChildFiber.js
+1 -1
@@ -36,7 +36,7 @@ var emptyObject = require('fbjs/lib/emptyObject');
36 var getIteratorFn = require('getIteratorFn');
37 var invariant = require('fbjs/lib/invariant');
38 var ReactFeatureFlags = require('ReactFeatureFlags');
39 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
39 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
40
41 if (__DEV__) {
42 var {getCurrentFiberStackAddendum} = require('ReactDebugCurrentFiber');
src/renderers/shared/fiber/ReactFiberBeginWork.js
+1 -1
@@ -60,8 +60,8 @@ var {
60 Err,
61 Ref,
62 } = require('ReactTypeOfSideEffect');
63 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
63 var ReactFiberClassComponent = require('ReactFiberClassComponent');
64 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
65 var invariant = require('fbjs/lib/invariant');
66
67 if (__DEV__) {
src/renderers/shared/fiber/ReactFiberContext.js
+1 -1
@@ -34,8 +34,8 @@ const {
34 } = require('ReactFiberStack');
35
36 if (__DEV__) {
37 - var ReactDebugCurrentFrame = require('react/lib/ReactDebugCurrentFrame');
37 var ReactDebugCurrentFiber = require('ReactDebugCurrentFiber');
38 + var {ReactDebugCurrentFrame} = require('ReactGlobalSharedState');
39 var {
40 startPhaseTimer,
41 stopPhaseTimer,
src/renderers/shared/fiber/ReactFiberScheduler.js
+1 -1
@@ -45,8 +45,8 @@ var ReactFiberBeginWork = require('ReactFiberBeginWork');
45 var ReactFiberCompleteWork = require('ReactFiberCompleteWork');
46 var ReactFiberCommitWork = require('ReactFiberCommitWork');
47 var ReactFiberHostContext = require('ReactFiberHostContext');
48 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
48 var ReactFeatureFlags = require('ReactFeatureFlags');
49 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
50 var getComponentName = require('getComponentName');
51
52 var {cloneFiber} = require('ReactFiber');
src/renderers/shared/fiber/ReactFiberTreeReflection.js
+1 -1
@@ -15,7 +15,7 @@
15 import type {Fiber} from 'ReactFiber';
16
17 var ReactInstanceMap = require('ReactInstanceMap');
18 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
18 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
19
20 var getComponentName = require('getComponentName');
21 var invariant = require('fbjs/lib/invariant');
src/renderers/shared/stack/reconciler/ReactChildReconciler.js
+5 -5
@@ -17,7 +17,7 @@ var ReactReconciler = require('ReactReconciler');
17
18 var instantiateReactComponent = require('instantiateReactComponent');
19 var shouldUpdateReactComponent = require('shouldUpdateReactComponent');
20 -var traverseAllChildren = require('traverseAllChildren');
20 +var traverseStackChildren = require('traverseStackChildren');
21 var warning = require('fbjs/lib/warning');
22
23 var ReactComponentTreeHook;
@@ -32,7 +32,7 @@ if (
32 // https://github.com/facebook/react/issues/7240
33 // Remove the inline requires when we don't need them anymore:
34 // https://github.com/facebook/react/pull/7178
35 - ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
35 + ReactComponentTreeHook = require('ReactGlobalSharedState').ReactComponentTreeHook;
36 }
37
38 function instantiateChild(childInstances, child, name, selfDebugID) {
@@ -40,7 +40,7 @@ function instantiateChild(childInstances, child, name, selfDebugID) {
40 var keyUnique = childInstances[name] === undefined;
41 if (__DEV__) {
42 if (!ReactComponentTreeHook) {
43 - ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
43 + ReactComponentTreeHook = require('ReactGlobalSharedState').ReactComponentTreeHook;
44 }
45 if (!keyUnique) {
46 warning(
@@ -84,14 +84,14 @@ var ReactChildReconciler = {
84 var childInstances = {};
85
86 if (__DEV__) {
87 - traverseAllChildren(
87 + traverseStackChildren(
88 nestedChildNodes,
89 (childInsts, child, name) =>
90 instantiateChild(childInsts, child, name, selfDebugID),
91 childInstances,
92 );
93 } else {
94 - traverseAllChildren(nestedChildNodes, instantiateChild, childInstances);
94 + traverseStackChildren(nestedChildNodes, instantiateChild, childInstances);
95 }
96 return childInstances;
97 },
src/renderers/shared/stack/reconciler/ReactCompositeComponent.js
+2 -2
@@ -14,16 +14,16 @@
14 var React = require('react');
15 var ReactComponentEnvironment = require('ReactComponentEnvironment');
16 var ReactCompositeComponentTypes = require('ReactCompositeComponentTypes');
17 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
17 var ReactErrorUtils = require('ReactErrorUtils');
18 var ReactFeatureFlags = require('ReactFeatureFlags');
19 var ReactInstanceMap = require('ReactInstanceMap');
20 var ReactInstrumentation = require('ReactInstrumentation');
21 var ReactNodeTypes = require('ReactNodeTypes');
22 var ReactReconciler = require('ReactReconciler');
23 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
24
25 if (__DEV__) {
26 - var ReactDebugCurrentFrame = require('react/lib/ReactDebugCurrentFrame');
26 + var {ReactDebugCurrentFrame} = require('ReactGlobalSharedState');
27 var warningAboutMissingGetChildContext = {};
28 }
29
src/renderers/shared/stack/reconciler/ReactMultiChild.js
+7 -4
@@ -15,12 +15,12 @@ var ReactComponentEnvironment = require('ReactComponentEnvironment');
15 var ReactInstanceMap = require('ReactInstanceMap');
16 var ReactInstrumentation = require('ReactInstrumentation');
17
18 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
18 var ReactReconciler = require('ReactReconciler');
19 var ReactChildReconciler = require('ReactChildReconciler');
20 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
21
22 var emptyFunction = require('fbjs/lib/emptyFunction');
23 -var flattenChildren = require('flattenChildren');
23 +var flattenStackChildren = require('flattenStackChildren');
24 var invariant = require('fbjs/lib/invariant');
25
26 /**
@@ -212,7 +212,7 @@ var ReactMultiChild = {
212 if (this._currentElement) {
213 try {
214 ReactCurrentOwner.current = this._currentElement._owner;
215 - nextChildren = flattenChildren(
215 + nextChildren = flattenStackChildren(
216 nextNestedChildrenElements,
217 selfDebugID,
218 );
@@ -233,7 +233,10 @@ var ReactMultiChild = {
233 return nextChildren;
234 }
235 }
236 - nextChildren = flattenChildren(nextNestedChildrenElements, selfDebugID);
236 + nextChildren = flattenStackChildren(
237 + nextNestedChildrenElements,
238 + selfDebugID,
239 + );
240 ReactChildReconciler.updateChildren(
241 prevChildren,
242 nextChildren,
src/renderers/shared/stack/reconciler/ReactRef.js
+1 -1
@@ -21,7 +21,7 @@ var ReactRef = {};
21
22 if (__DEV__) {
23 var ReactCompositeComponentTypes = require('ReactCompositeComponentTypes');
24 - var ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
24 + var {ReactComponentTreeHook} = require('ReactGlobalSharedState');
25 var warning = require('fbjs/lib/warning');
26
27 var warnedAboutStatelessRefs = {};
src/renderers/shared/stack/reconciler/ReactUpdateQueue.js
+1 -1
@@ -11,10 +11,10 @@
11
12 'use strict';
13
14 -var ReactCurrentOwner = require('react/lib/ReactCurrentOwner');
14 var ReactInstanceMap = require('ReactInstanceMap');
15 var ReactInstrumentation = require('ReactInstrumentation');
16 var ReactUpdates = require('ReactUpdates');
17 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
18
19 if (__DEV__) {
20 var warning = require('fbjs/lib/warning');
src/renderers/shared/stack/reconciler/flattenStackChildren.js new
+103
@@ -0,0 +1,103 @@
1 +/**
2 + * Copyright 2013-present, Facebook, Inc.
3 + * All rights reserved.
4 + *
5 + * This source code is licensed under the BSD-style license found in the
6 + * LICENSE file in the root directory of this source tree. An additional grant
7 + * of patent rights can be found in the PATENTS file in the same directory.
8 + *
9 + * @providesModule flattenStackChildren
10 + * @flow
11 + */
12 +
13 +'use strict';
14 +
15 +var KeyEscapeUtils = require('KeyEscapeUtils');
16 +var traverseStackChildren = require('traverseStackChildren');
17 +var warning = require('fbjs/lib/warning');
18 +
19 +var ReactComponentTreeHook;
20 +
21 +if (
22 + typeof process !== 'undefined' &&
23 + process.env &&
24 + process.env.NODE_ENV === 'test'
25 +) {
26 + // Temporary hack.
27 + // Inline requires don't work well with Jest:
28 + // https://github.com/facebook/react/issues/7240
29 + // Remove the inline requires when we don't need them anymore:
30 + // https://github.com/facebook/react/pull/7178
31 + ReactComponentTreeHook = require('ReactGlobalSharedState').ReactComponentTreeHook;
32 +}
33 +
34 +/**
35 + * @param {function} traverseContext Context passed through traversal.
36 + * @param {?ReactComponent} child React child component.
37 + * @param {!string} name String name of key path to child.
38 + * @param {number=} selfDebugID Optional debugID of the current internal instance.
39 + */
40 +function flattenSingleChildIntoContext(
41 + traverseContext: mixed,
42 + child: ReactElement<any>,
43 + name: string,
44 + selfDebugID?: number,
45 +): void {
46 + // We found a component instance.
47 + if (traverseContext && typeof traverseContext === 'object') {
48 + const result = traverseContext;
49 + const keyUnique = result[name] === undefined;
50 + if (__DEV__) {
51 + if (!ReactComponentTreeHook) {
52 + ReactComponentTreeHook = require('ReactGlobalSharedState').ReactComponentTreeHook;
53 + }
54 + if (!keyUnique) {
55 + warning(
56 + false,
57 + 'flattenChildren(...): Encountered two children with the same key, ' +
58 + '`%s`. Child keys must be unique; when two children share a key, only ' +
59 + 'the first child will be used.%s',
60 + KeyEscapeUtils.unescape(name),
61 + ReactComponentTreeHook.getStackAddendumByID(selfDebugID),
62 + );
63 + }
64 + }
65 + if (keyUnique && child != null) {
66 + result[name] = child;
67 + }
68 + }
69 +}
70 +
71 +/**
72 + * Flattens children that are typically specified as `props.children`. Any null
73 + * children will not be included in the resulting object.
74 + * @return {!object} flattened children keyed by name.
75 + */
76 +function flattenStackChildren(
77 + children: ReactElement<any>,
78 + selfDebugID?: number,
79 +): ?{[name: string]: ReactElement<any>} {
80 + if (children == null) {
81 + return children;
82 + }
83 + var result = {};
84 +
85 + if (__DEV__) {
86 + traverseStackChildren(
87 + children,
88 + (traverseContext, child, name) =>
89 + flattenSingleChildIntoContext(
90 + traverseContext,
91 + child,
92 + name,
93 + selfDebugID,
94 + ),
95 + result,
96 + );
97 + } else {
98 + traverseStackChildren(children, flattenSingleChildIntoContext, result);
99 + }
100 + return result;
101 +}
102 +
103 +module.exports = flattenStackChildren;
src/renderers/shared/stack/reconciler/traverseStackChildren.js new
+201
@@ -0,0 +1,201 @@
1 +/**
2 + * Copyright 2013-present, Facebook, Inc.
3 + * All rights reserved.
4 + *
5 + * This source code is licensed under the BSD-style license found in the
6 + * LICENSE file in the root directory of this source tree. An additional grant
7 + * of patent rights can be found in the PATENTS file in the same directory.
8 + *
9 + * @providesModule traverseStackChildren
10 + */
11 +
12 +'use strict';
13 +
14 +var REACT_ELEMENT_TYPE = require('ReactElementSymbol');
15 +var {ReactCurrentOwner} = require('ReactGlobalSharedState');
16 +
17 +var getIteratorFn = require('getIteratorFn');
18 +var invariant = require('fbjs/lib/invariant');
19 +var KeyEscapeUtils = require('KeyEscapeUtils');
20 +var warning = require('fbjs/lib/warning');
21 +
22 +var SEPARATOR = '.';
23 +var SUBSEPARATOR = ':';
24 +
25 +/**
26 + * This is inlined from ReactElement since this file is shared between
27 + * isomorphic and renderers. We could extract this to a
28 + *
29 + */
30 +
31 +/**
32 + * TODO: Test that a single child and an array with one item have the same key
33 + * pattern.
34 + */
35 +
36 +var didWarnAboutMaps = false;
37 +
38 +/**
39 + * Generate a key string that identifies a component within a set.
40 + *
41 + * @param {*} component A component that could contain a manual key.
42 + * @param {number} index Index that is used if a manual key is not provided.
43 + * @return {string}
44 + */
45 +function getComponentKey(component, index) {
46 + // Do some typechecking here since we call this blindly. We want to ensure
47 + // that we don't block potential future ES APIs.
48 + if (component && typeof component === 'object' && component.key != null) {
49 + // Explicit key
50 + return KeyEscapeUtils.escape(component.key);
51 + }
52 + // Implicit key determined by the index in the set
53 + return index.toString(36);
54 +}
55 +
56 +/**
57 + * @param {?*} children Children tree container.
58 + * @param {!string} nameSoFar Name of the key path so far.
59 + * @param {!function} callback Callback to invoke with each child found.
60 + * @param {?*} traverseContext Used to pass information throughout the traversal
61 + * process.
62 + * @return {!number} The number of children in this subtree.
63 + */
64 +function traverseStackChildrenImpl(
65 + children,
66 + nameSoFar,
67 + callback,
68 + traverseContext,
69 +) {
70 + var type = typeof children;
71 +
72 + if (type === 'undefined' || type === 'boolean') {
73 + // All of the above are perceived as null.
74 + children = null;
75 + }
76 +
77 + if (
78 + children === null ||
79 + type === 'string' ||
80 + type === 'number' ||
81 + // The following is inlined from ReactElement. This means we can optimize
82 + // some checks. React Fiber also inlines this logic for similar purposes.
83 + (type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE)
84 + ) {
85 + callback(
86 + traverseContext,
87 + children,
88 + // If it's the only child, treat the name as if it was wrapped in an array
89 + // so that it's consistent if the number of children grows.
90 + nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar,
91 + );
92 + return 1;
93 + }
94 +
95 + var child;
96 + var nextName;
97 + var subtreeCount = 0; // Count of children found in the current subtree.
98 + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
99 +
100 + if (Array.isArray(children)) {
101 + for (var i = 0; i < children.length; i++) {
102 + child = children[i];
103 + nextName = nextNamePrefix + getComponentKey(child, i);
104 + subtreeCount += traverseStackChildrenImpl(
105 + child,
106 + nextName,
107 + callback,
108 + traverseContext,
109 + );
110 + }
111 + } else {
112 + var iteratorFn = getIteratorFn(children);
113 + if (iteratorFn) {
114 + if (__DEV__) {
115 + // Warn about using Maps as children
116 + if (iteratorFn === children.entries) {
117 + let mapsAsChildrenAddendum = '';
118 + if (ReactCurrentOwner.current) {
119 + var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName();
120 + if (mapsAsChildrenOwnerName) {
121 + mapsAsChildrenAddendum = '\n\nCheck the render method of `' +
122 + mapsAsChildrenOwnerName +
123 + '`.';
124 + }
125 + }
126 + warning(
127 + didWarnAboutMaps,
128 + 'Using Maps as children is unsupported and will likely yield ' +
129 + 'unexpected results. Convert it to a sequence/iterable of keyed ' +
130 + 'ReactElements instead.%s',
131 + mapsAsChildrenAddendum,
132 + );
133 + didWarnAboutMaps = true;
134 + }
135 + }
136 +
137 + var iterator = iteratorFn.call(children);
138 + var step;
139 + var ii = 0;
140 + while (!(step = iterator.next()).done) {
141 + child = step.value;
142 + nextName = nextNamePrefix + getComponentKey(child, ii++);
143 + subtreeCount += traverseStackChildrenImpl(
144 + child,
145 + nextName,
146 + callback,
147 + traverseContext,
148 + );
149 + }
150 + } else if (type === 'object') {
151 + var addendum = '';
152 + if (__DEV__) {
153 + addendum = ' If you meant to render a collection of children, use an array ' +
154 + 'instead.';
155 + if (ReactCurrentOwner.current) {
156 + var name = ReactCurrentOwner.current.getName();
157 + if (name) {
158 + addendum += '\n\nCheck the render method of `' + name + '`.';
159 + }
160 + }
161 + }
162 + var childrenString = '' + children;
163 + invariant(
164 + false,
165 + 'Objects are not valid as a React child (found: %s).%s',
166 + childrenString === '[object Object]'
167 + ? 'object with keys {' + Object.keys(children).join(', ') + '}'
168 + : childrenString,
169 + addendum,
170 + );
171 + }
172 + }
173 +
174 + return subtreeCount;
175 +}
176 +
177 +/**
178 + * Traverses children that are typically specified as `props.children`, but
179 + * might also be specified through attributes:
180 + *
181 + * - `traverseStackChildren(this.props.children, ...)`
182 + * - `traverseStackChildren(this.props.leftPanelChildren, ...)`
183 + *
184 + * The `traverseContext` is an optional argument that is passed through the
185 + * entire traversal. It can be used to store accumulations or anything else that
186 + * the callback might find relevant.
187 + *
188 + * @param {?*} children Children tree object.
189 + * @param {!function} callback To invoke upon traversing each child.
190 + * @param {?*} traverseContext Context for traversal.
191 + * @return {!number} The number of children in this subtree.
192 + */
193 +function traverseStackChildren(children, callback, traverseContext) {
194 + if (children == null) {
195 + return 0;
196 + }
197 +
198 + return traverseStackChildrenImpl(children, '', callback, traverseContext);
199 +}
200 +
201 +module.exports = traverseStackChildren;
src/test/ReactComponentTreeTestUtils.js
+1 -1
@@ -11,7 +11,7 @@
11
12 'use strict';
13
14 -var ReactComponentTreeHook = require('react/lib/ReactComponentTreeHook');
14 +var ReactComponentTreeHook = require('ReactComponentTreeHook');
15
16 function getRootDisplayNames() {
17 return ReactComponentTreeHook.getRootIDs().map(
src/test/ReactTestUtils.js
+1 -1
@@ -21,7 +21,7 @@ var ReactDOM = require('react-dom');
21 var ReactDOMComponentTree = require('ReactDOMComponentTree');
22 var ReactBrowserEventEmitter = require('ReactBrowserEventEmitter');
23 var ReactFiberTreeReflection = require('ReactFiberTreeReflection');
24 -var ReactInstanceMap = require('react-dom/lib/ReactInstanceMap');
24 +var ReactInstanceMap = require('ReactInstanceMap');
25 var ReactTypeOfWork = require('ReactTypeOfWork');
26 var ReactGenericBatching = require('ReactGenericBatching');
27 var SyntheticEvent = require('SyntheticEvent');
src/umd/ReactDOMServerUMDEntry.js deleted
-16
@@ -1,16 +0,0 @@
1 -/**
2 - * Copyright 2013-present, Facebook, Inc.
3 - * All rights reserved.
4 - *
5 - * This source code is licensed under the BSD-style license found in the
6 - * LICENSE file in the root directory of this source tree. An additional grant
7 - * of patent rights can be found in the PATENTS file in the same directory.
8 - *
9 - * @providesModule ReactDOMServerUMDEntry
10 - */
11 -
12 -'use strict';
13 -
14 -var ReactDOMServer = require('ReactDOMServer');
15 -
16 -module.exports = ReactDOMServer;
src/umd/ReactDOMUMDEntry.js deleted
-23
@@ -1,23 +0,0 @@
1 -/**
2 - * Copyright 2013-present, Facebook, Inc.
3 - * All rights reserved.
4 - *
5 - * This source code is licensed under the BSD-style license found in the
6 - * LICENSE file in the root directory of this source tree. An additional grant
7 - * of patent rights can be found in the PATENTS file in the same directory.
8 - *
9 - * @providesModule ReactDOMUMDEntry
10 - */
11 -
12 -'use strict';
13 -
14 -var ReactDOM = require('ReactDOMFiber');
15 -
16 -var ReactDOMUMDEntry = Object.assign(ReactDOM, {
17 - __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
18 - // For TapEventPlugin which is popular in open source
19 - EventPluginHub: require('EventPluginHub'),
20 - },
21 -});
22 -
23 -module.exports = ReactDOMUMDEntry;
src/umd/ReactUMDEntry.js deleted
-37
@@ -1,37 +0,0 @@
1 -/**
2 - * Copyright 2013-present, Facebook, Inc.
3 - * All rights reserved.
4 - *
5 - * This source code is licensed under the BSD-style license found in the
6 - * LICENSE file in the root directory of this source tree. An additional grant
7 - * of patent rights can be found in the PATENTS file in the same directory.
8 - *
9 - * @providesModule ReactUMDEntry
10 - */
11 -
12 -'use strict';
13 -
14 -var React = require('React');
15 -
16 -// `version` will be added here by the React module.
17 -var ReactUMDEntry = Object.assign(
18 - {
19 - __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
20 - ReactCurrentOwner: require('react/lib/ReactCurrentOwner'),
21 - },
22 - },
23 - React,
24 -);
25 -
26 -if (__DEV__) {
27 - Object.assign(
28 - ReactUMDEntry.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
29 - {
30 - // These should not be included in production.
31 - ReactComponentTreeHook: require('react/lib/ReactComponentTreeHook'),
32 - ReactDebugCurrentFrame: require('react/lib/ReactDebugCurrentFrame'),
33 - },
34 - );
35 -}
36 -
37 -module.exports = ReactUMDEntry;
src/umd/shims/ReactComponentTreeHookUMDShim.js deleted
-18
@@ -1,18 +0,0 @@
1 -/**
2 - * Copyright 2013-present, Facebook, Inc.
3 - * All rights reserved.
4 - *
5 - * This source code is licensed under the BSD-style license found in the
6 - * LICENSE file in the root directory of this source tree. An additional grant
7 - * of patent rights can be found in the PATENTS file in the same directory.
8 - *
9 - * @providesModule ReactComponentTreeHookUMDShim
10 - */
11 -
12 -/* globals React */
13 -
14 -'use strict';
15 -
16 -var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
17 -
18 -module.exports = ReactInternals.ReactComponentTreeHook;
src/umd/shims/ReactCurrentOwnerUMDShim.js deleted
-18
@@ -1,18 +0,0 @@
1 -/**
2 - * Copyright 2013-present, Facebook, Inc.
3 - * All rights reserved.
4 - *
5 - * This source code is licensed under the BSD-style license found in the
6 - * LICENSE file in the root directory of this source tree. An additional grant
7 - * of patent rights can be found in the PATENTS file in the same directory.
8 - *
9 - * @providesModule ReactCurrentOwnerUMDShim
10 - */
11 -
12 -/* globals React */
13 -
14 -'use strict';
15 -
16 -var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
17 -
18 -module.exports = ReactInternals.ReactCurrentOwner;
src/umd/shims/ReactUMDShim.js deleted
-16
@@ -1,16 +0,0 @@
1 -/**
2 - * Copyright 2013-present, Facebook, Inc.
3 - * All rights reserved.
4 - *
5 - * This source code is licensed under the BSD-style license found in the
6 - * LICENSE file in the root directory of this source tree. An additional grant
7 - * of patent rights can be found in the PATENTS file in the same directory.
8 - *
9 - * @providesModule ReactUMDShim
10 - */
11 -
12 -/* globals React */
13 -
14 -'use strict';
15 -
16 -module.exports = React;