mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Compare commits
33
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
312d37f94a | ||
|
|
07f48ebf4a | ||
|
|
84241fbcdc | ||
|
|
ee68b113ff | ||
|
|
4555b06ffd | ||
|
|
dd63cbf5df | ||
|
|
afdd0d5d93 | ||
|
|
4cb4a71656 | ||
|
|
7b7b491e50 | ||
|
|
45a48271b1 | ||
|
|
cd81eff5b8 | ||
|
|
6f232424e6 | ||
|
|
35717c773a | ||
|
|
af89654699 | ||
|
|
776bd34eb3 | ||
|
|
ac4a214eeb | ||
|
|
1f85e21464 | ||
|
|
a41995ff5c | ||
|
|
6d64892c8a | ||
|
|
5d95e9950c | ||
|
|
6b39d644ea | ||
|
|
dff572c174 | ||
|
|
af3e1d4a86 | ||
|
|
897a3a5d5e | ||
|
|
0fea3515a1 | ||
|
|
80e8efe8e7 | ||
|
|
d1888650c5 | ||
|
|
f65b9e883a | ||
|
|
aa0b2ad1cd | ||
|
|
0a319978ff | ||
|
|
29e5deb85f | ||
|
|
031feb6942 | ||
|
|
d82138ff91 |
@@ -595,11 +595,14 @@ describe('Native Animated', () => {
|
||||
{
|
||||
type: 'spring',
|
||||
friction: 16,
|
||||
damping: 16,
|
||||
mass: 1,
|
||||
initialVelocity: 0,
|
||||
overshootClamping: false,
|
||||
restDisplacementThreshold: 0.001,
|
||||
restSpeedThreshold: 0.001,
|
||||
tension: 679.08,
|
||||
stiffness: 679.08,
|
||||
toValue: 10,
|
||||
iterations: 1,
|
||||
},
|
||||
@@ -613,11 +616,14 @@ describe('Native Animated', () => {
|
||||
{
|
||||
type: 'spring',
|
||||
friction: 23.05223140901191,
|
||||
damping: 23.05223140901191,
|
||||
mass: 1,
|
||||
initialVelocity: 0,
|
||||
overshootClamping: false,
|
||||
restDisplacementThreshold: 0.001,
|
||||
restSpeedThreshold: 0.001,
|
||||
tension: 299.61882352941177,
|
||||
stiffness: 299.61882352941177,
|
||||
toValue: 10,
|
||||
iterations: 1,
|
||||
},
|
||||
|
||||
@@ -120,6 +120,9 @@ class SpringAnimation extends Animation {
|
||||
restSpeedThreshold: this._restSpeedThreshold,
|
||||
tension: this._tension,
|
||||
friction: this._friction,
|
||||
stiffness: this._tension,
|
||||
damping: this._friction,
|
||||
mass: 1,
|
||||
initialVelocity: withDefault(this._initialVelocity, this._lastVelocity),
|
||||
toValue: this._toValue,
|
||||
iterations: this.__iterations,
|
||||
|
||||
@@ -44,7 +44,10 @@ RCT_EXPORT_MODULE()
|
||||
// form of an, NSURL which is what assets-library uses.
|
||||
NSString *assetID = @"";
|
||||
PHFetchResult *results;
|
||||
if ([imageURL.scheme caseInsensitiveCompare:@"assets-library"] == NSOrderedSame) {
|
||||
if (!imageURL) {
|
||||
completionHandler(RCTErrorWithMessage(@"Cannot load a photo library asset with no URL"), nil);
|
||||
return ^{};
|
||||
} else if ([imageURL.scheme caseInsensitiveCompare:@"assets-library"] == NSOrderedSame) {
|
||||
assetID = [imageURL absoluteString];
|
||||
results = [PHAsset fetchAssetsWithALAssetURLs:@[imageURL] options:nil];
|
||||
} else {
|
||||
|
||||
@@ -10,16 +10,14 @@
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
var NativeMethodsMixin = require('NativeMethodsMixin');
|
||||
var React = require('React');
|
||||
var PropTypes = require('prop-types');
|
||||
var ViewPropTypes = require('ViewPropTypes');
|
||||
var ColorPropType = require('ColorPropType');
|
||||
const ActivityIndicator = require('ActivityIndicator');
|
||||
const ColorPropType = require('ColorPropType');
|
||||
const PropTypes = require('prop-types');
|
||||
const React = require('React');
|
||||
const ReactNative = require('ReactNative');
|
||||
const ViewPropTypes = require('ViewPropTypes');
|
||||
|
||||
var createReactClass = require('create-react-class');
|
||||
var requireNativeComponent = require('requireNativeComponent');
|
||||
|
||||
var STYLE_ATTRIBUTES = [
|
||||
const STYLE_ATTRIBUTES = [
|
||||
'Horizontal',
|
||||
'Normal',
|
||||
'Small',
|
||||
@@ -29,10 +27,10 @@ var STYLE_ATTRIBUTES = [
|
||||
'LargeInverse',
|
||||
];
|
||||
|
||||
var indeterminateType = function(props, propName, componentName, ...rest) {
|
||||
var checker = function() {
|
||||
var indeterminate = props[propName];
|
||||
var styleAttr = props.styleAttr;
|
||||
const indeterminateType = function(props, propName, componentName, ...rest) {
|
||||
const checker = function() {
|
||||
const indeterminate = props[propName];
|
||||
const styleAttr = props.styleAttr;
|
||||
if (!indeterminate && styleAttr !== 'Horizontal') {
|
||||
return new Error('indeterminate=false is only valid for styleAttr=Horizontal');
|
||||
}
|
||||
@@ -64,10 +62,10 @@ var indeterminateType = function(props, propName, componentName, ...rest) {
|
||||
* },
|
||||
* ```
|
||||
*/
|
||||
var ProgressBarAndroid = createReactClass({
|
||||
displayName: 'ProgressBarAndroid',
|
||||
propTypes: {
|
||||
class ProgressBarAndroid extends ReactNative.NativeComponent {
|
||||
static propTypes = {
|
||||
...ViewPropTypes,
|
||||
|
||||
/**
|
||||
* Style of the ProgressBar. One of:
|
||||
*
|
||||
@@ -97,35 +95,25 @@ var ProgressBarAndroid = createReactClass({
|
||||
* Used to locate this view in end-to-end tests.
|
||||
*/
|
||||
testID: PropTypes.string,
|
||||
},
|
||||
};
|
||||
|
||||
getDefaultProps: function() {
|
||||
return {
|
||||
styleAttr: 'Normal',
|
||||
indeterminate: true
|
||||
};
|
||||
},
|
||||
static defaultProps = {
|
||||
styleAttr: 'Normal',
|
||||
indeterminate: true
|
||||
};
|
||||
|
||||
mixins: [NativeMethodsMixin],
|
||||
|
||||
componentDidMount: function() {
|
||||
componentDidMount() {
|
||||
if (this.props.indeterminate && this.props.styleAttr !== 'Horizontal') {
|
||||
console.warn(
|
||||
'Circular indeterminate `ProgressBarAndroid`' +
|
||||
'is deprecated. Use `ActivityIndicator` instead.'
|
||||
);
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
render: function() {
|
||||
return <AndroidProgressBar {...this.props} />;
|
||||
},
|
||||
});
|
||||
|
||||
var AndroidProgressBar = requireNativeComponent(
|
||||
'AndroidProgressBar',
|
||||
ProgressBarAndroid,
|
||||
{nativeOnly: {animating: true}},
|
||||
);
|
||||
render() {
|
||||
return <ActivityIndicator {...this.props} animating={true} />;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ProgressBarAndroid;
|
||||
|
||||
@@ -116,6 +116,26 @@ if (!global.__fbDisableExceptionsManager) {
|
||||
ErrorUtils.setGlobalHandler(handleError);
|
||||
}
|
||||
|
||||
const {PlatformConstants} = require('NativeModules');
|
||||
if (PlatformConstants) {
|
||||
const formatVersion = version =>
|
||||
`${version.major}.${version.minor}.${version.patch}` +
|
||||
(version.prerelease !== null ? `-${version.prerelease}` : '');
|
||||
|
||||
const ReactNativeVersion = require('ReactNativeVersion');
|
||||
const nativeVersion = PlatformConstants.reactNativeVersion;
|
||||
if (ReactNativeVersion.version.major !== nativeVersion.major ||
|
||||
ReactNativeVersion.version.minor !== nativeVersion.minor) {
|
||||
throw new Error(
|
||||
`React Native version mismatch.\n\nJavaScript version: ${formatVersion(ReactNativeVersion.version)}\n` +
|
||||
`Native version: ${formatVersion(nativeVersion)}\n\n` +
|
||||
'Make sure that you have rebuilt the native code. If the problem persists ' +
|
||||
'try clearing the watchman and packager caches with `watchman watch-del-all ' +
|
||||
'&& react-native start --reset-cache`.'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Set up collections
|
||||
const _shouldPolyfillCollection = require('_shouldPolyfillES6Collection');
|
||||
if (_shouldPolyfillCollection('Map')) {
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
* @generated by scripts/bump-oss-version.js
|
||||
*
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @flow
|
||||
* @providesModule ReactNativeVersion
|
||||
*/
|
||||
|
||||
exports.version = {
|
||||
major: 0,
|
||||
minor: 49,
|
||||
patch: 5,
|
||||
prerelease: null,
|
||||
};
|
||||
@@ -18,13 +18,7 @@ var warning = require('fbjs/lib/warning');
|
||||
|
||||
function defaultGetRowData(
|
||||
dataBlob: any,
|
||||
/* $FlowFixMe(>=0.53.0 site=react_native_fb) This comment suppresses an error
|
||||
* found when Flow v0.53 was deployed. To see the error delete this comment
|
||||
* and run Flow. */
|
||||
sectionID: number | string,
|
||||
/* $FlowFixMe(>=0.53.0 site=react_native_fb) This comment suppresses an error
|
||||
* found when Flow v0.53 was deployed. To see the error delete this comment
|
||||
* and run Flow. */
|
||||
rowID: number | string,
|
||||
): any {
|
||||
return dataBlob[sectionID][rowID];
|
||||
|
||||
@@ -1 +1 @@
|
||||
c3718c48f01fa6c2e04bd47226061769484c951b
|
||||
589c0a25dfa18c2090549cc6f5b626d69ea53c2a
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @noflow
|
||||
* @providesModule ReactNativeFiber-dev
|
||||
@@ -14,7 +12,7 @@
|
||||
__DEV__ && function() {
|
||||
var invariant = require("fbjs/lib/invariant"), require$$0 = require("fbjs/lib/warning"), ExceptionsManager = require("ExceptionsManager"), emptyObject = require("fbjs/lib/emptyObject"), react = require("react"), checkPropTypes = require("prop-types/checkPropTypes"), shallowEqual = require("fbjs/lib/shallowEqual"), deepDiffer = require("deepDiffer"), flattenStyle = require("flattenStyle"), TextInputState = require("TextInputState"), UIManager = require("UIManager"), deepFreezeAndThrowOnMutationInDev = require("deepFreezeAndThrowOnMutationInDev");
|
||||
require("InitializeCore");
|
||||
var RCTEventEmitter = require("RCTEventEmitter"), emptyFunction = require("fbjs/lib/emptyFunction"), ExecutionEnvironment = require("fbjs/lib/ExecutionEnvironment"), performanceNow = require("fbjs/lib/performanceNow"), defaultShowDialog = function(capturedError) {
|
||||
var RCTEventEmitter = require("RCTEventEmitter"), emptyFunction = require("fbjs/lib/emptyFunction"), defaultShowDialog = function(capturedError) {
|
||||
return !0;
|
||||
}, showDialog = defaultShowDialog;
|
||||
function logCapturedError(capturedError) {
|
||||
@@ -181,13 +179,9 @@ __DEV__ && function() {
|
||||
function restoreStateOfTarget(target) {
|
||||
var internalInstance = EventPluginUtils_1.getInstanceFromNode(target);
|
||||
if (internalInstance) {
|
||||
if ("number" == typeof internalInstance.tag) {
|
||||
invariant(fiberHostComponent && "function" == typeof fiberHostComponent.restoreControlledState, "Fiber needs to be injected to handle a fiber target for controlled " + "events. This error is likely caused by a bug in React. Please file an issue.");
|
||||
var props = EventPluginUtils_1.getFiberCurrentPropsFromNode(internalInstance.stateNode);
|
||||
return void fiberHostComponent.restoreControlledState(internalInstance.stateNode, internalInstance.type, props);
|
||||
}
|
||||
invariant("function" == typeof internalInstance.restoreControlledState, "The internal instance must be a React host component. " + "This error is likely caused by a bug in React. Please file an issue."),
|
||||
internalInstance.restoreControlledState();
|
||||
invariant(fiberHostComponent && "function" == typeof fiberHostComponent.restoreControlledState, "Fiber needs to be injected to handle a fiber target for controlled " + "events. This error is likely caused by a bug in React. Please file an issue.");
|
||||
var props = EventPluginUtils_1.getFiberCurrentPropsFromNode(internalInstance.stateNode);
|
||||
fiberHostComponent.restoreControlledState(internalInstance.stateNode, internalInstance.type, props);
|
||||
}
|
||||
}
|
||||
var ReactControlledComponent = {
|
||||
@@ -201,16 +195,11 @@ __DEV__ && function() {
|
||||
if (restoreTarget = null, restoreQueue = null, restoreStateOfTarget(target), queuedTargets) for (var i = 0; i < queuedTargets.length; i++) restoreStateOfTarget(queuedTargets[i]);
|
||||
}
|
||||
}
|
||||
}, ReactControlledComponent_1 = ReactControlledComponent, stackBatchedUpdates = function(fn, a, b, c, d, e) {
|
||||
return fn(a, b, c, d, e);
|
||||
}, fiberBatchedUpdates = function(fn, bookkeeping) {
|
||||
}, ReactControlledComponent_1 = ReactControlledComponent, fiberBatchedUpdates = function(fn, bookkeeping) {
|
||||
return fn(bookkeeping);
|
||||
};
|
||||
function performFiberBatchedUpdates(fn, bookkeeping) {
|
||||
return fiberBatchedUpdates(fn, bookkeeping);
|
||||
}
|
||||
function batchedUpdates(fn, bookkeeping) {
|
||||
return stackBatchedUpdates(performFiberBatchedUpdates, fn, bookkeeping);
|
||||
return fiberBatchedUpdates(fn, bookkeeping);
|
||||
}
|
||||
var isNestingBatched = !1;
|
||||
function batchedUpdatesWithControlledComponents(fn, bookkeeping) {
|
||||
@@ -223,9 +212,6 @@ __DEV__ && function() {
|
||||
}
|
||||
}
|
||||
var ReactGenericBatchingInjection = {
|
||||
injectStackBatchedUpdates: function(_batchedUpdates) {
|
||||
stackBatchedUpdates = _batchedUpdates;
|
||||
},
|
||||
injectFiberBatchedUpdates: function(_batchedUpdates) {
|
||||
fiberBatchedUpdates = _batchedUpdates;
|
||||
}
|
||||
@@ -262,21 +248,9 @@ __DEV__ && function() {
|
||||
isPortal: isPortal,
|
||||
REACT_PORTAL_TYPE: REACT_PORTAL_TYPE_1
|
||||
}, instanceCache = {}, instanceProps = {};
|
||||
function getRenderedHostOrTextFromComponent(component) {
|
||||
for (var rendered; rendered = component._renderedComponent; ) component = rendered;
|
||||
return component;
|
||||
}
|
||||
function precacheNode(inst, tag) {
|
||||
var nativeInst = getRenderedHostOrTextFromComponent(inst);
|
||||
instanceCache[tag] = nativeInst;
|
||||
}
|
||||
function precacheFiberNode(hostInst, tag) {
|
||||
instanceCache[tag] = hostInst;
|
||||
}
|
||||
function uncacheNode(inst) {
|
||||
var tag = inst._rootNodeID;
|
||||
tag && delete instanceCache[tag];
|
||||
}
|
||||
function uncacheFiberNode(tag) {
|
||||
delete instanceCache[tag], delete instanceProps[tag];
|
||||
}
|
||||
@@ -298,9 +272,7 @@ __DEV__ && function() {
|
||||
getInstanceFromNode: getInstanceFromTag,
|
||||
getNodeFromInstance: getTagFromInstance,
|
||||
precacheFiberNode: precacheFiberNode,
|
||||
precacheNode: precacheNode,
|
||||
uncacheFiberNode: uncacheFiberNode,
|
||||
uncacheNode: uncacheNode,
|
||||
getFiberCurrentPropsFromNode: getFiberCurrentPropsFromNode,
|
||||
updateFiberProps: updateFiberProps
|
||||
}, ReactNativeComponentTree_1 = ReactNativeComponentTree, commonjsGlobal = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {}, ReactFeatureFlags = {
|
||||
@@ -500,16 +472,9 @@ __DEV__ && function() {
|
||||
beginUpdateQueue: beginUpdateQueue_1,
|
||||
commitCallbacks: commitCallbacks_1
|
||||
};
|
||||
function getComponentName$1(instanceOrFiber) {
|
||||
if ("function" == typeof instanceOrFiber.getName) {
|
||||
return instanceOrFiber.getName();
|
||||
}
|
||||
if ("number" == typeof instanceOrFiber.tag) {
|
||||
var fiber = instanceOrFiber, type = fiber.type;
|
||||
if ("string" == typeof type) return type;
|
||||
if ("function" == typeof type) return type.displayName || type.name;
|
||||
}
|
||||
return null;
|
||||
function getComponentName$1(fiber) {
|
||||
var type = fiber.type;
|
||||
return "string" == typeof type ? type : "function" == typeof type ? type.displayName || type.name : null;
|
||||
}
|
||||
var getComponentName_1 = getComponentName$1, ReactInstanceMap = {
|
||||
remove: function(key) {
|
||||
@@ -528,7 +493,6 @@ __DEV__ && function() {
|
||||
ReactCurrentOwner: ReactInternals.ReactCurrentOwner
|
||||
};
|
||||
Object.assign(ReactGlobalSharedState, {
|
||||
ReactComponentTreeHook: ReactInternals.ReactComponentTreeHook,
|
||||
ReactDebugCurrentFrame: ReactInternals.ReactDebugCurrentFrame
|
||||
});
|
||||
var ReactGlobalSharedState_1 = ReactGlobalSharedState, ReactCurrentOwner = ReactGlobalSharedState_1.ReactCurrentOwner, warning$4 = require$$0, ClassComponent$2 = ReactTypeOfWork.ClassComponent, HostComponent$1 = ReactTypeOfWork.HostComponent, HostRoot$2 = ReactTypeOfWork.HostRoot, HostPortal = ReactTypeOfWork.HostPortal, HostText = ReactTypeOfWork.HostText, NoEffect = ReactTypeOfSideEffect.NoEffect, Placement = ReactTypeOfSideEffect.Placement, MOUNTING = 1, MOUNTED = 2, UNMOUNTED = 3;
|
||||
@@ -689,7 +653,9 @@ __DEV__ && function() {
|
||||
}, ReactDebugCurrentFrame = ReactGlobalSharedState_1.ReactDebugCurrentFrame, getComponentName$3 = getComponentName_1, _require2$1 = ReactFiberComponentTreeHook, getStackAddendumByWorkInProgressFiber = _require2$1.getStackAddendumByWorkInProgressFiber;
|
||||
function getCurrentFiberOwnerName() {
|
||||
var fiber = ReactDebugCurrentFiber$2.current;
|
||||
return null === fiber ? null : null != fiber._debugOwner ? getComponentName$3(fiber._debugOwner) : null;
|
||||
if (null === fiber) return null;
|
||||
var owner = fiber._debugOwner;
|
||||
return null !== owner && void 0 !== owner ? getComponentName$3(owner) : null;
|
||||
}
|
||||
function getCurrentFiberStackAddendum() {
|
||||
var fiber = ReactDebugCurrentFiber$2.current;
|
||||
@@ -699,8 +665,11 @@ __DEV__ && function() {
|
||||
ReactDebugCurrentFrame.getCurrentStack = null, ReactDebugCurrentFiber$2.current = null,
|
||||
ReactDebugCurrentFiber$2.phase = null;
|
||||
}
|
||||
function setCurrentFiber(fiber, phase) {
|
||||
function setCurrentFiber(fiber) {
|
||||
ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackAddendum, ReactDebugCurrentFiber$2.current = fiber,
|
||||
ReactDebugCurrentFiber$2.phase = null;
|
||||
}
|
||||
function setCurrentPhase(phase) {
|
||||
ReactDebugCurrentFiber$2.phase = phase;
|
||||
}
|
||||
var ReactDebugCurrentFiber$2 = {
|
||||
@@ -708,6 +677,7 @@ __DEV__ && function() {
|
||||
phase: null,
|
||||
resetCurrentFiber: resetCurrentFiber,
|
||||
setCurrentFiber: setCurrentFiber,
|
||||
setCurrentPhase: setCurrentPhase,
|
||||
getCurrentFiberOwnerName: getCurrentFiberOwnerName,
|
||||
getCurrentFiberStackAddendum: getCurrentFiberStackAddendum
|
||||
}, ReactDebugCurrentFiber_1 = ReactDebugCurrentFiber$2, ReactDebugFiberPerf = null, _require$2 = ReactTypeOfWork, HostRoot$3 = _require$2.HostRoot, HostComponent$3 = _require$2.HostComponent, HostText$1 = _require$2.HostText, HostPortal$1 = _require$2.HostPortal, YieldComponent = _require$2.YieldComponent, Fragment = _require$2.Fragment, getComponentName$4 = getComponentName_1, reactEmoji = "⚛", warningEmoji = "⛔", supportsUserTiming = "undefined" != typeof performance && "function" == typeof performance.mark && "function" == typeof performance.clearMarks && "function" == typeof performance.measure && "function" == typeof performance.clearMeasures, currentFiber = null, currentPhase = null, currentPhaseFiber = null, isCommitting = !1, hasScheduledUpdateInCurrentCommit = !1, hasScheduledUpdateInCurrentPhase = !1, commitCountInCurrentWorkLoop = 0, effectCountInCurrentCommit = 0, labelsInCurrentCommit = new Set(), formatMarkName = function(markName) {
|
||||
@@ -859,9 +829,8 @@ __DEV__ && function() {
|
||||
var context = {};
|
||||
for (var key in contextTypes) context[key] = unmaskedContext[key];
|
||||
var name = getComponentName_1(workInProgress) || "Unknown";
|
||||
return ReactDebugCurrentFiber$1.setCurrentFiber(workInProgress, null), checkPropTypes$1(contextTypes, context, "context", name, ReactDebugCurrentFiber$1.getCurrentFiberStackAddendum),
|
||||
ReactDebugCurrentFiber$1.resetCurrentFiber(), instance && cacheContext(workInProgress, unmaskedContext, context),
|
||||
context;
|
||||
return checkPropTypes$1(contextTypes, context, "context", name, ReactDebugCurrentFiber$1.getCurrentFiberStackAddendum),
|
||||
instance && cacheContext(workInProgress, unmaskedContext, context), context;
|
||||
}, hasContextChanged = function() {
|
||||
return didPerformWorkStackCursor.current;
|
||||
};
|
||||
@@ -880,7 +849,7 @@ __DEV__ && function() {
|
||||
invariant(null == contextStackCursor.cursor, "Unexpected context found on stack. " + "This error is likely caused by a bug in React. Please file an issue."),
|
||||
push(contextStackCursor, context, fiber), push(didPerformWorkStackCursor, didChange, fiber);
|
||||
};
|
||||
function processChildContext$1(fiber, parentContext, isReconciling) {
|
||||
function processChildContext$1(fiber, parentContext) {
|
||||
var instance = fiber.stateNode, childContextTypes = fiber.type.childContextTypes;
|
||||
if ("function" != typeof instance.getChildContext) {
|
||||
var componentName = getComponentName_1(fiber) || "Unknown";
|
||||
@@ -889,12 +858,12 @@ __DEV__ && function() {
|
||||
parentContext;
|
||||
}
|
||||
var childContext = void 0;
|
||||
ReactDebugCurrentFiber$1.setCurrentFiber(fiber, "getChildContext"), startPhaseTimer(fiber, "getChildContext"),
|
||||
childContext = instance.getChildContext(), stopPhaseTimer(), ReactDebugCurrentFiber$1.resetCurrentFiber();
|
||||
ReactDebugCurrentFiber$1.setCurrentPhase("getChildContext"), startPhaseTimer(fiber, "getChildContext"),
|
||||
childContext = instance.getChildContext(), stopPhaseTimer(), ReactDebugCurrentFiber$1.setCurrentPhase(null);
|
||||
for (var contextKey in childContext) invariant(contextKey in childContextTypes, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', getComponentName_1(fiber) || "Unknown", contextKey);
|
||||
var name = getComponentName_1(fiber) || "Unknown", workInProgress = isReconciling ? fiber : null;
|
||||
return ReactDebugCurrentFiber$1.setCurrentFiber(workInProgress, null), checkPropTypes$1(childContextTypes, childContext, "child context", name, ReactDebugCurrentFiber$1.getCurrentFiberStackAddendum),
|
||||
ReactDebugCurrentFiber$1.resetCurrentFiber(), Object.assign({}, parentContext, childContext);
|
||||
var name = getComponentName_1(fiber) || "Unknown";
|
||||
return checkPropTypes$1(childContextTypes, childContext, "child context", name, ReactDebugCurrentFiber$1.getCurrentFiberStackAddendum),
|
||||
Object.assign({}, parentContext, childContext);
|
||||
}
|
||||
var processChildContext_1 = processChildContext$1, pushContextProvider = function(workInProgress) {
|
||||
if (!isContextProvider$1(workInProgress)) return !1;
|
||||
@@ -906,7 +875,7 @@ __DEV__ && function() {
|
||||
var instance = workInProgress.stateNode;
|
||||
if (invariant(instance, "Expected to have an instance by this point. " + "This error is likely caused by a bug in React. Please file an issue."),
|
||||
didChange) {
|
||||
var mergedContext = processChildContext$1(workInProgress, previousContext, !0);
|
||||
var mergedContext = processChildContext$1(workInProgress, previousContext);
|
||||
instance.__reactInternalMemoizedMergedChildContext = mergedContext, pop(didPerformWorkStackCursor, workInProgress),
|
||||
pop(contextStackCursor, workInProgress), push(contextStackCursor, mergedContext, workInProgress),
|
||||
push(didPerformWorkStackCursor, didChange, workInProgress);
|
||||
@@ -1109,11 +1078,11 @@ __DEV__ && function() {
|
||||
if (null !== mixedRef && "function" != typeof mixedRef) {
|
||||
if (element._owner) {
|
||||
var owner = element._owner, inst = void 0;
|
||||
if (owner) if ("number" == typeof owner.tag) {
|
||||
if (owner) {
|
||||
var ownerFiber = owner;
|
||||
invariant(ownerFiber.tag === ClassComponent$7, "Stateless function components cannot have refs."),
|
||||
inst = ownerFiber.stateNode;
|
||||
} else inst = owner.getPublicInstance();
|
||||
}
|
||||
invariant(inst, "Missing owner for string ref %s. This error is likely caused by a " + "bug in React. Please file an issue.", mixedRef);
|
||||
var stringRef = "" + mixedRef;
|
||||
if (null !== current && null !== current.ref && current.ref._stringRef === stringRef) return current.ref;
|
||||
@@ -1701,8 +1670,8 @@ __DEV__ && function() {
|
||||
var fn = workInProgress.type, nextProps = workInProgress.pendingProps, memoizedProps = workInProgress.memoizedProps;
|
||||
if (hasContextChanged$1()) null === nextProps && (nextProps = memoizedProps); else if (null === nextProps || memoizedProps === nextProps) return bailoutOnAlreadyFinishedWork(current, workInProgress);
|
||||
var nextChildren, unmaskedContext = getUnmaskedContext$1(workInProgress), context = getMaskedContext$1(workInProgress, unmaskedContext);
|
||||
return ReactCurrentOwner$2.current = workInProgress, ReactDebugCurrentFiber$4.setCurrentFiber(workInProgress, "render"),
|
||||
nextChildren = fn(nextProps, context), ReactDebugCurrentFiber$4.setCurrentFiber(workInProgress, null),
|
||||
return ReactCurrentOwner$2.current = workInProgress, ReactDebugCurrentFiber$4.setCurrentPhase("render"),
|
||||
nextChildren = fn(nextProps, context), ReactDebugCurrentFiber$4.setCurrentPhase(null),
|
||||
workInProgress.effectTag |= PerformedWork$1, reconcileChildren(current, workInProgress, nextChildren),
|
||||
memoizeProps(workInProgress, nextProps), workInProgress.child;
|
||||
}
|
||||
@@ -1718,8 +1687,8 @@ __DEV__ && function() {
|
||||
var instance = workInProgress.stateNode;
|
||||
ReactCurrentOwner$2.current = workInProgress;
|
||||
var nextChildren = void 0;
|
||||
return ReactDebugCurrentFiber$4.setCurrentFiber(workInProgress, "render"), nextChildren = instance.render(),
|
||||
ReactDebugCurrentFiber$4.setCurrentFiber(workInProgress, null), workInProgress.effectTag |= PerformedWork$1,
|
||||
return ReactDebugCurrentFiber$4.setCurrentPhase("render"), nextChildren = instance.render(),
|
||||
ReactDebugCurrentFiber$4.setCurrentPhase(null), workInProgress.effectTag |= PerformedWork$1,
|
||||
reconcileChildren(current, workInProgress, nextChildren), memoizeState(workInProgress, instance.state),
|
||||
memoizeProps(workInProgress, instance.props), hasContext && invalidateContextProvider$1(workInProgress, !0),
|
||||
workInProgress.child;
|
||||
@@ -1822,7 +1791,7 @@ __DEV__ && function() {
|
||||
}
|
||||
function beginWork(current, workInProgress, priorityLevel) {
|
||||
if (workInProgress.pendingWorkPriority === NoWork$3 || workInProgress.pendingWorkPriority > priorityLevel) return bailoutOnLowPriority(current, workInProgress);
|
||||
switch (ReactDebugCurrentFiber$4.setCurrentFiber(workInProgress, null), workInProgress.tag) {
|
||||
switch (workInProgress.tag) {
|
||||
case IndeterminateComponent$2:
|
||||
return mountIndeterminateComponent(current, workInProgress, priorityLevel);
|
||||
|
||||
@@ -1887,7 +1856,7 @@ __DEV__ && function() {
|
||||
beginWork: beginWork,
|
||||
beginFailedWork: beginFailedWork
|
||||
};
|
||||
}, reconcileChildFibers$2 = ReactChildFiber.reconcileChildFibers, popContextProvider$2 = ReactFiberContext.popContextProvider, IndeterminateComponent$3 = ReactTypeOfWork.IndeterminateComponent, FunctionalComponent$3 = ReactTypeOfWork.FunctionalComponent, ClassComponent$8 = ReactTypeOfWork.ClassComponent, HostRoot$7 = ReactTypeOfWork.HostRoot, HostComponent$7 = ReactTypeOfWork.HostComponent, HostText$5 = ReactTypeOfWork.HostText, HostPortal$6 = ReactTypeOfWork.HostPortal, CoroutineComponent$3 = ReactTypeOfWork.CoroutineComponent, CoroutineHandlerPhase$1 = ReactTypeOfWork.CoroutineHandlerPhase, YieldComponent$4 = ReactTypeOfWork.YieldComponent, Fragment$4 = ReactTypeOfWork.Fragment, Placement$4 = ReactTypeOfSideEffect.Placement, Ref$2 = ReactTypeOfSideEffect.Ref, Update$2 = ReactTypeOfSideEffect.Update, OffscreenPriority$2 = ReactPriorityLevel.OffscreenPriority, ReactDebugCurrentFiber$5 = ReactDebugCurrentFiber_1, ReactFiberCompleteWork = function(config, hostContext, hydrationContext) {
|
||||
}, reconcileChildFibers$2 = ReactChildFiber.reconcileChildFibers, popContextProvider$2 = ReactFiberContext.popContextProvider, popTopLevelContextObject$1 = ReactFiberContext.popTopLevelContextObject, IndeterminateComponent$3 = ReactTypeOfWork.IndeterminateComponent, FunctionalComponent$3 = ReactTypeOfWork.FunctionalComponent, ClassComponent$8 = ReactTypeOfWork.ClassComponent, HostRoot$7 = ReactTypeOfWork.HostRoot, HostComponent$7 = ReactTypeOfWork.HostComponent, HostText$5 = ReactTypeOfWork.HostText, HostPortal$6 = ReactTypeOfWork.HostPortal, CoroutineComponent$3 = ReactTypeOfWork.CoroutineComponent, CoroutineHandlerPhase$1 = ReactTypeOfWork.CoroutineHandlerPhase, YieldComponent$4 = ReactTypeOfWork.YieldComponent, Fragment$4 = ReactTypeOfWork.Fragment, Placement$4 = ReactTypeOfSideEffect.Placement, Ref$2 = ReactTypeOfSideEffect.Ref, Update$2 = ReactTypeOfSideEffect.Update, OffscreenPriority$2 = ReactPriorityLevel.OffscreenPriority, ReactFiberCompleteWork = function(config, hostContext, hydrationContext) {
|
||||
var createInstance = config.createInstance, createTextInstance = config.createTextInstance, appendInitialChild = config.appendInitialChild, finalizeInitialChildren = config.finalizeInitialChildren, prepareUpdate = config.prepareUpdate, getRootHostContainer = hostContext.getRootHostContainer, popHostContext = hostContext.popHostContext, getHostContext = hostContext.getHostContext, popHostContainer = hostContext.popHostContainer, prepareToHydrateHostInstance = hydrationContext.prepareToHydrateHostInstance, prepareToHydrateHostTextInstance = hydrationContext.prepareToHydrateHostTextInstance, popHydrationState = hydrationContext.popHydrationState;
|
||||
function markUpdate(workInProgress) {
|
||||
workInProgress.effectTag |= Update$2;
|
||||
@@ -1934,7 +1903,6 @@ __DEV__ && function() {
|
||||
}
|
||||
}
|
||||
function completeWork(current, workInProgress, renderPriority) {
|
||||
ReactDebugCurrentFiber$5.setCurrentFiber(workInProgress, null);
|
||||
var newProps = workInProgress.pendingProps;
|
||||
switch (null === newProps ? newProps = workInProgress.memoizedProps : workInProgress.pendingWorkPriority === OffscreenPriority$2 && renderPriority !== OffscreenPriority$2 || (workInProgress.pendingProps = null),
|
||||
workInProgress.tag) {
|
||||
@@ -2466,7 +2434,7 @@ __DEV__ && function() {
|
||||
}
|
||||
function commitAllHostEffects() {
|
||||
for (;null !== nextEffect; ) {
|
||||
ReactDebugCurrentFiber$3.setCurrentFiber(nextEffect, null), recordEffect();
|
||||
ReactDebugCurrentFiber$3.setCurrentFiber(nextEffect), recordEffect();
|
||||
var effectTag = nextEffect.effectTag;
|
||||
if (effectTag & ContentReset && config.resetTextContent(nextEffect.stateNode), effectTag & Ref) {
|
||||
var current = nextEffect.alternate;
|
||||
@@ -2545,7 +2513,11 @@ __DEV__ && function() {
|
||||
}
|
||||
function completeUnitOfWork(workInProgress) {
|
||||
for (;!0; ) {
|
||||
var current = workInProgress.alternate, next = completeWork(current, workInProgress, nextPriorityLevel), returnFiber = workInProgress.return, siblingFiber = workInProgress.sibling;
|
||||
var current = workInProgress.alternate;
|
||||
ReactDebugCurrentFiber$3.setCurrentFiber(workInProgress);
|
||||
var next = completeWork(current, workInProgress, nextPriorityLevel);
|
||||
ReactDebugCurrentFiber$3.resetCurrentFiber();
|
||||
var returnFiber = workInProgress.return, siblingFiber = workInProgress.sibling;
|
||||
if (resetWorkPriority(workInProgress, nextPriorityLevel), null !== next) return stopWorkTimer(workInProgress),
|
||||
!0 && ReactFiberInstrumentation$1.debugTool && ReactFiberInstrumentation$1.debugTool.onCompleteWork(workInProgress),
|
||||
next;
|
||||
@@ -2565,19 +2537,19 @@ __DEV__ && function() {
|
||||
}
|
||||
function performUnitOfWork(workInProgress) {
|
||||
var current = workInProgress.alternate;
|
||||
startWorkTimer(workInProgress);
|
||||
startWorkTimer(workInProgress), ReactDebugCurrentFiber$3.setCurrentFiber(workInProgress);
|
||||
var next = beginWork(current, workInProgress, nextPriorityLevel);
|
||||
return !0 && ReactFiberInstrumentation$1.debugTool && ReactFiberInstrumentation$1.debugTool.onBeginWork(workInProgress),
|
||||
return ReactDebugCurrentFiber$3.resetCurrentFiber(), !0 && ReactFiberInstrumentation$1.debugTool && ReactFiberInstrumentation$1.debugTool.onBeginWork(workInProgress),
|
||||
null === next && (next = completeUnitOfWork(workInProgress)), ReactCurrentOwner$1.current = null,
|
||||
ReactDebugCurrentFiber$3.resetCurrentFiber(), next;
|
||||
next;
|
||||
}
|
||||
function performFailedUnitOfWork(workInProgress) {
|
||||
var current = workInProgress.alternate;
|
||||
startWorkTimer(workInProgress);
|
||||
startWorkTimer(workInProgress), ReactDebugCurrentFiber$3.setCurrentFiber(workInProgress);
|
||||
var next = beginFailedWork(current, workInProgress, nextPriorityLevel);
|
||||
return !0 && ReactFiberInstrumentation$1.debugTool && ReactFiberInstrumentation$1.debugTool.onBeginWork(workInProgress),
|
||||
return ReactDebugCurrentFiber$3.resetCurrentFiber(), !0 && ReactFiberInstrumentation$1.debugTool && ReactFiberInstrumentation$1.debugTool.onBeginWork(workInProgress),
|
||||
null === next && (next = completeUnitOfWork(workInProgress)), ReactCurrentOwner$1.current = null,
|
||||
ReactDebugCurrentFiber$3.resetCurrentFiber(), next;
|
||||
next;
|
||||
}
|
||||
function performDeferredWork(deadline) {
|
||||
performWork(OffscreenPriority, deadline);
|
||||
@@ -2843,22 +2815,12 @@ __DEV__ && function() {
|
||||
flushSync: flushSync,
|
||||
deferredUpdates: deferredUpdates
|
||||
};
|
||||
}, getContextFiber = function(arg) {
|
||||
invariant(!1, "Missing injection for fiber getContextForSubtree");
|
||||
};
|
||||
}, addTopLevelUpdate = ReactFiberUpdateQueue.addTopLevelUpdate, findCurrentUnmaskedContext = ReactFiberContext.findCurrentUnmaskedContext, isContextProvider = ReactFiberContext.isContextProvider, processChildContext = ReactFiberContext.processChildContext, createFiberRoot = ReactFiberRoot.createFiberRoot, HostComponent = ReactTypeOfWork.HostComponent, warning$1 = require$$0, ReactFiberInstrumentation = ReactFiberInstrumentation_1, ReactDebugCurrentFiber = ReactDebugCurrentFiber_1, getComponentName = getComponentName_1, findCurrentHostFiber = ReactFiberTreeReflection.findCurrentHostFiber, findCurrentHostFiberWithNoPortals = ReactFiberTreeReflection.findCurrentHostFiberWithNoPortals;
|
||||
function getContextForSubtree(parentComponent) {
|
||||
if (!parentComponent) return emptyObject;
|
||||
var instance = ReactInstanceMap_1.get(parentComponent);
|
||||
return "number" == typeof instance.tag ? getContextFiber(instance) : instance._processChildContext(instance._context);
|
||||
var fiber = ReactInstanceMap_1.get(parentComponent), parentContext = findCurrentUnmaskedContext(fiber);
|
||||
return isContextProvider(fiber) ? processChildContext(fiber, parentContext) : parentContext;
|
||||
}
|
||||
getContextForSubtree._injectFiber = function(fn) {
|
||||
getContextFiber = fn;
|
||||
};
|
||||
var getContextForSubtree_1 = getContextForSubtree, addTopLevelUpdate = ReactFiberUpdateQueue.addTopLevelUpdate, findCurrentUnmaskedContext = ReactFiberContext.findCurrentUnmaskedContext, isContextProvider = ReactFiberContext.isContextProvider, processChildContext = ReactFiberContext.processChildContext, createFiberRoot = ReactFiberRoot.createFiberRoot, HostComponent = ReactTypeOfWork.HostComponent, warning$1 = require$$0, ReactFiberInstrumentation = ReactFiberInstrumentation_1, ReactDebugCurrentFiber = ReactDebugCurrentFiber_1, getComponentName = getComponentName_1, findCurrentHostFiber = ReactFiberTreeReflection.findCurrentHostFiber, findCurrentHostFiberWithNoPortals = ReactFiberTreeReflection.findCurrentHostFiberWithNoPortals;
|
||||
getContextForSubtree_1._injectFiber(function(fiber) {
|
||||
var parentContext = findCurrentUnmaskedContext(fiber);
|
||||
return isContextProvider(fiber) ? processChildContext(fiber, parentContext, !1) : parentContext;
|
||||
});
|
||||
function _classCallCheck(instance, Constructor) {
|
||||
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
||||
}
|
||||
@@ -3054,7 +3016,7 @@ __DEV__ && function() {
|
||||
updateContainer: function(element, container, parentComponent, callback) {
|
||||
var current = container.current;
|
||||
ReactFiberInstrumentation.debugTool && (null === current.alternate ? ReactFiberInstrumentation.debugTool.onMountContainer(container) : null === element ? ReactFiberInstrumentation.debugTool.onUnmountContainer(container) : ReactFiberInstrumentation.debugTool.onUpdateContainer(container));
|
||||
var context = getContextForSubtree_1(parentComponent);
|
||||
var context = getContextForSubtree(parentComponent);
|
||||
null === container.context ? container.context = context : container.pendingContext = context,
|
||||
scheduleTopLevelUpdate(current, element, callback);
|
||||
},
|
||||
@@ -3232,11 +3194,7 @@ __DEV__ && function() {
|
||||
};
|
||||
var ReactNativeFiberInspector = {
|
||||
getInspectorDataForViewTag: getInspectorDataForViewTag
|
||||
}, ReactVersion = "16.0.0-beta.5", ReactNativeFeatureFlags = require("ReactNativeFeatureFlags"), ReactCurrentOwner$3 = ReactGlobalSharedState_1.ReactCurrentOwner, injectedFindNode = ReactNativeFeatureFlags.useFiber ? function(fiber) {
|
||||
return ReactNativeFiberRenderer.findHostInstance(fiber);
|
||||
} : function(instance) {
|
||||
return instance;
|
||||
};
|
||||
}, ReactVersion = "16.0.0", ReactCurrentOwner$3 = ReactGlobalSharedState_1.ReactCurrentOwner, warning$11 = require$$0;
|
||||
function findNodeHandle(componentOrHandle) {
|
||||
var owner = ReactCurrentOwner$3.current;
|
||||
if (null !== owner && (require$$0(owner._warnedAboutRefsInRender, "%s is accessing findNodeHandle inside its render(). " + "render() should be a pure function of props and state. It should " + "never access something that requires stale data from the previous " + "render, such as refs. Move this logic to componentDidMount and " + "componentDidUpdate instead.", owner.getName() || "A component"),
|
||||
@@ -3346,22 +3304,11 @@ __DEV__ && function() {
|
||||
injectEventPluginsByName: EventPluginRegistry_1.injectEventPluginsByName
|
||||
},
|
||||
getListener: function(inst, registrationName) {
|
||||
var listener;
|
||||
if ("number" == typeof inst.tag) {
|
||||
var stateNode = inst.stateNode;
|
||||
if (!stateNode) return null;
|
||||
var props = EventPluginUtils_1.getFiberCurrentPropsFromNode(stateNode);
|
||||
if (!props) return null;
|
||||
if (listener = props[registrationName], shouldPreventMouseEvent(registrationName, inst.type, props)) return null;
|
||||
} else {
|
||||
var currentElement = inst._currentElement;
|
||||
if ("string" == typeof currentElement || "number" == typeof currentElement) return null;
|
||||
if (!inst._rootNodeID) return null;
|
||||
var _props = currentElement.props;
|
||||
if (listener = _props[registrationName], shouldPreventMouseEvent(registrationName, currentElement.type, _props)) return null;
|
||||
}
|
||||
return invariant(!listener || "function" == typeof listener, "Expected %s listener to be a function, instead got type %s", registrationName, typeof listener),
|
||||
listener;
|
||||
var listener, stateNode = inst.stateNode;
|
||||
if (!stateNode) return null;
|
||||
var props = EventPluginUtils_1.getFiberCurrentPropsFromNode(stateNode);
|
||||
return props ? (listener = props[registrationName], shouldPreventMouseEvent(registrationName, inst.type, props) ? null : (invariant(!listener || "function" == typeof listener, "Expected `%s` listener to be a function, instead got a value of `%s` type.", registrationName, typeof listener),
|
||||
listener)) : null;
|
||||
},
|
||||
extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
||||
for (var events, plugins = EventPluginRegistry_1.plugins, i = 0; i < plugins.length; i++) {
|
||||
@@ -3384,14 +3331,10 @@ __DEV__ && function() {
|
||||
}
|
||||
}, EventPluginHub_1 = EventPluginHub, HostComponent$11 = ReactTypeOfWork.HostComponent;
|
||||
function getParent(inst) {
|
||||
if (void 0 !== inst._hostParent) return inst._hostParent;
|
||||
if ("number" == typeof inst.tag) {
|
||||
do {
|
||||
inst = inst.return;
|
||||
} while (inst && inst.tag !== HostComponent$11);
|
||||
if (inst) return inst;
|
||||
}
|
||||
return null;
|
||||
do {
|
||||
inst = inst.return;
|
||||
} while (inst && inst.tag !== HostComponent$11);
|
||||
return inst || null;
|
||||
}
|
||||
function getLowestCommonAncestor(instA, instB) {
|
||||
for (var depthA = 0, tempA = instA; tempA; tempA = getParent(tempA)) depthA++;
|
||||
@@ -4047,430 +3990,7 @@ __DEV__ && function() {
|
||||
return "number" != typeof view && "window" !== view && (view = findNumericNodeHandle$2(view) || "window"),
|
||||
UIManager.__takeSnapshot(view, options);
|
||||
}
|
||||
var takeSnapshot_1 = takeSnapshot, ReactInvalidSetStateWarningHook = {}, warning$15 = require$$0, processingChildContext = !1, warnInvalidSetState = function() {
|
||||
warning$15(!processingChildContext, "setState(...): Cannot call setState() inside getChildContext()");
|
||||
};
|
||||
ReactInvalidSetStateWarningHook = {
|
||||
onBeginProcessingChildContext: function() {
|
||||
processingChildContext = !0;
|
||||
},
|
||||
onEndProcessingChildContext: function() {
|
||||
processingChildContext = !1;
|
||||
},
|
||||
onSetState: function() {
|
||||
warnInvalidSetState();
|
||||
}
|
||||
};
|
||||
var ReactInvalidSetStateWarningHook_1 = ReactInvalidSetStateWarningHook, ReactHostOperationHistoryHook = null, history = [];
|
||||
ReactHostOperationHistoryHook = {
|
||||
onHostOperation: function(operation) {
|
||||
history.push(operation);
|
||||
},
|
||||
clearHistory: function() {
|
||||
ReactHostOperationHistoryHook._preventClearing || (history = []);
|
||||
},
|
||||
getHistory: function() {
|
||||
return history;
|
||||
}
|
||||
};
|
||||
var ReactHostOperationHistoryHook_1 = ReactHostOperationHistoryHook, ReactComponentTreeHook = ReactGlobalSharedState_1.ReactComponentTreeHook, warning$14 = require$$0, ReactDebugTool = null, hooks = [], didHookThrowForEvent = {}, callHook = function(event, fn, context, arg1, arg2, arg3, arg4, arg5) {
|
||||
try {
|
||||
fn.call(context, arg1, arg2, arg3, arg4, arg5);
|
||||
} catch (e) {
|
||||
warning$14(didHookThrowForEvent[event], "Exception thrown by hook while handling %s: %s", event, e + "\n" + e.stack),
|
||||
didHookThrowForEvent[event] = !0;
|
||||
}
|
||||
}, emitEvent = function(event, arg1, arg2, arg3, arg4, arg5) {
|
||||
for (var i = 0; i < hooks.length; i++) {
|
||||
var hook = hooks[i], fn = hook[event];
|
||||
fn && callHook(event, fn, hook, arg1, arg2, arg3, arg4, arg5);
|
||||
}
|
||||
}, isProfiling = !1, flushHistory = [], lifeCycleTimerStack = [], currentFlushNesting = 0, currentFlushMeasurements = [], currentFlushStartTime = 0, currentTimerDebugID = null, currentTimerStartTime = 0, currentTimerNestedFlushDuration = 0, currentTimerType = null, lifeCycleTimerHasWarned = !1, clearHistory = function() {
|
||||
ReactComponentTreeHook.purgeUnmountedComponents(), ReactHostOperationHistoryHook_1.clearHistory();
|
||||
}, getTreeSnapshot = function(registeredIDs) {
|
||||
return registeredIDs.reduce(function(tree, id) {
|
||||
var ownerID = ReactComponentTreeHook.getOwnerID(id), parentID = ReactComponentTreeHook.getParentID(id);
|
||||
return tree[id] = {
|
||||
displayName: ReactComponentTreeHook.getDisplayName(id),
|
||||
text: ReactComponentTreeHook.getText(id),
|
||||
updateCount: ReactComponentTreeHook.getUpdateCount(id),
|
||||
childIDs: ReactComponentTreeHook.getChildIDs(id),
|
||||
ownerID: ownerID || parentID && ReactComponentTreeHook.getOwnerID(parentID) || 0,
|
||||
parentID: parentID
|
||||
}, tree;
|
||||
}, {});
|
||||
}, resetMeasurements = function() {
|
||||
var previousStartTime = currentFlushStartTime, previousMeasurements = currentFlushMeasurements, previousOperations = ReactHostOperationHistoryHook_1.getHistory();
|
||||
if (0 === currentFlushNesting) return currentFlushStartTime = 0, currentFlushMeasurements = [],
|
||||
void clearHistory();
|
||||
if (previousMeasurements.length || previousOperations.length) {
|
||||
var registeredIDs = ReactComponentTreeHook.getRegisteredIDs();
|
||||
flushHistory.push({
|
||||
duration: performanceNow() - previousStartTime,
|
||||
measurements: previousMeasurements || [],
|
||||
operations: previousOperations || [],
|
||||
treeSnapshot: getTreeSnapshot(registeredIDs)
|
||||
});
|
||||
}
|
||||
clearHistory(), currentFlushStartTime = performanceNow(), currentFlushMeasurements = [];
|
||||
}, checkDebugID = function(debugID) {
|
||||
arguments.length > 1 && void 0 !== arguments[1] && arguments[1] && 0 === debugID || debugID || warning$14(!1, "ReactDebugTool: debugID may not be empty.");
|
||||
}, beginLifeCycleTimer = function(debugID, timerType) {
|
||||
0 !== currentFlushNesting && (currentTimerType && !lifeCycleTimerHasWarned && (warning$14(!1, "There is an internal error in the React performance measurement code." + "\n\nDid not expect %s timer to start while %s timer is still in " + "progress for %s instance.", timerType, currentTimerType || "no", debugID === currentTimerDebugID ? "the same" : "another"),
|
||||
lifeCycleTimerHasWarned = !0), currentTimerStartTime = performanceNow(), currentTimerNestedFlushDuration = 0,
|
||||
currentTimerDebugID = debugID, currentTimerType = timerType);
|
||||
}, endLifeCycleTimer = function(debugID, timerType) {
|
||||
0 !== currentFlushNesting && (currentTimerType === timerType || lifeCycleTimerHasWarned || (warning$14(!1, "There is an internal error in the React performance measurement code. " + "We did not expect %s timer to stop while %s timer is still in " + "progress for %s instance. Please report this as a bug in React.", timerType, currentTimerType || "no", debugID === currentTimerDebugID ? "the same" : "another"),
|
||||
lifeCycleTimerHasWarned = !0), isProfiling && currentFlushMeasurements.push({
|
||||
timerType: timerType,
|
||||
instanceID: debugID,
|
||||
duration: performanceNow() - currentTimerStartTime - currentTimerNestedFlushDuration
|
||||
}), currentTimerStartTime = 0, currentTimerNestedFlushDuration = 0, currentTimerDebugID = null,
|
||||
currentTimerType = null);
|
||||
}, pauseCurrentLifeCycleTimer = function() {
|
||||
var currentTimer = {
|
||||
startTime: currentTimerStartTime,
|
||||
nestedFlushStartTime: performanceNow(),
|
||||
debugID: currentTimerDebugID,
|
||||
timerType: currentTimerType
|
||||
};
|
||||
lifeCycleTimerStack.push(currentTimer), currentTimerStartTime = 0, currentTimerNestedFlushDuration = 0,
|
||||
currentTimerDebugID = null, currentTimerType = null;
|
||||
}, resumeCurrentLifeCycleTimer = function() {
|
||||
var _lifeCycleTimerStack$ = lifeCycleTimerStack.pop(), startTime = _lifeCycleTimerStack$.startTime, nestedFlushStartTime = _lifeCycleTimerStack$.nestedFlushStartTime, debugID = _lifeCycleTimerStack$.debugID, timerType = _lifeCycleTimerStack$.timerType, nestedFlushDuration = performanceNow() - nestedFlushStartTime;
|
||||
currentTimerStartTime = startTime, currentTimerNestedFlushDuration += nestedFlushDuration,
|
||||
currentTimerDebugID = debugID, currentTimerType = timerType;
|
||||
}, lastMarkTimeStamp = 0, canUsePerformanceMeasure = "undefined" != typeof performance && "function" == typeof performance.mark && "function" == typeof performance.clearMarks && "function" == typeof performance.measure && "function" == typeof performance.clearMeasures, shouldMark = function(debugID) {
|
||||
if (!isProfiling || !canUsePerformanceMeasure) return !1;
|
||||
var element = ReactComponentTreeHook.getElement(debugID);
|
||||
return null != element && "object" == typeof element && !("string" == typeof element.type);
|
||||
}, markBegin = function(debugID, markType) {
|
||||
if (shouldMark(debugID)) {
|
||||
var markName = debugID + "::" + markType;
|
||||
lastMarkTimeStamp = performanceNow(), performance.mark(markName);
|
||||
}
|
||||
}, markEnd = function(debugID, markType) {
|
||||
if (shouldMark(debugID)) {
|
||||
var markName = debugID + "::" + markType, displayName = ReactComponentTreeHook.getDisplayName(debugID) || "Unknown";
|
||||
if (performanceNow() - lastMarkTimeStamp > .1) {
|
||||
var measurementName = displayName + " [" + markType + "]";
|
||||
performance.measure(measurementName, markName);
|
||||
}
|
||||
performance.clearMarks(markName), measurementName && performance.clearMeasures(measurementName);
|
||||
}
|
||||
};
|
||||
ReactDebugTool = {
|
||||
addHook: function(hook) {
|
||||
hooks.push(hook);
|
||||
},
|
||||
removeHook: function(hook) {
|
||||
for (var i = 0; i < hooks.length; i++) hooks[i] === hook && (hooks.splice(i, 1),
|
||||
i--);
|
||||
},
|
||||
isProfiling: function() {
|
||||
return isProfiling;
|
||||
},
|
||||
beginProfiling: function() {
|
||||
isProfiling || (isProfiling = !0, flushHistory.length = 0, resetMeasurements(),
|
||||
ReactDebugTool.addHook(ReactHostOperationHistoryHook_1));
|
||||
},
|
||||
endProfiling: function() {
|
||||
isProfiling && (isProfiling = !1, resetMeasurements(), ReactDebugTool.removeHook(ReactHostOperationHistoryHook_1));
|
||||
},
|
||||
getFlushHistory: function() {
|
||||
return flushHistory;
|
||||
},
|
||||
onBeginFlush: function() {
|
||||
currentFlushNesting++, resetMeasurements(), pauseCurrentLifeCycleTimer(), emitEvent("onBeginFlush");
|
||||
},
|
||||
onEndFlush: function() {
|
||||
resetMeasurements(), currentFlushNesting--, resumeCurrentLifeCycleTimer(), emitEvent("onEndFlush");
|
||||
},
|
||||
onBeginLifeCycleTimer: function(debugID, timerType) {
|
||||
checkDebugID(debugID), emitEvent("onBeginLifeCycleTimer", debugID, timerType), markBegin(debugID, timerType),
|
||||
beginLifeCycleTimer(debugID, timerType);
|
||||
},
|
||||
onEndLifeCycleTimer: function(debugID, timerType) {
|
||||
checkDebugID(debugID), endLifeCycleTimer(debugID, timerType), markEnd(debugID, timerType),
|
||||
emitEvent("onEndLifeCycleTimer", debugID, timerType);
|
||||
},
|
||||
onBeginProcessingChildContext: function() {
|
||||
emitEvent("onBeginProcessingChildContext");
|
||||
},
|
||||
onEndProcessingChildContext: function() {
|
||||
emitEvent("onEndProcessingChildContext");
|
||||
},
|
||||
onHostOperation: function(operation) {
|
||||
checkDebugID(operation.instanceID), emitEvent("onHostOperation", operation);
|
||||
},
|
||||
onSetState: function() {
|
||||
emitEvent("onSetState");
|
||||
},
|
||||
onSetChildren: function(debugID, childDebugIDs) {
|
||||
checkDebugID(debugID), childDebugIDs.forEach(checkDebugID), emitEvent("onSetChildren", debugID, childDebugIDs);
|
||||
},
|
||||
onBeforeMountComponent: function(debugID, element, parentDebugID) {
|
||||
checkDebugID(debugID), checkDebugID(parentDebugID, !0), emitEvent("onBeforeMountComponent", debugID, element, parentDebugID),
|
||||
markBegin(debugID, "mount");
|
||||
},
|
||||
onMountComponent: function(debugID) {
|
||||
checkDebugID(debugID), markEnd(debugID, "mount"), emitEvent("onMountComponent", debugID);
|
||||
},
|
||||
onBeforeUpdateComponent: function(debugID, element) {
|
||||
checkDebugID(debugID), emitEvent("onBeforeUpdateComponent", debugID, element), markBegin(debugID, "update");
|
||||
},
|
||||
onUpdateComponent: function(debugID) {
|
||||
checkDebugID(debugID), markEnd(debugID, "update"), emitEvent("onUpdateComponent", debugID);
|
||||
},
|
||||
onBeforeUnmountComponent: function(debugID) {
|
||||
checkDebugID(debugID), emitEvent("onBeforeUnmountComponent", debugID), markBegin(debugID, "unmount");
|
||||
},
|
||||
onUnmountComponent: function(debugID) {
|
||||
checkDebugID(debugID), markEnd(debugID, "unmount"), emitEvent("onUnmountComponent", debugID);
|
||||
},
|
||||
onTestEvent: function() {
|
||||
emitEvent("onTestEvent");
|
||||
}
|
||||
}, ReactDebugTool.addHook(ReactInvalidSetStateWarningHook_1), ReactDebugTool.addHook(ReactComponentTreeHook),
|
||||
/[?&]react_perf\b/.test(ExecutionEnvironment.canUseDOM && window.location.href || "") && ReactDebugTool.beginProfiling();
|
||||
var ReactDebugTool_1 = ReactDebugTool, lowPriorityWarning = function() {}, printWarning = function(format) {
|
||||
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];
|
||||
var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() {
|
||||
return args[argIndex++];
|
||||
});
|
||||
"undefined" != typeof console && console.warn(message);
|
||||
try {
|
||||
throw new Error(message);
|
||||
} catch (x) {}
|
||||
};
|
||||
lowPriorityWarning = function(condition, format) {
|
||||
if (void 0 === format) throw new Error("`warning(condition, format, ...args)` requires a warning " + "message argument");
|
||||
if (!condition) {
|
||||
for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2];
|
||||
printWarning.apply(void 0, [ format ].concat(args));
|
||||
}
|
||||
};
|
||||
var lowPriorityWarning_1 = lowPriorityWarning;
|
||||
function roundFloat(val) {
|
||||
var base = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 2, n = Math.pow(10, base);
|
||||
return Math.floor(val * n) / n;
|
||||
}
|
||||
function consoleTable(table) {
|
||||
console.table(table);
|
||||
}
|
||||
function getLastMeasurements() {
|
||||
return ReactDebugTool_1.getFlushHistory();
|
||||
}
|
||||
function getExclusive() {
|
||||
var flushHistory = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : getLastMeasurements(), aggregatedStats = {}, affectedIDs = {};
|
||||
function updateAggregatedStats(treeSnapshot, instanceID, timerType, applyUpdate) {
|
||||
var displayName = treeSnapshot[instanceID].displayName, key = displayName, stats = aggregatedStats[key];
|
||||
stats || (affectedIDs[key] = {}, stats = aggregatedStats[key] = {
|
||||
key: key,
|
||||
instanceCount: 0,
|
||||
counts: {},
|
||||
durations: {},
|
||||
totalDuration: 0
|
||||
}), stats.durations[timerType] || (stats.durations[timerType] = 0), stats.counts[timerType] || (stats.counts[timerType] = 0),
|
||||
affectedIDs[key][instanceID] = !0, applyUpdate(stats);
|
||||
}
|
||||
return flushHistory.forEach(function(flush) {
|
||||
var measurements = flush.measurements, treeSnapshot = flush.treeSnapshot;
|
||||
measurements.forEach(function(measurement) {
|
||||
var duration = measurement.duration, instanceID = measurement.instanceID, timerType = measurement.timerType;
|
||||
updateAggregatedStats(treeSnapshot, instanceID, timerType, function(stats) {
|
||||
stats.totalDuration += duration, stats.durations[timerType] += duration, stats.counts[timerType]++;
|
||||
});
|
||||
});
|
||||
}), Object.keys(aggregatedStats).map(function(key) {
|
||||
return Object.assign({}, aggregatedStats[key], {
|
||||
instanceCount: Object.keys(affectedIDs[key]).length
|
||||
});
|
||||
}).sort(function(a, b) {
|
||||
return b.totalDuration - a.totalDuration;
|
||||
});
|
||||
}
|
||||
function getInclusive() {
|
||||
var flushHistory = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : getLastMeasurements(), aggregatedStats = {}, affectedIDs = {};
|
||||
function updateAggregatedStats(treeSnapshot, instanceID, applyUpdate) {
|
||||
var _treeSnapshot$instanc = treeSnapshot[instanceID], displayName = _treeSnapshot$instanc.displayName, ownerID = _treeSnapshot$instanc.ownerID, owner = treeSnapshot[ownerID], key = (owner ? owner.displayName + " > " : "") + displayName, stats = aggregatedStats[key];
|
||||
stats || (affectedIDs[key] = {}, stats = aggregatedStats[key] = {
|
||||
key: key,
|
||||
instanceCount: 0,
|
||||
inclusiveRenderDuration: 0,
|
||||
renderCount: 0
|
||||
}), affectedIDs[key][instanceID] = !0, applyUpdate(stats);
|
||||
}
|
||||
var isCompositeByID = {};
|
||||
return flushHistory.forEach(function(flush) {
|
||||
flush.measurements.forEach(function(measurement) {
|
||||
var instanceID = measurement.instanceID;
|
||||
"render" === measurement.timerType && (isCompositeByID[instanceID] = !0);
|
||||
});
|
||||
}), flushHistory.forEach(function(flush) {
|
||||
var measurements = flush.measurements, treeSnapshot = flush.treeSnapshot;
|
||||
measurements.forEach(function(measurement) {
|
||||
var duration = measurement.duration, instanceID = measurement.instanceID;
|
||||
if ("render" === measurement.timerType) {
|
||||
updateAggregatedStats(treeSnapshot, instanceID, function(stats) {
|
||||
stats.renderCount++;
|
||||
});
|
||||
for (var nextParentID = instanceID; nextParentID; ) isCompositeByID[nextParentID] && updateAggregatedStats(treeSnapshot, nextParentID, function(stats) {
|
||||
stats.inclusiveRenderDuration += duration;
|
||||
}), nextParentID = treeSnapshot[nextParentID].parentID;
|
||||
}
|
||||
});
|
||||
}), Object.keys(aggregatedStats).map(function(key) {
|
||||
return Object.assign({}, aggregatedStats[key], {
|
||||
instanceCount: Object.keys(affectedIDs[key]).length
|
||||
});
|
||||
}).sort(function(a, b) {
|
||||
return b.inclusiveRenderDuration - a.inclusiveRenderDuration;
|
||||
});
|
||||
}
|
||||
function getWasted() {
|
||||
var flushHistory = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : getLastMeasurements(), aggregatedStats = {}, affectedIDs = {};
|
||||
function updateAggregatedStats(treeSnapshot, instanceID, applyUpdate) {
|
||||
var _treeSnapshot$instanc2 = treeSnapshot[instanceID], displayName = _treeSnapshot$instanc2.displayName, ownerID = _treeSnapshot$instanc2.ownerID, owner = treeSnapshot[ownerID], key = (owner ? owner.displayName + " > " : "") + displayName, stats = aggregatedStats[key];
|
||||
stats || (affectedIDs[key] = {}, stats = aggregatedStats[key] = {
|
||||
key: key,
|
||||
instanceCount: 0,
|
||||
inclusiveRenderDuration: 0,
|
||||
renderCount: 0
|
||||
}), affectedIDs[key][instanceID] = !0, applyUpdate(stats);
|
||||
}
|
||||
return flushHistory.forEach(function(flush) {
|
||||
var measurements = flush.measurements, treeSnapshot = flush.treeSnapshot, operations = flush.operations, isDefinitelyNotWastedByID = {};
|
||||
operations.forEach(function(operation) {
|
||||
for (var instanceID = operation.instanceID, nextParentID = instanceID; nextParentID; ) isDefinitelyNotWastedByID[nextParentID] = !0,
|
||||
nextParentID = treeSnapshot[nextParentID].parentID;
|
||||
});
|
||||
var renderedCompositeIDs = {};
|
||||
measurements.forEach(function(measurement) {
|
||||
var instanceID = measurement.instanceID;
|
||||
"render" === measurement.timerType && (renderedCompositeIDs[instanceID] = !0);
|
||||
}), measurements.forEach(function(measurement) {
|
||||
var duration = measurement.duration, instanceID = measurement.instanceID;
|
||||
if ("render" === measurement.timerType) {
|
||||
var updateCount = treeSnapshot[instanceID].updateCount;
|
||||
if (!isDefinitelyNotWastedByID[instanceID] && 0 !== updateCount) {
|
||||
updateAggregatedStats(treeSnapshot, instanceID, function(stats) {
|
||||
stats.renderCount++;
|
||||
});
|
||||
for (var nextParentID = instanceID; nextParentID; ) renderedCompositeIDs[nextParentID] && !isDefinitelyNotWastedByID[nextParentID] && updateAggregatedStats(treeSnapshot, nextParentID, function(stats) {
|
||||
stats.inclusiveRenderDuration += duration;
|
||||
}), nextParentID = treeSnapshot[nextParentID].parentID;
|
||||
}
|
||||
}
|
||||
});
|
||||
}), Object.keys(aggregatedStats).map(function(key) {
|
||||
return Object.assign({}, aggregatedStats[key], {
|
||||
instanceCount: Object.keys(affectedIDs[key]).length
|
||||
});
|
||||
}).sort(function(a, b) {
|
||||
return b.inclusiveRenderDuration - a.inclusiveRenderDuration;
|
||||
});
|
||||
}
|
||||
function getOperations() {
|
||||
var flushHistory = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : getLastMeasurements(), stats = [];
|
||||
return flushHistory.forEach(function(flush, flushIndex) {
|
||||
var operations = flush.operations, treeSnapshot = flush.treeSnapshot;
|
||||
operations.forEach(function(operation) {
|
||||
var instanceID = operation.instanceID, type = operation.type, payload = operation.payload, _treeSnapshot$instanc3 = treeSnapshot[instanceID], displayName = _treeSnapshot$instanc3.displayName, ownerID = _treeSnapshot$instanc3.ownerID, owner = treeSnapshot[ownerID], key = (owner ? owner.displayName + " > " : "") + displayName;
|
||||
stats.push({
|
||||
flushIndex: flushIndex,
|
||||
instanceID: instanceID,
|
||||
key: key,
|
||||
type: type,
|
||||
ownerID: ownerID,
|
||||
payload: payload
|
||||
});
|
||||
});
|
||||
}), stats;
|
||||
}
|
||||
function printExclusive(flushHistory) {
|
||||
consoleTable(getExclusive(flushHistory).map(function(item) {
|
||||
var key = item.key, instanceCount = item.instanceCount, totalDuration = item.totalDuration, renderCount = item.counts.render || 0, renderDuration = item.durations.render || 0;
|
||||
return {
|
||||
Component: key,
|
||||
"Total time (ms)": roundFloat(totalDuration),
|
||||
"Instance count": instanceCount,
|
||||
"Total render time (ms)": roundFloat(renderDuration),
|
||||
"Average render time (ms)": renderCount ? roundFloat(renderDuration / renderCount) : void 0,
|
||||
"Render count": renderCount,
|
||||
"Total lifecycle time (ms)": roundFloat(totalDuration - renderDuration)
|
||||
};
|
||||
}));
|
||||
}
|
||||
function printInclusive(flushHistory) {
|
||||
consoleTable(getInclusive(flushHistory).map(function(item) {
|
||||
var key = item.key, instanceCount = item.instanceCount, inclusiveRenderDuration = item.inclusiveRenderDuration, renderCount = item.renderCount;
|
||||
return {
|
||||
"Owner > Component": key,
|
||||
"Inclusive render time (ms)": roundFloat(inclusiveRenderDuration),
|
||||
"Instance count": instanceCount,
|
||||
"Render count": renderCount
|
||||
};
|
||||
}));
|
||||
}
|
||||
function printWasted(flushHistory) {
|
||||
consoleTable(getWasted(flushHistory).map(function(item) {
|
||||
var key = item.key, instanceCount = item.instanceCount, inclusiveRenderDuration = item.inclusiveRenderDuration, renderCount = item.renderCount;
|
||||
return {
|
||||
"Owner > Component": key,
|
||||
"Inclusive wasted time (ms)": roundFloat(inclusiveRenderDuration),
|
||||
"Instance count": instanceCount,
|
||||
"Render count": renderCount
|
||||
};
|
||||
}));
|
||||
}
|
||||
function printOperations(flushHistory) {
|
||||
consoleTable(getOperations(flushHistory).map(function(stat) {
|
||||
return {
|
||||
"Owner > Node": stat.key,
|
||||
Operation: stat.type,
|
||||
Payload: "object" == typeof stat.payload ? JSON.stringify(stat.payload) : stat.payload,
|
||||
"Flush index": stat.flushIndex,
|
||||
"Owner Component ID": stat.ownerID,
|
||||
"DOM Component ID": stat.instanceID
|
||||
};
|
||||
}));
|
||||
}
|
||||
var warnedAboutPrintDOM = !1;
|
||||
function printDOM(measurements) {
|
||||
return lowPriorityWarning_1(warnedAboutPrintDOM, "`ReactPerf.printDOM(...)` is deprecated. Use " + "`ReactPerf.printOperations(...)` instead."),
|
||||
warnedAboutPrintDOM = !0, printOperations(measurements);
|
||||
}
|
||||
var warnedAboutGetMeasurementsSummaryMap = !1;
|
||||
function getMeasurementsSummaryMap(measurements) {
|
||||
return lowPriorityWarning_1(warnedAboutGetMeasurementsSummaryMap, "`ReactPerf.getMeasurementsSummaryMap(...)` is deprecated. Use " + "`ReactPerf.getWasted(...)` instead."),
|
||||
warnedAboutGetMeasurementsSummaryMap = !0, getWasted(measurements);
|
||||
}
|
||||
function start() {
|
||||
ReactDebugTool_1.beginProfiling();
|
||||
}
|
||||
function stop() {
|
||||
ReactDebugTool_1.endProfiling();
|
||||
}
|
||||
function isRunning() {
|
||||
return ReactDebugTool_1.isProfiling();
|
||||
}
|
||||
var ReactPerfAnalysis = {
|
||||
getLastMeasurements: getLastMeasurements,
|
||||
getExclusive: getExclusive,
|
||||
getInclusive: getInclusive,
|
||||
getWasted: getWasted,
|
||||
getOperations: getOperations,
|
||||
printExclusive: printExclusive,
|
||||
printInclusive: printInclusive,
|
||||
printWasted: printWasted,
|
||||
printOperations: printOperations,
|
||||
start: start,
|
||||
stop: stop,
|
||||
isRunning: isRunning,
|
||||
printDOM: printDOM,
|
||||
getMeasurementsSummaryMap: getMeasurementsSummaryMap
|
||||
}, ReactPerf = ReactPerfAnalysis, injectInternals = ReactFiberDevToolsHook.injectInternals;
|
||||
var takeSnapshot_1 = takeSnapshot, injectInternals = ReactFiberDevToolsHook.injectInternals;
|
||||
ReactGenericBatching_1.injection.injectFiberBatchedUpdates(ReactNativeFiberRenderer.batchedUpdates);
|
||||
var roots = new Map();
|
||||
ReactFiberErrorLogger.injection.injectDialog(ReactNativeFiberErrorDialog_1.showDialog);
|
||||
@@ -4508,8 +4028,16 @@ __DEV__ && function() {
|
||||
}
|
||||
};
|
||||
Object.assign(ReactNativeFiber.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, {
|
||||
ReactDebugTool: ReactDebugTool_1,
|
||||
ReactPerf: ReactPerf
|
||||
ReactDebugTool: {
|
||||
addHook: function() {},
|
||||
removeHook: function() {}
|
||||
},
|
||||
ReactPerf: {
|
||||
start: function() {},
|
||||
stop: function() {},
|
||||
printInclusive: function() {},
|
||||
printWasted: function() {}
|
||||
}
|
||||
}), injectInternals({
|
||||
findFiberByHostInstance: ReactNativeComponentTree_1.getClosestInstanceFromNode,
|
||||
findHostInstanceByFiber: ReactNativeFiberRenderer.findHostInstance,
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @noflow
|
||||
* @providesModule ReactNativeFiber-prod
|
||||
@@ -170,13 +168,9 @@ var EventPluginUtils = {
|
||||
function restoreStateOfTarget(target) {
|
||||
var internalInstance = EventPluginUtils_1.getInstanceFromNode(target);
|
||||
if (internalInstance) {
|
||||
if ("number" == typeof internalInstance.tag) {
|
||||
invariant(fiberHostComponent && "function" == typeof fiberHostComponent.restoreControlledState, "Fiber needs to be injected to handle a fiber target for controlled " + "events. This error is likely caused by a bug in React. Please file an issue.");
|
||||
var props = EventPluginUtils_1.getFiberCurrentPropsFromNode(internalInstance.stateNode);
|
||||
return void fiberHostComponent.restoreControlledState(internalInstance.stateNode, internalInstance.type, props);
|
||||
}
|
||||
invariant("function" == typeof internalInstance.restoreControlledState, "The internal instance must be a React host component. " + "This error is likely caused by a bug in React. Please file an issue."),
|
||||
internalInstance.restoreControlledState();
|
||||
invariant(fiberHostComponent && "function" == typeof fiberHostComponent.restoreControlledState, "Fiber needs to be injected to handle a fiber target for controlled " + "events. This error is likely caused by a bug in React. Please file an issue.");
|
||||
var props = EventPluginUtils_1.getFiberCurrentPropsFromNode(internalInstance.stateNode);
|
||||
fiberHostComponent.restoreControlledState(internalInstance.stateNode, internalInstance.type, props);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,18 +185,12 @@ var ReactControlledComponent = {
|
||||
if (restoreTarget = null, restoreQueue = null, restoreStateOfTarget(target), queuedTargets) for (var i = 0; i < queuedTargets.length; i++) restoreStateOfTarget(queuedTargets[i]);
|
||||
}
|
||||
}
|
||||
}, ReactControlledComponent_1 = ReactControlledComponent, stackBatchedUpdates = function(fn, a, b, c, d, e) {
|
||||
return fn(a, b, c, d, e);
|
||||
}, fiberBatchedUpdates = function(fn, bookkeeping) {
|
||||
}, ReactControlledComponent_1 = ReactControlledComponent, fiberBatchedUpdates = function(fn, bookkeeping) {
|
||||
return fn(bookkeeping);
|
||||
};
|
||||
|
||||
function performFiberBatchedUpdates(fn, bookkeeping) {
|
||||
return fiberBatchedUpdates(fn, bookkeeping);
|
||||
}
|
||||
|
||||
function batchedUpdates(fn, bookkeeping) {
|
||||
return stackBatchedUpdates(performFiberBatchedUpdates, fn, bookkeeping);
|
||||
return fiberBatchedUpdates(fn, bookkeeping);
|
||||
}
|
||||
|
||||
var isNestingBatched = !1;
|
||||
@@ -218,9 +206,6 @@ function batchedUpdatesWithControlledComponents(fn, bookkeeping) {
|
||||
}
|
||||
|
||||
var ReactGenericBatchingInjection = {
|
||||
injectStackBatchedUpdates: function(_batchedUpdates) {
|
||||
stackBatchedUpdates = _batchedUpdates;
|
||||
},
|
||||
injectFiberBatchedUpdates: function(_batchedUpdates) {
|
||||
fiberBatchedUpdates = _batchedUpdates;
|
||||
}
|
||||
@@ -260,25 +245,10 @@ var showDialog$1 = ReactNativeFiberErrorDialog, ReactNativeFiberErrorDialog_1 =
|
||||
REACT_PORTAL_TYPE: REACT_PORTAL_TYPE_1
|
||||
}, instanceCache = {}, instanceProps = {};
|
||||
|
||||
function getRenderedHostOrTextFromComponent(component) {
|
||||
for (var rendered; rendered = component._renderedComponent; ) component = rendered;
|
||||
return component;
|
||||
}
|
||||
|
||||
function precacheNode(inst, tag) {
|
||||
var nativeInst = getRenderedHostOrTextFromComponent(inst);
|
||||
instanceCache[tag] = nativeInst;
|
||||
}
|
||||
|
||||
function precacheFiberNode(hostInst, tag) {
|
||||
instanceCache[tag] = hostInst;
|
||||
}
|
||||
|
||||
function uncacheNode(inst) {
|
||||
var tag = inst._rootNodeID;
|
||||
tag && delete instanceCache[tag];
|
||||
}
|
||||
|
||||
function uncacheFiberNode(tag) {
|
||||
delete instanceCache[tag], delete instanceProps[tag];
|
||||
}
|
||||
@@ -305,9 +275,7 @@ var ReactNativeComponentTree = {
|
||||
getInstanceFromNode: getInstanceFromTag,
|
||||
getNodeFromInstance: getTagFromInstance,
|
||||
precacheFiberNode: precacheFiberNode,
|
||||
precacheNode: precacheNode,
|
||||
uncacheFiberNode: uncacheFiberNode,
|
||||
uncacheNode: uncacheNode,
|
||||
getFiberCurrentPropsFromNode: getFiberCurrentPropsFromNode,
|
||||
updateFiberProps: updateFiberProps
|
||||
}, ReactNativeComponentTree_1 = ReactNativeComponentTree, commonjsGlobal = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {}, ReactFeatureFlags = {
|
||||
@@ -526,16 +494,9 @@ var commitCallbacks_1 = commitCallbacks, ReactFiberUpdateQueue = {
|
||||
commitCallbacks: commitCallbacks_1
|
||||
};
|
||||
|
||||
function getComponentName$1(instanceOrFiber) {
|
||||
if ("function" == typeof instanceOrFiber.getName) {
|
||||
return instanceOrFiber.getName();
|
||||
}
|
||||
if ("number" == typeof instanceOrFiber.tag) {
|
||||
var fiber = instanceOrFiber, type = fiber.type;
|
||||
if ("string" == typeof type) return type;
|
||||
if ("function" == typeof type) return type.displayName || type.name;
|
||||
}
|
||||
return null;
|
||||
function getComponentName$1(fiber) {
|
||||
var type = fiber.type;
|
||||
return "string" == typeof type ? type : "function" == typeof type ? type.displayName || type.name : null;
|
||||
}
|
||||
|
||||
var getComponentName_1 = getComponentName$1, ReactInstanceMap = {
|
||||
@@ -726,7 +687,7 @@ var popContextProvider_1 = popContextProvider, pushTopLevelContextObject = funct
|
||||
push(contextStackCursor, context, fiber), push(didPerformWorkStackCursor, didChange, fiber);
|
||||
};
|
||||
|
||||
function processChildContext$1(fiber, parentContext, isReconciling) {
|
||||
function processChildContext$1(fiber, parentContext) {
|
||||
var instance = fiber.stateNode, childContextTypes = fiber.type.childContextTypes;
|
||||
if ("function" != typeof instance.getChildContext) return parentContext;
|
||||
var childContext = void 0;
|
||||
@@ -745,7 +706,7 @@ var processChildContext_1 = processChildContext$1, pushContextProvider = functio
|
||||
var instance = workInProgress.stateNode;
|
||||
if (invariant(instance, "Expected to have an instance by this point. " + "This error is likely caused by a bug in React. Please file an issue."),
|
||||
didChange) {
|
||||
var mergedContext = processChildContext$1(workInProgress, previousContext, !0);
|
||||
var mergedContext = processChildContext$1(workInProgress, previousContext);
|
||||
instance.__reactInternalMemoizedMergedChildContext = mergedContext, pop(didPerformWorkStackCursor, workInProgress),
|
||||
pop(contextStackCursor, workInProgress), push(contextStackCursor, mergedContext, workInProgress),
|
||||
push(didPerformWorkStackCursor, didChange, workInProgress);
|
||||
@@ -958,11 +919,11 @@ function coerceRef(current, element) {
|
||||
if (null !== mixedRef && "function" != typeof mixedRef) {
|
||||
if (element._owner) {
|
||||
var owner = element._owner, inst = void 0;
|
||||
if (owner) if ("number" == typeof owner.tag) {
|
||||
if (owner) {
|
||||
var ownerFiber = owner;
|
||||
invariant(ownerFiber.tag === ClassComponent$7, "Stateless function components cannot have refs."),
|
||||
inst = ownerFiber.stateNode;
|
||||
} else inst = owner.getPublicInstance();
|
||||
}
|
||||
invariant(inst, "Missing owner for string ref %s. This error is likely caused by a " + "bug in React. Please file an issue.", mixedRef);
|
||||
var stringRef = "" + mixedRef;
|
||||
if (null !== current && null !== current.ref && current.ref._stringRef === stringRef) return current.ref;
|
||||
@@ -2552,27 +2513,14 @@ var injectInternals_1 = injectInternals$1, onCommitRoot_1 = onCommitRoot$1, onCo
|
||||
flushSync: flushSync,
|
||||
deferredUpdates: deferredUpdates
|
||||
};
|
||||
}, getContextFiber = function(arg) {
|
||||
invariant(!1, "Missing injection for fiber getContextForSubtree");
|
||||
};
|
||||
}, addTopLevelUpdate = ReactFiberUpdateQueue.addTopLevelUpdate, findCurrentUnmaskedContext = ReactFiberContext.findCurrentUnmaskedContext, isContextProvider = ReactFiberContext.isContextProvider, processChildContext = ReactFiberContext.processChildContext, createFiberRoot = ReactFiberRoot.createFiberRoot, HostComponent = ReactTypeOfWork.HostComponent, findCurrentHostFiber = ReactFiberTreeReflection.findCurrentHostFiber, findCurrentHostFiberWithNoPortals = ReactFiberTreeReflection.findCurrentHostFiberWithNoPortals;
|
||||
|
||||
function getContextForSubtree(parentComponent) {
|
||||
if (!parentComponent) return emptyObject;
|
||||
var instance = ReactInstanceMap_1.get(parentComponent);
|
||||
return "number" == typeof instance.tag ? getContextFiber(instance) : instance._processChildContext(instance._context);
|
||||
var fiber = ReactInstanceMap_1.get(parentComponent), parentContext = findCurrentUnmaskedContext(fiber);
|
||||
return isContextProvider(fiber) ? processChildContext(fiber, parentContext) : parentContext;
|
||||
}
|
||||
|
||||
getContextForSubtree._injectFiber = function(fn) {
|
||||
getContextFiber = fn;
|
||||
};
|
||||
|
||||
var getContextForSubtree_1 = getContextForSubtree, addTopLevelUpdate = ReactFiberUpdateQueue.addTopLevelUpdate, findCurrentUnmaskedContext = ReactFiberContext.findCurrentUnmaskedContext, isContextProvider = ReactFiberContext.isContextProvider, processChildContext = ReactFiberContext.processChildContext, createFiberRoot = ReactFiberRoot.createFiberRoot, HostComponent = ReactTypeOfWork.HostComponent, findCurrentHostFiber = ReactFiberTreeReflection.findCurrentHostFiber, findCurrentHostFiberWithNoPortals = ReactFiberTreeReflection.findCurrentHostFiberWithNoPortals;
|
||||
|
||||
getContextForSubtree_1._injectFiber(function(fiber) {
|
||||
var parentContext = findCurrentUnmaskedContext(fiber);
|
||||
return isContextProvider(fiber) ? processChildContext(fiber, parentContext, !1) : parentContext;
|
||||
});
|
||||
|
||||
var ReactFiberReconciler = function(config) {
|
||||
var getPublicInstance = config.getPublicInstance, _ReactFiberScheduler = ReactFiberScheduler(config), scheduleUpdate = _ReactFiberScheduler.scheduleUpdate, getPriorityContext = _ReactFiberScheduler.getPriorityContext, performWithPriority = _ReactFiberScheduler.performWithPriority, batchedUpdates = _ReactFiberScheduler.batchedUpdates, unbatchedUpdates = _ReactFiberScheduler.unbatchedUpdates, flushSync = _ReactFiberScheduler.flushSync, deferredUpdates = _ReactFiberScheduler.deferredUpdates;
|
||||
function scheduleTopLevelUpdate(current, element, callback) {
|
||||
@@ -2587,7 +2535,7 @@ var ReactFiberReconciler = function(config) {
|
||||
return createFiberRoot(containerInfo);
|
||||
},
|
||||
updateContainer: function(element, container, parentComponent, callback) {
|
||||
var current = container.current, context = getContextForSubtree_1(parentComponent);
|
||||
var current = container.current, context = getContextForSubtree(parentComponent);
|
||||
null === container.context ? container.context = context : container.pendingContext = context,
|
||||
scheduleTopLevelUpdate(current, element, callback);
|
||||
},
|
||||
@@ -2915,11 +2863,7 @@ getInspectorDataForViewTag = function() {
|
||||
|
||||
var ReactNativeFiberInspector = {
|
||||
getInspectorDataForViewTag: getInspectorDataForViewTag
|
||||
}, ReactVersion = "16.0.0-beta.5", ReactNativeFeatureFlags = require("ReactNativeFeatureFlags"), injectedFindNode = ReactNativeFeatureFlags.useFiber ? function(fiber) {
|
||||
return ReactNativeFiberRenderer.findHostInstance(fiber);
|
||||
} : function(instance) {
|
||||
return instance;
|
||||
};
|
||||
}, ReactVersion = "16.0.0";
|
||||
|
||||
function findNodeHandle(componentOrHandle) {
|
||||
if (null == componentOrHandle) return null;
|
||||
@@ -3037,22 +2981,11 @@ var EventPluginHub = {
|
||||
injectEventPluginsByName: EventPluginRegistry_1.injectEventPluginsByName
|
||||
},
|
||||
getListener: function(inst, registrationName) {
|
||||
var listener;
|
||||
if ("number" == typeof inst.tag) {
|
||||
var stateNode = inst.stateNode;
|
||||
if (!stateNode) return null;
|
||||
var props = EventPluginUtils_1.getFiberCurrentPropsFromNode(stateNode);
|
||||
if (!props) return null;
|
||||
if (listener = props[registrationName], shouldPreventMouseEvent(registrationName, inst.type, props)) return null;
|
||||
} else {
|
||||
var currentElement = inst._currentElement;
|
||||
if ("string" == typeof currentElement || "number" == typeof currentElement) return null;
|
||||
if (!inst._rootNodeID) return null;
|
||||
var _props = currentElement.props;
|
||||
if (listener = _props[registrationName], shouldPreventMouseEvent(registrationName, currentElement.type, _props)) return null;
|
||||
}
|
||||
return invariant(!listener || "function" == typeof listener, "Expected %s listener to be a function, instead got type %s", registrationName, typeof listener),
|
||||
listener;
|
||||
var listener, stateNode = inst.stateNode;
|
||||
if (!stateNode) return null;
|
||||
var props = EventPluginUtils_1.getFiberCurrentPropsFromNode(stateNode);
|
||||
return props ? (listener = props[registrationName], shouldPreventMouseEvent(registrationName, inst.type, props) ? null : (invariant(!listener || "function" == typeof listener, "Expected `%s` listener to be a function, instead got a value of `%s` type.", registrationName, typeof listener),
|
||||
listener)) : null;
|
||||
},
|
||||
extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
||||
for (var events, plugins = EventPluginRegistry_1.plugins, i = 0; i < plugins.length; i++) {
|
||||
@@ -3076,14 +3009,10 @@ var EventPluginHub = {
|
||||
}, EventPluginHub_1 = EventPluginHub, HostComponent$10 = ReactTypeOfWork.HostComponent;
|
||||
|
||||
function getParent(inst) {
|
||||
if (void 0 !== inst._hostParent) return inst._hostParent;
|
||||
if ("number" == typeof inst.tag) {
|
||||
do {
|
||||
inst = inst.return;
|
||||
} while (inst && inst.tag !== HostComponent$10);
|
||||
if (inst) return inst;
|
||||
}
|
||||
return null;
|
||||
do {
|
||||
inst = inst.return;
|
||||
} while (inst && inst.tag !== HostComponent$10);
|
||||
return inst || null;
|
||||
}
|
||||
|
||||
function getLowestCommonAncestor(instA, instB) {
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule NativeMethodsMixin
|
||||
* @flow
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule PooledClass
|
||||
* @flow
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule ReactDebugTool
|
||||
*/
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule ReactGlobalSharedState
|
||||
*/
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule ReactNative
|
||||
* @flow
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @providesModule ReactNativeBridgeEventPlugin
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const {
|
||||
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
|
||||
} = require('ReactNative');
|
||||
|
||||
module.exports =
|
||||
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactNativeBridgeEventPlugin;
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule ReactNativeComponentTree
|
||||
* @flow
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule ReactNativePropRegistry
|
||||
* @flow
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule ReactNativeTypes
|
||||
* @flow
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule ReactPerf
|
||||
*/
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2014-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2014-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule ReactTypes
|
||||
* @flow
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule TouchHistoryMath
|
||||
*/
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule createReactNativeComponentClass
|
||||
* @flow
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
/**
|
||||
* Copyright 2013-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2013-present, Facebook, Inc.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @providesModule takeSnapshot
|
||||
*/
|
||||
|
||||
@@ -204,6 +204,7 @@ Pod::Spec.new do |s|
|
||||
end
|
||||
|
||||
s.subspec "fishhook" do |ss|
|
||||
ss.header_dir = "fishhook"
|
||||
ss.source_files = "Libraries/fishhook/*.{h,c}"
|
||||
end
|
||||
|
||||
|
||||
@@ -927,6 +927,10 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
|
||||
{
|
||||
RCTAssertJSThread();
|
||||
|
||||
if (!self.valid) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (buffer != nil && buffer != (id)kCFNull) {
|
||||
_wasBatchActive = YES;
|
||||
[self handleBuffer:buffer];
|
||||
|
||||
@@ -373,6 +373,8 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init);
|
||||
- (dispatch_queue_t)methodQueue
|
||||
{
|
||||
(void)[self instance];
|
||||
RCTAssert(_methodQueue != nullptr, @"Module %@ has no methodQueue (instance: %@, bridge.valid: %d)",
|
||||
self, _instance, _bridge.valid);
|
||||
return _methodQueue;
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
// Throttle progress events so we don't send more that around 60 per second.
|
||||
CFTimeInterval currentTime = CACurrentMediaTime();
|
||||
|
||||
NSUInteger headersContentLength = headers[@"Content-Length"] != nil ? [headers[@"Content-Length"] unsignedIntValue] : 0;
|
||||
NSInteger headersContentLength = headers[@"Content-Length"] != nil ? [headers[@"Content-Length"] integerValue] : 0;
|
||||
if (callback && (currentTime - _lastDownloadProgress > 0.016 || final)) {
|
||||
_lastDownloadProgress = currentTime;
|
||||
callback(headers, @(headersContentLength), @(contentLength));
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#import "RCTUtils.h"
|
||||
#import "RCTVersion.h"
|
||||
|
||||
static NSString *interfaceIdiom(UIUserInterfaceIdiom idiom) {
|
||||
switch(idiom) {
|
||||
@@ -46,6 +47,7 @@ RCT_EXPORT_MODULE(PlatformConstants)
|
||||
@"systemName": [device systemName],
|
||||
@"interfaceIdiom": interfaceIdiom([device userInterfaceIdiom]),
|
||||
@"isTesting": @(RCTRunningInTestEnvironment()),
|
||||
@"reactNativeVersion": REACT_NATIVE_VERSION,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* @generated by scripts/bump-oss-version.js
|
||||
*
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
#define REACT_NATIVE_VERSION @{ \
|
||||
@"major": @(0), \
|
||||
@"minor": @(49), \
|
||||
@"patch": @(5), \
|
||||
@"prerelease": [NSNull null], \
|
||||
}
|
||||
@@ -125,13 +125,12 @@ struct RCTInstanceCallback : public InstanceCallback {
|
||||
[bridge_ partialBatchDidFlush];
|
||||
[bridge_ batchDidComplete];
|
||||
}
|
||||
void incrementPendingJSCalls() override {}
|
||||
void decrementPendingJSCalls() override {}
|
||||
};
|
||||
|
||||
@implementation RCTCxxBridge
|
||||
{
|
||||
BOOL _wasBatchActive;
|
||||
BOOL _didInvalidate;
|
||||
|
||||
NSMutableArray<dispatch_block_t> *_pendingCalls;
|
||||
std::atomic<NSInteger> _pendingCount;
|
||||
@@ -169,7 +168,7 @@ struct RCTInstanceCallback : public InstanceCallback {
|
||||
|
||||
- (JSGlobalContextRef)jsContextRef
|
||||
{
|
||||
return (JSGlobalContextRef)self->_reactInstance->getJavaScriptContext();
|
||||
return (JSGlobalContextRef)(self->_reactInstance ? self->_reactInstance->getJavaScriptContext() : nullptr);
|
||||
}
|
||||
|
||||
- (instancetype)initWithParentBridge:(RCTBridge *)bridge
|
||||
@@ -204,7 +203,7 @@ struct RCTInstanceCallback : public InstanceCallback {
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)runJSRunLoop
|
||||
+ (void)runRunLoop
|
||||
{
|
||||
@autoreleasepool {
|
||||
RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTCxxBridge runJSRunLoop] setup", nil);
|
||||
@@ -267,8 +266,8 @@ struct RCTInstanceCallback : public InstanceCallback {
|
||||
object:_parentBridge userInfo:@{@"bridge": self}];
|
||||
|
||||
// Set up the JS thread early
|
||||
_jsThread = [[NSThread alloc] initWithTarget:self
|
||||
selector:@selector(runJSRunLoop)
|
||||
_jsThread = [[NSThread alloc] initWithTarget:[self class]
|
||||
selector:@selector(runRunLoop)
|
||||
object:nil];
|
||||
_jsThread.name = RCTJSThreadName;
|
||||
_jsThread.qualityOfService = NSOperationQualityOfServiceUserInteractive;
|
||||
@@ -493,7 +492,7 @@ struct RCTInstanceCallback : public InstanceCallback {
|
||||
if (_reactInstance) {
|
||||
// This is async, but any calls into JS are blocked by the m_syncReady CV in Instance
|
||||
_reactInstance->initializeBridge(
|
||||
std::unique_ptr<RCTInstanceCallback>(new RCTInstanceCallback(self)),
|
||||
std::make_unique<RCTInstanceCallback>(self),
|
||||
executorFactory,
|
||||
_jsMessageThread,
|
||||
[self _buildModuleRegistry]);
|
||||
@@ -816,6 +815,7 @@ struct RCTInstanceCallback : public InstanceCallback {
|
||||
}
|
||||
|
||||
RCTFatal(error);
|
||||
|
||||
// RN will stop, but let the rest of the app keep going.
|
||||
return;
|
||||
}
|
||||
@@ -826,27 +826,27 @@ struct RCTInstanceCallback : public InstanceCallback {
|
||||
|
||||
// Hack: once the bridge is invalidated below, it won't initialize any new native
|
||||
// modules. Initialize the redbox module now so we can still report this error.
|
||||
[self redBox];
|
||||
RCTRedBox *redBox = [self redBox];
|
||||
|
||||
_loading = NO;
|
||||
_valid = NO;
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
if (self->_jsMessageThread) {
|
||||
auto thread = self->_jsMessageThread;
|
||||
self->_jsMessageThread->runOnQueue([thread] {
|
||||
thread->quitSynchronous();
|
||||
});
|
||||
self->_jsMessageThread.reset();
|
||||
// Make sure initializeBridge completed
|
||||
self->_jsMessageThread->runOnQueueSync([] {});
|
||||
}
|
||||
|
||||
self->_reactInstance.reset();
|
||||
self->_jsMessageThread.reset();
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName:RCTJavaScriptDidFailToLoadNotification
|
||||
object:self->_parentBridge userInfo:@{@"bridge": self, @"error": error}];
|
||||
|
||||
if ([error userInfo][RCTJSRawStackTraceKey]) {
|
||||
[self.redBox showErrorMessage:[error localizedDescription]
|
||||
withRawStack:[error userInfo][RCTJSRawStackTraceKey]];
|
||||
[redBox showErrorMessage:[error localizedDescription]
|
||||
withRawStack:[error userInfo][RCTJSRawStackTraceKey]];
|
||||
}
|
||||
|
||||
RCTFatal(error);
|
||||
@@ -913,63 +913,68 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
|
||||
|
||||
- (void)invalidate
|
||||
{
|
||||
if (!_valid) {
|
||||
if (_didInvalidate) {
|
||||
return;
|
||||
}
|
||||
|
||||
RCTAssertMainQueue();
|
||||
RCTAssert(_reactInstance != nil, @"Can't complete invalidation without a react instance");
|
||||
RCTLogInfo(@"Invalidating %@ (parent: %@, executor: %@)", self, _parentBridge, [self executorClass]);
|
||||
|
||||
_loading = NO;
|
||||
_valid = NO;
|
||||
_didInvalidate = YES;
|
||||
|
||||
if ([RCTBridge currentBridge] == self) {
|
||||
[RCTBridge setCurrentBridge:nil];
|
||||
}
|
||||
|
||||
// Invalidate modules
|
||||
dispatch_group_t group = dispatch_group_create();
|
||||
for (RCTModuleData *moduleData in _moduleDataByID) {
|
||||
// Be careful when grabbing an instance here, we don't want to instantiate
|
||||
// any modules just to invalidate them.
|
||||
if (![moduleData hasInstance]) {
|
||||
continue;
|
||||
// Stop JS instance and message thread
|
||||
[self ensureOnJavaScriptThread:^{
|
||||
[self->_displayLink invalidate];
|
||||
self->_displayLink = nil;
|
||||
|
||||
if (RCTProfileIsProfiling()) {
|
||||
RCTProfileUnhookModules(self);
|
||||
}
|
||||
|
||||
if ([moduleData.instance respondsToSelector:@selector(invalidate)]) {
|
||||
dispatch_group_enter(group);
|
||||
[self dispatchBlock:^{
|
||||
[(id<RCTInvalidating>)moduleData.instance invalidate];
|
||||
dispatch_group_leave(group);
|
||||
} queue:moduleData.methodQueue];
|
||||
// Invalidate modules
|
||||
// We're on the JS thread (which we'll be suspending soon), so no new calls will be made to native modules after
|
||||
// this completes. We must ensure all previous calls were dispatched before deallocating the instance (and module
|
||||
// wrappers) or we may have invalid pointers still in flight.
|
||||
dispatch_group_t moduleInvalidation = dispatch_group_create();
|
||||
for (RCTModuleData *moduleData in self->_moduleDataByID) {
|
||||
// Be careful when grabbing an instance here, we don't want to instantiate
|
||||
// any modules just to invalidate them.
|
||||
if (![moduleData hasInstance]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ([moduleData.instance respondsToSelector:@selector(invalidate)]) {
|
||||
dispatch_group_enter(moduleInvalidation);
|
||||
[self dispatchBlock:^{
|
||||
[(id<RCTInvalidating>)moduleData.instance invalidate];
|
||||
dispatch_group_leave(moduleInvalidation);
|
||||
} queue:moduleData.methodQueue];
|
||||
}
|
||||
[moduleData invalidate];
|
||||
}
|
||||
[moduleData invalidate];
|
||||
}
|
||||
|
||||
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
|
||||
[self ensureOnJavaScriptThread:^{
|
||||
[self->_displayLink invalidate];
|
||||
self->_displayLink = nil;
|
||||
if (dispatch_group_wait(moduleInvalidation, dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC))) {
|
||||
RCTLogError(@"Timed out waiting for modules to be invalidated");
|
||||
}
|
||||
|
||||
self->_reactInstance.reset();
|
||||
if (self->_jsMessageThread) {
|
||||
self->_jsMessageThread->quitSynchronous();
|
||||
self->_jsMessageThread.reset();
|
||||
}
|
||||
self->_reactInstance.reset();
|
||||
self->_jsMessageThread.reset();
|
||||
|
||||
if (RCTProfileIsProfiling()) {
|
||||
RCTProfileUnhookModules(self);
|
||||
}
|
||||
self->_moduleDataByName = nil;
|
||||
self->_moduleDataByID = nil;
|
||||
self->_moduleClassesByID = nil;
|
||||
self->_pendingCalls = nil;
|
||||
|
||||
self->_moduleDataByName = nil;
|
||||
self->_moduleDataByID = nil;
|
||||
self->_moduleClassesByID = nil;
|
||||
self->_pendingCalls = nil;
|
||||
|
||||
[self->_jsThread cancel];
|
||||
self->_jsThread = nil;
|
||||
CFRunLoopStop(CFRunLoopGetCurrent());
|
||||
}];
|
||||
});
|
||||
[self->_jsThread cancel];
|
||||
self->_jsThread = nil;
|
||||
CFRunLoopStop(CFRunLoopGetCurrent());
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)logMessage:(NSString *)message level:(NSString *)level
|
||||
@@ -1098,7 +1103,6 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
|
||||
*/
|
||||
|
||||
RCTProfileBeginFlowEvent();
|
||||
|
||||
[self _runAfterLoad:^{
|
||||
RCTProfileEndFlowEvent();
|
||||
|
||||
@@ -1189,25 +1193,25 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
|
||||
if (!_reactInstance) {
|
||||
if (error) {
|
||||
*error = RCTErrorWithMessage(
|
||||
@"Attempt to call sync callFunctionOnModule: on uninitialized bridge");
|
||||
@"callFunctionOnModule was called on uninitialized bridge");
|
||||
}
|
||||
return nil;
|
||||
} else if (self.executorClass) {
|
||||
if (error) {
|
||||
*error = RCTErrorWithMessage(
|
||||
@"sync callFunctionOnModule: can only be used with JSC executor");
|
||||
@"callFunctionOnModule can only be used with JSC executor");
|
||||
}
|
||||
return nil;
|
||||
} else if (!self.valid) {
|
||||
if (error) {
|
||||
*error = RCTErrorWithMessage(
|
||||
@"sync callFunctionOnModule: bridge is no longer valid");
|
||||
@"Bridge is no longer valid");
|
||||
}
|
||||
return nil;
|
||||
} else if (self.loading) {
|
||||
if (error) {
|
||||
*error = RCTErrorWithMessage(
|
||||
@"sync callFunctionOnModule: bridge is still loading");
|
||||
@"Bridge is still loading");
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@ public:
|
||||
|
||||
void runOnQueue(std::function<void()>&& func) override {
|
||||
dispatch_queue_t queue = moduleData_.methodQueue;
|
||||
RCTAssert(queue != nullptr, @"Module %@ provided invalid queue", moduleData_);
|
||||
dispatch_block_t block = [func=std::move(func)] { func(); };
|
||||
RCTAssert(block != nullptr, @"Invalid block generated in call to %@", moduleData_);
|
||||
if (queue && block) {
|
||||
|
||||
@@ -203,6 +203,8 @@
|
||||
14F7A0F01BDA714B003C6C10 /* RCTFPSGraph.m in Sources */ = {isa = PBXBuildFile; fileRef = 14F7A0EF1BDA714B003C6C10 /* RCTFPSGraph.m */; };
|
||||
191E3EBE1C29D9AF00C180A6 /* RCTRefreshControlManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 191E3EBD1C29D9AF00C180A6 /* RCTRefreshControlManager.m */; };
|
||||
191E3EC11C29DC3800C180A6 /* RCTRefreshControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 191E3EC01C29DC3800C180A6 /* RCTRefreshControl.m */; };
|
||||
199B8A6F1F44DB16005DEF67 /* RCTVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 199B8A6E1F44DB16005DEF67 /* RCTVersion.h */; };
|
||||
199B8A761F44DEDA005DEF67 /* RCTVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 199B8A6E1F44DB16005DEF67 /* RCTVersion.h */; };
|
||||
19F61BFA1E8495CD00571D81 /* bignum-dtoa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 139D7E3A1E25C5A300323FB7 /* bignum-dtoa.h */; };
|
||||
19F61BFB1E8495CD00571D81 /* bignum.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 139D7E3C1E25C5A300323FB7 /* bignum.h */; };
|
||||
19F61BFC1E8495CD00571D81 /* cached-powers.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 139D7E3E1E25C5A300323FB7 /* cached-powers.h */; };
|
||||
@@ -1842,6 +1844,7 @@
|
||||
191E3EBD1C29D9AF00C180A6 /* RCTRefreshControlManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTRefreshControlManager.m; sourceTree = "<group>"; };
|
||||
191E3EBF1C29DC3800C180A6 /* RCTRefreshControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTRefreshControl.h; sourceTree = "<group>"; };
|
||||
191E3EC01C29DC3800C180A6 /* RCTRefreshControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTRefreshControl.m; sourceTree = "<group>"; };
|
||||
199B8A6E1F44DB16005DEF67 /* RCTVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTVersion.h; sourceTree = "<group>"; };
|
||||
19DED2281E77E29200F089BB /* systemJSCWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = systemJSCWrapper.cpp; sourceTree = "<group>"; };
|
||||
27B958731E57587D0096647A /* JSBigString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSBigString.cpp; sourceTree = "<group>"; };
|
||||
2D2A28131D9B038B00D4039D /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@@ -2652,6 +2655,7 @@
|
||||
1345A83B1B265A0E00583190 /* RCTURLRequestHandler.h */,
|
||||
83CBBA4F1A601E3B00E9B192 /* RCTUtils.h */,
|
||||
83CBBA501A601E3B00E9B192 /* RCTUtils.m */,
|
||||
199B8A6E1F44DB16005DEF67 /* RCTVersion.h */,
|
||||
);
|
||||
path = Base;
|
||||
sourceTree = "<group>";
|
||||
@@ -2792,6 +2796,7 @@
|
||||
3D302F411DF828F800D6DDAE /* RCTModuleMethod.h in Headers */,
|
||||
3D302F421DF828F800D6DDAE /* RCTMultipartDataTask.h in Headers */,
|
||||
3D302F431DF828F800D6DDAE /* RCTMultipartStreamReader.h in Headers */,
|
||||
199B8A761F44DEDA005DEF67 /* RCTVersion.h in Headers */,
|
||||
3D302F441DF828F800D6DDAE /* RCTNullability.h in Headers */,
|
||||
3D302F451DF828F800D6DDAE /* RCTParserUtils.h in Headers */,
|
||||
3D302F461DF828F800D6DDAE /* RCTPerformanceLogger.h in Headers */,
|
||||
@@ -3029,6 +3034,7 @@
|
||||
3D80DA191DF820620028D040 /* RCTImageLoader.h in Headers */,
|
||||
C654505E1F3BD9280090799B /* RCTManagedPointer.h in Headers */,
|
||||
13134C941E296B2A00B9F3CB /* RCTObjcExecutor.h in Headers */,
|
||||
199B8A6F1F44DB16005DEF67 /* RCTVersion.h in Headers */,
|
||||
3D80DA1A1DF820620028D040 /* RCTImageStoreManager.h in Headers */,
|
||||
130443A11E3FEAA900D93A67 /* RCTFollyConvert.h in Headers */,
|
||||
59FBEFB41E46D91C0095D885 /* RCTScrollContentViewManager.h in Headers */,
|
||||
|
||||
+32
-19
@@ -36,33 +36,46 @@
|
||||
typedef CGFloat RCTFontWeight;
|
||||
static RCTFontWeight weightOfFont(UIFont *font)
|
||||
{
|
||||
static NSDictionary *nameToWeight;
|
||||
static NSArray *fontNames;
|
||||
static NSArray *fontWeights;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
nameToWeight = @{
|
||||
@"normal": @(UIFontWeightRegular),
|
||||
@"bold": @(UIFontWeightBold),
|
||||
@"ultralight": @(UIFontWeightUltraLight),
|
||||
@"thin": @(UIFontWeightThin),
|
||||
@"light": @(UIFontWeightLight),
|
||||
@"regular": @(UIFontWeightRegular),
|
||||
@"medium": @(UIFontWeightMedium),
|
||||
@"semibold": @(UIFontWeightSemibold),
|
||||
@"bold": @(UIFontWeightBold),
|
||||
@"heavy": @(UIFontWeightHeavy),
|
||||
@"black": @(UIFontWeightBlack),
|
||||
};
|
||||
// We use two arrays instead of one map because
|
||||
// the order is important for suffix matching.
|
||||
fontNames = @[
|
||||
@"normal",
|
||||
@"ultralight",
|
||||
@"thin",
|
||||
@"light",
|
||||
@"regular",
|
||||
@"medium",
|
||||
@"semibold",
|
||||
@"bold",
|
||||
@"heavy",
|
||||
@"black"
|
||||
];
|
||||
fontWeights = @[
|
||||
@(UIFontWeightRegular),
|
||||
@(UIFontWeightUltraLight),
|
||||
@(UIFontWeightThin),
|
||||
@(UIFontWeightLight),
|
||||
@(UIFontWeightRegular),
|
||||
@(UIFontWeightMedium),
|
||||
@(UIFontWeightSemibold),
|
||||
@(UIFontWeightBold),
|
||||
@(UIFontWeightHeavy),
|
||||
@(UIFontWeightBlack)
|
||||
];
|
||||
});
|
||||
|
||||
for (NSString *name in nameToWeight) {
|
||||
if ([font.fontName.lowercaseString hasSuffix:name]) {
|
||||
return [nameToWeight[name] doubleValue];
|
||||
for (NSInteger i = 0; i < fontNames.count; i++) {
|
||||
if ([font.fontName.lowercaseString hasSuffix:fontNames[i]]) {
|
||||
return (RCTFontWeight)[fontWeights[i] doubleValue];
|
||||
}
|
||||
}
|
||||
|
||||
NSDictionary *traits = [font.fontDescriptor objectForKey:UIFontDescriptorTraitsAttribute];
|
||||
RCTFontWeight weight = [traits[UIFontWeightTrait] doubleValue];
|
||||
return weight;
|
||||
return (RCTFontWeight)[traits[UIFontWeightTrait] doubleValue];
|
||||
}
|
||||
|
||||
static BOOL isItalicFont(UIFont *font)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
VERSION_NAME=1000.0.0-master
|
||||
VERSION_NAME=0.49.5
|
||||
GROUP=com.facebook.react
|
||||
|
||||
POM_NAME=ReactNative
|
||||
|
||||
+1
-1
@@ -40,7 +40,7 @@ import com.facebook.react.bridge.ReactContext;
|
||||
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
|
||||
WindowManager.LayoutParams.MATCH_PARENT,
|
||||
WindowManager.LayoutParams.MATCH_PARENT,
|
||||
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
|
||||
WindowOverlayCompat.TYPE_SYSTEM_OVERLAY,
|
||||
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|
||||
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
|
||||
PixelFormat.TRANSLUCENT);
|
||||
|
||||
+1
-1
@@ -143,7 +143,7 @@ public class DevLoadingViewController {
|
||||
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
|
||||
WindowManager.LayoutParams.MATCH_PARENT,
|
||||
WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
|
||||
WindowOverlayCompat.TYPE_SYSTEM_OVERLAY,
|
||||
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
|
||||
PixelFormat.TRANSLUCENT);
|
||||
params.gravity = Gravity.TOP;
|
||||
|
||||
@@ -36,7 +36,6 @@ import android.content.pm.PackageManager;
|
||||
import android.hardware.SensorManager;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.facebook.common.logging.FLog;
|
||||
@@ -337,7 +336,7 @@ public class DevSupportManagerImpl implements
|
||||
public void run() {
|
||||
if (mRedBoxDialog == null) {
|
||||
mRedBoxDialog = new RedBoxDialog(mApplicationContext, DevSupportManagerImpl.this, mRedBoxHandler);
|
||||
mRedBoxDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
|
||||
mRedBoxDialog.getWindow().setType(WindowOverlayCompat.TYPE_SYSTEM_ALERT);
|
||||
}
|
||||
if (mRedBoxDialog.isShowing()) {
|
||||
// Sometimes errors cause multiple errors to be thrown in JS in quick succession. Only
|
||||
@@ -466,7 +465,7 @@ public class DevSupportManagerImpl implements
|
||||
}
|
||||
})
|
||||
.create();
|
||||
mDevOptionsDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
|
||||
mDevOptionsDialog.getWindow().setType(WindowOverlayCompat.TYPE_SYSTEM_ALERT);
|
||||
mDevOptionsDialog.show();
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.facebook.react.devsupport;
|
||||
|
||||
import android.os.Build;
|
||||
import android.view.WindowManager;
|
||||
|
||||
/**
|
||||
* Compatibility wrapper for apps targeting API level 26 or later.
|
||||
* See https://developer.android.com/about/versions/oreo/android-8.0-changes.html#cwt
|
||||
*/
|
||||
/* package */ class WindowOverlayCompat {
|
||||
|
||||
private static final int ANDROID_OREO = 26;
|
||||
private static final int TYPE_APPLICATION_OVERLAY = 2038;
|
||||
|
||||
static final int TYPE_SYSTEM_ALERT = Build.VERSION.SDK_INT < ANDROID_OREO ? WindowManager.LayoutParams.TYPE_SYSTEM_ALERT : TYPE_APPLICATION_OVERLAY;
|
||||
static final int TYPE_SYSTEM_OVERLAY = Build.VERSION.SDK_INT < ANDROID_OREO ? WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY : TYPE_APPLICATION_OVERLAY;
|
||||
|
||||
}
|
||||
+1
@@ -38,6 +38,7 @@ public class AndroidInfoModule extends BaseJavaModule {
|
||||
constants.put("Version", Build.VERSION.SDK_INT);
|
||||
constants.put("ServerHost", AndroidInfoHelpers.getServerHost());
|
||||
constants.put("isTesting", "true".equals(System.getProperty(IS_TESTING)));
|
||||
constants.put("reactNativeVersion", ReactNativeVersion.VERSION);
|
||||
return constants;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ android_library(
|
||||
name = "systeminfo",
|
||||
srcs = [
|
||||
"AndroidInfoModule.java",
|
||||
"ReactNativeVersion.java",
|
||||
],
|
||||
exported_deps = [
|
||||
":systeminfo-moduleless",
|
||||
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* @generated by scripts/bump-oss-version.js
|
||||
*
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
package com.facebook.react.modules.systeminfo;
|
||||
|
||||
import com.facebook.react.common.MapBuilder;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class ReactNativeVersion {
|
||||
public static final Map<String, Object> VERSION = MapBuilder.<String, Object>of(
|
||||
"major", 0,
|
||||
"minor", 49,
|
||||
"patch", 5,
|
||||
"prerelease", null);
|
||||
}
|
||||
@@ -27,8 +27,6 @@ public class OnScrollDispatchHelper {
|
||||
|
||||
private long mLastScrollEventTimeMs = -(MIN_EVENT_SEPARATION_MS + 1);
|
||||
|
||||
private static final float THRESHOLD = 0.1f; // Threshold for end fling
|
||||
|
||||
/**
|
||||
* Call from a ScrollView in onScrollChanged, returns true if this onScrollChanged is legit (not a
|
||||
* duplicate) and should be dispatched.
|
||||
@@ -40,11 +38,6 @@ public class OnScrollDispatchHelper {
|
||||
mPrevX != x ||
|
||||
mPrevY != y;
|
||||
|
||||
// Skip the first calculation in each scroll
|
||||
if (Math.abs(mXFlingVelocity) < THRESHOLD && Math.abs(mYFlingVelocity) < THRESHOLD) {
|
||||
shouldDispatch = false;
|
||||
}
|
||||
|
||||
if (eventTime - mLastScrollEventTimeMs != 0) {
|
||||
mXFlingVelocity = (float) (x - mPrevX) / (eventTime - mLastScrollEventTimeMs);
|
||||
mYFlingVelocity = (float) (y - mPrevY) / (eventTime - mLastScrollEventTimeMs);
|
||||
|
||||
@@ -27,9 +27,9 @@ class ModuleRegistry;
|
||||
|
||||
struct InstanceCallback {
|
||||
virtual ~InstanceCallback() {}
|
||||
virtual void onBatchComplete() = 0;
|
||||
virtual void incrementPendingJSCalls() = 0;
|
||||
virtual void decrementPendingJSCalls() = 0;
|
||||
virtual void onBatchComplete() {}
|
||||
virtual void incrementPendingJSCalls() {}
|
||||
virtual void decrementPendingJSCalls() {}
|
||||
};
|
||||
|
||||
class RN_EXPORT Instance {
|
||||
|
||||
+6
-6
@@ -34,15 +34,12 @@ dependencies:
|
||||
- npm install
|
||||
# for eslint bot
|
||||
- npm install github@0.2.4
|
||||
# for website, danger
|
||||
- cd website && npm install
|
||||
- cd danger && npm install
|
||||
cache_directories:
|
||||
- "ReactAndroid/build/downloads"
|
||||
- "/home/ubuntu/buck"
|
||||
- "website/node_modules"
|
||||
- "node_modules"
|
||||
- "danger/node_modules"
|
||||
|
||||
test:
|
||||
pre:
|
||||
@@ -53,12 +50,12 @@ test:
|
||||
|
||||
override:
|
||||
# Run Danger against PRs. This GitHub token grants public_repo access scope. The associated account has no privileged access to the React Native repo. The token must be split in this manner to avoid revocation by GitHub.
|
||||
- cd danger && DANGER_GITHUB_API_TOKEN="e622517d9f1136ea8900""07c6373666312cdfaa69" npm run danger
|
||||
# eslint bot. This GitHub token grants public_repo access scope. The token must be split in this manner to avoid revocation by GitHub.
|
||||
- cat <(echo eslint; npm run lint --silent -- --format=json; echo flow; npm run flow --silent -- check --json) | GITHUB_TOKEN="af6ef0d15709bc91d""06a6217a5a826a226fb57b7" CI_USER=$CIRCLE_PROJECT_USERNAME CI_REPO=$CIRCLE_PROJECT_REPONAME PULL_REQUEST_NUMBER=$CIRCLE_PR_NUMBER node bots/code-analysis-bot.js
|
||||
- npm run lint
|
||||
# JS tests for dependencies installed with npm3
|
||||
- npm run flow -- check
|
||||
# Commenting out Flow tests
|
||||
# - npm run flow -- check
|
||||
- npm test -- --maxWorkers=1
|
||||
|
||||
# build app
|
||||
@@ -76,8 +73,11 @@ test:
|
||||
# integration tests
|
||||
# build JS bundle for instrumentation tests
|
||||
- node local-cli/cli.js bundle --max-workers 1 --platform android --dev true --entry-file ReactAndroid/src/androidTest/js/TestBundle.js --bundle-output ReactAndroid/src/androidTest/assets/AndroidTestBundle.js
|
||||
|
||||
# build test APK
|
||||
- buck install ReactAndroid/src/androidTest/buck-runner:instrumentation-tests --config build.threads=1
|
||||
# Commented out due to test failures. Please uncomment the next line once these have been fixed. See Issue #15726.
|
||||
# - buck install ReactAndroid/src/androidTest/buck-runner:instrumentation-tests --config build.threads=1
|
||||
|
||||
# run installed apk with tests
|
||||
# - node ./scripts/run-android-ci-instrumentation-tests.js --retries 3 --path ./ReactAndroid/src/androidTest/java/com/facebook/react/tests --package com.facebook.react.tests
|
||||
|
||||
|
||||
@@ -157,9 +157,11 @@ Go to the root directory for your project and create a new `package.json` file w
|
||||
Next, you will install the `react` and `react-native` packages. Open a terminal or command prompt, then navigate to the root directory for your project and type the following commands:
|
||||
|
||||
```
|
||||
$ npm install --save react react-native
|
||||
$ npm install --save react@16.0.0-beta.5 react-native
|
||||
```
|
||||
|
||||
> Make sure you use the same React version as specified in the [React Native `package.json` file](https://github.com/facebook/react-native/blob/0.49-stable/package.json). This will only be necessary as long as React Native depends on a pre-release version of React.
|
||||
|
||||
This will create a new `/node_modules` folder in your project's root directory. This folder stores all the JavaScript dependencies required to build your project.
|
||||
|
||||
<block class="objc swift" />
|
||||
|
||||
+10
-1
@@ -34,7 +34,7 @@ jest
|
||||
jest.setMock('ErrorUtils', require('ErrorUtils'));
|
||||
|
||||
jest
|
||||
.mock('InitializeCore')
|
||||
.mock('InitializeCore', () => {})
|
||||
.mock('Image', () => mockComponent('Image'))
|
||||
.mock('Text', () => mockComponent('Text'))
|
||||
.mock('TextInput', () => mockComponent('TextInput'))
|
||||
@@ -275,6 +275,15 @@ const mockNativeModules = {
|
||||
Constants: {},
|
||||
},
|
||||
},
|
||||
BlobModule: {
|
||||
BLOB_URI_SCHEME: 'content',
|
||||
BLOB_URI_HOST: null,
|
||||
enableBlobSupport: jest.fn(),
|
||||
disableBlobSupport: jest.fn(),
|
||||
createFromParts: jest.fn(),
|
||||
sendBlob: jest.fn(),
|
||||
release: jest.fn(),
|
||||
},
|
||||
WebSocketModule: {
|
||||
connect: jest.fn(),
|
||||
send: jest.fn(),
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
'use strict';
|
||||
|
||||
const blacklist = require('metro-bundler/src/blacklist');
|
||||
const findSymlinksPaths = require('./findSymlinksPaths');
|
||||
const findSymlinkedModules = require('./findSymlinkedModules');
|
||||
const fs = require('fs');
|
||||
const getPolyfills = require('../../rn-get-polyfills');
|
||||
const invariant = require('fbjs/lib/invariant');
|
||||
@@ -150,14 +150,15 @@ function getProjectPath() {
|
||||
return path.resolve(__dirname, '../..');
|
||||
}
|
||||
|
||||
const resolveSymlink = (roots) =>
|
||||
roots.concat(
|
||||
findSymlinksPaths(
|
||||
path.join(getProjectPath(), 'node_modules'),
|
||||
roots
|
||||
)
|
||||
const resolveSymlinksForRoots = roots =>
|
||||
roots.reduce(
|
||||
(arr, rootPath) => arr.concat(
|
||||
findSymlinkedModules(rootPath, roots)
|
||||
),
|
||||
[...roots]
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* Module capable of getting the configuration out of a given file.
|
||||
*
|
||||
@@ -177,9 +178,9 @@ const Config = {
|
||||
getProjectRoots: () => {
|
||||
const root = process.env.REACT_NATIVE_APP_ROOT;
|
||||
if (root) {
|
||||
return resolveSymlink([path.resolve(root)]);
|
||||
return resolveSymlinksForRoots([path.resolve(root)]);
|
||||
}
|
||||
return resolveSymlink([getProjectPath()]);
|
||||
return resolveSymlinksForRoots([getProjectPath()]);
|
||||
},
|
||||
getProvidesModuleNodeModules: () => providesModuleNodeModules.slice(),
|
||||
getSourceExts: () => [],
|
||||
|
||||
@@ -0,0 +1,368 @@
|
||||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const {EventEmitter} = require('events');
|
||||
const {dirname} = require.requireActual('path');
|
||||
const fs = jest.genMockFromModule('fs');
|
||||
const path = require('path');
|
||||
const stream = require.requireActual('stream');
|
||||
|
||||
const noop = () => {};
|
||||
|
||||
function asyncCallback(cb) {
|
||||
return function() {
|
||||
setImmediate(() => cb.apply(this, arguments));
|
||||
};
|
||||
}
|
||||
|
||||
const mtime = {
|
||||
getTime: () => Math.ceil(Math.random() * 10000000),
|
||||
};
|
||||
|
||||
fs.realpath.mockImplementation((filepath, callback) => {
|
||||
callback = asyncCallback(callback);
|
||||
let node;
|
||||
try {
|
||||
node = getToNode(filepath);
|
||||
} catch (e) {
|
||||
return callback(e);
|
||||
}
|
||||
if (node && typeof node === 'object' && node.SYMLINK != null) {
|
||||
return callback(null, node.SYMLINK);
|
||||
}
|
||||
return callback(null, filepath);
|
||||
});
|
||||
|
||||
fs.readdirSync.mockImplementation(filepath => Object.keys(getToNode(filepath)));
|
||||
|
||||
fs.readdir.mockImplementation((filepath, callback) => {
|
||||
callback = asyncCallback(callback);
|
||||
let node;
|
||||
try {
|
||||
node = getToNode(filepath);
|
||||
if (node && typeof node === 'object' && node.SYMLINK != null) {
|
||||
node = getToNode(node.SYMLINK);
|
||||
}
|
||||
} catch (e) {
|
||||
return callback(e);
|
||||
}
|
||||
|
||||
if (!(node && typeof node === 'object' && node.SYMLINK == null)) {
|
||||
return callback(new Error(filepath + ' is not a directory.'));
|
||||
}
|
||||
|
||||
return callback(null, Object.keys(node));
|
||||
});
|
||||
|
||||
fs.readFile.mockImplementation(function(filepath, encoding, callback) {
|
||||
callback = asyncCallback(callback);
|
||||
if (arguments.length === 2) {
|
||||
callback = encoding;
|
||||
encoding = null;
|
||||
}
|
||||
|
||||
let node;
|
||||
try {
|
||||
node = getToNode(filepath);
|
||||
// dir check
|
||||
if (node && typeof node === 'object' && node.SYMLINK == null) {
|
||||
callback(new Error('Error readFile a dir: ' + filepath));
|
||||
}
|
||||
if (node == null) {
|
||||
return callback(Error('No such file: ' + filepath));
|
||||
} else {
|
||||
return callback(null, node);
|
||||
}
|
||||
} catch (e) {
|
||||
return callback(e);
|
||||
}
|
||||
});
|
||||
|
||||
fs.readFileSync.mockImplementation(function(filepath, encoding) {
|
||||
const node = getToNode(filepath);
|
||||
// dir check
|
||||
if (node && typeof node === 'object' && node.SYMLINK == null) {
|
||||
throw new Error('Error readFileSync a dir: ' + filepath);
|
||||
}
|
||||
return node;
|
||||
});
|
||||
|
||||
function readlinkSync(filepath) {
|
||||
const node = getToNode(filepath);
|
||||
if (node !== null && typeof node === 'object' && !!node.SYMLINK) {
|
||||
return node.SYMLINK;
|
||||
} else {
|
||||
throw new Error(`EINVAL: invalid argument, readlink '${filepath}'`);
|
||||
}
|
||||
}
|
||||
|
||||
fs.readlink.mockImplementation((filepath, callback) => {
|
||||
callback = asyncCallback(callback);
|
||||
let result;
|
||||
try {
|
||||
result = readlinkSync(filepath);
|
||||
} catch (e) {
|
||||
callback(e);
|
||||
return;
|
||||
}
|
||||
callback(null, result);
|
||||
});
|
||||
|
||||
fs.readlinkSync.mockImplementation(readlinkSync);
|
||||
|
||||
function existsSync(filepath) {
|
||||
try {
|
||||
const node = getToNode(filepath);
|
||||
return node !== null;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
fs.exists.mockImplementation((filepath, callback) => {
|
||||
callback = asyncCallback(callback);
|
||||
let result;
|
||||
try {
|
||||
result = existsSync(filepath);
|
||||
} catch (e) {
|
||||
callback(e);
|
||||
return;
|
||||
}
|
||||
callback(null, result);
|
||||
});
|
||||
|
||||
fs.existsSync.mockImplementation(existsSync);
|
||||
|
||||
function makeStatResult(node) {
|
||||
const isSymlink = node != null && node.SYMLINK != null;
|
||||
return {
|
||||
isBlockDevice: () => false,
|
||||
isCharacterDevice: () => false,
|
||||
isDirectory: () => node != null && typeof node === 'object' && !isSymlink,
|
||||
isFIFO: () => false,
|
||||
isFile: () => node != null && typeof node === 'string',
|
||||
isSocket: () => false,
|
||||
isSymbolicLink: () => isSymlink,
|
||||
mtime,
|
||||
};
|
||||
}
|
||||
|
||||
function statSync(filepath) {
|
||||
const node = getToNode(filepath);
|
||||
if (node != null && node.SYMLINK) {
|
||||
return statSync(node.SYMLINK);
|
||||
}
|
||||
return makeStatResult(node);
|
||||
}
|
||||
|
||||
fs.stat.mockImplementation((filepath, callback) => {
|
||||
callback = asyncCallback(callback);
|
||||
let result;
|
||||
try {
|
||||
result = statSync(filepath);
|
||||
} catch (e) {
|
||||
callback(e);
|
||||
return;
|
||||
}
|
||||
callback(null, result);
|
||||
});
|
||||
|
||||
fs.statSync.mockImplementation(statSync);
|
||||
|
||||
function lstatSync(filepath) {
|
||||
const node = getToNode(filepath);
|
||||
return makeStatResult(node);
|
||||
}
|
||||
|
||||
fs.lstat.mockImplementation((filepath, callback) => {
|
||||
callback = asyncCallback(callback);
|
||||
let result;
|
||||
try {
|
||||
result = lstatSync(filepath);
|
||||
} catch (e) {
|
||||
callback(e);
|
||||
return;
|
||||
}
|
||||
callback(null, result);
|
||||
});
|
||||
|
||||
fs.lstatSync.mockImplementation(lstatSync);
|
||||
|
||||
fs.open.mockImplementation(function(filepath) {
|
||||
const callback = arguments[arguments.length - 1] || noop;
|
||||
let data, error, fd;
|
||||
try {
|
||||
data = getToNode(filepath);
|
||||
} catch (e) {
|
||||
error = e;
|
||||
}
|
||||
|
||||
if (error || data == null) {
|
||||
error = Error(`ENOENT: no such file or directory, open ${filepath}`);
|
||||
}
|
||||
if (data != null) {
|
||||
/* global Buffer: true */
|
||||
fd = {buffer: new Buffer(data, 'utf8'), position: 0};
|
||||
}
|
||||
|
||||
callback(error, fd);
|
||||
});
|
||||
|
||||
fs.read.mockImplementation(
|
||||
(fd, buffer, writeOffset, length, position, callback = noop) => {
|
||||
let bytesWritten;
|
||||
try {
|
||||
if (position == null || position < 0) {
|
||||
({position} = fd);
|
||||
}
|
||||
bytesWritten = fd.buffer.copy(
|
||||
buffer,
|
||||
writeOffset,
|
||||
position,
|
||||
position + length,
|
||||
);
|
||||
fd.position = position + bytesWritten;
|
||||
} catch (e) {
|
||||
callback(Error('invalid argument'));
|
||||
return;
|
||||
}
|
||||
callback(null, bytesWritten, buffer);
|
||||
},
|
||||
);
|
||||
|
||||
fs.close.mockImplementation((fd, callback = noop) => {
|
||||
try {
|
||||
fd.buffer = fs.position = undefined;
|
||||
} catch (e) {
|
||||
callback(Error('invalid argument'));
|
||||
return;
|
||||
}
|
||||
callback(null);
|
||||
});
|
||||
|
||||
let filesystem;
|
||||
|
||||
fs.createReadStream.mockImplementation(filepath => {
|
||||
if (!filepath.startsWith('/')) {
|
||||
throw Error('Cannot open file ' + filepath);
|
||||
}
|
||||
|
||||
const parts = filepath.split('/').slice(1);
|
||||
let file = filesystem;
|
||||
|
||||
for (const part of parts) {
|
||||
file = file[part];
|
||||
if (!file) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof file !== 'string') {
|
||||
throw Error('Cannot open file ' + filepath);
|
||||
}
|
||||
|
||||
return new stream.Readable({
|
||||
read() {
|
||||
this.push(file, 'utf8');
|
||||
this.push(null);
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
fs.createWriteStream.mockImplementation(file => {
|
||||
let node;
|
||||
try {
|
||||
node = getToNode(dirname(file));
|
||||
} finally {
|
||||
if (typeof node === 'object') {
|
||||
const writeStream = new stream.Writable({
|
||||
write(chunk) {
|
||||
this.__chunks.push(chunk);
|
||||
},
|
||||
});
|
||||
writeStream.__file = file;
|
||||
writeStream.__chunks = [];
|
||||
writeStream.end = jest.fn(writeStream.end);
|
||||
fs.createWriteStream.mock.returned.push(writeStream);
|
||||
return writeStream;
|
||||
} else {
|
||||
throw new Error('Cannot open file ' + file);
|
||||
}
|
||||
}
|
||||
});
|
||||
fs.createWriteStream.mock.returned = [];
|
||||
|
||||
fs.__setMockFilesystem = object => (filesystem = object);
|
||||
|
||||
const watcherListByPath = new Map();
|
||||
|
||||
fs.watch.mockImplementation((filename, options, listener) => {
|
||||
if (options.recursive) {
|
||||
throw new Error('recursive watch not implemented');
|
||||
}
|
||||
let watcherList = watcherListByPath.get(filename);
|
||||
if (watcherList == null) {
|
||||
watcherList = [];
|
||||
watcherListByPath.set(filename, watcherList);
|
||||
}
|
||||
const fsWatcher = new EventEmitter();
|
||||
fsWatcher.on('change', listener);
|
||||
fsWatcher.close = () => {
|
||||
watcherList.splice(watcherList.indexOf(fsWatcher), 1);
|
||||
fsWatcher.close = () => {
|
||||
throw new Error('FSWatcher is already closed');
|
||||
};
|
||||
};
|
||||
watcherList.push(fsWatcher);
|
||||
});
|
||||
|
||||
fs.__triggerWatchEvent = (eventType, filename) => {
|
||||
const directWatchers = watcherListByPath.get(filename) || [];
|
||||
directWatchers.forEach(wtc => wtc.emit('change', eventType));
|
||||
const dirPath = path.dirname(filename);
|
||||
const dirWatchers = watcherListByPath.get(dirPath) || [];
|
||||
dirWatchers.forEach(wtc =>
|
||||
wtc.emit('change', eventType, path.relative(dirPath, filename)),
|
||||
);
|
||||
};
|
||||
|
||||
function getToNode(filepath) {
|
||||
// Ignore the drive for Windows paths.
|
||||
if (filepath.match(/^[a-zA-Z]:\\/)) {
|
||||
filepath = filepath.substring(2);
|
||||
}
|
||||
|
||||
if (filepath.endsWith(path.sep)) {
|
||||
filepath = filepath.slice(0, -1);
|
||||
}
|
||||
const parts = filepath.split(/[\/\\]/);
|
||||
if (parts[0] !== '') {
|
||||
throw new Error('Make sure all paths are absolute.');
|
||||
}
|
||||
let node = filesystem;
|
||||
parts.slice(1).forEach(part => {
|
||||
if (node && node.SYMLINK) {
|
||||
node = getToNode(node.SYMLINK);
|
||||
}
|
||||
node = node[part];
|
||||
if (node == null) {
|
||||
const err = new Error('ENOENT: no such file or directory');
|
||||
err.code = 'ENOENT';
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
module.exports = fs;
|
||||
@@ -0,0 +1,354 @@
|
||||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
jest.mock('fs');
|
||||
|
||||
const fs = require('fs');
|
||||
const findSymlinkedModules = require('../findSymlinkedModules');
|
||||
|
||||
describe('findSymlinksForProjectRoot', () => {
|
||||
it('correctly finds normal module symlinks', () => {
|
||||
fs.__setMockFilesystem({
|
||||
root: {
|
||||
projectA: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectA',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depFoo: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depFoo',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
projectB: {
|
||||
SYMLINK: '/root/projectB',
|
||||
},
|
||||
},
|
||||
},
|
||||
projectB: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectB',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depBar: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depBar',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const symlinkedModules = findSymlinkedModules('/root/projectA', []);
|
||||
expect(symlinkedModules).toEqual(['/root/projectB']);
|
||||
});
|
||||
|
||||
it('correctly finds scoped module symlinks', () => {
|
||||
fs.__setMockFilesystem({
|
||||
root: {
|
||||
projectA: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectA',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depFoo: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depFoo',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
SYMLINK: '/root/@scoped/projectC',
|
||||
},
|
||||
},
|
||||
projectB: {
|
||||
SYMLINK: '/root/projectB',
|
||||
},
|
||||
},
|
||||
},
|
||||
projectB: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectB',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depBar: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depBar',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
'package.json': JSON.stringify({
|
||||
name: '@scoped/projectC',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const symlinkedModules = findSymlinkedModules('/root/projectA', []);
|
||||
expect(symlinkedModules).toEqual([
|
||||
'/root/@scoped/projectC',
|
||||
'/root/projectB',
|
||||
]);
|
||||
});
|
||||
|
||||
it('correctly finds module symlinks within other module symlinks', () => {
|
||||
fs.__setMockFilesystem({
|
||||
root: {
|
||||
projectA: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectA',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depFoo: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depFoo',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
SYMLINK: '/root/@scoped/projectC',
|
||||
},
|
||||
},
|
||||
projectB: {
|
||||
SYMLINK: '/root/projectB',
|
||||
},
|
||||
},
|
||||
},
|
||||
projectB: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectB',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depBar: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depBar',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
projectD: {
|
||||
SYMLINK: '/root/projectD',
|
||||
},
|
||||
},
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
'package.json': JSON.stringify({
|
||||
name: '@scoped/projectC',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
},
|
||||
projectD: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectD',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const symlinkedModules = findSymlinkedModules('/root/projectA', []);
|
||||
expect(symlinkedModules).toEqual([
|
||||
'/root/@scoped/projectC',
|
||||
'/root/projectB',
|
||||
'/root/projectD',
|
||||
]);
|
||||
});
|
||||
|
||||
it('correctly handles duplicate symlink paths', () => {
|
||||
// projectA ->
|
||||
// -> projectC
|
||||
// -> projectB -> projectC
|
||||
// Final list should only contain projectC once
|
||||
fs.__setMockFilesystem({
|
||||
root: {
|
||||
projectA: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectA',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depFoo: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depFoo',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
SYMLINK: '/root/@scoped/projectC',
|
||||
},
|
||||
},
|
||||
projectB: {
|
||||
SYMLINK: '/root/projectB',
|
||||
},
|
||||
},
|
||||
},
|
||||
projectB: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectB',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depBar: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depBar',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
SYMLINK: '/root/@scoped/projectC',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
'package.json': JSON.stringify({
|
||||
name: '@scoped/projectC',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const symlinkedModules = findSymlinkedModules('/root/projectA', []);
|
||||
expect(symlinkedModules).toEqual([
|
||||
'/root/@scoped/projectC',
|
||||
'/root/projectB',
|
||||
]);
|
||||
});
|
||||
|
||||
it('correctly handles symlink recursion', () => {
|
||||
// projectA ->
|
||||
// -> projectC -> projectD -> projectA
|
||||
// -> projectB -> projectC -> projectA
|
||||
// -> projectD -> projectC -> projectA
|
||||
// Should not infinite loop, should not contain projectA
|
||||
fs.__setMockFilesystem({
|
||||
root: {
|
||||
projectA: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectA',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depFoo: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depFoo',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
SYMLINK: '/root/@scoped/projectC',
|
||||
},
|
||||
},
|
||||
projectB: {
|
||||
SYMLINK: '/root/projectB',
|
||||
},
|
||||
},
|
||||
},
|
||||
projectB: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectB',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
depBar: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'depBar',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
projectD: {
|
||||
SYMLINK: '/root/projectD',
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
SYMLINK: '/root/@scoped/projectC',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
'package.json': JSON.stringify({
|
||||
name: '@scoped/projectC',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
projectA: {
|
||||
SYMLINK: '/root/projectA',
|
||||
},
|
||||
projectD: {
|
||||
SYMLINK: '/root/projectD',
|
||||
},
|
||||
projectE: {
|
||||
SYMLINK: '/root/projectE',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
projectD: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectD',
|
||||
main: 'main.js',
|
||||
}),
|
||||
node_modules: {
|
||||
'@scoped': {
|
||||
projectC: {
|
||||
SYMLINK: '/root/@scoped/projectC',
|
||||
},
|
||||
},
|
||||
projectE: {
|
||||
SYMLINK: '/root/projectE',
|
||||
},
|
||||
},
|
||||
},
|
||||
projectE: {
|
||||
'package.json': JSON.stringify({
|
||||
name: 'projectD',
|
||||
main: 'main.js',
|
||||
}),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const symlinkedModules = findSymlinkedModules('/root/projectA');
|
||||
expect(symlinkedModules).toEqual([
|
||||
'/root/@scoped/projectC',
|
||||
'/root/projectB',
|
||||
'/root/projectD',
|
||||
'/root/projectE',
|
||||
]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @format
|
||||
* @flow
|
||||
*/
|
||||
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
/**
|
||||
* Find symlinked modules inside "node_modules."
|
||||
*
|
||||
* Naively, we could just perform a depth-first search of all folders in
|
||||
* node_modules, recursing when we find a symlink.
|
||||
*
|
||||
* We can be smarter than this due to our knowledge of how npm/Yarn lays out
|
||||
* "node_modules" / how tools that build on top of npm/Yarn (such as Lerna)
|
||||
* install dependencies.
|
||||
*
|
||||
* Starting from a given root node_modules folder, this algorithm will look at
|
||||
* both the top level descendants of the node_modules folder or second level
|
||||
* descendants of folders that start with "@" (which indicates a scoped
|
||||
* package). If any of those folders is a symlink, it will recurse into the
|
||||
* link, and perform the same search in the linked folder.
|
||||
*
|
||||
* The end result should be a list of all resolved module symlinks for a given
|
||||
* root.
|
||||
*/
|
||||
module.exports = function findSymlinkedModules(
|
||||
projectRoot: string,
|
||||
ignoredRoots?: Array<string> = [],
|
||||
) {
|
||||
const timeStart = Date.now();
|
||||
const nodeModuleRoot = path.join(projectRoot, 'node_modules');
|
||||
const resolvedSymlinks = findModuleSymlinks(nodeModuleRoot, [
|
||||
...ignoredRoots,
|
||||
projectRoot,
|
||||
]);
|
||||
const timeEnd = Date.now();
|
||||
|
||||
console.log(
|
||||
`Scanning folders for symlinks in ${nodeModuleRoot} (${timeEnd -
|
||||
timeStart}ms)`,
|
||||
);
|
||||
|
||||
return resolvedSymlinks;
|
||||
};
|
||||
|
||||
function findModuleSymlinks(
|
||||
modulesPath: string,
|
||||
ignoredPaths: Array<string> = [],
|
||||
): Array<string> {
|
||||
if (!fs.existsSync(modulesPath)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Find module symlinks
|
||||
const moduleFolders = fs.readdirSync(modulesPath);
|
||||
const symlinks = moduleFolders.reduce((links, folderName) => {
|
||||
const folderPath = path.join(modulesPath, folderName);
|
||||
const maybeSymlinkPaths = [];
|
||||
if (folderName.startsWith('@')) {
|
||||
const scopedModuleFolders = fs.readdirSync(folderPath);
|
||||
maybeSymlinkPaths.push(
|
||||
...scopedModuleFolders.map(name => path.join(folderPath, name)),
|
||||
);
|
||||
} else {
|
||||
maybeSymlinkPaths.push(folderPath);
|
||||
}
|
||||
return links.concat(resolveSymlinkPaths(maybeSymlinkPaths, ignoredPaths));
|
||||
}, []);
|
||||
|
||||
// For any symlinks found, look in _that_ modules node_modules directory
|
||||
// and find any symlinked modules
|
||||
const nestedSymlinks = symlinks.reduce(
|
||||
(links, symlinkPath) =>
|
||||
links.concat(
|
||||
// We ignore any found symlinks or anything from the ignored list,
|
||||
// to prevent infinite recursion
|
||||
findModuleSymlinks(path.join(symlinkPath, 'node_modules'), [
|
||||
...ignoredPaths,
|
||||
...symlinks,
|
||||
]),
|
||||
),
|
||||
[],
|
||||
);
|
||||
|
||||
return [...new Set([...symlinks, ...nestedSymlinks])];
|
||||
}
|
||||
|
||||
function resolveSymlinkPaths(maybeSymlinkPaths, ignoredPaths) {
|
||||
return maybeSymlinkPaths.reduce((links, maybeSymlinkPath) => {
|
||||
if (fs.lstatSync(maybeSymlinkPath).isSymbolicLink()) {
|
||||
const resolved = path.resolve(
|
||||
path.dirname(maybeSymlinkPath),
|
||||
fs.readlinkSync(maybeSymlinkPath),
|
||||
);
|
||||
if (ignoredPaths.indexOf(resolved) === -1 && fs.existsSync(resolved)) {
|
||||
links.push(resolved);
|
||||
}
|
||||
}
|
||||
return links;
|
||||
}, []);
|
||||
}
|
||||
+5
-5
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "react-native",
|
||||
"version": "1000.0.0",
|
||||
"version": "0.49.5",
|
||||
"description": "A framework for building native apps using React",
|
||||
"license": "BSD-3-Clause",
|
||||
"repository": {
|
||||
@@ -132,7 +132,7 @@
|
||||
"react-native": "local-cli/wrong-react-native.js"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "16.0.0-beta.5"
|
||||
"react": "16.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"absolute-path": "^0.0.0",
|
||||
@@ -200,9 +200,9 @@
|
||||
"jest": "20.1.0-echo.1",
|
||||
"mock-fs": "^4.4.1",
|
||||
"prettier": "1.5.2",
|
||||
"react": "16.0.0-beta.5",
|
||||
"react-test-renderer": "16.0.0-beta.5",
|
||||
"shelljs": "0.6.0",
|
||||
"react": "16.0.0",
|
||||
"react-test-renderer": "16.0.0",
|
||||
"shelljs": "^0.7.8",
|
||||
"sinon": "^2.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
+57
-19
@@ -15,7 +15,7 @@
|
||||
* After changing the files it makes a commit and tags it.
|
||||
* All you have to do is push changes to remote and CI will make a new build.
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const {
|
||||
cat,
|
||||
echo,
|
||||
@@ -32,31 +32,69 @@ let argv = minimist(process.argv.slice(2), {
|
||||
});
|
||||
|
||||
// - check we are in release branch, e.g. 0.33-stable
|
||||
let branch = exec(`git symbolic-ref --short HEAD`, {silent: true}).stdout.trim();
|
||||
let branch = exec('git symbolic-ref --short HEAD', {silent: true}).stdout.trim();
|
||||
|
||||
if (branch.indexOf(`-stable`) === -1) {
|
||||
echo(`You must be in 0.XX-stable branch to bump a version`);
|
||||
if (branch.indexOf('-stable') === -1) {
|
||||
echo('You must be in 0.XX-stable branch to bump a version');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// e.g. 0.33
|
||||
let versionMajor = branch.slice(0, branch.indexOf(`-stable`));
|
||||
let versionMajor = branch.slice(0, branch.indexOf('-stable'));
|
||||
|
||||
// - check that argument version matches branch
|
||||
// e.g. 0.33.1 or 0.33.0-rc4
|
||||
let version = argv._[0];
|
||||
if (!version || version.indexOf(versionMajor) !== 0) {
|
||||
echo(`You must pass a tag like ${versionMajor}.[X]-rc[Y] to bump a version`);
|
||||
echo(`You must pass a tag like 0.${versionMajor}.[X]-rc[Y] to bump a version`);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
let packageJson = JSON.parse(cat(`package.json`));
|
||||
// Generate version files to detect mismatches between JS and native.
|
||||
let match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/);
|
||||
if (!match) {
|
||||
echo(`You must pass a correctly formatted version; couldn't parse ${version}`);
|
||||
exit(1);
|
||||
}
|
||||
let [, major, minor, patch, prerelease] = match;
|
||||
|
||||
fs.writeFileSync(
|
||||
'ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java',
|
||||
cat('scripts/versiontemplates/ReactNativeVersion.java.template')
|
||||
.replace('${major}', major)
|
||||
.replace('${minor}', minor)
|
||||
.replace('${patch}', patch)
|
||||
.replace('${prerelease}', prerelease !== undefined ? `"${prerelease}"` : 'null'),
|
||||
'utf-8'
|
||||
);
|
||||
|
||||
fs.writeFileSync(
|
||||
'React/Base/RCTVersion.h',
|
||||
cat('scripts/versiontemplates/RCTVersion.h.template')
|
||||
.replace('${major}', `@(${major})`)
|
||||
.replace('${minor}', `@(${minor})`)
|
||||
.replace('${patch}', `@(${patch})`)
|
||||
.replace('${prerelease}', prerelease !== undefined ? `@"${prerelease}"` : '[NSNull null]'),
|
||||
'utf-8'
|
||||
);
|
||||
|
||||
fs.writeFileSync(
|
||||
'Libraries/Core/ReactNativeVersion.js',
|
||||
cat('scripts/versiontemplates/ReactNativeVersion.js.template')
|
||||
.replace('${major}', major)
|
||||
.replace('${minor}', minor)
|
||||
.replace('${patch}', patch)
|
||||
.replace('${prerelease}', prerelease !== undefined ? `'${prerelease}'` : 'null'),
|
||||
'utf-8'
|
||||
);
|
||||
|
||||
let packageJson = JSON.parse(cat('package.json'));
|
||||
packageJson.version = version;
|
||||
JSON.stringify(packageJson, null, 2).to(`package.json`);
|
||||
fs.writeFileSync('package.json', JSON.stringify(packageJson, null, 2), 'utf-8');
|
||||
|
||||
// - change ReactAndroid/gradle.properties
|
||||
if (sed(`-i`, /^VERSION_NAME=.*/, `VERSION_NAME=${version}`, `ReactAndroid/gradle.properties`).code) {
|
||||
echo(`Couldn't update version for Gradle`);
|
||||
if (sed('-i', /^VERSION_NAME=.*/, `VERSION_NAME=${version}`, 'ReactAndroid/gradle.properties').code) {
|
||||
echo('Couldn\'t update version for Gradle');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -64,23 +102,23 @@ if (sed(`-i`, /^VERSION_NAME=.*/, `VERSION_NAME=${version}`, `ReactAndroid/gradl
|
||||
let numberOfChangedLinesWithNewVersion = exec(`git diff -U0 | grep '^[+]' | grep -c ${version} `, {silent: true})
|
||||
.stdout.trim();
|
||||
if (+numberOfChangedLinesWithNewVersion !== 2) {
|
||||
echo(`Failed to update all the files. package.json and gradle.properties must have versions in them`);
|
||||
echo(`Fix the issue, revert and try again`);
|
||||
exec(`git diff`);
|
||||
echo('Failed to update all the files. package.json and gradle.properties must have versions in them');
|
||||
echo('Fix the issue, revert and try again');
|
||||
exec('git diff');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// - make commit [0.21.0-rc] Bump version numbers
|
||||
if (exec(`git commit -a -m "[${version}] Bump version numbers"`).code) {
|
||||
echo(`failed to commit`);
|
||||
echo('failed to commit');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// - add tag v0.21.0-rc
|
||||
if (exec(`git tag v${version}`).code) {
|
||||
echo(`failed to tag the commit with v${version}, are you sure this release wasn't made earlier?`);
|
||||
echo(`You may want to rollback the last commit`);
|
||||
echo(`git reset --hard HEAD~1`);
|
||||
echo('You may want to rollback the last commit');
|
||||
echo('git reset --hard HEAD~1');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -89,10 +127,10 @@ let remote = argv.remote;
|
||||
exec(`git push ${remote} v${version}`);
|
||||
|
||||
// Tag latest if doing stable release
|
||||
if (version.indexOf(`rc`) === -1) {
|
||||
exec(`git tag -d latest`);
|
||||
if (version.indexOf('rc') === -1) {
|
||||
exec('git tag -d latest');
|
||||
exec(`git push ${remote} :latest`);
|
||||
exec(`git tag latest`);
|
||||
exec('git tag latest');
|
||||
exec(`git push ${remote} latest`);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* @generated by scripts/bump-oss-version.js
|
||||
*
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
#define REACT_NATIVE_VERSION @{ \
|
||||
@"major": ${major}, \
|
||||
@"minor": ${minor}, \
|
||||
@"patch": ${patch}, \
|
||||
@"prerelease": ${prerelease}, \
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* @generated by scripts/bump-oss-version.js
|
||||
*
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
package com.facebook.react.modules.systeminfo;
|
||||
|
||||
import com.facebook.react.common.MapBuilder;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class ReactNativeVersion {
|
||||
public static final Map<String, Object> VERSION = MapBuilder.<String, Object>of(
|
||||
"major", ${major},
|
||||
"minor", ${minor},
|
||||
"patch", ${patch},
|
||||
"prerelease", ${prerelease});
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/**
|
||||
* @generated by scripts/bump-oss-version.js
|
||||
*
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
* @flow
|
||||
* @providesModule ReactNativeVersion
|
||||
*/
|
||||
|
||||
exports.version = {
|
||||
major: ${major},
|
||||
minor: ${minor},
|
||||
patch: ${patch},
|
||||
prerelease: ${prerelease},
|
||||
};
|
||||
Reference in New Issue
Block a user