Add Experimental Fabric Renderer (#12069)

This commit is contained in:
Sebastian Markbåge
2018-01-22 09:58:35 -08:00
committed by GitHub
parent 4ca7855ca0
commit 6031bea239
21 changed files with 1114 additions and 502 deletions

View File

@@ -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;

View File

@@ -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<any>, 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;

View File

@@ -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;

View File

@@ -119,11 +119,11 @@ function restoreDeletedValuesInNestedArray(
}
function diffNestedArrayProperty(
updatePayload: ?Object,
updatePayload: null | Object,
prevArray: Array<NestedNode>,
nextArray: Array<NestedNode>,
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,

View File

@@ -149,7 +149,7 @@ class ReactNativeComponent<DefaultProps, Props, State> extends React.Component<
}
const viewConfig: ReactNativeBaseComponentViewConfig =
maybeInstance.viewConfig;
maybeInstance.viewConfig || maybeInstance.canonical.viewConfig;
const updatePayload = ReactNativeAttributePayload.create(
nativeProps,

View File

@@ -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;
}

View File

@@ -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<Instance | number>,
_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') {

View File

@@ -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);

View File

@@ -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,
);

View File

@@ -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;

View File

@@ -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(<View foo="test" />, 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(<View foo="foo" />, 11);
expect(FabricUIManager.createNode.mock.calls.length).toBe(1);
ReactFabric.render(<View foo="bar" />, 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(<Text foo="a">1</Text>, 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(<Text foo="a">1</Text>, 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(<Text foo="b">1</Text>, 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(<Text foo="b">2</Text>, 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(<Text foo="c">3</Text>, 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 />;
}
}
[View, Subclass].forEach(Component => {
UIManager.updateView.mockReset();
let viewRef;
ReactFabric.render(
<Component
foo="bar"
ref={ref => {
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(
<View foo="foo" ref={v => (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 (
<View>{chars.map(text => <View key={text} title={text} />)}</View>
);
}
}
// Mini multi-child stress test: lots of reorders, some adds, some removes.
const before = 'abcdefghijklmnopqrst';
const after = 'mxhpgwfralkeoivcstzy';
ReactFabric.render(<Component chars={before} />, 11);
expect(FabricUIManager.__dumpHierarchyForJestTestsOnly()).toMatchSnapshot();
ReactFabric.render(<Component chars={after} />, 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(<Component />, 11);
expect(mockArgs.length).toEqual(0);
});
});

View File

@@ -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\\"}"
`;

View File

@@ -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;

View File

@@ -123,8 +123,17 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
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;

View File

@@ -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:

View File

@@ -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<CSFeatureFlagsType, FeatureFlagsType>);
(null: Check<FabricFeatureFlagsType, FeatureFlagsType>);

View File

@@ -81,7 +81,38 @@ declare module 'UIManager' {
quality?: number,
},
): Promise<any>;
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;
}

View File

@@ -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',

View File

@@ -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:

View File

@@ -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
}
]
}
}

450
yarn.lock
View File

@@ -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"