@samitouri / QOS-React / commits / b83e01cade

Adds more scaffolding for experimental event API (#15112)

* Adds more scaffolding for experimental event API

Dominic Gannaway committed Mar 20, 2019 at 11:20 UTC b83e01cade6f86b9a127bdfdda60f625fd14fdcd
19 files changed +1066 -279
packages/react-art/src/ReactARTHostConfig.js
+5 -1
@@ -340,6 +340,10 @@ export function getChildHostContext() {
340 return NO_CONTEXT;
341 }
342
343 +export function getChildHostContextForEvent() {
344 + return NO_CONTEXT;
345 +}
346 +
347 export const scheduleTimeout = setTimeout;
348 export const cancelTimeout = clearTimeout;
349 export const noTimeout = -1;
@@ -440,7 +444,7 @@ export function handleEventComponent(
444 }
445
446 export function handleEventTarget(
443 - type: string,
447 + type: Symbol | number,
448 props: Props,
449 internalInstanceHandle: Object,
450 ) {
packages/react-dom/src/client/ReactDOMHostConfig.js
+82 -5
@@ -44,6 +44,12 @@ import dangerousStyleValue from '../shared/dangerousStyleValue';
44
45 import type {DOMContainer} from './ReactDOM';
46 import type {ReactEventResponder} from 'shared/ReactTypes';
47 +import {
48 + REACT_EVENT_COMPONENT_TYPE,
49 + REACT_EVENT_TARGET_TYPE,
50 + REACT_EVENT_TARGET_TOUCH_HIT,
51 +} from 'shared/ReactSymbols';
52 +import getElementFromTouchHitTarget from 'shared/getElementFromTouchHitTarget';
53
54 export type Type = string;
55 export type Props = {
@@ -65,6 +71,10 @@ export type PublicInstance = Element | Text;
71 type HostContextDev = {
72 namespace: string,
73 ancestorInfo: mixed,
74 + eventData: null | {|
75 + isEventComponent?: boolean,
76 + isEventTarget?: boolean,
77 + |},
78 };
79 type HostContextProd = string;
80 export type HostContext = HostContextDev | HostContextProd;
@@ -73,7 +83,11 @@ export type ChildSet = void; // Unused
83 export type TimeoutHandle = TimeoutID;
84 export type NoTimeout = -1;
85
76 -import {enableSuspenseServerRenderer} from 'shared/ReactFeatureFlags';
86 +import {
87 + enableSuspenseServerRenderer,
88 + enableEventAPI,
89 +} from 'shared/ReactFeatureFlags';
90 +import warning from 'shared/warning';
91
92 // Intentionally not named imports because Rollup would
93 // use dynamic dispatch for CommonJS interop named imports.
@@ -142,7 +156,7 @@ export function getRootHostContext(
156 if (__DEV__) {
157 const validatedTag = type.toLowerCase();
158 const ancestorInfo = updatedAncestorInfo(null, validatedTag);
145 - return {namespace, ancestorInfo};
159 + return {namespace, ancestorInfo, eventData: null};
160 }
161 return namespace;
162 }
@@ -159,12 +173,42 @@ export function getChildHostContext(
173 parentHostContextDev.ancestorInfo,
174 type,
175 );
162 - return {namespace, ancestorInfo};
176 + return {namespace, ancestorInfo, eventData: null};
177 }
178 const parentNamespace = ((parentHostContext: any): HostContextProd);
179 return getChildNamespace(parentNamespace, type);
180 }
181
182 +export function getChildHostContextForEvent(
183 + parentHostContext: HostContext,
184 + type: Symbol | number,
185 +): HostContext {
186 + if (__DEV__) {
187 + const parentHostContextDev = ((parentHostContext: any): HostContextDev);
188 + const {namespace, ancestorInfo} = parentHostContextDev;
189 + let eventData = null;
190 +
191 + if (type === REACT_EVENT_COMPONENT_TYPE) {
192 + eventData = {
193 + isEventComponent: true,
194 + isEventTarget: false,
195 + };
196 + } else if (type === REACT_EVENT_TARGET_TYPE) {
197 + warning(
198 + parentHostContextDev.eventData !== null &&
199 + parentHostContextDev.eventData.isEventComponent,
200 + 'validateDOMNesting: React event targets must be direct children of event components.',
201 + );
202 + eventData = {
203 + isEventComponent: false,
204 + isEventTarget: true,
205 + };
206 + }
207 + return {namespace, ancestorInfo, eventData};
208 + }
209 + return parentHostContext;
210 +}
211 +
212 export function getPublicInstance(instance: Instance): * {
213 return instance;
214 }
@@ -296,6 +340,23 @@ export function createTextInstance(
340 if (__DEV__) {
341 const hostContextDev = ((hostContext: any): HostContextDev);
342 validateDOMNesting(null, text, hostContextDev.ancestorInfo);
343 + if (enableEventAPI) {
344 + const eventData = hostContextDev.eventData;
345 + if (eventData !== null) {
346 + warning(
347 + !eventData.isEventComponent,
348 + 'validateDOMNesting: React event components cannot have text DOM nodes as children. ' +
349 + 'Wrap the child text "%s" in an element.',
350 + text,
351 + );
352 + warning(
353 + !eventData.isEventTarget,
354 + 'validateDOMNesting: React event targets cannot have text DOM nodes as children. ' +
355 + 'Wrap the child text "%s" in an element.',
356 + text,
357 + );
358 + }
359 + }
360 }
361 const textNode: TextInstance = createTextNode(text, rootContainerInstance);
362 precacheFiberNode(internalInstanceHandle, textNode);
@@ -804,9 +865,25 @@ export function handleEventComponent(
865 }
866
867 export function handleEventTarget(
807 - type: string,
868 + type: Symbol | number,
869 props: Props,
870 internalInstanceHandle: Object,
871 ) {
811 - // TODO: add handleEventTarget implementation
872 + // Touch target hit slop handling
873 + if (type === REACT_EVENT_TARGET_TOUCH_HIT) {
874 + // Validates that there is a single element
875 + const element = getElementFromTouchHitTarget(internalInstanceHandle);
876 + if (element !== null) {
877 + // We update the event target state node to be that of the element.
878 + // We can then diff this entry to determine if we need to add the
879 + // hit slop element, or change the dimensions of the hit slop.
880 + const lastElement = internalInstanceHandle.stateNode;
881 + if (lastElement !== element) {
882 + internalInstanceHandle.stateNode = element;
883 + // TODO: Create the hit slop element and attach it to the element
884 + } else {
885 + // TODO: Diff the left, top, right, bottom props
886 + }
887 + }
888 + }
889 }
packages/react-native-renderer/src/ReactFabricHostConfig.js
+9 -1
@@ -283,6 +283,14 @@ export function getChildHostContext(
283 }
284 }
285
286 +export function getChildHostContextForEvent(
287 + parentHostContext: HostContext,
288 + type: Symbol | number,
289 +) {
290 + // TODO: add getChildHostContextForEvent implementation
291 + return parentHostContext;
292 +}
293 +
294 export function getPublicInstance(instance: Instance): * {
295 return instance.canonical;
296 }
@@ -428,7 +436,7 @@ export function handleEventComponent(
436 }
437
438 export function handleEventTarget(
431 - type: string,
439 + type: Symbol | number,
440 props: Props,
441 internalInstanceHandle: Object,
442 ) {
packages/react-native-renderer/src/ReactNativeHostConfig.js
+9 -1
@@ -206,6 +206,14 @@ export function getChildHostContext(
206 }
207 }
208
209 +export function getChildHostContextForEvent(
210 + parentHostContext: HostContext,
211 + type: Symbol | number,
212 +) {
213 + // TODO: add getChildHostContextForEvent implementation
214 + return parentHostContext;
215 +}
216 +
217 export function getPublicInstance(instance: Instance): * {
218 return instance;
219 }
@@ -487,7 +495,7 @@ export function handleEventComponent(
495 }
496
497 export function handleEventTarget(
490 - type: string,
498 + type: Symbol | number,
499 props: Props,
500 internalInstanceHandle: Object,
501 ) {
packages/react-noop-renderer/src/createReactNoop.js
+60 -1
@@ -21,8 +21,18 @@ import type {ReactNodeList} from 'shared/ReactTypes';
21 import * as Scheduler from 'scheduler/unstable_mock';
22 import {createPortal} from 'shared/ReactPortal';
23 import expect from 'expect';
24 -import {REACT_FRAGMENT_TYPE, REACT_ELEMENT_TYPE} from 'shared/ReactSymbols';
24 +import {
25 + REACT_FRAGMENT_TYPE,
26 + REACT_ELEMENT_TYPE,
27 + REACT_EVENT_COMPONENT_TYPE,
28 + REACT_EVENT_TARGET_TYPE,
29 + REACT_EVENT_TARGET_TOUCH_HIT,
30 +} from 'shared/ReactSymbols';
31 import warningWithoutStack from 'shared/warningWithoutStack';
32 +import warning from 'shared/warning';
33 +import getElementFromTouchHitTarget from 'shared/getElementFromTouchHitTarget';
34 +
35 +import {enableEventAPI} from 'shared/ReactFeatureFlags';
36
37 // for .act's return value
38 type Thenable = {
@@ -54,6 +64,8 @@ type HostContext = Object;
64
65 const NO_CONTEXT = {};
66 const UPPERCASE_CONTEXT = {};
67 +const EVENT_COMPONENT_CONTEXT = {};
68 +const EVENT_TARGET_CONTEXT = {};
69 const UPDATE_SIGNAL = {};
70 if (__DEV__) {
71 Object.freeze(NO_CONTEXT);
@@ -250,6 +262,24 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
262 return NO_CONTEXT;
263 },
264
265 + getChildHostContextForEvent(
266 + parentHostContext: HostContext,
267 + type: Symbol | number,
268 + ) {
269 + if (__DEV__ && enableEventAPI) {
270 + if (type === REACT_EVENT_COMPONENT_TYPE) {
271 + return EVENT_COMPONENT_CONTEXT;
272 + } else if (type === REACT_EVENT_TARGET_TYPE) {
273 + warning(
274 + parentHostContext === EVENT_COMPONENT_CONTEXT,
275 + 'validateDOMNesting: React event targets must be direct children of event components.',
276 + );
277 + return EVENT_TARGET_CONTEXT;
278 + }
279 + }
280 + return parentHostContext;
281 + },
282 +
283 getPublicInstance(instance) {
284 return instance;
285 },
@@ -333,6 +363,20 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
363 hostContext: Object,
364 internalInstanceHandle: Object,
365 ): TextInstance {
366 + if (__DEV__ && enableEventAPI) {
367 + warning(
368 + hostContext !== EVENT_COMPONENT_CONTEXT,
369 + 'validateDOMNesting: React event components cannot have text DOM nodes as children. ' +
370 + 'Wrap the child text "%s" in an element.',
371 + text,
372 + );
373 + warning(
374 + hostContext !== EVENT_TARGET_CONTEXT,
375 + 'validateDOMNesting: React event targets cannot have text DOM nodes as children. ' +
376 + 'Wrap the child text "%s" in an element.',
377 + text,
378 + );
379 + }
380 if (hostContext === UPPERCASE_CONTEXT) {
381 text = text.toUpperCase();
382 }
@@ -363,6 +407,21 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
407
408 isPrimaryRenderer: true,
409 supportsHydration: false,
410 +
411 + handleEventComponent() {
412 + // NO-OP
413 + },
414 +
415 + handleEventTarget(
416 + type: Symbol | number,
417 + props: Props,
418 + internalInstanceHandle: Object,
419 + ) {
420 + if (type === REACT_EVENT_TARGET_TOUCH_HIT) {
421 + // Validates that there is a single element
422 + getElementFromTouchHitTarget(internalInstanceHandle);
423 + }
424 + },
425 };
426
427 const hostConfig = useMutation
packages/react-reconciler/src/ReactFiber.js
+63 -2
@@ -8,7 +8,13 @@
8 */
9
10 import type {ReactElement, Source} from 'shared/ReactElementType';
11 -import type {ReactFragment, ReactPortal, RefObject} from 'shared/ReactTypes';
11 +import type {
12 + ReactFragment,
13 + ReactPortal,
14 + RefObject,
15 + ReactEventComponent,
16 + ReactEventTarget,
17 +} from 'shared/ReactTypes';
18 import type {WorkTag} from 'shared/ReactWorkTags';
19 import type {TypeOfMode} from './ReactTypeOfMode';
20 import type {SideEffectTag} from 'shared/ReactSideEffectTags';
@@ -19,7 +25,7 @@ import type {HookType} from './ReactFiberHooks';
25
26 import invariant from 'shared/invariant';
27 import warningWithoutStack from 'shared/warningWithoutStack';
22 -import {enableProfilerTimer} from 'shared/ReactFeatureFlags';
28 +import {enableProfilerTimer, enableEventAPI} from 'shared/ReactFeatureFlags';
29 import {NoEffect} from 'shared/ReactSideEffectTags';
30 import {
31 IndeterminateComponent,
@@ -38,6 +44,8 @@ import {
44 FunctionComponent,
45 MemoComponent,
46 LazyComponent,
47 + EventComponent,
48 + EventTarget,
49 } from 'shared/ReactWorkTags';
50 import getComponentName from 'shared/getComponentName';
51
@@ -60,6 +68,8 @@ import {
68 REACT_SUSPENSE_TYPE,
69 REACT_MEMO_TYPE,
70 REACT_LAZY_TYPE,
71 + REACT_EVENT_COMPONENT_TYPE,
72 + REACT_EVENT_TARGET_TYPE,
73 } from 'shared/ReactSymbols';
74
75 let hasBadMapPolyfill;
@@ -503,6 +513,28 @@ export function createFiberFromTypeAndProps(
513 fiberTag = LazyComponent;
514 resolvedType = null;
515 break getTag;
516 + case REACT_EVENT_COMPONENT_TYPE:
517 + if (enableEventAPI) {
518 + return createFiberFromEventComponent(
519 + type,
520 + pendingProps,
521 + mode,
522 + expirationTime,
523 + key,
524 + );
525 + }
526 + break;
527 + case REACT_EVENT_TARGET_TYPE:
528 + if (enableEventAPI) {
529 + return createFiberFromEventTarget(
530 + type,
531 + pendingProps,
532 + mode,
533 + expirationTime,
534 + key,
535 + );
536 + }
537 + break;
538 }
539 }
540 let info = '';
@@ -581,6 +613,35 @@ export function createFiberFromFragment(
613 return fiber;
614 }
615
616 +export function createFiberFromEventComponent(
617 + eventComponent: ReactEventComponent,
618 + pendingProps: any,
619 + mode: TypeOfMode,
620 + expirationTime: ExpirationTime,
621 + key: null | string,
622 +): Fiber {
623 + const fiber = createFiber(EventComponent, pendingProps, key, mode);
624 + fiber.elementType = eventComponent;
625 + fiber.type = eventComponent;
626 + fiber.stateNode = new Map();
627 + fiber.expirationTime = expirationTime;
628 + return fiber;
629 +}
630 +
631 +export function createFiberFromEventTarget(
632 + eventTarget: ReactEventTarget,
633 + pendingProps: any,
634 + mode: TypeOfMode,
635 + expirationTime: ExpirationTime,
636 + key: null | string,
637 +): Fiber {
638 + const fiber = createFiber(EventTarget, pendingProps, key, mode);
639 + fiber.elementType = eventTarget;
640 + fiber.type = eventTarget;
641 + fiber.expirationTime = expirationTime;
642 + return fiber;
643 +}
644 +
645 function createFiberFromProfiler(
646 pendingProps: any,
647 mode: TypeOfMode,
packages/react-reconciler/src/ReactFiberBeginWork.js
+52 -1
@@ -35,6 +35,8 @@ import {
35 SimpleMemoComponent,
36 LazyComponent,
37 IncompleteClassComponent,
38 + EventComponent,
39 + EventTarget,
40 } from 'shared/ReactWorkTags';
41 import {
42 NoEffect,
@@ -52,6 +54,7 @@ import {
54 debugRenderPhaseSideEffectsForStrictMode,
55 enableProfilerTimer,
56 enableSuspenseServerRenderer,
57 + enableEventAPI,
58 } from 'shared/ReactFeatureFlags';
59 import invariant from 'shared/invariant';
60 import shallowEqual from 'shared/shallowEqual';
@@ -93,7 +96,11 @@ import {
96 registerSuspenseInstanceRetry,
97 } from './ReactFiberHostConfig';
98 import type {SuspenseInstance} from './ReactFiberHostConfig';
96 -import {pushHostContext, pushHostContainer} from './ReactFiberHostContext';
99 +import {
100 + pushHostContext,
101 + pushHostContainer,
102 + pushHostContextForEvent,
103 +} from './ReactFiberHostContext';
104 import {
105 pushProvider,
106 propagateContextChange,
@@ -1943,6 +1950,34 @@ function updateContextConsumer(
1950 return workInProgress.child;
1951 }
1952
1953 +function updateEventComponent(current, workInProgress, renderExpirationTime) {
1954 + const nextProps = workInProgress.pendingProps;
1955 + let nextChildren = nextProps.children;
1956 +
1957 + reconcileChildren(
1958 + current,
1959 + workInProgress,
1960 + nextChildren,
1961 + renderExpirationTime,
1962 + );
1963 + pushHostContextForEvent(workInProgress);
1964 + return workInProgress.child;
1965 +}
1966 +
1967 +function updateEventTarget(current, workInProgress, renderExpirationTime) {
1968 + const nextProps = workInProgress.pendingProps;
1969 + let nextChildren = nextProps.children;
1970 +
1971 + reconcileChildren(
1972 + current,
1973 + workInProgress,
1974 + nextChildren,
1975 + renderExpirationTime,
1976 + );
1977 + pushHostContextForEvent(workInProgress);
1978 + return workInProgress.child;
1979 +}
1980 +
1981 export function markWorkInProgressReceivedUpdate() {
1982 didReceiveUpdate = true;
1983 }
@@ -2259,6 +2294,22 @@ function beginWork(
2294 }
2295 break;
2296 }
2297 + case EventComponent: {
2298 + if (enableEventAPI) {
2299 + return updateEventComponent(
2300 + current,
2301 + workInProgress,
2302 + renderExpirationTime,
2303 + );
2304 + }
2305 + break;
2306 + }
2307 + case EventTarget: {
2308 + if (enableEventAPI) {
2309 + return updateEventTarget(current, workInProgress, renderExpirationTime);
2310 + }
2311 + break;
2312 + }
2313 }
2314 invariant(
2315 false,
packages/react-reconciler/src/ReactFiberCommitWork.js
+2 -16
@@ -43,7 +43,6 @@ import {
43 IncompleteClassComponent,
44 MemoComponent,
45 SimpleMemoComponent,
46 - EventTarget,
46 } from 'shared/ReactWorkTags';
47 import {
48 invokeGuardedCallback,
@@ -91,7 +90,6 @@ import {
90 hideTextInstance,
91 unhideInstance,
92 unhideTextInstance,
94 - handleEventTarget,
93 } from './ReactFiberHostConfig';
94 import {
95 captureCommitPhaseError,
@@ -301,7 +299,6 @@ function commitBeforeMutationLifeCycles(
299 case HostText:
300 case HostPortal:
301 case IncompleteClassComponent:
304 - case EventTarget:
302 // Nothing to do for these component types
303 return;
304 default: {
@@ -588,7 +585,6 @@ function commitLifeCycles(
585 }
586 case SuspenseComponent:
587 case IncompleteClassComponent:
591 - case EventTarget:
588 break;
589 default: {
590 invariant(
@@ -819,12 +815,8 @@ function commitContainer(finishedWork: Fiber) {
815 }
816
817 switch (finishedWork.tag) {
822 - case ClassComponent: {
823 - return;
824 - }
825 - case HostComponent: {
826 - return;
827 - }
818 + case ClassComponent:
819 + case HostComponent:
820 case HostText: {
821 return;
822 }
@@ -1216,12 +1208,6 @@ function commitWork(current: Fiber | null, finishedWork: Fiber): void {
1208 case IncompleteClassComponent: {
1209 return;
1210 }
1219 - case EventTarget: {
1220 - const newProps = finishedWork.memoizedProps;
1221 - const type = finishedWork.type.type;
1222 - handleEventTarget(type, newProps, finishedWork);
1223 - return;
1224 - }
1211 default: {
1212 invariant(
1213 false,
packages/react-reconciler/src/ReactFiberCompleteWork.js
+16 -5
@@ -66,6 +66,7 @@ import {
66 appendChildToContainerChildSet,
67 finalizeContainerChildren,
68 handleEventComponent,
69 + handleEventTarget,
70 } from './ReactFiberHostConfig';
71 import {
72 getRootHostContainer,
@@ -85,7 +86,10 @@ import {
86 skipPastDehydratedSuspenseInstance,
87 popHydrationState,
88 } from './ReactFiberHydrationContext';
88 -import {enableSuspenseServerRenderer} from 'shared/ReactFeatureFlags';
89 +import {
90 + enableSuspenseServerRenderer,
91 + enableEventAPI,
92 +} from 'shared/ReactFeatureFlags';
93
94 function markUpdate(workInProgress: Fiber) {
95 // Tag the fiber with an update effect. This turns a Placement into
@@ -766,13 +770,20 @@ function completeWork(
770 break;
771 }
772 case EventComponent: {
769 - const rootContainerInstance = getRootHostContainer();
770 - const responder = workInProgress.type.responder;
771 - handleEventComponent(responder, rootContainerInstance, workInProgress);
773 + if (enableEventAPI) {
774 + popHostContext(workInProgress);
775 + const rootContainerInstance = getRootHostContainer();
776 + const responder = workInProgress.type.responder;
777 + handleEventComponent(responder, rootContainerInstance, workInProgress);
778 + }
779 break;
780 }
781 case EventTarget: {
775 - markUpdate(workInProgress);
782 + if (enableEventAPI) {
783 + popHostContext(workInProgress);
784 + const type = workInProgress.type.type;
785 + handleEventTarget(type, newProps, workInProgress);
786 + }
787 break;
788 }
789 default:
packages/react-reconciler/src/ReactFiberHostContext.js
+22 -1
@@ -13,7 +13,11 @@ import type {Container, HostContext} from './ReactFiberHostConfig';
13
14 import invariant from 'shared/invariant';
15
16 -import {getChildHostContext, getRootHostContext} from './ReactFiberHostConfig';
16 +import {
17 + getChildHostContext,
18 + getRootHostContext,
19 + getChildHostContextForEvent,
20 +} from './ReactFiberHostConfig';
21 import {createCursor, push, pop} from './ReactFiberStack';
22
23 declare class NoContextT {}
@@ -92,6 +96,22 @@ function pushHostContext(fiber: Fiber): void {
96 push(contextStackCursor, nextContext, fiber);
97 }
98
99 +function pushHostContextForEvent(fiber: Fiber): void {
100 + const context: HostContext = requiredContext(contextStackCursor.current);
101 + const eventTypeof = fiber.type.$$typeof;
102 + const nextContext = getChildHostContextForEvent(context, eventTypeof);
103 +
104 + // Don't push this Fiber's context unless it's unique.
105 + if (context === nextContext) {
106 + return;
107 + }
108 +
109 + // Track the context and the Fiber that provided it.
110 + // This enables us to pop only Fibers that provide unique contexts.
111 + push(contextFiberStackCursor, fiber, fiber);
112 + push(contextStackCursor, nextContext, fiber);
113 +}
114 +
115 function popHostContext(fiber: Fiber): void {
116 // Do not pop unless this Fiber provided the current context.
117 // pushHostContext() only pushes Fibers that provide unique contexts.
@@ -110,4 +130,5 @@ export {
130 popHostContext,
131 pushHostContainer,
132 pushHostContext,
133 + pushHostContextForEvent,
134 };
packages/react-reconciler/src/__tests__/ReactFiberEvents-test-internal.js new
+361
@@ -0,0 +1,361 @@
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 + * @emails react-core
8 + * @jest-environment node
9 + */
10 +
11 +'use strict';
12 +
13 +let React;
14 +let ReactNoop;
15 +let Scheduler;
16 +let ReactFeatureFlags;
17 +let EventComponent;
18 +let ReactTestRenderer;
19 +let EventTarget;
20 +let ReactEvents;
21 +
22 +const noOpResponder = {
23 + targetEventTypes: [],
24 + handleEvent() {},
25 +};
26 +
27 +function createReactEventComponent() {
28 + return {
29 + $$typeof: Symbol.for('react.event_component'),
30 + props: null,
31 + responder: noOpResponder,
32 + };
33 +}
34 +
35 +function init() {
36 + jest.resetModules();
37 + ReactFeatureFlags = require('shared/ReactFeatureFlags');
38 + ReactFeatureFlags.enableEventAPI = true;
39 + React = require('react');
40 + Scheduler = require('scheduler');
41 + ReactEvents = require('react-events');
42 +}
43 +
44 +function initNoopRenderer() {
45 + init();
46 + ReactNoop = require('react-noop-renderer');
47 +}
48 +
49 +function initTestRenderer() {
50 + init();
51 + ReactTestRenderer = require('react-test-renderer');
52 +}
53 +
54 +// This is a new feature in Fiber so I put it in its own test file. It could
55 +// probably move to one of the other test files once it is official.
56 +describe('ReactTopLevelText', () => {
57 + describe('NoopRenderer', () => {
58 + beforeEach(() => {
59 + initNoopRenderer();
60 + EventComponent = createReactEventComponent();
61 + EventTarget = ReactEvents.TouchHitTarget;
62 + });
63 +
64 + it('should render a simple event component with a single child', () => {
65 + const Test = () => (
66 + <EventComponent>
67 + <div>Hello world</div>
68 + </EventComponent>
69 + );
70 +
71 + ReactNoop.render(<Test />);
72 + expect(Scheduler).toFlushWithoutYielding();
73 + expect(ReactNoop).toMatchRenderedOutput(<div>Hello world</div>);
74 + });
75 +
76 + it('should warn when an event component has a direct text child', () => {
77 + const Test = () => <EventComponent>Hello world</EventComponent>;
78 +
79 + expect(() => {
80 + ReactNoop.render(<Test />);
81 + expect(Scheduler).toFlushWithoutYielding();
82 + }).toWarnDev(
83 + 'Warning: validateDOMNesting: React event components cannot have text DOM nodes as children. ' +
84 + 'Wrap the child text "Hello world" in an element.',
85 + );
86 + });
87 +
88 + it('should warn when an event component has a direct text child #2', () => {
89 + const ChildWrapper = () => 'Hello world';
90 + const Test = () => (
91 + <EventComponent>
92 + <ChildWrapper />
93 + </EventComponent>
94 + );
95 +
96 + expect(() => {
97 + ReactNoop.render(<Test />);
98 + expect(Scheduler).toFlushWithoutYielding();
99 + }).toWarnDev(
100 + 'Warning: validateDOMNesting: React event components cannot have text DOM nodes as children. ' +
101 + 'Wrap the child text "Hello world" in an element.',
102 + );
103 + });
104 +
105 + it('should render a simple event component with a single event target', () => {
106 + const Test = () => (
107 + <EventComponent>
108 + <EventTarget>
109 + <div>Hello world</div>
110 + </EventTarget>
111 + </EventComponent>
112 + );
113 +
114 + ReactNoop.render(<Test />);
115 + expect(Scheduler).toFlushWithoutYielding();
116 + expect(ReactNoop).toMatchRenderedOutput(<div>Hello world</div>);
117 + });
118 +
119 + it('should warn when an event target has a direct text child', () => {
120 + const Test = () => (
121 + <EventComponent>
122 + <EventTarget>Hello world</EventTarget>
123 + </EventComponent>
124 + );
125 +
126 + expect(() => {
127 + ReactNoop.render(<Test />);
128 + expect(Scheduler).toFlushWithoutYielding();
129 + }).toWarnDev([
130 + 'Warning: validateDOMNesting: React event targets cannot have text DOM nodes as children. ' +
131 + 'Wrap the child text "Hello world" in an element.',
132 + 'Warning: <TouchHitTarget> must have a single DOM element as a child. Found no children.',
133 + ]);
134 + });
135 +
136 + it('should warn when an event target has a direct text child #2', () => {
137 + const ChildWrapper = () => 'Hello world';
138 + const Test = () => (
139 + <EventComponent>
140 + <EventTarget>
141 + <ChildWrapper />
142 + </EventTarget>
143 + </EventComponent>
144 + );
145 +
146 + expect(() => {
147 + ReactNoop.render(<Test />);
148 + expect(Scheduler).toFlushWithoutYielding();
149 + }).toWarnDev([
150 + 'Warning: validateDOMNesting: React event targets cannot have text DOM nodes as children. ' +
151 + 'Wrap the child text "Hello world" in an element.',
152 + 'Warning: <TouchHitTarget> must have a single DOM element as a child. Found no children.',
153 + ]);
154 + });
155 +
156 + it('should warn when an event target has more than one child', () => {
157 + const Test = () => (
158 + <EventComponent>
159 + <EventTarget>
160 + <span>Child 1</span>
161 + <span>Child 2</span>
162 + </EventTarget>
163 + </EventComponent>
164 + );
165 +
166 + expect(() => {
167 + ReactNoop.render(<Test />);
168 + expect(Scheduler).toFlushWithoutYielding();
169 + }).toWarnDev(
170 + 'Warning: <TouchHitTarget> must only have a single DOM element as a child. Found many children.',
171 + );
172 + });
173 +
174 + it('should warn if an event target is not a direct child of an event component', () => {
175 + const Test = () => (
176 + <EventComponent>
177 + <div>
178 + <EventTarget>
179 + <span>Child 1</span>
180 + </EventTarget>
181 + </div>
182 + </EventComponent>
183 + );
184 +
185 + expect(() => {
186 + ReactNoop.render(<Test />);
187 + expect(Scheduler).toFlushWithoutYielding();
188 + }).toWarnDev(
189 + 'Warning: validateDOMNesting: React event targets must be direct children of event components.',
190 + );
191 + });
192 + });
193 +
194 + describe('TestRenderer', () => {
195 + beforeEach(() => {
196 + initTestRenderer();
197 + EventComponent = createReactEventComponent();
198 + EventTarget = ReactEvents.TouchHitTarget;
199 + });
200 +
201 + it('should render a simple event component with a single child', () => {
202 + const Test = () => (
203 + <EventComponent>
204 + <div>Hello world</div>
205 + </EventComponent>
206 + );
207 +
208 + const root = ReactTestRenderer.create(null);
209 + root.update(<Test />);
210 + expect(Scheduler).toFlushWithoutYielding();
211 + expect(root).toMatchRenderedOutput(<div>Hello world</div>);
212 + });
213 +
214 + it('should warn when an event component has a direct text child', () => {
215 + const Test = () => <EventComponent>Hello world</EventComponent>;
216 +
217 + const root = ReactTestRenderer.create(null);
218 + expect(() => {
219 + root.update(<Test />);
220 + expect(Scheduler).toFlushWithoutYielding();
221 + }).toWarnDev(
222 + 'Warning: validateDOMNesting: React event components cannot have text DOM nodes as children. ' +
223 + 'Wrap the child text "Hello world" in an element.',
224 + );
225 + });
226 +
227 + it('should warn when an event component has a direct text child #2', () => {
228 + const ChildWrapper = () => 'Hello world';
229 + const Test = () => (
230 + <EventComponent>
231 + <ChildWrapper />
232 + </EventComponent>
233 + );
234 +
235 + const root = ReactTestRenderer.create(null);
236 + expect(() => {
237 + root.update(<Test />);
238 + expect(Scheduler).toFlushWithoutYielding();
239 + }).toWarnDev(
240 + 'Warning: validateDOMNesting: React event components cannot have text DOM nodes as children. ' +
241 + 'Wrap the child text "Hello world" in an element.',
242 + );
243 + });
244 +
245 + it('should render a simple event component with a single event target', () => {
246 + const Test = () => (
247 + <EventComponent>
248 + <EventTarget>
249 + <div>Hello world</div>
250 + </EventTarget>
251 + </EventComponent>
252 + );
253 +
254 + const root = ReactTestRenderer.create(null);
255 + root.update(<Test />);
256 + expect(Scheduler).toFlushWithoutYielding();
257 + expect(root).toMatchRenderedOutput(<div>Hello world</div>);
258 +
259 + const Test2 = () => (
260 + <EventComponent>
261 + <EventTarget>
262 + <span>I am now a span</span>
263 + </EventTarget>
264 + </EventComponent>
265 + );
266 +
267 + root.update(<Test2 />);
268 + expect(Scheduler).toFlushWithoutYielding();
269 + expect(root).toMatchRenderedOutput(<span>I am now a span</span>);
270 + });
271 +
272 + it('should warn when an event target has a direct text child', () => {
273 + const Test = () => (
274 + <EventComponent>
275 + <EventTarget>Hello world</EventTarget>
276 + </EventComponent>
277 + );
278 +
279 + const root = ReactTestRenderer.create(null);
280 + expect(() => {
281 + root.update(<Test />);
282 + expect(Scheduler).toFlushWithoutYielding();
283 + }).toWarnDev([
284 + 'Warning: validateDOMNesting: React event targets cannot have text DOM nodes as children. ' +
285 + 'Wrap the child text "Hello world" in an element.',
286 + 'Warning: <TouchHitTarget> must have a single DOM element as a child. Found no children.',
287 + ]);
288 + });
289 +
290 + it('should warn when an event target has a direct text child #2', () => {
291 + const ChildWrapper = () => 'Hello world';
292 + const Test = () => (
293 + <EventComponent>
294 + <EventTarget>
295 + <ChildWrapper />
296 + </EventTarget>
297 + </EventComponent>
298 + );
299 +
300 + const root = ReactTestRenderer.create(null);
301 + expect(() => {
302 + root.update(<Test />);
303 + expect(Scheduler).toFlushWithoutYielding();
304 + }).toWarnDev([
305 + 'Warning: validateDOMNesting: React event targets cannot have text DOM nodes as children. ' +
306 + 'Wrap the child text "Hello world" in an element.',
307 + 'Warning: <TouchHitTarget> must have a single DOM element as a child. Found no children.',
308 + ]);
309 + });
310 +
311 + it('should warn when an event target has more than one child', () => {
312 + const Test = () => (
313 + <EventComponent>
314 + <EventTarget>
315 + <span>Child 1</span>
316 + <span>Child 2</span>
317 + </EventTarget>
318 + </EventComponent>
319 + );
320 +
321 + const root = ReactTestRenderer.create(null);
322 + expect(() => {
323 + root.update(<Test />);
324 + expect(Scheduler).toFlushWithoutYielding();
325 + }).toWarnDev(
326 + 'Warning: <TouchHitTarget> must only have a single DOM element as a child. Found many children.',
327 + );
328 + // This should not fire a warning, as this is now valid.
329 + const Test2 = () => (
330 + <EventComponent>
331 + <EventTarget>
332 + <span>Child 1</span>
333 + </EventTarget>
334 + </EventComponent>
335 + );
336 + root.update(<Test2 />);
337 + expect(Scheduler).toFlushWithoutYielding();
338 + expect(root).toMatchRenderedOutput(<span>Child 1</span>);
339 + });
340 +
341 + it('should warn if an event target is not a direct child of an event component', () => {
342 + const Test = () => (
343 + <EventComponent>
344 + <div>
345 + <EventTarget>
346 + <span>Child 1</span>
347 + </EventTarget>
348 + </div>
349 + </EventComponent>
350 + );
351 +
352 + const root = ReactTestRenderer.create(null);
353 + expect(() => {
354 + root.update(<Test />);
355 + expect(Scheduler).toFlushWithoutYielding();
356 + }).toWarnDev(
357 + 'Warning: validateDOMNesting: React event targets must be direct children of event components.',
358 + );
359 + });
360 + });
361 +});
packages/react-reconciler/src/__tests__/ReactFiberHostContext-test.js
+3
@@ -31,6 +31,9 @@ describe('ReactFiberHostContext', () => {
31 getChildHostContext: function() {
32 return null;
33 },
34 + getChildHostContextForEvent: function() {
35 + return null;
36 + },
37 shouldSetTextContent: function() {
38 return false;
39 },
packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js
+2
@@ -41,6 +41,8 @@ export opaque type NoTimeout = mixed; // eslint-disable-line no-undef
41 export const getPublicInstance = $$$hostConfig.getPublicInstance;
42 export const getRootHostContext = $$$hostConfig.getRootHostContext;
43 export const getChildHostContext = $$$hostConfig.getChildHostContext;
44 +export const getChildHostContextForEvent =
45 + $$$hostConfig.getChildHostContextForEvent;
46 export const prepareForCommit = $$$hostConfig.prepareForCommit;
47 export const resetAfterCommit = $$$hostConfig.resetAfterCommit;
48 export const createInstance = $$$hostConfig.createInstance;
packages/react-test-renderer/src/ReactTestHostConfig.js
+47 -2
@@ -10,6 +10,14 @@
10 import warning from 'shared/warning';
11
12 import type {ReactEventResponder} from 'shared/ReactTypes';
13 +import {
14 + REACT_EVENT_COMPONENT_TYPE,
15 + REACT_EVENT_TARGET_TYPE,
16 + REACT_EVENT_TARGET_TOUCH_HIT,
17 +} from 'shared/ReactSymbols';
18 +import getElementFromTouchHitTarget from 'shared/getElementFromTouchHitTarget';
19 +
20 +import {enableEventAPI} from 'shared/ReactFeatureFlags';
21
22 export type Type = string;
23 export type Props = Object;
@@ -42,6 +50,8 @@ export type NoTimeout = -1;
50 export * from 'shared/HostConfigWithNoPersistence';
51 export * from 'shared/HostConfigWithNoHydration';
52
53 +const EVENT_COMPONENT_CONTEXT = {};
54 +const EVENT_TARGET_CONTEXT = {};
55 const NO_CONTEXT = {};
56 const UPDATE_SIGNAL = {};
57 if (__DEV__) {
@@ -117,6 +127,24 @@ export function getChildHostContext(
127 return NO_CONTEXT;
128 }
129
130 +export function getChildHostContextForEvent(
131 + parentHostContext: HostContext,
132 + type: Symbol | number,
133 +): HostContext {
134 + if (__DEV__ && enableEventAPI) {
135 + if (type === REACT_EVENT_COMPONENT_TYPE) {
136 + return EVENT_COMPONENT_CONTEXT;
137 + } else if (type === REACT_EVENT_TARGET_TYPE) {
138 + warning(
139 + parentHostContext === EVENT_COMPONENT_CONTEXT,
140 + 'validateDOMNesting: React event targets must be direct children of event components.',
141 + );
142 + return EVENT_TARGET_CONTEXT;
143 + }
144 + }
145 + return NO_CONTEXT;
146 +}
147 +
148 export function prepareForCommit(containerInfo: Container): void {
149 // noop
150 }
@@ -188,6 +216,20 @@ export function createTextInstance(
216 hostContext: Object,
217 internalInstanceHandle: Object,
218 ): TextInstance {
219 + if (__DEV__ && enableEventAPI) {
220 + warning(
221 + hostContext !== EVENT_COMPONENT_CONTEXT,
222 + 'validateDOMNesting: React event components cannot have text DOM nodes as children. ' +
223 + 'Wrap the child text "%s" in an element.',
224 + text,
225 + );
226 + warning(
227 + hostContext !== EVENT_TARGET_CONTEXT,
228 + 'validateDOMNesting: React event targets cannot have text DOM nodes as children. ' +
229 + 'Wrap the child text "%s" in an element.',
230 + text,
231 + );
232 + }
233 return {
234 text,
235 isHidden: false,
@@ -272,9 +314,12 @@ export function handleEventComponent(
314 }
315
316 export function handleEventTarget(
275 - type: string,
317 + type: Symbol | number,
318 props: Props,
319 internalInstanceHandle: Object,
320 ) {
279 - // TODO: add handleEventTarget implementation
321 + if (type === REACT_EVENT_TARGET_TOUCH_HIT) {
322 + // Validates that there is a single element
323 + getElementFromTouchHitTarget(internalInstanceHandle);
324 + }
325 }
packages/shared/ReactSymbols.js
+1 -1
@@ -47,7 +47,7 @@ export const REACT_SUSPENSE_TYPE = hasSymbol
47 export const REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
48 export const REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
49 export const REACT_EVENT_COMPONENT_TYPE = hasSymbol
50 - ? Symbol.for('react.event')
50 + ? Symbol.for('react.event_component')
51 : 0xead5;
52 export const REACT_EVENT_TARGET_TYPE = hasSymbol
53 ? Symbol.for('react.event_target')
packages/shared/ReactTypes.js
+7 -3
@@ -14,7 +14,7 @@ export type ReactNode =
14 | ReactFragment
15 | ReactProvider<any>
16 | ReactConsumer<any>
17 - | ReactEvent
17 + | ReactEventComponent
18 | ReactEventTarget;
19
20 export type ReactEmpty = null | void | boolean;
@@ -81,13 +81,17 @@ export type RefObject = {|
81 current: any,
82 |};
83
84 +export type ReactEventResponderEventType =
85 + | string
86 + | {name: string, passive?: boolean, capture?: boolean};
87 +
88 export type ReactEventResponder = {
85 - targetEventTypes: Array<string>,
89 + targetEventTypes: Array<ReactEventResponderEventType>,
90 createInitialState?: (props: Object) => Object,
91 handleEvent: (context: Object, props: Object, state: Object) => void,
92 };
93
90 -export type ReactEvent = {|
94 +export type ReactEventComponent = {|
95 $$typeof: Symbol | number,
96 props: null | Object,
97 responder: ReactEventResponder,
packages/shared/forks/ReactFeatureFlags.test-renderer.js
+1
@@ -27,6 +27,7 @@ export const enableStableConcurrentModeAPIs = false;
27 export const warnAboutShorthandPropertyCollision = false;
28 export const enableSchedulerDebugging = false;
29 export const warnAboutDeprecatedSetNativeProps = false;
30 +export const enableEventAPI = false;
31
32 // Only used in www builds.
33 export function addUserTimingListener() {
packages/shared/getElementFromTouchHitTarget.js new
+85
@@ -0,0 +1,85 @@
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 +import type {Fiber} from 'react-reconciler/src/ReactFiber';
11 +
12 +import {HostComponent} from 'shared/ReactWorkTags';
13 +import warning from 'shared/warning';
14 +
15 +type HostContext = Object;
16 +
17 +type TextInstance =
18 + | Text
19 + | {|
20 + text: string,
21 + id: number,
22 + hidden: boolean,
23 + context: HostContext,
24 + |};
25 +
26 +type Instance =
27 + | Element
28 + | {|
29 + type: string,
30 + id: number,
31 + children: Array<Instance | TextInstance>,
32 + text: string | null,
33 + prop: any,
34 + hidden: boolean,
35 + context: HostContext,
36 + |};
37 +
38 +export default function getElementFromTouchHitTarget(
39 + targetFiber: Fiber,
40 +): null | Instance {
41 + // Traverse through child fibers and find the first host components
42 + let node = targetFiber.child;
43 + let hostComponent = null;
44 +
45 + while (node !== null) {
46 + if (node.tag === HostComponent) {
47 + if (__DEV__) {
48 + if (hostComponent === null) {
49 + hostComponent = node.stateNode;
50 + } else {
51 + warning(
52 + false,
53 + '<TouchHitTarget> must only have a single DOM element as a child. ' +
54 + 'Found many children.',
55 + );
56 + }
57 + while (node !== null) {
58 + if (node === targetFiber) {
59 + return hostComponent;
60 + } else if (node.sibling !== null) {
61 + node = node.sibling;
62 + break;
63 + }
64 + node = node.return;
65 + }
66 + } else {
67 + return node.stateNode;
68 + }
69 + } else if (node.child !== null) {
70 + node = node.child;
71 + } else if (node.sibling !== null) {
72 + node = node.sibling;
73 + } else {
74 + break;
75 + }
76 + }
77 + if (__DEV__) {
78 + warning(
79 + hostComponent !== null,
80 + '<TouchHitTarget> must have a single DOM element as a child. ' +
81 + 'Found no children.',
82 + );
83 + }
84 + return hostComponent;
85 +}
scripts/rollup/results.json
+239 -239
@@ -4,29 +4,29 @@
4 "filename": "react.development.js",
5 "bundleType": "UMD_DEV",
6 "packageName": "react",
7 - "size": 102032,
8 - "gzip": 26457
7 + "size": 102492,
8 + "gzip": 26625
9 },
10 {
11 "filename": "react.production.min.js",
12 "bundleType": "UMD_PROD",
13 "packageName": "react",
14 - "size": 12564,
15 - "gzip": 4826
14 + "size": 12609,
15 + "gzip": 4834
16 },
17 {
18 "filename": "react.development.js",
19 "bundleType": "NODE_DEV",
20 "packageName": "react",
21 - "size": 63704,
22 - "gzip": 17181
21 + "size": 64139,
22 + "gzip": 17318
23 },
24 {
25 "filename": "react.production.min.js",
26 "bundleType": "NODE_PROD",
27 "packageName": "react",
28 - "size": 6831,
29 - "gzip": 2817
28 + "size": 6834,
29 + "gzip": 2814
30 },
31 {
32 "filename": "React-dev.js",
@@ -46,29 +46,29 @@
46 "filename": "react-dom.development.js",
47 "bundleType": "UMD_DEV",
48 "packageName": "react-dom",
49 - "size": 791682,
50 - "gzip": 179962
49 + "size": 803793,
50 + "gzip": 183116
51 },
52 {
53 "filename": "react-dom.production.min.js",
54 "bundleType": "UMD_PROD",
55 "packageName": "react-dom",
56 - "size": 107808,
57 - "gzip": 34704
56 + "size": 107752,
57 + "gzip": 34911
58 },
59 {
60 "filename": "react-dom.development.js",
61 "bundleType": "NODE_DEV",
62 "packageName": "react-dom",
63 - "size": 786187,
64 - "gzip": 178415
63 + "size": 798048,
64 + "gzip": 181482
65 },
66 {
67 "filename": "react-dom.production.min.js",
68 "bundleType": "NODE_PROD",
69 "packageName": "react-dom",
70 - "size": 108031,
71 - "gzip": 34186
70 + "size": 107733,
71 + "gzip": 34431
72 },
73 {
74 "filename": "ReactDOM-dev.js",
@@ -88,29 +88,29 @@
88 "filename": "react-dom-test-utils.development.js",
89 "bundleType": "UMD_DEV",
90 "packageName": "react-dom",
91 - "size": 48181,
92 - "gzip": 13291
91 + "size": 48274,
92 + "gzip": 13318
93 },
94 {
95 "filename": "react-dom-test-utils.production.min.js",
96 "bundleType": "UMD_PROD",
97 "packageName": "react-dom",
98 - "size": 10504,
99 - "gzip": 3882
98 + "size": 10511,
99 + "gzip": 3880
100 },
101 {
102 "filename": "react-dom-test-utils.development.js",
103 "bundleType": "NODE_DEV",
104 "packageName": "react-dom",
105 - "size": 47895,
106 - "gzip": 13220
105 + "size": 47988,
106 + "gzip": 13245
107 },
108 {
109 "filename": "react-dom-test-utils.production.min.js",
110 "bundleType": "NODE_PROD",
111 "packageName": "react-dom",
112 - "size": 10281,
113 - "gzip": 3814
112 + "size": 10288,
113 + "gzip": 3812
114 },
115 {
116 "filename": "ReactTestUtils-dev.js",
@@ -123,29 +123,29 @@
123 "filename": "react-dom-unstable-native-dependencies.development.js",
124 "bundleType": "UMD_DEV",
125 "packageName": "react-dom",
126 - "size": 62058,
127 - "gzip": 16289
126 + "size": 62061,
127 + "gzip": 16285
128 },
129 {
130 "filename": "react-dom-unstable-native-dependencies.production.min.js",
131 "bundleType": "UMD_PROD",
132 "packageName": "react-dom",
133 - "size": 11263,
134 - "gzip": 3892
133 + "size": 11266,
134 + "gzip": 3889
135 },
136 {
137 "filename": "react-dom-unstable-native-dependencies.development.js",
138 "bundleType": "NODE_DEV",
139 "packageName": "react-dom",
140 - "size": 61722,
141 - "gzip": 16156
140 + "size": 61725,
141 + "gzip": 16151
142 },
143 {
144 "filename": "react-dom-unstable-native-dependencies.production.min.js",
145 "bundleType": "NODE_PROD",
146 "packageName": "react-dom",
147 - "size": 10998,
148 - "gzip": 3785
147 + "size": 11001,
148 + "gzip": 3783
149 },
150 {
151 "filename": "ReactDOMUnstableNativeDependencies-dev.js",
@@ -165,29 +165,29 @@
165 "filename": "react-dom-server.browser.development.js",
166 "bundleType": "UMD_DEV",
167 "packageName": "react-dom",
168 - "size": 130425,
169 - "gzip": 34746
168 + "size": 133264,
169 + "gzip": 35517
170 },
171 {
172 "filename": "react-dom-server.browser.production.min.js",
173 "bundleType": "UMD_PROD",
174 "packageName": "react-dom",
175 - "size": 19319,
176 - "gzip": 7379
175 + "size": 19666,
176 + "gzip": 7443
177 },
178 {
179 "filename": "react-dom-server.browser.development.js",
180 "bundleType": "NODE_DEV",
181 "packageName": "react-dom",
182 - "size": 126463,
183 - "gzip": 33795
182 + "size": 129302,
183 + "gzip": 34571
184 },
185 {
186 "filename": "react-dom-server.browser.production.min.js",
187 "bundleType": "NODE_PROD",
188 "packageName": "react-dom",
189 - "size": 19239,
190 - "gzip": 7368
189 + "size": 19590,
190 + "gzip": 7447
191 },
192 {
193 "filename": "ReactDOMServer-dev.js",
@@ -207,43 +207,43 @@
207 "filename": "react-dom-server.node.development.js",
208 "bundleType": "NODE_DEV",
209 "packageName": "react-dom",
210 - "size": 128570,
211 - "gzip": 34348
210 + "size": 131409,
211 + "gzip": 35129
212 },
213 {
214 "filename": "react-dom-server.node.production.min.js",
215 "bundleType": "NODE_PROD",
216 "packageName": "react-dom",
217 - "size": 20132,
218 - "gzip": 7685
217 + "size": 20483,
218 + "gzip": 7757
219 },
220 {
221 "filename": "react-art.development.js",
222 "bundleType": "UMD_DEV",
223 "packageName": "react-art",
224 - "size": 562387,
225 - "gzip": 121860
224 + "size": 570224,
225 + "gzip": 123819
226 },
227 {
228 "filename": "react-art.production.min.js",
229 "bundleType": "UMD_PROD",
230 "packageName": "react-art",
231 - "size": 99616,
232 - "gzip": 30538
231 + "size": 99370,
232 + "gzip": 30598
233 },
234 {
235 "filename": "react-art.development.js",
236 "bundleType": "NODE_DEV",
237 "packageName": "react-art",
238 - "size": 491818,
239 - "gzip": 104175
238 + "size": 499479,
239 + "gzip": 106084
240 },
241 {
242 "filename": "react-art.production.min.js",
243 "bundleType": "NODE_PROD",
244 "packageName": "react-art",
245 - "size": 63873,
246 - "gzip": 19446
245 + "size": 63450,
246 + "gzip": 19455
247 },
248 {
249 "filename": "ReactART-dev.js",
@@ -291,29 +291,29 @@
291 "filename": "react-test-renderer.development.js",
292 "bundleType": "UMD_DEV",
293 "packageName": "react-test-renderer",
294 - "size": 503952,
295 - "gzip": 106548
294 + "size": 508633,
295 + "gzip": 107760
296 },
297 {
298 "filename": "react-test-renderer.production.min.js",
299 "bundleType": "UMD_PROD",
300 "packageName": "react-test-renderer",
301 - "size": 65222,
302 - "gzip": 19962
301 + "size": 64479,
302 + "gzip": 19791
303 },
304 {
305 "filename": "react-test-renderer.development.js",
306 "bundleType": "NODE_DEV",
307 "packageName": "react-test-renderer",
308 - "size": 498258,
309 - "gzip": 105207
308 + "size": 504043,
309 + "gzip": 106587
310 },
311 {
312 "filename": "react-test-renderer.production.min.js",
313 "bundleType": "NODE_PROD",
314 "packageName": "react-test-renderer",
315 - "size": 64873,
316 - "gzip": 19614
315 + "size": 64119,
316 + "gzip": 19538
317 },
318 {
319 "filename": "ReactTestRenderer-dev.js",
@@ -326,29 +326,29 @@
326 "filename": "react-test-renderer-shallow.development.js",
327 "bundleType": "UMD_DEV",
328 "packageName": "react-test-renderer",
329 - "size": 38084,
330 - "gzip": 9724
329 + "size": 38113,
330 + "gzip": 9733
331 },
332 {
333 "filename": "react-test-renderer-shallow.production.min.js",
334 "bundleType": "UMD_PROD",
335 "packageName": "react-test-renderer",
336 - "size": 11382,
337 - "gzip": 3422
336 + "size": 11385,
337 + "gzip": 3419
338 },
339 {
340 "filename": "react-test-renderer-shallow.development.js",
341 "bundleType": "NODE_DEV",
342 "packageName": "react-test-renderer",
343 - "size": 32246,
344 - "gzip": 8323
343 + "size": 32275,
344 + "gzip": 8333
345 },
346 {
347 "filename": "react-test-renderer-shallow.production.min.js",
348 "bundleType": "NODE_PROD",
349 "packageName": "react-test-renderer",
350 - "size": 12043,
351 - "gzip": 3734
350 + "size": 12046,
351 + "gzip": 3733
352 },
353 {
354 "filename": "ReactShallowRenderer-dev.js",
@@ -361,57 +361,57 @@
361 "filename": "react-noop-renderer.development.js",
362 "bundleType": "NODE_DEV",
363 "packageName": "react-noop-renderer",
364 - "size": 28240,
365 - "gzip": 6740
364 + "size": 26949,
365 + "gzip": 6362
366 },
367 {
368 "filename": "react-noop-renderer.production.min.js",
369 "bundleType": "NODE_PROD",
370 "packageName": "react-noop-renderer",
371 - "size": 10081,
372 - "gzip": 3367
371 + "size": 9933,
372 + "gzip": 3165
373 },
374 {
375 "filename": "react-reconciler.development.js",
376 "bundleType": "NODE_DEV",
377 "packageName": "react-reconciler",
378 - "size": 489120,
379 - "gzip": 102507
378 + "size": 497879,
379 + "gzip": 104645
380 },
381 {
382 "filename": "react-reconciler.production.min.js",
383 "bundleType": "NODE_PROD",
384 "packageName": "react-reconciler",
385 - "size": 65080,
386 - "gzip": 19234
385 + "size": 64551,
386 + "gzip": 19325
387 },
388 {
389 "filename": "react-reconciler-persistent.development.js",
390 "bundleType": "NODE_DEV",
391 "packageName": "react-reconciler",
392 - "size": 487276,
393 - "gzip": 101780
392 + "size": 495898,
393 + "gzip": 103848
394 },
395 {
396 "filename": "react-reconciler-persistent.production.min.js",
397 "bundleType": "NODE_PROD",
398 "packageName": "react-reconciler",
399 - "size": 65091,
400 - "gzip": 19239
399 + "size": 64562,
400 + "gzip": 19330
401 },
402 {
403 "filename": "react-reconciler-reflection.development.js",
404 "bundleType": "NODE_DEV",
405 "packageName": "react-reconciler",
406 - "size": 16132,
407 - "gzip": 5091
406 + "size": 16161,
407 + "gzip": 5096
408 },
409 {
410 "filename": "react-reconciler-reflection.production.min.js",
411 "bundleType": "NODE_PROD",
412 "packageName": "react-reconciler",
413 - "size": 2757,
414 - "gzip": 1247
413 + "size": 2760,
414 + "gzip": 1244
415 },
416 {
417 "filename": "react-call-return.development.js",
@@ -431,29 +431,29 @@
431 "filename": "react-is.development.js",
432 "bundleType": "UMD_DEV",
433 "packageName": "react-is",
434 - "size": 8255,
435 - "gzip": 2495
434 + "size": 8551,
435 + "gzip": 2554
436 },
437 {
438 "filename": "react-is.production.min.js",
439 "bundleType": "UMD_PROD",
440 "packageName": "react-is",
441 - "size": 2342,
442 - "gzip": 898
441 + "size": 2466,
442 + "gzip": 928
443 },
444 {
445 "filename": "react-is.development.js",
446 "bundleType": "NODE_DEV",
447 "packageName": "react-is",
448 - "size": 8066,
449 - "gzip": 2445
448 + "size": 8362,
449 + "gzip": 2502
450 },
451 {
452 "filename": "react-is.production.min.js",
453 "bundleType": "NODE_PROD",
454 "packageName": "react-is",
455 - "size": 2339,
456 - "gzip": 838
455 + "size": 2463,
456 + "gzip": 870
457 },
458 {
459 "filename": "ReactIs-dev.js",
@@ -487,22 +487,22 @@
487 "filename": "create-subscription.development.js",
488 "bundleType": "NODE_DEV",
489 "packageName": "create-subscription",
490 - "size": 8535,
491 - "gzip": 2957
490 + "size": 8538,
491 + "gzip": 2952
492 },
493 {
494 "filename": "create-subscription.production.min.js",
495 "bundleType": "NODE_PROD",
496 "packageName": "create-subscription",
497 - "size": 2886,
498 - "gzip": 1346
497 + "size": 2889,
498 + "gzip": 1344
499 },
500 {
501 "filename": "React-dev.js",
502 "bundleType": "FB_WWW_DEV",
503 "packageName": "react",
504 - "size": 60786,
505 - "gzip": 16140
504 + "size": 61163,
505 + "gzip": 16239
506 },
507 {
508 "filename": "React-prod.js",
@@ -515,22 +515,22 @@
515 "filename": "ReactDOM-dev.js",
516 "bundleType": "FB_WWW_DEV",
517 "packageName": "react-dom",
518 - "size": 809740,
519 - "gzip": 179616
518 + "size": 821918,
519 + "gzip": 182691
520 },
521 {
522 "filename": "ReactDOM-prod.js",
523 "bundleType": "FB_WWW_PROD",
524 "packageName": "react-dom",
525 - "size": 329960,
526 - "gzip": 60112
525 + "size": 333267,
526 + "gzip": 61003
527 },
528 {
529 "filename": "ReactTestUtils-dev.js",
530 "bundleType": "FB_WWW_DEV",
531 "packageName": "react-dom",
532 - "size": 44795,
533 - "gzip": 12159
532 + "size": 44870,
533 + "gzip": 12188
534 },
535 {
536 "filename": "ReactDOMUnstableNativeDependencies-dev.js",
@@ -550,113 +550,113 @@
550 "filename": "ReactDOMServer-dev.js",
551 "bundleType": "FB_WWW_DEV",
552 "packageName": "react-dom",
553 - "size": 127337,
554 - "gzip": 33235
553 + "size": 130310,
554 + "gzip": 33947
555 },
556 {
557 "filename": "ReactDOMServer-prod.js",
558 "bundleType": "FB_WWW_PROD",
559 "packageName": "react-dom",
560 - "size": 46343,
561 - "gzip": 10662
560 + "size": 46994,
561 + "gzip": 10956
562 },
563 {
564 "filename": "ReactART-dev.js",
565 "bundleType": "FB_WWW_DEV",
566 "packageName": "react-art",
567 - "size": 501297,
568 - "gzip": 103384
567 + "size": 509037,
568 + "gzip": 105217
569 },
570 {
571 "filename": "ReactART-prod.js",
572 "bundleType": "FB_WWW_PROD",
573 "packageName": "react-art",
574 - "size": 200132,
575 - "gzip": 33817
574 + "size": 201874,
575 + "gzip": 34245
576 },
577 {
578 "filename": "ReactNativeRenderer-dev.js",
579 "bundleType": "RN_FB_DEV",
580 "packageName": "react-native-renderer",
581 - "size": 631255,
582 - "gzip": 134845
581 + "size": 637829,
582 + "gzip": 136280
583 },
584 {
585 "filename": "ReactNativeRenderer-prod.js",
586 "bundleType": "RN_FB_PROD",
587 "packageName": "react-native-renderer",
588 - "size": 252735,
589 - "gzip": 44084
588 + "size": 251569,
589 + "gzip": 43973
590 },
591 {
592 "filename": "ReactNativeRenderer-dev.js",
593 "bundleType": "RN_OSS_DEV",
594 "packageName": "react-native-renderer",
595 - "size": 631168,
596 - "gzip": 134810
595 + "size": 637742,
596 + "gzip": 136246
597 },
598 {
599 "filename": "ReactNativeRenderer-prod.js",
600 "bundleType": "RN_OSS_PROD",
601 "packageName": "react-native-renderer",
602 - "size": 252749,
603 - "gzip": 44079
602 + "size": 251583,
603 + "gzip": 43970
604 },
605 {
606 "filename": "ReactFabric-dev.js",
607 "bundleType": "RN_FB_DEV",
608 "packageName": "react-native-renderer",
609 - "size": 621889,
610 - "gzip": 132504
609 + "size": 628028,
610 + "gzip": 133874
611 },
612 {
613 "filename": "ReactFabric-prod.js",
614 "bundleType": "RN_FB_PROD",
615 "packageName": "react-native-renderer",
616 - "size": 244896,
617 - "gzip": 42571
616 + "size": 245497,
617 + "gzip": 42746
618 },
619 {
620 "filename": "ReactFabric-dev.js",
621 "bundleType": "RN_OSS_DEV",
622 "packageName": "react-native-renderer",
623 - "size": 621794,
624 - "gzip": 132455
623 + "size": 627933,
624 + "gzip": 133834
625 },
626 {
627 "filename": "ReactFabric-prod.js",
628 "bundleType": "RN_OSS_PROD",
629 "packageName": "react-native-renderer",
630 - "size": 244902,
631 - "gzip": 42561
630 + "size": 245503,
631 + "gzip": 42741
632 },
633 {
634 "filename": "ReactTestRenderer-dev.js",
635 "bundleType": "FB_WWW_DEV",
636 "packageName": "react-test-renderer",
637 - "size": 508573,
638 - "gzip": 104823
637 + "size": 514514,
638 + "gzip": 106185
639 },
640 {
641 "filename": "ReactShallowRenderer-dev.js",
642 "bundleType": "FB_WWW_DEV",
643 "packageName": "react-test-renderer",
644 - "size": 30628,
645 - "gzip": 7749
644 + "size": 30652,
645 + "gzip": 7761
646 },
647 {
648 "filename": "ReactIs-dev.js",
649 "bundleType": "FB_WWW_DEV",
650 "packageName": "react-is",
651 - "size": 6437,
652 - "gzip": 1724
651 + "size": 6754,
652 + "gzip": 1788
653 },
654 {
655 "filename": "ReactIs-prod.js",
656 "bundleType": "FB_WWW_PROD",
657 "packageName": "react-is",
658 - "size": 4838,
659 - "gzip": 1202
658 + "size": 5133,
659 + "gzip": 1256
660 },
661 {
662 "filename": "scheduler.development.js",
@@ -676,15 +676,15 @@
676 "filename": "scheduler.development.js",
677 "bundleType": "NODE_DEV",
678 "packageName": "scheduler",
679 - "size": 23505,
680 - "gzip": 6019
679 + "size": 23508,
680 + "gzip": 6017
681 },
682 {
683 "filename": "scheduler.production.min.js",
684 "bundleType": "NODE_PROD",
685 "packageName": "scheduler",
686 - "size": 4888,
687 - "gzip": 1819
686 + "size": 4891,
687 + "gzip": 1813
688 },
689 {
690 "filename": "SimpleCacheProvider-dev.js",
@@ -704,36 +704,36 @@
704 "filename": "react-noop-renderer-persistent.development.js",
705 "bundleType": "NODE_DEV",
706 "packageName": "react-noop-renderer",
707 - "size": 28359,
708 - "gzip": 6753
707 + "size": 27068,
708 + "gzip": 6375
709 },
710 {
711 "filename": "react-noop-renderer-persistent.production.min.js",
712 "bundleType": "NODE_PROD",
713 "packageName": "react-noop-renderer",
714 - "size": 10103,
715 - "gzip": 3373
714 + "size": 9955,
715 + "gzip": 3170
716 },
717 {
718 "filename": "react-dom.profiling.min.js",
719 "bundleType": "NODE_PROFILING",
720 "packageName": "react-dom",
721 - "size": 111178,
722 - "gzip": 35023
721 + "size": 110923,
722 + "gzip": 35060
723 },
724 {
725 "filename": "ReactNativeRenderer-profiling.js",
726 "bundleType": "RN_OSS_PROFILING",
727 "packageName": "react-native-renderer",
728 - "size": 259254,
729 - "gzip": 45666
728 + "size": 257964,
729 + "gzip": 45359
730 },
731 {
732 "filename": "ReactFabric-profiling.js",
733 "bundleType": "RN_OSS_PROFILING",
734 "packageName": "react-native-renderer",
735 - "size": 251284,
736 - "gzip": 44137
735 + "size": 250954,
736 + "gzip": 44143
737 },
738 {
739 "filename": "Scheduler-dev.js",
@@ -767,64 +767,64 @@
767 "filename": "ReactDOM-profiling.js",
768 "bundleType": "FB_WWW_PROFILING",
769 "packageName": "react-dom",
770 - "size": 336694,
771 - "gzip": 61627
770 + "size": 339339,
771 + "gzip": 62379
772 },
773 {
774 "filename": "ReactNativeRenderer-profiling.js",
775 "bundleType": "RN_FB_PROFILING",
776 "packageName": "react-native-renderer",
777 - "size": 259235,
778 - "gzip": 45675
777 + "size": 257945,
778 + "gzip": 45363
779 },
780 {
781 "filename": "ReactFabric-profiling.js",
782 "bundleType": "RN_FB_PROFILING",
783 "packageName": "react-native-renderer",
784 - "size": 251273,
785 - "gzip": 44141
784 + "size": 250943,
785 + "gzip": 44145
786 },
787 {
788 "filename": "react.profiling.min.js",
789 "bundleType": "UMD_PROFILING",
790 "packageName": "react",
791 - "size": 14773,
792 - "gzip": 5356
791 + "size": 14818,
792 + "gzip": 5369
793 },
794 {
795 "filename": "react-dom.profiling.min.js",
796 "bundleType": "UMD_PROFILING",
797 "packageName": "react-dom",
798 - "size": 110796,
799 - "gzip": 35607
798 + "size": 110829,
799 + "gzip": 35621
800 },
801 {
802 "filename": "scheduler-tracing.development.js",
803 "bundleType": "NODE_DEV",
804 "packageName": "scheduler",
805 - "size": 10737,
806 - "gzip": 2535
805 + "size": 10878,
806 + "gzip": 2594
807 },
808 {
809 "filename": "scheduler-tracing.production.min.js",
810 "bundleType": "NODE_PROD",
811 "packageName": "scheduler",
812 - "size": 719,
813 - "gzip": 374
812 + "size": 722,
813 + "gzip": 372
814 },
815 {
816 "filename": "scheduler-tracing.profiling.min.js",
817 "bundleType": "NODE_PROFILING",
818 "packageName": "scheduler",
819 - "size": 3334,
820 - "gzip": 991
819 + "size": 3337,
820 + "gzip": 987
821 },
822 {
823 "filename": "SchedulerTracing-dev.js",
824 "bundleType": "FB_WWW_DEV",
825 "packageName": "scheduler",
826 - "size": 10207,
827 - "gzip": 2134
826 + "size": 10267,
827 + "gzip": 2151
828 },
829 {
830 "filename": "SchedulerTracing-prod.js",
@@ -844,106 +844,106 @@
844 "filename": "react-cache.development.js",
845 "bundleType": "NODE_DEV",
846 "packageName": "react-cache",
847 - "size": 9030,
848 - "gzip": 3016
847 + "size": 9192,
848 + "gzip": 3076
849 },
850 {
851 "filename": "react-cache.production.min.js",
852 "bundleType": "NODE_PROD",
853 "packageName": "react-cache",
854 - "size": 2199,
855 - "gzip": 1125
854 + "size": 2202,
855 + "gzip": 1121
856 },
857 {
858 "filename": "ReactCache-dev.js",
859 "bundleType": "FB_WWW_DEV",
860 "packageName": "react-cache",
861 - "size": 7429,
862 - "gzip": 2370
861 + "size": 7587,
862 + "gzip": 2444
863 },
864 {
865 "filename": "ReactCache-prod.js",
866 "bundleType": "FB_WWW_PROD",
867 "packageName": "react-cache",
868 - "size": 5200,
869 - "gzip": 1641
868 + "size": 5235,
869 + "gzip": 1648
870 },
871 {
872 "filename": "react-cache.development.js",
873 "bundleType": "UMD_DEV",
874 "packageName": "react-cache",
875 - "size": 9261,
876 - "gzip": 3090
875 + "size": 9423,
876 + "gzip": 3152
877 },
878 {
879 "filename": "react-cache.production.min.js",
880 "bundleType": "UMD_PROD",
881 "packageName": "react-cache",
882 - "size": 2398,
883 - "gzip": 1215
882 + "size": 2405,
883 + "gzip": 1214
884 },
885 {
886 "filename": "jest-react.development.js",
887 "bundleType": "NODE_DEV",
888 "packageName": "jest-react",
889 - "size": 9286,
890 - "gzip": 3053
889 + "size": 7455,
890 + "gzip": 2737
891 },
892 {
893 "filename": "jest-react.production.min.js",
894 "bundleType": "NODE_PROD",
895 "packageName": "jest-react",
896 - "size": 3716,
897 - "gzip": 1655
896 + "size": 2930,
897 + "gzip": 1442
898 },
899 {
900 "filename": "JestReact-dev.js",
901 "bundleType": "FB_WWW_DEV",
902 "packageName": "jest-react",
903 - "size": 6125,
904 - "gzip": 1827
903 + "size": 4208,
904 + "gzip": 1490
905 },
906 {
907 "filename": "JestReact-prod.js",
908 "bundleType": "FB_WWW_PROD",
909 "packageName": "jest-react",
910 - "size": 5201,
911 - "gzip": 1623
910 + "size": 3592,
911 + "gzip": 1315
912 },
913 {
914 "filename": "react-debug-tools.development.js",
915 "bundleType": "NODE_DEV",
916 "packageName": "react-debug-tools",
917 - "size": 19024,
918 - "gzip": 5638
917 + "size": 19625,
918 + "gzip": 5835
919 },
920 {
921 "filename": "react-debug-tools.production.min.js",
922 "bundleType": "NODE_PROD",
923 "packageName": "react-debug-tools",
924 - "size": 5800,
925 - "gzip": 2343
924 + "size": 5929,
925 + "gzip": 2395
926 },
927 {
928 "filename": "eslint-plugin-react-hooks.development.js",
929 "bundleType": "NODE_DEV",
930 "packageName": "eslint-plugin-react-hooks",
931 - "size": 50458,
932 - "gzip": 11887
931 + "size": 75099,
932 + "gzip": 17223
933 },
934 {
935 "filename": "eslint-plugin-react-hooks.production.min.js",
936 "bundleType": "NODE_PROD",
937 "packageName": "eslint-plugin-react-hooks",
938 - "size": 12598,
939 - "gzip": 4566
938 + "size": 19731,
939 + "gzip": 6811
940 },
941 {
942 "filename": "ReactDOMFizzServer-dev.js",
943 "bundleType": "FB_WWW_DEV",
944 "packageName": "react-dom",
945 - "size": 3772,
946 - "gzip": 1432
945 + "size": 3796,
946 + "gzip": 1444
947 },
948 {
949 "filename": "ReactDOMFizzServer-prod.js",
@@ -956,141 +956,141 @@
956 "filename": "react-noop-renderer-server.development.js",
957 "bundleType": "NODE_DEV",
958 "packageName": "react-noop-renderer",
959 - "size": 1861,
960 - "gzip": 869
959 + "size": 1864,
960 + "gzip": 868
961 },
962 {
963 "filename": "react-noop-renderer-server.production.min.js",
964 "bundleType": "NODE_PROD",
965 "packageName": "react-noop-renderer",
966 - "size": 804,
967 - "gzip": 482
966 + "size": 807,
967 + "gzip": 480
968 },
969 {
970 "filename": "react-stream.development.js",
971 "bundleType": "NODE_DEV",
972 "packageName": "react-stream",
973 - "size": 4633,
974 - "gzip": 1683
973 + "size": 4674,
974 + "gzip": 1693
975 },
976 {
977 "filename": "react-stream.production.min.js",
978 "bundleType": "NODE_PROD",
979 "packageName": "react-stream",
980 - "size": 1224,
980 + "size": 1227,
981 "gzip": 655
982 },
983 {
984 "filename": "react-dom-unstable-fizz.browser.development.js",
985 "bundleType": "UMD_DEV",
986 "packageName": "react-dom",
987 - "size": 3704,
988 - "gzip": 1463
987 + "size": 3745,
988 + "gzip": 1476
989 },
990 {
991 "filename": "react-dom-unstable-fizz.browser.production.min.js",
992 "bundleType": "UMD_PROD",
993 "packageName": "react-dom",
994 - "size": 1227,
995 - "gzip": 697
994 + "size": 1230,
995 + "gzip": 694
996 },
997 {
998 "filename": "react-dom-unstable-fizz.browser.development.js",
999 "bundleType": "NODE_DEV",
1000 "packageName": "react-dom",
1001 - "size": 3528,
1002 - "gzip": 1416
1001 + "size": 3569,
1002 + "gzip": 1433
1003 },
1004 {
1005 "filename": "react-dom-unstable-fizz.browser.production.min.js",
1006 "bundleType": "NODE_PROD",
1007 "packageName": "react-dom",
1008 - "size": 1063,
1008 + "size": 1066,
1009 "gzip": 628
1010 },
1011 {
1012 "filename": "react-dom-unstable-fizz.node.development.js",
1013 "bundleType": "NODE_DEV",
1014 "packageName": "react-dom",
1015 - "size": 3780,
1016 - "gzip": 1443
1015 + "size": 3821,
1016 + "gzip": 1459
1017 },
1018 {
1019 "filename": "react-dom-unstable-fizz.node.production.min.js",
1020 "bundleType": "NODE_PROD",
1021 "packageName": "react-dom",
1022 - "size": 1122,
1022 + "size": 1125,
1023 "gzip": 659
1024 },
1025 {
1026 "filename": "ESLintPluginReactHooks-dev.js",
1027 "bundleType": "FB_WWW_DEV",
1028 "packageName": "eslint-plugin-react-hooks",
1029 - "size": 54073,
1030 - "gzip": 12239
1029 + "size": 80483,
1030 + "gzip": 17729
1031 },
1032 {
1033 "filename": "react-dom-unstable-fire.development.js",
1034 "bundleType": "UMD_DEV",
1035 "packageName": "react-dom",
1036 - "size": 792036,
1037 - "gzip": 180102
1036 + "size": 804147,
1037 + "gzip": 183253
1038 },
1039 {
1040 "filename": "react-dom-unstable-fire.production.min.js",
1041 "bundleType": "UMD_PROD",
1042 "packageName": "react-dom",
1043 - "size": 107823,
1044 - "gzip": 34713
1043 + "size": 107767,
1044 + "gzip": 34920
1045 },
1046 {
1047 "filename": "react-dom-unstable-fire.profiling.min.js",
1048 "bundleType": "UMD_PROFILING",
1049 "packageName": "react-dom",
1050 - "size": 110811,
1051 - "gzip": 35616
1050 + "size": 110844,
1051 + "gzip": 35630
1052 },
1053 {
1054 "filename": "react-dom-unstable-fire.development.js",
1055 "bundleType": "NODE_DEV",
1056 "packageName": "react-dom",
1057 - "size": 786540,
1058 - "gzip": 178557
1057 + "size": 798401,
1058 + "gzip": 181622
1059 },
1060 {
1061 "filename": "react-dom-unstable-fire.production.min.js",
1062 "bundleType": "NODE_PROD",
1063 "packageName": "react-dom",
1064 - "size": 108045,
1065 - "gzip": 34197
1064 + "size": 107747,
1065 + "gzip": 34441
1066 },
1067 {
1068 "filename": "react-dom-unstable-fire.profiling.min.js",
1069 "bundleType": "NODE_PROFILING",
1070 "packageName": "react-dom",
1071 - "size": 111192,
1072 - "gzip": 35033
1071 + "size": 110937,
1072 + "gzip": 35069
1073 },
1074 {
1075 "filename": "ReactFire-dev.js",
1076 "bundleType": "FB_WWW_DEV",
1077 "packageName": "react-dom",
1078 - "size": 808931,
1079 - "gzip": 179569
1078 + "size": 821109,
1079 + "gzip": 182607
1080 },
1081 {
1082 "filename": "ReactFire-prod.js",
1083 "bundleType": "FB_WWW_PROD",
1084 "packageName": "react-dom",
1085 - "size": 318110,
1086 - "gzip": 57721
1085 + "size": 321531,
1086 + "gzip": 58583
1087 },
1088 {
1089 "filename": "ReactFire-profiling.js",
1090 "bundleType": "FB_WWW_PROFILING",
1091 "packageName": "react-dom",
1092 - "size": 324881,
1093 - "gzip": 59172
1092 + "size": 327694,
1093 + "gzip": 59916
1094 },
1095 {
1096 "filename": "jest-mock-scheduler.development.js",
@@ -1124,15 +1124,15 @@
1124 "filename": "scheduler-unstable_mock.development.js",
1125 "bundleType": "NODE_DEV",
1126 "packageName": "scheduler",
1127 - "size": 17926,
1128 - "gzip": 4128
1127 + "size": 17929,
1128 + "gzip": 4125
1129 },
1130 {
1131 "filename": "scheduler-unstable_mock.production.min.js",
1132 "bundleType": "NODE_PROD",
1133 "packageName": "scheduler",
1134 - "size": 4173,
1135 - "gzip": 1606
1134 + "size": 4176,
1135 + "gzip": 1603
1136 },
1137 {
1138 "filename": "SchedulerMock-dev.js",