diff --git a/packages/react-native-renderer/fabric.js b/packages/react-native-renderer/fabric.js new file mode 100644 index 0000000000..b7b98eb2cd --- /dev/null +++ b/packages/react-native-renderer/fabric.js @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ + +'use strict'; + +const ReactFabric = require('./src/ReactFabric'); + +// TODO: decide on the top-level export form. +// This is hacky but makes it work with both Rollup and Jest. +module.exports = ReactFabric.default ? ReactFabric.default : ReactFabric; diff --git a/packages/react-native-renderer/src/ReactFabric.js b/packages/react-native-renderer/src/ReactFabric.js new file mode 100644 index 0000000000..7d0ebc03f2 --- /dev/null +++ b/packages/react-native-renderer/src/ReactFabric.js @@ -0,0 +1,130 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ + +import type {ReactNativeType} from './ReactNativeTypes'; +import type {ReactNodeList} from 'shared/ReactTypes'; + +import './ReactNativeInjection'; + +import * as ReactPortal from 'shared/ReactPortal'; +import * as ReactGenericBatching from 'events/ReactGenericBatching'; +import TouchHistoryMath from 'events/TouchHistoryMath'; +import * as ReactGlobalSharedState from 'shared/ReactGlobalSharedState'; +import ReactVersion from 'shared/ReactVersion'; + +import NativeMethodsMixin from './NativeMethodsMixin'; +import ReactNativeBridgeEventPlugin from './ReactNativeBridgeEventPlugin'; +import ReactNativeComponent from './ReactNativeComponent'; +import * as ReactNativeComponentTree from './ReactNativeComponentTree'; +import ReactFabricRenderer from './ReactFabricRenderer'; +import ReactNativePropRegistry from './ReactNativePropRegistry'; +import {getInspectorDataForViewTag} from './ReactNativeFiberInspector'; +import createReactNativeComponentClass from './createReactNativeComponentClass'; +import {injectFindHostInstanceFabric} from './findNodeHandle'; +import findNumericNodeHandle from './findNumericNodeHandle'; +import takeSnapshot from './takeSnapshot'; + +injectFindHostInstanceFabric(ReactFabricRenderer.findHostInstance); + +ReactGenericBatching.injection.injectFiberBatchedUpdates( + ReactFabricRenderer.batchedUpdates, +); + +const roots = new Map(); + +const ReactFabric: ReactNativeType = { + NativeComponent: ReactNativeComponent, + + findNodeHandle: findNumericNodeHandle, + + render(element: React$Element, containerTag: any, callback: ?Function) { + let root = roots.get(containerTag); + + if (!root) { + // TODO (bvaughn): If we decide to keep the wrapper component, + // We could create a wrapper for containerTag as well to reduce special casing. + root = ReactFabricRenderer.createContainer(containerTag, false, false); + roots.set(containerTag, root); + } + ReactFabricRenderer.updateContainer(element, root, null, callback); + + return ReactFabricRenderer.getPublicRootInstance(root); + }, + + unmountComponentAtNode(containerTag: number) { + const root = roots.get(containerTag); + if (root) { + // TODO: Is it safe to reset this now or should I wait since this unmount could be deferred? + ReactFabricRenderer.updateContainer(null, root, null, () => { + roots.delete(containerTag); + }); + } + }, + + unmountComponentAtNodeAndRemoveContainer(containerTag: number) { + ReactFabric.unmountComponentAtNode(containerTag); + }, + + createPortal( + children: ReactNodeList, + containerTag: number, + key: ?string = null, + ) { + return ReactPortal.createPortal(children, containerTag, null, key); + }, + + unstable_batchedUpdates: ReactGenericBatching.batchedUpdates, + + flushSync: ReactFabricRenderer.flushSync, + + __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: { + // Used as a mixin in many createClass-based components + NativeMethodsMixin, + // Used by react-native-github/Libraries/ components + ReactNativeBridgeEventPlugin, // requireNativeComponent + ReactGlobalSharedState, // Systrace + ReactNativeComponentTree, // InspectorUtils, ScrollResponder + ReactNativePropRegistry, // flattenStyle, Stylesheet + TouchHistoryMath, // PanResponder + createReactNativeComponentClass, // RCTText, RCTView, ReactNativeART + takeSnapshot, // react-native-implementation + }, +}; + +if (__DEV__) { + // $FlowFixMe + Object.assign( + ReactFabric.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, + { + // TODO: none of these work since Fiber. Remove these dependencies. + // Used by RCTRenderingPerf, Systrace: + ReactDebugTool: { + addHook() {}, + removeHook() {}, + }, + // Used by ReactPerfStallHandler, RCTRenderingPerf: + ReactPerf: { + start() {}, + stop() {}, + printInclusive() {}, + printWasted() {}, + }, + }, + ); +} + +ReactFabricRenderer.injectIntoDevTools({ + findFiberByHostInstance: ReactNativeComponentTree.getClosestInstanceFromNode, + getInspectorDataForViewTag: getInspectorDataForViewTag, + bundleType: __DEV__ ? 1 : 0, + version: ReactVersion, + rendererPackageName: 'react-native-renderer', +}); + +export default ReactFabric; diff --git a/packages/react-native-renderer/src/ReactFabricRenderer.js b/packages/react-native-renderer/src/ReactFabricRenderer.js new file mode 100644 index 0000000000..7cfc742dfd --- /dev/null +++ b/packages/react-native-renderer/src/ReactFabricRenderer.js @@ -0,0 +1,321 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ + +import type { + MeasureInWindowOnSuccessCallback, + MeasureLayoutOnSuccessCallback, + MeasureOnSuccessCallback, + NativeMethodsMixinType, + ReactNativeBaseComponentViewConfig, +} from './ReactNativeTypes'; + +import {mountSafeCallback, warnForStyleProps} from './NativeMethodsMixinUtils'; +import * as ReactGenericBatching from 'events/ReactGenericBatching'; +import * as ReactNativeAttributePayload from './ReactNativeAttributePayload'; +import * as ReactNativeFrameScheduling from './ReactNativeFrameScheduling'; +import * as ReactNativeViewConfigRegistry from './ReactNativeViewConfigRegistry'; +import ReactFiberReconciler from 'react-reconciler'; +import ReactNativeTagHandles from './ReactNativeTagHandles'; + +import deepFreezeAndThrowOnMutationInDev from 'deepFreezeAndThrowOnMutationInDev'; +import emptyObject from 'fbjs/lib/emptyObject'; + +// Modules provided by RN: +import TextInputState from 'TextInputState'; +import FabricUIManager from 'FabricUIManager'; +import UIManager from 'UIManager'; + +/** + * This is used for refs on host components. + */ +class ReactFabricHostComponent { + _nativeTag: number; + viewConfig: ReactNativeBaseComponentViewConfig; + currentProps: Props; + + constructor( + tag: number, + viewConfig: ReactNativeBaseComponentViewConfig, + props: Props, + ) { + this._nativeTag = tag; + this.viewConfig = viewConfig; + this.currentProps = props; + } + + blur() { + TextInputState.blurTextInput(this._nativeTag); + } + + focus() { + TextInputState.focusTextInput(this._nativeTag); + } + + measure(callback: MeasureOnSuccessCallback) { + UIManager.measure(this._nativeTag, mountSafeCallback(this, callback)); + } + + measureInWindow(callback: MeasureInWindowOnSuccessCallback) { + UIManager.measureInWindow( + this._nativeTag, + mountSafeCallback(this, callback), + ); + } + + measureLayout( + relativeToNativeNode: number, + onSuccess: MeasureLayoutOnSuccessCallback, + onFail: () => void /* currently unused */, + ) { + UIManager.measureLayout( + this._nativeTag, + relativeToNativeNode, + mountSafeCallback(this, onFail), + mountSafeCallback(this, onSuccess), + ); + } + + setNativeProps(nativeProps: Object) { + if (__DEV__) { + warnForStyleProps(nativeProps, this.viewConfig.validAttributes); + } + + const updatePayload = ReactNativeAttributePayload.create( + nativeProps, + this.viewConfig.validAttributes, + ); + + // Avoid the overhead of bridge calls if there's no update. + // This is an expensive no-op for Android, and causes an unnecessary + // view invalidation for certain components (eg RCTTextInput) on iOS. + if (updatePayload != null) { + UIManager.updateView( + this._nativeTag, + this.viewConfig.uiViewClassName, + updatePayload, + ); + } + } +} + +// eslint-disable-next-line no-unused-expressions +(ReactFabricHostComponent.prototype: NativeMethodsMixinType); + +type Node = Object; +type ChildSet = Object; +type Container = number; +type Instance = { + node: Node, + canonical: ReactFabricHostComponent, +}; +type Props = Object; +type TextInstance = { + node: Node, +}; + +const ReactFabricRenderer = ReactFiberReconciler({ + appendInitialChild( + parentInstance: Instance, + child: Instance | TextInstance, + ): void { + FabricUIManager.appendChild(parentInstance.node, child.node); + }, + + createInstance( + type: string, + props: Props, + rootContainerInstance: Container, + hostContext: {}, + internalInstanceHandle: Object, + ): Instance { + const tag = ReactNativeTagHandles.allocateTag(); + const viewConfig = ReactNativeViewConfigRegistry.get(type); + + if (__DEV__) { + for (const key in viewConfig.validAttributes) { + if (props.hasOwnProperty(key)) { + deepFreezeAndThrowOnMutationInDev(props[key]); + } + } + } + + const updatePayload = ReactNativeAttributePayload.create( + props, + viewConfig.validAttributes, + ); + + const node = FabricUIManager.createNode( + tag, // reactTag + viewConfig.uiViewClassName, // viewName + rootContainerInstance, // rootTag + updatePayload, // props + internalInstanceHandle, // internalInstanceHandle + ); + + const component = new ReactFabricHostComponent(tag, viewConfig, props); + + return { + node: node, + canonical: component, + }; + }, + + createTextInstance( + text: string, + rootContainerInstance: Container, + hostContext: {}, + internalInstanceHandle: Object, + ): TextInstance { + const tag = ReactNativeTagHandles.allocateTag(); + + const node = FabricUIManager.createNode( + tag, // reactTag + 'RCTRawText', // viewName + rootContainerInstance, // rootTag + {text: text}, // props + internalInstanceHandle, // instance handle + ); + + return { + node: node, + }; + }, + + finalizeInitialChildren( + parentInstance: Instance, + type: string, + props: Props, + rootContainerInstance: Container, + ): boolean { + return false; + }, + + getRootHostContext(): {} { + return emptyObject; + }, + + getChildHostContext(): {} { + return emptyObject; + }, + + getPublicInstance(instance) { + return instance.canonical; + }, + + now: ReactNativeFrameScheduling.now, + + prepareForCommit(): void { + // Noop + }, + + prepareUpdate( + instance: Instance, + type: string, + oldProps: Props, + newProps: Props, + rootContainerInstance: Container, + hostContext: {}, + ): null | Object { + const viewConfig = instance.canonical.viewConfig; + const updatePayload = ReactNativeAttributePayload.diff( + oldProps, + newProps, + viewConfig.validAttributes, + ); + // TODO: If the event handlers have changed, we need to update the current props + // in the commit phase but there is no host config hook to do it yet. + return updatePayload; + }, + + resetAfterCommit(): void { + // Noop + }, + + scheduleDeferredCallback: ReactNativeFrameScheduling.scheduleDeferredCallback, + cancelDeferredCallback: ReactNativeFrameScheduling.cancelDeferredCallback, + + shouldDeprioritizeSubtree(type: string, props: Props): boolean { + return false; + }, + + shouldSetTextContent(type: string, props: Props): boolean { + // TODO (bvaughn) Revisit this decision. + // Always returning false simplifies the createInstance() implementation, + // But creates an additional child Fiber for raw text children. + // No additional native views are created though. + // It's not clear to me which is better so I'm deferring for now. + // More context @ github.com/facebook/react/pull/8560#discussion_r92111303 + return false; + }, + + persistence: { + cloneInstance( + instance: Instance, + updatePayload: null | Object, + type: string, + oldProps: Props, + newProps: Props, + internalInstanceHandle: Object, + keepChildren: boolean, + recyclableInstance: null | Instance, + ): Instance { + const node = instance.node; + let clone; + if (keepChildren) { + if (updatePayload !== null) { + clone = FabricUIManager.cloneNodeWithNewProps(node, updatePayload); + } else { + clone = FabricUIManager.cloneNode(node); + } + } else { + if (updatePayload !== null) { + clone = FabricUIManager.cloneNodeWithNewChildrenAndProps( + node, + updatePayload, + ); + } else { + clone = FabricUIManager.cloneNodeWithNewChildren(node); + } + } + return { + node: clone, + canonical: instance.canonical, + }; + }, + + createContainerChildSet(container: Container): ChildSet { + return FabricUIManager.createChildSet(container); + }, + + appendChildToContainerChildSet( + childSet: ChildSet, + child: Instance | TextInstance, + ): void { + FabricUIManager.appendChildToSet(childSet, child.node); + }, + + finalizeContainerChildren( + container: Container, + newChildren: ChildSet, + ): void { + FabricUIManager.completeRoot(container, newChildren); + }, + + replaceContainerChildren( + container: Container, + newChildren: ChildSet, + ): void {}, + }, +}); + +ReactGenericBatching.injection.injectFiberBatchedUpdates( + ReactFabricRenderer.batchedUpdates, +); + +export default ReactFabricRenderer; diff --git a/packages/react-native-renderer/src/ReactNativeAttributePayload.js b/packages/react-native-renderer/src/ReactNativeAttributePayload.js index 96c50b485b..fda0bd7962 100644 --- a/packages/react-native-renderer/src/ReactNativeAttributePayload.js +++ b/packages/react-native-renderer/src/ReactNativeAttributePayload.js @@ -119,11 +119,11 @@ function restoreDeletedValuesInNestedArray( } function diffNestedArrayProperty( - updatePayload: ?Object, + updatePayload: null | Object, prevArray: Array, nextArray: Array, validAttributes: AttributeConfiguration, -): ?Object { +): null | Object { const minLength = prevArray.length < nextArray.length ? prevArray.length : nextArray.length; let i; @@ -157,11 +157,11 @@ function diffNestedArrayProperty( } function diffNestedProperty( - updatePayload: ?Object, + updatePayload: null | Object, prevProp: NestedNode, nextProp: NestedNode, validAttributes: AttributeConfiguration, -): ?Object { +): null | Object { if (!updatePayload && prevProp === nextProp) { // If no properties have been added, then we can bail out quickly on object // equality. @@ -224,7 +224,7 @@ function diffNestedProperty( * updatePayload. */ function addNestedProperty( - updatePayload: ?Object, + updatePayload: null | Object, nextProp: NestedNode, validAttributes: AttributeConfiguration, ) { @@ -258,10 +258,10 @@ function addNestedProperty( * adds a null sentinel to the updatePayload, for each prop key. */ function clearNestedProperty( - updatePayload: ?Object, + updatePayload: null | Object, prevProp: NestedNode, validAttributes: AttributeConfiguration, -): ?Object { +): null | Object { if (!prevProp) { return updatePayload; } @@ -293,11 +293,11 @@ function clearNestedProperty( * anything changed. */ function diffProperties( - updatePayload: ?Object, + updatePayload: null | Object, prevProps: Object, nextProps: Object, validAttributes: AttributeConfiguration, -): ?Object { +): null | Object { let attributeConfig: ?(CustomAttributeConfiguration | AttributeConfiguration); let nextProp; let prevProp; @@ -465,10 +465,10 @@ function diffProperties( * addProperties adds all the valid props to the payload after being processed. */ function addProperties( - updatePayload: ?Object, + updatePayload: null | Object, props: Object, validAttributes: AttributeConfiguration, -): ?Object { +): null | Object { // TODO: Fast path return diffProperties(updatePayload, emptyObject, props, validAttributes); } @@ -478,10 +478,10 @@ function addProperties( * to the payload for each valid key. */ function clearProperties( - updatePayload: ?Object, + updatePayload: null | Object, prevProps: Object, validAttributes: AttributeConfiguration, -): ?Object { +): null | Object { // TODO: Fast path return diffProperties(updatePayload, prevProps, emptyObject, validAttributes); } @@ -489,7 +489,7 @@ function clearProperties( export function create( props: Object, validAttributes: AttributeConfiguration, -): ?Object { +): null | Object { return addProperties( null, // updatePayload props, @@ -501,7 +501,7 @@ export function diff( prevProps: Object, nextProps: Object, validAttributes: AttributeConfiguration, -): ?Object { +): null | Object { return diffProperties( null, // updatePayload prevProps, diff --git a/packages/react-native-renderer/src/ReactNativeComponent.js b/packages/react-native-renderer/src/ReactNativeComponent.js index 74e6eb7a0d..c6bbb136d0 100644 --- a/packages/react-native-renderer/src/ReactNativeComponent.js +++ b/packages/react-native-renderer/src/ReactNativeComponent.js @@ -149,7 +149,7 @@ class ReactNativeComponent extends React.Component< } const viewConfig: ReactNativeBaseComponentViewConfig = - maybeInstance.viewConfig; + maybeInstance.viewConfig || maybeInstance.canonical.viewConfig; const updatePayload = ReactNativeAttributePayload.create( nativeProps, diff --git a/packages/react-native-renderer/src/ReactNativeComponentTree.js b/packages/react-native-renderer/src/ReactNativeComponentTree.js index 9645b79eed..6123dc1928 100644 --- a/packages/react-native-renderer/src/ReactNativeComponentTree.js +++ b/packages/react-native-renderer/src/ReactNativeComponentTree.js @@ -20,11 +20,19 @@ export function uncacheFiberNode(tag) { } function getInstanceFromTag(tag) { - return instanceCache[tag] || null; + if (typeof tag === 'number') { + return instanceCache[tag] || null; + } else { + // Fabric will invoke event emitters on a direct fiber reference + return tag; + } } function getTagFromInstance(inst) { - const tag = inst.stateNode._nativeTag; + let tag = inst.stateNode._nativeTag; + if (tag === undefined) { + tag = inst.stateNode.canonical._nativeTag; + } invariant(tag, 'All native instances should have a tag.'); return tag; } diff --git a/packages/react-native-renderer/src/ReactNativeFiberRenderer.js b/packages/react-native-renderer/src/ReactNativeFiberRenderer.js index e95afba8de..956336c47b 100644 --- a/packages/react-native-renderer/src/ReactNativeFiberRenderer.js +++ b/packages/react-native-renderer/src/ReactNativeFiberRenderer.js @@ -27,14 +27,14 @@ import ReactNativeFiberHostComponent from './ReactNativeFiberHostComponent'; import * as ReactNativeFrameScheduling from './ReactNativeFrameScheduling'; import ReactNativeTagHandles from './ReactNativeTagHandles'; -export type Container = number; +type Container = number; export type Instance = { _children: Array, _nativeTag: number, viewConfig: ReactNativeBaseComponentViewConfig, }; -export type Props = Object; -export type TextInstance = number; +type Props = Object; +type TextInstance = number; function recursivelyUncacheFiberNode(node: Instance | TextInstance) { if (typeof node === 'number') { diff --git a/packages/react-native-renderer/src/ReactNativeGlobalResponderHandler.js b/packages/react-native-renderer/src/ReactNativeGlobalResponderHandler.js index 94619443e3..7e00943376 100644 --- a/packages/react-native-renderer/src/ReactNativeGlobalResponderHandler.js +++ b/packages/react-native-renderer/src/ReactNativeGlobalResponderHandler.js @@ -3,13 +3,15 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. + * + * @flow */ // Module provided by RN: import UIManager from 'UIManager'; const ReactNativeGlobalResponderHandler = { - onChange: function(from, to, blockNativeResponder) { + onChange: function(from: any, to: any, blockNativeResponder: boolean) { if (to !== null) { const tag = to.stateNode._nativeTag; UIManager.setJSResponder(tag, blockNativeResponder); diff --git a/packages/react-native-renderer/src/ReactNativeRenderer.js b/packages/react-native-renderer/src/ReactNativeRenderer.js index 483a049c2c..451c8a58be 100644 --- a/packages/react-native-renderer/src/ReactNativeRenderer.js +++ b/packages/react-native-renderer/src/ReactNativeRenderer.js @@ -28,9 +28,12 @@ import ReactNativeFiberRenderer from './ReactNativeFiberRenderer'; import ReactNativePropRegistry from './ReactNativePropRegistry'; import {getInspectorDataForViewTag} from './ReactNativeFiberInspector'; import createReactNativeComponentClass from './createReactNativeComponentClass'; +import {injectFindHostInstance} from './findNodeHandle'; import findNumericNodeHandle from './findNumericNodeHandle'; import takeSnapshot from './takeSnapshot'; +injectFindHostInstance(ReactNativeFiberRenderer.findHostInstance); + ReactGenericBatching.injection.injectFiberBatchedUpdates( ReactNativeFiberRenderer.batchedUpdates, ); diff --git a/packages/react-native-renderer/src/__mocks__/FabricUIManager.js b/packages/react-native-renderer/src/__mocks__/FabricUIManager.js new file mode 100644 index 0000000000..f4765c95ea --- /dev/null +++ b/packages/react-native-renderer/src/__mocks__/FabricUIManager.js @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +// Mock of the Native Hooks + +const invariant = require('fbjs/lib/invariant'); + +const roots = new Map(); +const allocatedTags = new Set(); + +const RCTFabricUIManager = { + __dumpHierarchyForJestTestsOnly: function() { + function dumpSubtree(info, indent) { + let out = ''; + out += + ' '.repeat(indent) + info.viewName + ' ' + JSON.stringify(info.props); + for (const child of info.children) { + out += '\n' + dumpSubtree(child, indent + 2); + } + return out; + } + let result = []; + for (const [rootTag, childSet] of roots) { + result.push(rootTag); + for (const child of childSet) { + result.push(dumpSubtree(child, 1)); + } + } + return result.join('\n'); + }, + createNode: jest.fn(function createNode( + reactTag, + viewName, + rootTag, + props, + instanceHandle, + ) { + invariant( + !allocatedTags.has(reactTag), + 'Created two native views with tag %s', + reactTag, + ); + allocatedTags.add(reactTag); + return { + reactTag: reactTag, + viewName: viewName, + props: props, + children: [], + }; + }), + cloneNode: jest.fn(function cloneNode(node) { + return { + reactTag: node.reactTag, + viewName: node.viewName, + props: node.props, + children: node.children, + }; + }), + cloneNodeWithNewChildren: jest.fn(function cloneNodeWithNewChildren(node) { + return { + reactTag: node.reactTag, + viewName: node.viewName, + props: node.props, + children: [], + }; + }), + cloneNodeWithNewProps: jest.fn(function cloneNodeWithNewProps( + node, + newProps, + ) { + return { + reactTag: node.reactTag, + viewName: node.viewName, + props: newProps, + children: node.children, + }; + }), + cloneNodeWithNewChildrenAndProps: jest.fn( + function cloneNodeWithNewChildrenAndProps(node, newProps) { + return { + reactTag: node.reactTag, + viewName: node.viewName, + props: newProps, + children: [], + }; + }, + ), + appendChild: jest.fn(function appendChild(parentNode, childNode) { + parentNode.children.push(childNode); + }), + + createChildSet: jest.fn(function createChildSet() { + return []; + }), + + appendChildToSet: jest.fn(function appendChildToSet(childSet, childNode) { + childSet.push(childNode); + }), + + completeRoot: jest.fn(function completeRoot(rootTag, newChildSet) { + roots.set(rootTag, newChildSet); + }), +}; + +module.exports = RCTFabricUIManager; diff --git a/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js b/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js new file mode 100644 index 0000000000..8249904b5c --- /dev/null +++ b/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js @@ -0,0 +1,208 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @emails react-core + * @jest-environment node + */ + +'use strict'; + +let React; +let ReactFabric; +let createReactNativeComponentClass; +let UIManager; +let FabricUIManager; + +jest.mock('shared/ReactFeatureFlags', () => + require('shared/forks/ReactFeatureFlags.native-fabric'), +); + +describe('ReactFabric', () => { + beforeEach(() => { + jest.resetModules(); + + React = require('react'); + ReactFabric = require('react-native-renderer/fabric'); + FabricUIManager = require('FabricUIManager'); + UIManager = require('UIManager'); + createReactNativeComponentClass = require('../createReactNativeComponentClass') + .default; + }); + + it('should be able to create and render a native component', () => { + const View = createReactNativeComponentClass('View', () => ({ + validAttributes: {foo: true}, + uiViewClassName: 'View', + })); + + ReactFabric.render(, 1); + expect(FabricUIManager.createNode).toBeCalled(); + expect(FabricUIManager.appendChild).not.toBeCalled(); + expect(FabricUIManager.completeRoot).toBeCalled(); + }); + + it('should be able to create and update a native component', () => { + const View = createReactNativeComponentClass('View', () => ({ + validAttributes: {foo: true}, + uiViewClassName: 'View', + })); + + const firstNode = {}; + + FabricUIManager.createNode.mockReturnValue(firstNode); + + ReactFabric.render(, 11); + + expect(FabricUIManager.createNode.mock.calls.length).toBe(1); + + ReactFabric.render(, 11); + + expect(FabricUIManager.createNode.mock.calls.length).toBe(1); + expect(FabricUIManager.cloneNodeWithNewProps).toBeCalledWith(firstNode, { + foo: 'bar', + }); + }); + + it('should not call FabricUIManager.cloneNode after render for properties that have not changed', () => { + const Text = createReactNativeComponentClass('Text', () => ({ + validAttributes: {foo: true}, + uiViewClassName: 'Text', + })); + + ReactFabric.render(1, 11); + expect(FabricUIManager.cloneNode).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewChildren).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewProps).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewChildrenAndProps).not.toBeCalled(); + + // If no properties have changed, we shouldn't call cloneNode. + ReactFabric.render(1, 11); + expect(FabricUIManager.cloneNode).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewChildren).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewProps).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewChildrenAndProps).not.toBeCalled(); + + // Only call cloneNode for the changed property (and not for text). + ReactFabric.render(1, 11); + expect(FabricUIManager.cloneNode).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewChildren).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewProps.mock.calls.length).toBe(1); + expect(FabricUIManager.cloneNodeWithNewChildrenAndProps).not.toBeCalled(); + + // Only call cloneNode for the changed text (and no other properties). + ReactFabric.render(2, 11); + expect(FabricUIManager.cloneNode).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewChildren.mock.calls.length).toBe(1); + expect(FabricUIManager.cloneNodeWithNewProps.mock.calls.length).toBe(1); + expect(FabricUIManager.cloneNodeWithNewChildrenAndProps).not.toBeCalled(); + + // Call cloneNode for both changed text and properties. + ReactFabric.render(3, 11); + expect(FabricUIManager.cloneNode).not.toBeCalled(); + expect(FabricUIManager.cloneNodeWithNewChildren.mock.calls.length).toBe(1); + expect(FabricUIManager.cloneNodeWithNewProps.mock.calls.length).toBe(1); + expect( + FabricUIManager.cloneNodeWithNewChildrenAndProps.mock.calls.length, + ).toBe(1); + }); + + it('should not call UIManager.updateView from setNativeProps for properties that have not changed', () => { + const View = createReactNativeComponentClass('View', () => ({ + validAttributes: {foo: true}, + uiViewClassName: 'View', + })); + + class Subclass extends ReactFabric.NativeComponent { + render() { + return ; + } + } + + [View, Subclass].forEach(Component => { + UIManager.updateView.mockReset(); + + let viewRef; + ReactFabric.render( + { + viewRef = ref; + }} + />, + 11, + ); + expect(UIManager.updateView).not.toBeCalled(); + + viewRef.setNativeProps({}); + expect(UIManager.updateView).not.toBeCalled(); + + viewRef.setNativeProps({foo: 'baz'}); + expect(UIManager.updateView.mock.calls.length).toBe(1); + }); + }); + + it('returns the correct instance and calls it in the callback', () => { + const View = createReactNativeComponentClass('View', () => ({ + validAttributes: {foo: true}, + uiViewClassName: 'View', + })); + + let a; + let b; + const c = ReactFabric.render( + (a = v)} />, + 11, + function() { + b = this; + }, + ); + + expect(a).toBeTruthy(); + expect(a).toBe(b); + expect(a).toBe(c); + }); + + it('renders and reorders children', () => { + const View = createReactNativeComponentClass('View', () => ({ + validAttributes: {title: true}, + uiViewClassName: 'View', + })); + + class Component extends React.Component { + render() { + const chars = this.props.chars.split(''); + return ( + {chars.map(text => )} + ); + } + } + + // Mini multi-child stress test: lots of reorders, some adds, some removes. + const before = 'abcdefghijklmnopqrst'; + const after = 'mxhpgwfralkeoivcstzy'; + + ReactFabric.render(, 11); + expect(FabricUIManager.__dumpHierarchyForJestTestsOnly()).toMatchSnapshot(); + + ReactFabric.render(, 11); + expect(FabricUIManager.__dumpHierarchyForJestTestsOnly()).toMatchSnapshot(); + }); + + it('calls setState with no arguments', () => { + let mockArgs; + class Component extends React.Component { + componentDidMount() { + this.setState({}, (...args) => (mockArgs = args)); + } + render() { + return false; + } + } + + ReactFabric.render(, 11); + expect(mockArgs.length).toEqual(0); + }); +}); diff --git a/packages/react-native-renderer/src/__tests__/__snapshots__/ReactFabric-test.internal.js.snap b/packages/react-native-renderer/src/__tests__/__snapshots__/ReactFabric-test.internal.js.snap new file mode 100644 index 0000000000..829b12c03a --- /dev/null +++ b/packages/react-native-renderer/src/__tests__/__snapshots__/ReactFabric-test.internal.js.snap @@ -0,0 +1,51 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ReactFabric renders and reorders children 1`] = ` +"11 + View null + View {\\"title\\":\\"a\\"} + View {\\"title\\":\\"b\\"} + View {\\"title\\":\\"c\\"} + View {\\"title\\":\\"d\\"} + View {\\"title\\":\\"e\\"} + View {\\"title\\":\\"f\\"} + View {\\"title\\":\\"g\\"} + View {\\"title\\":\\"h\\"} + View {\\"title\\":\\"i\\"} + View {\\"title\\":\\"j\\"} + View {\\"title\\":\\"k\\"} + View {\\"title\\":\\"l\\"} + View {\\"title\\":\\"m\\"} + View {\\"title\\":\\"n\\"} + View {\\"title\\":\\"o\\"} + View {\\"title\\":\\"p\\"} + View {\\"title\\":\\"q\\"} + View {\\"title\\":\\"r\\"} + View {\\"title\\":\\"s\\"} + View {\\"title\\":\\"t\\"}" +`; + +exports[`ReactFabric renders and reorders children 2`] = ` +"11 + View null + View {\\"title\\":\\"m\\"} + View {\\"title\\":\\"x\\"} + View {\\"title\\":\\"h\\"} + View {\\"title\\":\\"p\\"} + View {\\"title\\":\\"g\\"} + View {\\"title\\":\\"w\\"} + View {\\"title\\":\\"f\\"} + View {\\"title\\":\\"r\\"} + View {\\"title\\":\\"a\\"} + View {\\"title\\":\\"l\\"} + View {\\"title\\":\\"k\\"} + View {\\"title\\":\\"e\\"} + View {\\"title\\":\\"o\\"} + View {\\"title\\":\\"i\\"} + View {\\"title\\":\\"v\\"} + View {\\"title\\":\\"c\\"} + View {\\"title\\":\\"s\\"} + View {\\"title\\":\\"t\\"} + View {\\"title\\":\\"z\\"} + View {\\"title\\":\\"y\\"}" +`; diff --git a/packages/react-native-renderer/src/findNodeHandle.js b/packages/react-native-renderer/src/findNodeHandle.js index 56bcb1e680..bbadecb2a7 100644 --- a/packages/react-native-renderer/src/findNodeHandle.js +++ b/packages/react-native-renderer/src/findNodeHandle.js @@ -15,7 +15,24 @@ import getComponentName from 'shared/getComponentName'; import invariant from 'fbjs/lib/invariant'; import warning from 'fbjs/lib/warning'; -import ReactNativeFiberRenderer from './ReactNativeFiberRenderer'; +// TODO: Share this module between Fabric and React Native renderers +// so that both can be used in the same tree. + +let findHostInstance = function(fiber: Fiber): any { + return null; +}; + +let findHostInstanceFabric = function(fiber: Fiber): any { + return null; +}; + +export function injectFindHostInstance(impl: (fiber: Fiber) => any) { + findHostInstance = impl; +} + +export function injectFindHostInstanceFabric(impl: (fiber: Fiber) => any) { + findHostInstanceFabric = impl; +} /** * ReactNative vs ReactWeb @@ -81,7 +98,10 @@ function findNodeHandle(componentOrHandle: any): any { // ReactInstanceMap.get here will always succeed for mounted components const internalInstance: Fiber = ReactInstanceMap.get(component); if (internalInstance) { - return ReactNativeFiberRenderer.findHostInstance(internalInstance); + return ( + findHostInstance(internalInstance) || + findHostInstanceFabric(internalInstance) + ); } else { if (component) { return component; diff --git a/packages/react-reconciler/src/ReactFiberCommitWork.js b/packages/react-reconciler/src/ReactFiberCommitWork.js index cce749eb94..cf6d598f7e 100644 --- a/packages/react-reconciler/src/ReactFiberCommitWork.js +++ b/packages/react-reconciler/src/ReactFiberCommitWork.js @@ -123,8 +123,17 @@ export default function( case HostRoot: { const updateQueue = finishedWork.updateQueue; if (updateQueue !== null) { - const instance = - finishedWork.child !== null ? finishedWork.child.stateNode : null; + let instance = null; + if (finishedWork.child !== null) { + switch (finishedWork.child.tag) { + case HostComponent: + instance = getPublicInstance(finishedWork.child.stateNode); + break; + case ClassComponent: + instance = finishedWork.child.stateNode; + break; + } + } commitCallbacks(updateQueue, instance); } return; diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index 391581e4da..a84b176d38 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -18,7 +18,7 @@ export const enableUserTimingAPI = __DEV__; export const enableMutatingReconciler = true; // Experimental noop mode (currently unused): export const enableNoopReconciler = false; -// Experimental persistent mode (CS): +// Experimental persistent mode (Fabric): export const enablePersistentReconciler = false; // Helps identify side effects in begin-phase lifecycle hooks and setState reducers: diff --git a/packages/shared/forks/ReactFeatureFlags.native-cs.js b/packages/shared/forks/ReactFeatureFlags.native-fabric.js similarity index 84% rename from packages/shared/forks/ReactFeatureFlags.native-cs.js rename to packages/shared/forks/ReactFeatureFlags.native-fabric.js index 7a70a2deb7..21222cbf40 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-cs.js +++ b/packages/shared/forks/ReactFeatureFlags.native-fabric.js @@ -10,7 +10,7 @@ import invariant from 'fbjs/lib/invariant'; import typeof * as FeatureFlagsType from 'shared/ReactFeatureFlags'; -import typeof * as CSFeatureFlagsType from './ReactFeatureFlags.native-cs'; +import typeof * as FabricFeatureFlagsType from './ReactFeatureFlags.native-fabric'; export const debugRenderPhaseSideEffects = false; export const enableAsyncSubtreeAPI = true; @@ -18,7 +18,7 @@ export const enableCreateRoot = false; export const enableUserTimingAPI = __DEV__; export const warnAboutDeprecatedLifecycles = false; -// React Native CS uses persistent reconciler. +// React Fabric uses persistent reconciler. export const enableMutatingReconciler = false; export const enableNoopReconciler = false; export const enablePersistentReconciler = true; @@ -32,4 +32,4 @@ export function addUserTimingListener() { // eslint-disable-next-line no-unused-vars type Check<_X, Y: _X, X: Y = _X> = null; // eslint-disable-next-line no-unused-expressions -(null: Check); +(null: Check); diff --git a/scripts/flow/react-native-host-hooks.js b/scripts/flow/react-native-host-hooks.js index 42bad64d53..a6fe506c4a 100644 --- a/scripts/flow/react-native-host-hooks.js +++ b/scripts/flow/react-native-host-hooks.js @@ -81,7 +81,38 @@ declare module 'UIManager' { quality?: number, }, ): Promise; + declare function setJSResponder( + reactTag: number, + blockNativeResponder: boolean, + ): void; + declare function clearJSResponder(): void; } + +declare module 'FabricUIManager' { + declare function createNode( + reactTag: number, + viewName: string, + rootTag: number, + props: ?Object, + instanceHandle: Object, + ): Object; + declare function cloneNode(node: Object): Object; + declare function cloneNodeWithNewChildren(node: Object): Object; + declare function cloneNodeWithNewProps( + node: Object, + newProps: ?Object, + ): Object; + declare function cloneNodeWithNewChildrenAndProps( + node: Object, + newProps: ?Object, + ): Object; + declare function appendChild(node: Object, childNode: Object): void; + + declare function createChildSet(rootTag: number): Object; + declare function appendChildToSet(childSet: Object, childNode: Object): void; + declare function completeRoot(rootTag: number, childSet: Object): void; +} + declare module 'View' { declare module.exports: typeof React$Component; } diff --git a/scripts/rollup/bundles.js b/scripts/rollup/bundles.js index d57d52e2c7..d44619e24f 100644 --- a/scripts/rollup/bundles.js +++ b/scripts/rollup/bundles.js @@ -131,6 +131,28 @@ const bundles = [ ], }, + /******* React Native Fabric *******/ + { + label: 'native-fabric', + bundleTypes: [RN_DEV, RN_PROD], + moduleType: RENDERER, + entry: 'react-native-renderer/fabric', + global: 'ReactFabric', + externals: [ + 'ExceptionsManager', + 'InitializeCore', + 'Platform', + 'RCTEventEmitter', + 'TextInputState', + 'UIManager', + 'FabricUIManager', + 'View', + 'deepDiffer', + 'deepFreezeAndThrowOnMutationInDev', + 'flattenStyle', + ], + }, + /******* React Test Renderer *******/ { label: 'test', diff --git a/scripts/rollup/forks.js b/scripts/rollup/forks.js index 481bdc91f2..d5963ec78c 100644 --- a/scripts/rollup/forks.js +++ b/scripts/rollup/forks.js @@ -34,6 +34,8 @@ const forks = Object.freeze({ switch (entry) { case 'react-native-renderer': return 'shared/forks/ReactFeatureFlags.native.js'; + case 'react-native-renderer/src/ReactFabric': + return 'shared/forks/ReactFeatureFlags.native-fabric.js'; default: switch (bundleType) { case FB_DEV: diff --git a/scripts/rollup/results.json b/scripts/rollup/results.json index 08c9b18e84..a53f77637e 100644 --- a/scripts/rollup/results.json +++ b/scripts/rollup/results.json @@ -46,85 +46,85 @@ "filename": "react-dom.development.js", "bundleType": "UMD_DEV", "packageName": "react-dom", - "size": 561031, - "gzip": 132753 + "size": 569094, + "gzip": 133855 }, { "filename": "react-dom.production.min.js", "bundleType": "UMD_PROD", "packageName": "react-dom", - "size": 93750, - "gzip": 30816 + "size": 94278, + "gzip": 30883 }, { "filename": "react-dom.development.js", "bundleType": "NODE_DEV", "packageName": "react-dom", - "size": 545064, - "gzip": 129039 + "size": 553111, + "gzip": 130124 }, { "filename": "react-dom.production.min.js", "bundleType": "NODE_PROD", "packageName": "react-dom", - "size": 92174, - "gzip": 29919 + "size": 92696, + "gzip": 29923 }, { "filename": "ReactDOM-dev.js", "bundleType": "FB_DEV", "packageName": "react-dom", - "size": 562543, - "gzip": 131280 + "size": 571833, + "gzip": 132486 }, { "filename": "ReactDOM-prod.js", "bundleType": "FB_PROD", "packageName": "react-dom", - "size": 264955, - "gzip": 51224 + "size": 267496, + "gzip": 51395 }, { "filename": "react-dom-test-utils.development.js", "bundleType": "UMD_DEV", "packageName": "react-dom", - "size": 41264, - "gzip": 11741 + "size": 41636, + "gzip": 11940 }, { "filename": "react-dom-test-utils.production.min.js", "bundleType": "UMD_PROD", "packageName": "react-dom", - "size": 10565, - "gzip": 3914 + "size": 10616, + "gzip": 3941 }, { "filename": "react-dom-test-utils.development.js", "bundleType": "NODE_DEV", "packageName": "react-dom", - "size": 36001, - "gzip": 10275 + "size": 36373, + "gzip": 10481 }, { "filename": "react-dom-test-utils.production.min.js", "bundleType": "NODE_PROD", "packageName": "react-dom", - "size": 10142, - "gzip": 3828 + "size": 10160, + "gzip": 3834 }, { "filename": "ReactTestUtils-dev.js", "bundleType": "FB_DEV", "packageName": "react-dom", - "size": 36716, - "gzip": 10358 + "size": 37102, + "gzip": 10564 }, { "filename": "react-dom-unstable-native-dependencies.development.js", "bundleType": "UMD_DEV", "packageName": "react-dom", - "size": 63124, - "gzip": 16553 + "size": 63220, + "gzip": 16592 }, { "filename": "react-dom-unstable-native-dependencies.production.min.js", @@ -137,8 +137,8 @@ "filename": "react-dom-unstable-native-dependencies.development.js", "bundleType": "NODE_DEV", "packageName": "react-dom", - "size": 58686, - "gzip": 15380 + "size": 58782, + "gzip": 15415 }, { "filename": "react-dom-unstable-native-dependencies.production.min.js", @@ -151,8 +151,8 @@ "filename": "ReactDOMUnstableNativeDependencies-dev.js", "bundleType": "FB_DEV", "packageName": "react-dom", - "size": 57769, - "gzip": 14752 + "size": 57873, + "gzip": 14804 }, { "filename": "ReactDOMUnstableNativeDependencies-prod.js", @@ -165,162 +165,162 @@ "filename": "react-dom-server.browser.development.js", "bundleType": "UMD_DEV", "packageName": "react-dom", - "size": 93545, - "gzip": 25061 + "size": 96757, + "gzip": 25839 }, { "filename": "react-dom-server.browser.production.min.js", "bundleType": "UMD_PROD", "packageName": "react-dom", - "size": 14258, - "gzip": 5749 + "size": 14488, + "gzip": 5818 }, { "filename": "react-dom-server.browser.development.js", "bundleType": "NODE_DEV", "packageName": "react-dom", - "size": 82603, - "gzip": 22355 + "size": 85807, + "gzip": 23140 }, { "filename": "react-dom-server.browser.production.min.js", "bundleType": "NODE_PROD", "packageName": "react-dom", - "size": 13600, - "gzip": 5503 + "size": 13829, + "gzip": 5574 }, { "filename": "ReactDOMServer-dev.js", "bundleType": "FB_DEV", "packageName": "react-dom", - "size": 86081, - "gzip": 22377 + "size": 90048, + "gzip": 23276 }, { "filename": "ReactDOMServer-prod.js", "bundleType": "FB_PROD", "packageName": "react-dom", - "size": 29791, - "gzip": 7706 + "size": 30295, + "gzip": 7822 }, { "filename": "react-dom-server.node.development.js", "bundleType": "NODE_DEV", "packageName": "react-dom", - "size": 84571, - "gzip": 22859 + "size": 87775, + "gzip": 23648 }, { "filename": "react-dom-server.node.production.min.js", "bundleType": "NODE_PROD", "packageName": "react-dom", - "size": 14424, - "gzip": 5812 + "size": 14653, + "gzip": 5882 }, { "filename": "react-art.development.js", "bundleType": "UMD_DEV", "packageName": "react-art", - "size": 357962, - "gzip": 80313 + "size": 366568, + "gzip": 81568 }, { "filename": "react-art.production.min.js", "bundleType": "UMD_PROD", "packageName": "react-art", - "size": 83566, - "gzip": 26202 + "size": 84611, + "gzip": 26455 }, { "filename": "react-art.development.js", "bundleType": "NODE_DEV", "packageName": "react-art", - "size": 282049, - "gzip": 61216 + "size": 290639, + "gzip": 62540 }, { "filename": "react-art.production.min.js", "bundleType": "NODE_PROD", "packageName": "react-art", - "size": 47228, - "gzip": 15196 + "size": 48273, + "gzip": 15466 }, { "filename": "ReactART-dev.js", "bundleType": "FB_DEV", "packageName": "react-art", - "size": 286110, - "gzip": 60960 + "size": 295882, + "gzip": 62334 }, { "filename": "ReactART-prod.js", "bundleType": "FB_PROD", "packageName": "react-art", - "size": 144750, - "gzip": 25349 + "size": 147792, + "gzip": 25778 }, { "filename": "ReactNativeRenderer-dev.js", "bundleType": "RN_DEV", "packageName": "react-native-renderer", - "size": 410401, - "gzip": 91364 + "size": 421415, + "gzip": 92969 }, { "filename": "ReactNativeRenderer-prod.js", "bundleType": "RN_PROD", "packageName": "react-native-renderer", - "size": 196483, - "gzip": 34394 + "size": 200039, + "gzip": 35042 }, { "filename": "react-test-renderer.development.js", "bundleType": "NODE_DEV", "packageName": "react-test-renderer", - "size": 278620, - "gzip": 60006 + "size": 287210, + "gzip": 61295 }, { "filename": "react-test-renderer.production.min.js", "bundleType": "NODE_PROD", "packageName": "react-test-renderer", - "size": 45590, - "gzip": 14534 + "size": 46631, + "gzip": 14753 }, { "filename": "ReactTestRenderer-dev.js", "bundleType": "FB_DEV", "packageName": "react-test-renderer", - "size": 282777, - "gzip": 59760 + "size": 292549, + "gzip": 61128 }, { "filename": "react-test-renderer-shallow.development.js", "bundleType": "NODE_DEV", "packageName": "react-test-renderer", - "size": 11293, - "gzip": 3095 + "size": 17328, + "gzip": 4208 }, { "filename": "react-test-renderer-shallow.production.min.js", "bundleType": "NODE_PROD", "packageName": "react-test-renderer", - "size": 5640, - "gzip": 2049 + "size": 6421, + "gzip": 2181 }, { "filename": "ReactShallowRenderer-dev.js", "bundleType": "FB_DEV", "packageName": "react-test-renderer", - "size": 11530, - "gzip": 3060 + "size": 18804, + "gzip": 4332 }, { "filename": "react-noop-renderer.development.js", "bundleType": "NODE_DEV", "packageName": "react-noop-renderer", - "size": 18222, - "gzip": 5112 + "size": 18298, + "gzip": 5159 }, { "filename": "react-noop-renderer.production.min.js", @@ -333,15 +333,15 @@ "filename": "react-reconciler.development.js", "bundleType": "NODE_DEV", "packageName": "react-reconciler", - "size": 260466, - "gzip": 55624 + "size": 269084, + "gzip": 56920 }, { "filename": "react-reconciler.production.min.js", "bundleType": "NODE_PROD", "packageName": "react-reconciler", - "size": 38900, - "gzip": 12567 + "size": 39964, + "gzip": 12786 }, { "filename": "react-reconciler-reflection.development.js", @@ -370,6 +370,20 @@ "packageName": "react-call-return", "size": 971, "gzip": 525 + }, + { + "filename": "ReactFabric-dev.js", + "bundleType": "RN_DEV", + "packageName": "react-native-renderer", + "size": 416100, + "gzip": 91978 + }, + { + "filename": "ReactFabric-prod.js", + "bundleType": "RN_PROD", + "packageName": "react-native-renderer", + "size": 195831, + "gzip": 34427 } ] -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index dea59c7a14..4ed45af36d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,14 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@babel/code-frame@^7.0.0-beta.35": + version "7.0.0-beta.38" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.38.tgz#c0af5930617e55e050336838e3a3670983b0b2b2" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + "@babel/helper-function-name@7.0.0-beta.36": version "7.0.0-beta.36" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.36.tgz#366e3bc35147721b69009f803907c4d53212e88d" @@ -73,12 +81,6 @@ abbrev@1: version "1.1.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" -acorn-globals@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - dependencies: - acorn "^4.0.4" - acorn-globals@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" @@ -99,7 +101,7 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.3, acorn@^4.0.4: +acorn@^4.0.3: version "4.0.11" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" @@ -107,10 +109,6 @@ acorn@^5.0.0, acorn@^5.1.2: version "5.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" -acorn@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" - acorn@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" @@ -547,13 +545,6 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.3.0-beta.4.tgz#43d3975be81fb029d2d675d913803c123267309d" - dependencies: - babel-plugin-istanbul "^4.1.5" - babel-preset-jest "21.3.0-beta.4" - babel-jest@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.0.6.tgz#807a2a5f5fad7789c57174a955cd14b11045299f" @@ -603,10 +594,6 @@ babel-plugin-istanbul@^4.1.5: istanbul-lib-instrument "^1.7.5" test-exclude "^4.1.1" -babel-plugin-jest-hoist@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.3.0-beta.4.tgz#a1283b7e556c3cf236604c17e0f18aaa9cf3d79a" - babel-plugin-jest-hoist@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.0.6.tgz#551269ded350a15d6585da35d16d449df30d66c4" @@ -895,13 +882,6 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" -babel-preset-jest@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.3.0-beta.4.tgz#d4f797e00a23c0a027a42341684702888d90789a" - dependencies: - babel-plugin-jest-hoist "21.3.0-beta.4" - babel-plugin-syntax-object-rest-spread "^6.13.0" - babel-preset-jest@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.0.6.tgz#d13202533db9495c98663044d9f51b273d3984c8" @@ -1291,6 +1271,14 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -1750,12 +1738,6 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -"errno@>=0.1.1 <0.2.0-0": - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" - dependencies: - prr "~0.0.0" - error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" @@ -1855,17 +1837,6 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escodegen@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - escodegen@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" @@ -1982,7 +1953,7 @@ esprima-fb@~15001.1001.0-dev-harmony-fb: version "15001.1001.0-dev-harmony-fb" resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" -esprima@^2.6.0, esprima@^2.7.1: +esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -1990,6 +1961,10 @@ esprima@^3.1.1, esprima@^3.1.3, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + esquery@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" @@ -2003,10 +1978,6 @@ esrecurse@^4.1.0: estraverse "~4.1.0" object-assign "^4.0.1" -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -2074,17 +2045,6 @@ expand-tilde@^1.2.2: dependencies: os-homedir "^1.0.1" -expect@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/expect/-/expect-21.3.0-beta.4.tgz#e1243ad493fb9dec41793ab0ffd08a3a81eb9cb4" - dependencies: - ansi-styles "^3.2.0" - jest-diff "21.3.0-beta.4" - jest-get-type "21.3.0-beta.4" - jest-matcher-utils "21.3.0-beta.4" - jest-message-util "21.3.0-beta.4" - jest-regex-util "^21.2.0" - expect@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/expect/-/expect-22.0.6.tgz#69e1761ecb5ba354513e546e6187beda79e18078" @@ -2390,6 +2350,10 @@ function-bind@^1.0.2, function-bind@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -2827,7 +2791,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -3026,7 +2990,7 @@ is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" -is-regex@^1.0.3: +is-regex@^1.0.3, is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" dependencies: @@ -3182,53 +3146,12 @@ jasmine-check@^1.0.0-rc.0: dependencies: testcheck "^1.0.0-rc" -jest-changed-files@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29" - dependencies: - throat "^4.0.0" - jest-changed-files@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.0.6.tgz#fca38cf4c89920c66aad1707e91d25bbea238875" dependencies: throat "^4.0.0" -jest-cli@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.3.0-beta.4.tgz#50a1c2773cfeff68dbb1fe454a3f259ad5850fa6" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - istanbul-api "^1.1.14" - istanbul-lib-coverage "^1.1.1" - istanbul-lib-instrument "^1.8.0" - istanbul-lib-source-maps "^1.2.1" - jest-changed-files "^21.2.0" - jest-config "21.3.0-beta.4" - jest-environment-jsdom "21.3.0-beta.4" - jest-haste-map "21.3.0-beta.4" - jest-message-util "21.3.0-beta.4" - jest-regex-util "^21.2.0" - jest-resolve-dependencies "^21.2.0" - jest-runner "21.3.0-beta.4" - jest-runtime "21.3.0-beta.4" - jest-snapshot "21.3.0-beta.4" - jest-util "21.3.0-beta.4" - micromatch "^2.3.11" - node-notifier "^5.1.2" - pify "^3.0.0" - rimraf "^2.5.4" - slash "^1.0.0" - string-length "^2.0.0" - strip-ansi "^4.0.0" - which "^1.2.12" - worker-farm "^1.3.1" - yargs "^9.0.0" - jest-cli@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.0.6.tgz#a2f1e5e094c42b29d22815463ae57f4d07e292ac" @@ -3265,22 +3188,6 @@ jest-cli@^22.0.6: which "^1.2.12" yargs "^10.0.3" -jest-config@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.3.0-beta.4.tgz#03c936c605c5ec11bbd42aa9d2715d4d96cb11ee" - dependencies: - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "21.3.0-beta.4" - jest-environment-node "21.3.0-beta.4" - jest-get-type "21.3.0-beta.4" - jest-jasmine2 "21.3.0-beta.4" - jest-regex-util "^21.2.0" - jest-resolve "21.3.0-beta.4" - jest-util "21.3.0-beta.4" - jest-validate "21.3.0-beta.4" - pretty-format "21.3.0-beta.4" - jest-config@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.0.6.tgz#8af116784df189b98ed6fd6c307bce4181f7f012" @@ -3297,15 +3204,6 @@ jest-config@^22.0.6: jest-validate "^22.0.6" pretty-format "^22.0.6" -jest-diff@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.3.0-beta.4.tgz#75e795e83f6c3368720c2ddd1f0cbed1543c4139" - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "21.3.0-beta.4" - pretty-format "21.3.0-beta.4" - jest-diff@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.0.6.tgz#38c07187324564ecf6389a980a2f0e86e7e79890" @@ -3315,26 +3213,12 @@ jest-diff@^22.0.6: jest-get-type "^22.0.6" pretty-format "^22.0.6" -jest-docblock@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.3.0-beta.4.tgz#11c3121cccc39d826d484e0951cb2faad1fe1ebd" - dependencies: - detect-newline "^2.1.0" - jest-docblock@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.0.6.tgz#f187fb2c67eec0999e569d563092125283084f9e" dependencies: detect-newline "^2.1.0" -jest-environment-jsdom@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.3.0-beta.4.tgz#aa2831f1ac6b2c88a7ec965990517960d5828da1" - dependencies: - jest-mock "21.3.0-beta.4" - jest-util "21.3.0-beta.4" - jsdom "^9.12.0" - jest-environment-jsdom@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.0.6.tgz#243f3fa7167a1f293410aec8d3eb12ab8de4f748" @@ -3343,13 +3227,6 @@ jest-environment-jsdom@^22.0.6: jest-util "^22.0.6" jsdom "^11.5.1" -jest-environment-node@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.3.0-beta.4.tgz#d4d620ee495d9af84edc157466ff962596e783ab" - dependencies: - jest-mock "21.3.0-beta.4" - jest-util "21.3.0-beta.4" - jest-environment-node@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.0.6.tgz#4f34ac4c0591297aceefa6a93421360bd56e5a74" @@ -3357,25 +3234,10 @@ jest-environment-node@^22.0.6: jest-mock "^22.0.6" jest-util "^22.0.6" -jest-get-type@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.3.0-beta.4.tgz#248b16f9b8fe2887a0baa35b31905d73d66e56e0" - jest-get-type@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.0.6.tgz#301fbc0760779fdbad37b6e3239a3c1811aa75cb" -jest-haste-map@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.3.0-beta.4.tgz#dd8736c40c6db933e16f8f402a45fec859a310f5" - dependencies: - fb-watchman "^2.0.0" - graceful-fs "^4.1.11" - jest-docblock "21.3.0-beta.4" - micromatch "^2.3.11" - sane "^2.0.0" - worker-farm "^1.3.1" - jest-haste-map@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.0.6.tgz#198d665f65e1c484fef106a3c970c5b47903647e" @@ -3387,20 +3249,6 @@ jest-haste-map@^22.0.6: micromatch "^2.3.11" sane "^2.0.0" -jest-jasmine2@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.3.0-beta.4.tgz#da0f065ce48c8eaaec1de6c1074ad05cc5a9f96f" - dependencies: - chalk "^2.0.1" - expect "21.3.0-beta.4" - graceful-fs "^4.1.11" - jest-diff "21.3.0-beta.4" - jest-matcher-utils "21.3.0-beta.4" - jest-message-util "21.3.0-beta.4" - jest-snapshot "21.3.0-beta.4" - p-cancelable "^0.3.0" - source-map-support "^0.5.0" - jest-jasmine2@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.0.6.tgz#db9eae709978a8d67a52f7b90d74cab7301107f5" @@ -3423,14 +3271,6 @@ jest-leak-detector@^22.0.6: dependencies: pretty-format "^22.0.6" -jest-matcher-utils@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.3.0-beta.4.tgz#a83ad12d284c4c3a4db87ba5830f84a16b9a4a91" - dependencies: - chalk "^2.0.1" - jest-get-type "21.3.0-beta.4" - pretty-format "21.3.0-beta.4" - jest-matcher-utils@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.0.6.tgz#55675242b2af1de913f44e00aa4d68a38d349b07" @@ -3439,15 +3279,6 @@ jest-matcher-utils@^22.0.6: jest-get-type "^22.0.6" pretty-format "^22.0.6" -jest-message-util@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.3.0-beta.4.tgz#018dd79f8d7b1a4bbbd9f5b3d59354d14ac9641f" - dependencies: - chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - stack-utils "^1.0.1" - jest-message-util@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.0.6.tgz#2b30edce5131a9358f529ad66ff84835ba4ed457" @@ -3458,41 +3289,20 @@ jest-message-util@^22.0.6: slash "^1.0.0" stack-utils "^1.0.1" -jest-mock@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.3.0-beta.4.tgz#f318168c781a340c2a75fbb3cc40559670531ddd" - jest-mock@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.0.6.tgz#0d1f51ec2bf1e72cd58e79cb76f587e6397306ec" -jest-regex-util@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530" - jest-regex-util@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.0.6.tgz#cd01d33c5993340f5d61be09b270773787a41d88" -jest-resolve-dependencies@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09" - dependencies: - jest-regex-util "^21.2.0" - jest-resolve-dependencies@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.0.6.tgz#dd976f0a9c2874d32edf4876b0a965cef48d479b" dependencies: jest-regex-util "^22.0.6" -jest-resolve@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.3.0-beta.4.tgz#66771415f4be5363b846a6b00599c0e9b01dc726" - dependencies: - browser-resolve "^1.11.2" - chalk "^2.0.1" - jest-resolve@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.0.6.tgz#29d7aa425adb9aae7aa5ae157483dffba724e52b" @@ -3500,21 +3310,6 @@ jest-resolve@^22.0.6: browser-resolve "^1.11.2" chalk "^2.0.1" -jest-runner@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.3.0-beta.4.tgz#a52680a5aff6f1e160c6f520d86482224905d5fa" - dependencies: - jest-config "21.3.0-beta.4" - jest-docblock "21.3.0-beta.4" - jest-haste-map "21.3.0-beta.4" - jest-jasmine2 "21.3.0-beta.4" - jest-message-util "21.3.0-beta.4" - jest-runtime "21.3.0-beta.4" - jest-util "21.3.0-beta.4" - pify "^3.0.0" - throat "^4.0.0" - worker-farm "^1.3.1" - jest-runner@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.0.6.tgz#1986ee82b7968d21f04c402e5b67e3da71496f19" @@ -3530,27 +3325,6 @@ jest-runner@^22.0.6: jest-worker "^22.0.6" throat "^4.0.0" -jest-runtime@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.3.0-beta.4.tgz#22238a05341baf88857e44e39a881c28807e5a36" - dependencies: - babel-jest "21.3.0-beta.4" - babel-plugin-istanbul "^4.1.5" - chalk "^2.0.1" - convert-source-map "^1.4.0" - graceful-fs "^4.1.11" - jest-config "21.3.0-beta.4" - jest-haste-map "21.3.0-beta.4" - jest-regex-util "^21.2.0" - jest-resolve "21.3.0-beta.4" - jest-util "21.3.0-beta.4" - json-stable-stringify "^1.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" - yargs "^9.0.0" - jest-runtime@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.0.6.tgz#827c35e706adfc22e685de733ba3ab78cda72bfc" @@ -3574,17 +3348,6 @@ jest-runtime@^22.0.6: write-file-atomic "^2.1.0" yargs "^10.0.3" -jest-snapshot@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.3.0-beta.4.tgz#0ba657b322029c2855dd6ac95a6494bf101de7dc" - dependencies: - chalk "^2.0.1" - jest-diff "21.3.0-beta.4" - jest-matcher-utils "21.3.0-beta.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "21.3.0-beta.4" - jest-snapshot@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.0.6.tgz#30c1f85b6f050891c4a2060d807a3d65a594591c" @@ -3596,18 +3359,6 @@ jest-snapshot@^22.0.6: natural-compare "^1.4.0" pretty-format "^22.0.6" -jest-util@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.3.0-beta.4.tgz#88bd0c8d1d51098336cf6696e3ae27d38b881664" - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - jest-message-util "21.3.0-beta.4" - jest-mock "21.3.0-beta.4" - jest-validate "21.3.0-beta.4" - mkdirp "^0.5.1" - jest-util@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.0.6.tgz#539b3f21f4e2e458bb38719aa0e417109fe31657" @@ -3620,15 +3371,6 @@ jest-util@^22.0.6: jest-validate "^22.0.6" mkdirp "^0.5.1" -jest-validate@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.3.0-beta.4.tgz#cfb0cdb38f7eb694f909ad041687645fd1b90452" - dependencies: - chalk "^2.0.1" - jest-get-type "21.3.0-beta.4" - leven "^2.1.0" - pretty-format "21.3.0-beta.4" - jest-validate@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.0.6.tgz#48c6972f154fa4abe20d0686a9b819d142740167" @@ -3718,30 +3460,6 @@ jsdom@^11.5.1: whatwg-url "^6.3.0" xml-name-validator "^2.0.1" -jsdom@^9.12.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" - dependencies: - abab "^1.0.3" - acorn "^4.0.4" - acorn-globals "^3.1.0" - array-equal "^1.0.0" - content-type-parser "^1.0.1" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.2.37 < 0.3.0" - escodegen "^1.6.1" - html-encoding-sniffer "^1.0.1" - nwmatcher ">= 1.3.9 < 2.0.0" - parse5 "^1.5.1" - request "^2.79.0" - sax "^1.2.1" - symbol-tree "^3.2.1" - tough-cookie "^2.3.2" - webidl-conversions "^4.0.0" - whatwg-encoding "^1.0.1" - whatwg-url "^4.3.0" - xml-name-validator "^2.0.1" - jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -4055,7 +3773,7 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -merge-stream@^1.0.0: +merge-stream@^1.0.0, merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" dependencies: @@ -4262,10 +3980,6 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -"nwmatcher@>= 1.3.9 < 2.0.0": - version "1.3.9" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" - nwmatcher@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" @@ -4373,7 +4087,7 @@ os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4392,10 +4106,6 @@ output-file-sync@^1.1.0: mkdirp "^0.5.1" object-assign "^4.1.0" -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -4452,10 +4162,6 @@ parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" -parse5@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" - parse5@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -4522,10 +4228,6 @@ pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -4564,13 +4266,6 @@ prettier@1.8.1, prettier@^1.0.0: version "1.8.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.8.1.tgz#91064d778c08c85ac1cbe6b23195c34310d039f9" -pretty-format@21.3.0-beta.4: - version "21.3.0-beta.4" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.3.0-beta.4.tgz#6b3b8aba0b7097f821156e5fd1e3bc0fa923b17f" - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - pretty-format@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.0.6.tgz#bbb78e38445f263c2d3b9e281f4b844380990720" @@ -4615,10 +4310,6 @@ proxy-from-env@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" - pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -4747,7 +4438,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable string_decoder "~1.0.0" util-deprecate "~1.0.1" -readable-stream@^2.0.5: +readable-stream@^2.0.5, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -4936,7 +4627,7 @@ request@2.79.0: tunnel-agent "~0.4.1" uuid "^3.0.0" -request@^2.79.0, request@^2.81.0: +request@^2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -5296,12 +4987,6 @@ source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - dependencies: - amdefine ">=0.0.4" - source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -5657,7 +5342,7 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.3: dependencies: punycode "^1.4.1" -tough-cookie@^2.3.2, tough-cookie@~2.3.0: +tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" dependencies: @@ -5669,10 +5354,6 @@ tr46@^1.0.0: dependencies: punycode "^2.1.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - trim-right@^1.0.0, trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -5709,7 +5390,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -typedarray@~0.0.5: +typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -5840,14 +5521,6 @@ watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - -webidl-conversions@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" - webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -5869,13 +5542,6 @@ whatwg-fetch@>=0.10.0: version "2.0.3" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" -whatwg-url@^4.3.0: - version "4.7.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.7.1.tgz#df4dc2e3f25a63b1fa5b32ed6d6c139577d690de" - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - whatwg-url@^6.3.0: version "6.4.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" @@ -5934,13 +5600,6 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -worker-farm@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" - dependencies: - errno ">=0.1.1 <0.2.0-0" - xtend ">=4.0.0 <4.1.0-0" - wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -6001,6 +5660,12 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + yargs@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.1.tgz#420ef75e840c1457a80adcca9bc6fa3849de51aa" @@ -6019,6 +5684,23 @@ yargs@8.0.1: y18n "^3.2.1" yargs-parser "^7.0.0" +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + yargs@^4.8.0: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" @@ -6056,24 +5738,6 @@ yargs@^6.3.0, yargs@^6.5.0: y18n "^3.2.1" yargs-parser "^4.2.0" -yargs@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"