react-relay
Version:
A framework for building GraphQL-driven React applications.
86 lines (85 loc) • 2.67 kB
JavaScript
;
var enqueueTask = require('./enqueueTask');
var Scheduler = require('scheduler/unstable_mock');
var actingUpdatesScopeDepth = 0;
function act(scope) {
if (Scheduler.unstable_flushAllWithoutAsserting === undefined) {
throw Error('This version of `act` requires a special mock build of Scheduler.');
}
if (setTimeout._isMockFunction !== true) {
throw Error("This version of `act` requires Jest's timer mocks " + '(i.e. jest.useFakeTimers).');
}
var previousIsActEnvironment = global.IS_REACT_ACT_ENVIRONMENT;
var previousActingUpdatesScopeDepth = actingUpdatesScopeDepth;
actingUpdatesScopeDepth++;
if (process.env.NODE_ENV !== "production" && actingUpdatesScopeDepth === 1) {
global.IS_REACT_ACT_ENVIRONMENT = false;
}
var unwind = function unwind() {
if (process.env.NODE_ENV !== "production" && actingUpdatesScopeDepth === 1) {
global.IS_REACT_ACT_ENVIRONMENT = previousIsActEnvironment;
}
actingUpdatesScopeDepth--;
if (process.env.NODE_ENV !== "production") {
if (actingUpdatesScopeDepth > previousActingUpdatesScopeDepth) {
console.error('You seem to have overlapping act() calls, this is not supported. ' + 'Be sure to await previous act() calls before making a new one. ');
}
}
};
try {
var result = scope();
if (typeof result === 'object' && result !== null && typeof result.then === 'function') {
var thenableResult = result;
return {
then: function then(resolve, reject) {
thenableResult.then(function (returnValue) {
flushActWork(function () {
unwind();
resolve(returnValue);
}, function (error) {
unwind();
reject(error);
});
}, function (error) {
unwind();
reject(error);
});
}
};
} else {
var returnValue = result;
try {
var didFlushWork;
do {
didFlushWork = Scheduler.unstable_flushAllWithoutAsserting();
} while (didFlushWork);
return {
then: function then(resolve, reject) {
resolve(returnValue);
}
};
} finally {
unwind();
}
}
} catch (error) {
unwind();
throw error;
}
}
function flushActWork(resolve, reject) {
jest.runOnlyPendingTimers();
enqueueTask(function () {
try {
var didFlushWork = Scheduler.unstable_flushAllWithoutAsserting();
if (didFlushWork) {
flushActWork(resolve, reject);
} else {
resolve();
}
} catch (error) {
reject(error);
}
});
}
exports.act = act;