mirror of
https://github.com/facebook/react.git
synced 2026-02-24 20:53:03 +00:00
These are based on the ReactNoop renderer, which we use to test React itself. This gives library authors (Relay, Apollo, Redux, et al.) a way to test their components for async compatibility. - Pass `unstable_isAsync` to `TestRenderer.create` to create an async renderer instance. This causes updates to be lazily flushed. - `renderer.unstable_yield` tells React to yield execution after the currently rendering component. - `renderer.unstable_flushAll` flushes all pending async work, and returns an array of yielded values. - `renderer.unstable_flushThrough` receives an array of expected values, begins rendering, and stops once those values have been yielded. It returns the array of values that are actually yielded. The user should assert that they are equal. Although we've used this pattern successfully in our own tests, I'm not sure if these are the final APIs we'll make public.
122 lines
3.8 KiB
JavaScript
122 lines
3.8 KiB
JavaScript
'use strict';
|
|
|
|
const bundleTypes = require('./bundles').bundleTypes;
|
|
|
|
const UMD_DEV = bundleTypes.UMD_DEV;
|
|
const UMD_PROD = bundleTypes.UMD_PROD;
|
|
const FB_DEV = bundleTypes.FB_DEV;
|
|
const FB_PROD = bundleTypes.FB_PROD;
|
|
const RN_DEV = bundleTypes.RN_DEV;
|
|
const RN_PROD = bundleTypes.RN_PROD;
|
|
|
|
// If you need to replace a file with another file for a specific environment,
|
|
// add it to this list with the logic for choosing the right replacement.
|
|
const forks = Object.freeze({
|
|
// Optimization: for UMDs, use object-assign polyfill that is already a part
|
|
// of the React package instead of bundling it again.
|
|
'object-assign': (bundleType, entry, dependencies) => {
|
|
if (bundleType !== UMD_DEV && bundleType !== UMD_PROD) {
|
|
// It's only relevant for UMD bundles since that's where the duplication
|
|
// happens. Other bundles just require('object-assign') anyway.
|
|
return null;
|
|
}
|
|
if (dependencies.indexOf('react') === -1) {
|
|
// We can only apply the optimizations to bundle that depend on React
|
|
// because we read assign() from an object exposed on React internals.
|
|
return null;
|
|
}
|
|
// We can use the fork!
|
|
return 'shared/forks/object-assign.umd.js';
|
|
},
|
|
|
|
// We have a few forks for different environments.
|
|
'shared/ReactFeatureFlags': (bundleType, entry) => {
|
|
switch (entry) {
|
|
case 'react-native-renderer':
|
|
return 'shared/forks/ReactFeatureFlags.native.js';
|
|
case 'react-native-renderer/fabric':
|
|
return 'shared/forks/ReactFeatureFlags.native-fabric.js';
|
|
case 'react-reconciler/persistent':
|
|
return 'shared/forks/ReactFeatureFlags.persistent.js';
|
|
case 'react-test-renderer':
|
|
return 'shared/forks/ReactFeatureFlags.test-renderer.js';
|
|
default:
|
|
switch (bundleType) {
|
|
case FB_DEV:
|
|
case FB_PROD:
|
|
return 'shared/forks/ReactFeatureFlags.www.js';
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
|
|
// This logic is forked on www to blacklist warnings.
|
|
'shared/lowPriorityWarning': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_DEV:
|
|
case FB_PROD:
|
|
return 'shared/forks/lowPriorityWarning.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// In FB bundles, we preserve an inline require to ReactCurrentOwner.
|
|
// See the explanation in FB version of ReactCurrentOwner in www:
|
|
'react/src/ReactCurrentOwner': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_DEV:
|
|
case FB_PROD:
|
|
return 'react/src/forks/ReactCurrentOwner.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// Different wrapping/reporting for caught errors.
|
|
'shared/invokeGuardedCallback': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_DEV:
|
|
case FB_PROD:
|
|
return 'shared/forks/invokeGuardedCallback.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// Different dialogs for caught errors.
|
|
'react-reconciler/src/ReactFiberErrorDialog': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_DEV:
|
|
case FB_PROD:
|
|
// Use the www fork which shows an error dialog.
|
|
return 'react-reconciler/src/forks/ReactFiberErrorDialog.www.js';
|
|
case RN_DEV:
|
|
case RN_PROD:
|
|
switch (entry) {
|
|
case 'react-native-renderer':
|
|
// Use the RN fork which plays well with redbox.
|
|
return 'react-reconciler/src/forks/ReactFiberErrorDialog.native.js';
|
|
default:
|
|
return null;
|
|
}
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// We wrap top-level listeners into guards on www.
|
|
'react-dom/src/events/EventListener': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_DEV:
|
|
case FB_PROD:
|
|
// Use the www fork which is integrated with TimeSlice profiling.
|
|
return 'react-dom/src/events/forks/EventListener-www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
});
|
|
|
|
module.exports = forks;
|