@samitouri / QOS-React / commits / 46f7b0d945

Fix dead code elimination for feature flags (#11453)

* Fix dead code elimination for feature flags Turning flags into named exports fixes dead code elimination. This required some restructuring of how we verify that flag types match up. I used the Check<> trick combined with import typeof, as suggested by @calebmer. For www, we can no longer re-export `require('ReactFeatureFlags')` directly, and instead destructure it. This means flags have to be known at init time. This is already the case so it's not a problem. In fact it may be better since it removes extra property access in tight paths. For things that we *want* to be dynamic on www (currently, only performance flag) we can export a function to toggle it, and then put it on the secret exports. In fact this is better than just letting everyone mutate the flag at arbitrary times since we can provide, e.g., a ref counting interface to it. * Record sizes

Dan Abramov committed Nov 6, 2017 at 14:14 UTC 46f7b0d9451c2ac6f5ec5efd2c12ba77a4e054d9
18 files changed +189 -139
.flowconfig
+9 -1
@@ -2,7 +2,15 @@
2
3 <PROJECT_ROOT>/fixtures/.*
4 <PROJECT_ROOT>/build/.*
5 -<PROJECT_ROOT>/scripts/.*
5 +<PROJECT_ROOT>/scripts/bench/.*
6 +
7 +# These shims are copied into external projects:
8 +<PROJECT_ROOT>/scripts/rollup/shims/facebook-www/.*
9 +<PROJECT_ROOT>/scripts/rollup/shims/react-native/.*
10 +
11 +# Note: intentionally *don't* ignore /scripts/rollup/shims/rollup/
12 +# because it is part of the build and isn't external.
13 +
14 <PROJECT_ROOT>/.*/node_modules/y18n/.*
15 <PROJECT_ROOT>/node_modules/chrome-devtools-frontend/.*
16 <PROJECT_ROOT>/node_modules/devtools-timeline-model/.*
packages/react-cs-renderer/src/ReactNativeCSFeatureFlags.js
+16 -12
@@ -7,17 +7,21 @@
7 * @flow
8 */
9
10 -import type {FeatureFlags} from 'shared/ReactFeatureFlags';
10 +import typeof * as FeatureFlagsType from 'shared/ReactFeatureFlags';
11 +import typeof * as CSFeatureFlagsType from './ReactNativeCSFeatureFlags';
12
12 -var ReactNativeCSFeatureFlags: FeatureFlags = {
13 - enableAsyncSubtreeAPI: true,
14 - enableAsyncSchedulingByDefaultInReactDOM: false,
15 - enableReactFragment: false,
16 - enableCreateRoot: false,
17 - // React Native CS uses persistent reconciler.
18 - enableMutatingReconciler: false,
19 - enableNoopReconciler: false,
20 - enablePersistentReconciler: true,
21 -};
13 +export const enableAsyncSubtreeAPI = true;
14 +export const enableAsyncSchedulingByDefaultInReactDOM = false;
15 +export const enableReactFragment = false;
16 +export const enableCreateRoot = false;
17
23 -export default ReactNativeCSFeatureFlags;
18 +// React Native CS uses persistent reconciler.
19 +export const enableMutatingReconciler = false;
20 +export const enableNoopReconciler = false;
21 +export const enablePersistentReconciler = true;
22 +
23 +// Flow magic to verify the exports of this file match the original version.
24 +// eslint-disable-next-line no-unused-vars
25 +type Check<_X, Y: _X, X: Y=_X> = null;
26 +// eslint-disable-next-line no-unused-expressions
27 +(null: Check<CSFeatureFlagsType, FeatureFlagsType>);
packages/react-dom/src/client/ReactDOM.js
+6 -3
@@ -23,7 +23,10 @@ import * as EventPluginHub from 'events/EventPluginHub';
23 import * as EventPluginRegistry from 'events/EventPluginRegistry';
24 import * as EventPropagators from 'events/EventPropagators';
25 import * as ReactInstanceMap from 'shared/ReactInstanceMap';
26 -import ReactFeatureFlags from 'shared/ReactFeatureFlags';
26 +import {
27 + enableAsyncSchedulingByDefaultInReactDOM,
28 + enableCreateRoot,
29 +} from 'shared/ReactFeatureFlags';
30 import ReactVersion from 'shared/ReactVersion';
31 import * as ReactDOMFrameScheduling from 'shared/ReactDOMFrameScheduling';
32 import {ReactCurrentOwner} from 'shared/ReactGlobalSharedState';
@@ -631,7 +634,7 @@ const DOMRenderer = ReactFiberReconciler({
634
635 scheduleDeferredCallback: ReactDOMFrameScheduling.rIC,
636
634 - useSyncScheduling: !ReactFeatureFlags.enableAsyncSchedulingByDefaultInReactDOM,
637 + useSyncScheduling: !enableAsyncSchedulingByDefaultInReactDOM,
638 });
639
640 ReactGenericBatching.injection.injectFiberBatchedUpdates(
@@ -944,7 +947,7 @@ const ReactDOM: Object = {
947 },
948 };
949
947 -if (ReactFeatureFlags.enableCreateRoot) {
950 +if (enableCreateRoot) {
951 ReactDOM.createRoot = function createRoot(
952 container: DOMContainer,
953 options?: RootOptions,
packages/react-noop-renderer/src/ReactNoop.js
+2 -2
@@ -21,7 +21,7 @@ import type {UpdateQueue} from 'react-reconciler/src/ReactFiberUpdateQueue';
21 import ReactFiberInstrumentation
22 from 'react-reconciler/src/ReactFiberInstrumentation';
23 import ReactFiberReconciler from 'react-reconciler';
24 -import ReactFeatureFlags from 'shared/ReactFeatureFlags';
24 +import {enablePersistentReconciler} from 'shared/ReactFeatureFlags';
25 import * as ReactInstanceMap from 'shared/ReactInstanceMap';
26 import emptyObject from 'fbjs/lib/emptyObject';
27 import expect from 'expect';
@@ -213,7 +213,7 @@ var NoopRenderer = ReactFiberReconciler({
213 },
214 });
215
216 -var PersistentNoopRenderer = ReactFeatureFlags.enablePersistentReconciler
216 +var PersistentNoopRenderer = enablePersistentReconciler
217 ? ReactFiberReconciler({
218 ...SharedHostConfig,
219 persistence: {
packages/react-reconciler/src/ReactChildFiber.js
+2 -2
@@ -14,7 +14,7 @@ import type {
14 ExpirationTime,
15 } from 'react-reconciler/src/ReactFiberExpirationTime';
16
17 -import ReactFeatureFlags from 'shared/ReactFeatureFlags';
17 +import {enableReactFragment} from 'shared/ReactFeatureFlags';
18 import {NoEffect, Placement, Deletion} from 'shared/ReactTypeOfSideEffect';
19 import {
20 FunctionalComponent,
@@ -1426,7 +1426,7 @@ function ChildReconciler(shouldClone, shouldTrackSideEffects) {
1426 // This leads to an ambiguity between <>{[...]}</> and <>...</>.
1427 // We treat the ambiguous cases above the same.
1428 if (
1429 - ReactFeatureFlags.enableReactFragment &&
1429 + enableReactFragment &&
1430 typeof newChild === 'object' &&
1431 newChild !== null &&
1432 newChild.type === REACT_FRAGMENT_TYPE &&
packages/react-reconciler/src/ReactFiberClassComponent.js
+2 -2
@@ -11,7 +11,7 @@ import type {Fiber} from './ReactFiber';
11 import type {ExpirationTime} from './ReactFiberExpirationTime';
12
13 import {Update} from 'shared/ReactTypeOfSideEffect';
14 -import ReactFeatureFlags from 'shared/ReactFeatureFlags';
14 +import {enableAsyncSubtreeAPI} from 'shared/ReactFeatureFlags';
15 import {isMounted} from 'shared/ReactFiberTreeReflection';
16 import * as ReactInstanceMap from 'shared/ReactInstanceMap';
17 import emptyObject from 'fbjs/lib/emptyObject';
@@ -450,7 +450,7 @@ export default function(
450 instance.context = getMaskedContext(workInProgress, unmaskedContext);
451
452 if (
453 - ReactFeatureFlags.enableAsyncSubtreeAPI &&
453 + enableAsyncSubtreeAPI &&
454 workInProgress.type != null &&
455 workInProgress.type.prototype != null &&
456 workInProgress.type.prototype.unstable_isAsyncReactComponent === true
packages/react-reconciler/src/ReactFiberCommitWork.js
+9 -11
@@ -10,7 +10,11 @@
10 import type {HostConfig} from 'react-reconciler';
11 import type {Fiber} from './ReactFiber';
12
13 -import ReactFeatureFlags from 'shared/ReactFeatureFlags';
13 +import {
14 + enableMutatingReconciler,
15 + enableNoopReconciler,
16 + enablePersistentReconciler,
17 +} from 'shared/ReactFeatureFlags';
18 import {
19 ClassComponent,
20 HostRoot,
@@ -218,12 +222,9 @@ export default function<T, P, I, TI, PI, C, CC, CX, PL>(
222 // TODO: this is recursive.
223 // We are also not using this parent because
224 // the portal will get pushed immediately.
221 - if (ReactFeatureFlags.enableMutatingReconciler && mutation) {
225 + if (enableMutatingReconciler && mutation) {
226 unmountHostComponents(current);
223 - } else if (
224 - ReactFeatureFlags.enablePersistentReconciler &&
225 - persistence
226 - ) {
227 + } else if (enablePersistentReconciler && persistence) {
228 emptyPortalContainer(current);
229 }
230 return;
@@ -324,10 +325,7 @@ export default function<T, P, I, TI, PI, C, CC, CX, PL>(
325 // Noop
326 };
327 }
327 - if (
328 - ReactFeatureFlags.enablePersistentReconciler ||
329 - ReactFeatureFlags.enableNoopReconciler
330 - ) {
328 + if (enablePersistentReconciler || enableNoopReconciler) {
329 return {
330 commitResetTextContent(finishedWork: Fiber) {},
331 commitPlacement(finishedWork: Fiber) {},
@@ -660,7 +658,7 @@ export default function<T, P, I, TI, PI, C, CC, CX, PL>(
658 resetTextContent(current.stateNode);
659 }
660
663 - if (ReactFeatureFlags.enableMutatingReconciler) {
661 + if (enableMutatingReconciler) {
662 return {
663 commitResetTextContent,
664 commitPlacement,
packages/react-reconciler/src/ReactFiberCompleteWork.js
+8 -4
@@ -15,7 +15,11 @@ import type {HostContext} from './ReactFiberHostContext';
15 import type {HydrationContext} from './ReactFiberHydrationContext';
16 import type {FiberRoot} from './ReactFiberRoot';
17
18 -import ReactFeatureFlags from 'shared/ReactFeatureFlags';
18 +import {
19 + enableMutatingReconciler,
20 + enablePersistentReconciler,
21 + enableNoopReconciler,
22 +} from 'shared/ReactFeatureFlags';
23 import {
24 IndeterminateComponent,
25 FunctionalComponent,
@@ -180,7 +184,7 @@ export default function<T, P, I, TI, PI, C, CC, CX, PL>(
184 let updateHostComponent;
185 let updateHostText;
186 if (mutation) {
183 - if (ReactFeatureFlags.enableMutatingReconciler) {
187 + if (enableMutatingReconciler) {
188 // Mutation mode
189 updateHostContainer = function(workInProgress: Fiber) {
190 // Noop
@@ -217,7 +221,7 @@ export default function<T, P, I, TI, PI, C, CC, CX, PL>(
221 invariant(false, 'Mutating reconciler is disabled.');
222 }
223 } else if (persistence) {
220 - if (ReactFeatureFlags.enablePersistentReconciler) {
224 + if (enablePersistentReconciler) {
225 // Persistent host tree mode
226 const {
227 cloneInstance,
@@ -354,7 +358,7 @@ export default function<T, P, I, TI, PI, C, CC, CX, PL>(
358 invariant(false, 'Persistent reconciler is disabled.');
359 }
360 } else {
357 - if (ReactFeatureFlags.enableNoopReconciler) {
361 + if (enableNoopReconciler) {
362 // No host operations
363 updateHostContainer = function(workInProgress: Fiber) {
364 // Noop
packages/react-reconciler/src/ReactFiberReconciler.js
+2 -2
@@ -11,7 +11,7 @@ import type {Fiber} from './ReactFiber';
11 import type {FiberRoot} from './ReactFiberRoot';
12 import type {ReactNodeList} from 'shared/ReactTypes';
13
14 -import ReactFeatureFlags from 'shared/ReactFeatureFlags';
14 +import {enableAsyncSubtreeAPI} from 'shared/ReactFeatureFlags';
15 import {
16 findCurrentHostFiber,
17 findCurrentHostFiberWithNoPortals,
@@ -322,7 +322,7 @@ export default function<T, P, I, TI, PI, C, CC, CX, PL>(
322 // treat updates to the root as async. This is a bit weird but lets us
323 // avoid a separate `renderAsync` API.
324 if (
325 - ReactFeatureFlags.enableAsyncSubtreeAPI &&
325 + enableAsyncSubtreeAPI &&
326 element != null &&
327 element.type != null &&
328 element.type.prototype != null &&
packages/react/src/React.js
+2 -2
@@ -7,7 +7,7 @@
7
8 import assign from 'object-assign';
9 import ReactVersion from 'shared/ReactVersion';
10 -import ReactFeatureFlags from 'shared/ReactFeatureFlags';
10 +import {enableReactFragment} from 'shared/ReactFeatureFlags';
11
12 import {Component, PureComponent, AsyncComponent} from './ReactBaseClasses';
13 import {forEach, map, count, toArray, only} from './ReactChildren';
@@ -58,7 +58,7 @@ var React = {
58 },
59 };
60
61 -if (ReactFeatureFlags.enableReactFragment) {
61 +if (enableReactFragment) {
62 React.Fragment = REACT_FRAGMENT_TYPE;
63 }
64
packages/shared/ReactFeatureFlags.js
+12 -31
@@ -7,35 +7,16 @@
7 * @flow
8 */
9
10 -export type FeatureFlags = {|
11 - enableAsyncSubtreeAPI: boolean,
12 - enableAsyncSchedulingByDefaultInReactDOM: boolean,
13 - enableMutatingReconciler: boolean,
14 - enableNoopReconciler: boolean,
15 - enablePersistentReconciler: boolean,
16 - enableReactFragment: boolean,
17 - enableCreateRoot: boolean,
18 -|};
10 +export const enableAsyncSubtreeAPI = true;
11 +export const enableAsyncSchedulingByDefaultInReactDOM = false;
12 +// Exports React.Fragment
13 +export const enableReactFragment = false;
14 +// Exports ReactDOM.createRoot
15 +export const enableCreateRoot = false;
16
20 -var ReactFeatureFlags: FeatureFlags = {
21 - enableAsyncSubtreeAPI: true,
22 - enableAsyncSchedulingByDefaultInReactDOM: false,
23 - // Mutating mode (React DOM, React ART, React Native):
24 - enableMutatingReconciler: true,
25 - // Experimental noop mode (currently unused):
26 - enableNoopReconciler: false,
27 - // Experimental persistent mode (CS):
28 - enablePersistentReconciler: false,
29 - // Exports React.Fragment
30 - enableReactFragment: false,
31 - // Exports ReactDOM.createRoot
32 - enableCreateRoot: false,
33 -};
34 -
35 -if (__DEV__) {
36 - if (Object.freeze) {
37 - Object.freeze(ReactFeatureFlags);
38 - }
39 -}
40 -
41 -export default ReactFeatureFlags;
17 +// Mutating mode (React DOM, React ART, React Native):
18 +export const enableMutatingReconciler = true;
19 +// Experimental noop mode (currently unused):
20 +export const enableNoopReconciler = false;
21 +// Experimental persistent mode (CS):
22 +export const enablePersistentReconciler = false;
scripts/flow/environment.js
+5
@@ -12,3 +12,8 @@
12 declare var __REACT_DEVTOOLS_GLOBAL_HOOK__: any; /*?{
13 inject: ?((stuff: Object) => void)
14 };*/
15 +
16 +// ReactFeatureFlags rollup shim for www imports the www implementation.
17 +declare module 'ReactFeatureFlags' {
18 + declare module.exports: any;
19 +}
scripts/jest/setup.js
+3 -6
@@ -1,12 +1,9 @@
1 'use strict';
2
3 -// We want to globally mock this but jest doesn't let us do that by default
4 -// for a file that already exists. So we have to explicitly mock it.
3 jest.mock('shared/ReactFeatureFlags', () => {
6 - const flags = require.requireActual('shared/ReactFeatureFlags').default;
7 - return Object.assign({}, flags, {
8 - disableNewFiberFeatures: true,
9 - });
4 + // We can alter flags based on environment here
5 + // (e.g. for CI runs with different flags).
6 + return require.requireActual('shared/ReactFeatureFlags');
7 });
8
9 // Error logging varies between Fiber and Stack;
scripts/rollup/results.json
+60 -60
@@ -1,52 +1,52 @@
1 {
2 "bundleSizes": {
3 "react.development.js (UMD_DEV)": {
4 - "size": 57960,
5 - "gzip": 15055
4 + "size": 57612,
5 + "gzip": 14938
6 },
7 "react.production.min.js (UMD_PROD)": {
8 "size": 6672,
9 "gzip": 2772
10 },
11 "react.development.js (NODE_DEV)": {
12 - "size": 48341,
13 - "gzip": 12749
12 + "size": 47993,
13 + "gzip": 12640
14 },
15 "react.production.min.js (NODE_PROD)": {
16 "size": 5471,
17 "gzip": 2349
18 },
19 "React-dev.js (FB_DEV)": {
20 - "size": 45254,
21 - "gzip": 11809
20 + "size": 45761,
21 + "gzip": 11884
22 },
23 "React-prod.js (FB_PROD)": {
24 - "size": 25804,
25 - "gzip": 6870
24 + "size": 26012,
25 + "gzip": 6885
26 },
27 "react-dom.development.js (UMD_DEV)": {
28 - "size": 589183,
29 - "gzip": 133823
28 + "size": 589114,
29 + "gzip": 133729
30 },
31 "react-dom.production.min.js (UMD_PROD)": {
32 - "size": 96544,
33 - "gzip": 31188
32 + "size": 94334,
33 + "gzip": 30564
34 },
35 "react-dom.development.js (NODE_DEV)": {
36 - "size": 570160,
37 - "gzip": 129121
36 + "size": 569900,
37 + "gzip": 129020
38 },
39 "react-dom.production.min.js (NODE_PROD)": {
40 - "size": 94731,
41 - "gzip": 30346
40 + "size": 92521,
41 + "gzip": 29735
42 },
43 "ReactDOM-dev.js (FB_DEV)": {
44 - "size": 571472,
45 - "gzip": 129612
44 + "size": 572245,
45 + "gzip": 129735
46 },
47 "ReactDOM-prod.js (FB_PROD)": {
48 - "size": 405312,
49 - "gzip": 90089
48 + "size": 405997,
49 + "gzip": 90194
50 },
51 "react-dom-test-utils.development.js (NODE_DEV)": {
52 "size": 37876,
@@ -61,8 +61,8 @@
61 "gzip": 10182
62 },
63 "react-dom-unstable-native-dependencies.development.js (UMD_DEV)": {
64 - "size": 66641,
65 - "gzip": 16671
64 + "size": 66832,
65 + "gzip": 16686
66 },
67 "react-dom-unstable-native-dependencies.production.min.js (UMD_PROD)": {
68 "size": 11349,
@@ -85,8 +85,8 @@
85 "gzip": 12586
86 },
87 "react-dom-server.browser.development.js (UMD_DEV)": {
88 - "size": 100894,
89 - "gzip": 26193
88 + "size": 101085,
89 + "gzip": 26194
90 },
91 "react-dom-server.browser.production.min.js (UMD_PROD)": {
92 "size": 14713,
@@ -117,64 +117,64 @@
117 "gzip": 6016
118 },
119 "react-art.development.js (UMD_DEV)": {
120 - "size": 361363,
121 - "gzip": 78801
120 + "size": 361168,
121 + "gzip": 78675
122 },
123 "react-art.production.min.js (UMD_PROD)": {
124 - "size": 84853,
125 - "gzip": 26004
124 + "size": 82786,
125 + "gzip": 25335
126 },
127 "react-art.development.js (NODE_DEV)": {
128 - "size": 285762,
129 - "gzip": 59878
128 + "size": 285376,
129 + "gzip": 59744
130 },
131 "react-art.production.min.js (NODE_PROD)": {
132 - "size": 48726,
133 - "gzip": 15050
132 + "size": 46664,
133 + "gzip": 14576
134 },
135 "ReactART-dev.js (FB_DEV)": {
136 - "size": 284015,
137 - "gzip": 59653
136 + "size": 284412,
137 + "gzip": 59714
138 },
139 "ReactART-prod.js (FB_PROD)": {
140 - "size": 209267,
141 - "gzip": 43024
140 + "size": 209350,
141 + "gzip": 43045
142 },
143 "ReactNativeRenderer-dev.js (RN_DEV)": {
144 - "size": 264248,
145 - "gzip": 45270
144 + "size": 263840,
145 + "gzip": 45183
146 },
147 "ReactNativeRenderer-prod.js (RN_PROD)": {
148 - "size": 202770,
149 - "gzip": 34504
148 + "size": 202457,
149 + "gzip": 34443
150 },
151 "ReactRTRenderer-dev.js (RN_DEV)": {
152 - "size": 195970,
153 - "gzip": 32882
152 + "size": 195570,
153 + "gzip": 32792
154 },
155 "ReactRTRenderer-prod.js (RN_PROD)": {
156 - "size": 143566,
157 - "gzip": 23595
156 + "size": 143253,
157 + "gzip": 23524
158 },
159 "ReactCSRenderer-dev.js (RN_DEV)": {
160 - "size": 189548,
161 - "gzip": 31563
160 + "size": 189107,
161 + "gzip": 31467
162 },
163 "ReactCSRenderer-prod.js (RN_PROD)": {
164 - "size": 139382,
165 - "gzip": 22608
164 + "size": 138973,
165 + "gzip": 22523
166 },
167 "react-test-renderer.development.js (NODE_DEV)": {
168 - "size": 284199,
169 - "gzip": 58944
168 + "size": 283813,
169 + "gzip": 58810
170 },
171 "react-test-renderer.production.min.js (NODE_PROD)": {
172 - "size": 47325,
173 - "gzip": 14489
172 + "size": 45266,
173 + "gzip": 13979
174 },
175 "ReactTestRenderer-dev.js (FB_DEV)": {
176 - "size": 282462,
177 - "gzip": 58722
176 + "size": 282859,
177 + "gzip": 58787
178 },
179 "react-test-renderer-shallow.development.js (NODE_DEV)": {
180 "size": 10657,
@@ -189,16 +189,16 @@
189 "gzip": 2515
190 },
191 "react-noop-renderer.development.js (NODE_DEV)": {
192 - "size": 280181,
193 - "gzip": 57920
192 + "size": 279777,
193 + "gzip": 57797
194 },
195 "react-reconciler.development.js (NODE_DEV)": {
196 - "size": 264938,
197 - "gzip": 54474
196 + "size": 264552,
197 + "gzip": 54331
198 },
199 "react-reconciler.production.min.js (NODE_PROD)": {
200 - "size": 40581,
201 - "gzip": 12611
200 + "size": 38523,
201 + "gzip": 12008
202 },
203 "react-call-return.development.js (NODE_DEV)": {
204 "size": 3048,
scripts/rollup/shims/rollup/ReactCurrentOwner-www.js
+7
@@ -1 +1,8 @@
1 +/**
2 + * Copyright (c) 2013-present, Facebook, Inc.
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 +
8 export default require('ReactCurrentOwner');
scripts/rollup/shims/rollup/ReactFeatureFlags-www.js
+28 -1
@@ -1 +1,28 @@
1 -export default require('ReactFeatureFlags');
1 +/**
2 + * Copyright (c) 2013-present, Facebook, Inc.
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 +import typeof * as FeatureFlagsType from 'shared/ReactFeatureFlags';
11 +import typeof * as FeatureFlagsShimType from './ReactFeatureFlags-www';
12 +
13 +// Re-export all flags from the www version.
14 +export const {
15 + enableAsyncSubtreeAPI,
16 + enableAsyncSchedulingByDefaultInReactDOM,
17 + enableReactFragment,
18 + enableCreateRoot,
19 + enableMutatingReconciler,
20 + enableNoopReconciler,
21 + enablePersistentReconciler,
22 +} = require('ReactFeatureFlags');
23 +
24 +// Flow magic to verify the exports of this file match the original version.
25 +// eslint-disable-next-line no-unused-vars
26 +type Check<_X, Y: _X, X: Y=_X> = null;
27 +// eslint-disable-next-line no-unused-expressions
28 +(null: Check<FeatureFlagsShimType, FeatureFlagsType>);
scripts/rollup/shims/rollup/assign-umd.js
+9
@@ -1,3 +1,12 @@
1 +/**
2 + * Copyright (c) 2013-present, Facebook, Inc.
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 import React from 'react';
11
12 const ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
scripts/rollup/shims/rollup/lowPriorityWarning-www.js
+7
@@ -1 +1,8 @@
1 +/**
2 + * Copyright (c) 2013-present, Facebook, Inc.
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 +
8 export default require('lowPriorityWarning');