238 lines
7.5 KiB
JavaScript
238 lines
7.5 KiB
JavaScript
'use strict';
|
|
|
|
const bundleTypes = require('./bundles').bundleTypes;
|
|
const moduleTypes = require('./bundles').moduleTypes;
|
|
const inlinedHostConfigs = require('../shared/inlinedHostConfigs');
|
|
|
|
const UMD_DEV = bundleTypes.UMD_DEV;
|
|
const UMD_PROD = bundleTypes.UMD_PROD;
|
|
const FB_WWW_DEV = bundleTypes.FB_WWW_DEV;
|
|
const FB_WWW_PROD = bundleTypes.FB_WWW_PROD;
|
|
const FB_WWW_PROFILING = bundleTypes.FB_WWW_PROFILING;
|
|
const RN_OSS_DEV = bundleTypes.RN_OSS_DEV;
|
|
const RN_OSS_PROD = bundleTypes.RN_OSS_PROD;
|
|
const RN_OSS_PROFILING = bundleTypes.RN_OSS_PROFILING;
|
|
const RN_FB_DEV = bundleTypes.RN_FB_DEV;
|
|
const RN_FB_PROD = bundleTypes.RN_FB_PROD;
|
|
const RN_FB_PROFILING = bundleTypes.RN_FB_PROFILING;
|
|
const RENDERER = moduleTypes.RENDERER;
|
|
const RECONCILER = moduleTypes.RECONCILER;
|
|
|
|
// 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':
|
|
switch (bundleType) {
|
|
case RN_FB_DEV:
|
|
case RN_FB_PROD:
|
|
case RN_FB_PROFILING:
|
|
return 'shared/forks/ReactFeatureFlags.native-fb.js';
|
|
case RN_OSS_DEV:
|
|
case RN_OSS_PROD:
|
|
case RN_OSS_PROFILING:
|
|
return 'shared/forks/ReactFeatureFlags.native-oss.js';
|
|
default:
|
|
throw Error(
|
|
`Unexpected entry (${entry}) and bundleType (${bundleType})`
|
|
);
|
|
}
|
|
case 'react-native-renderer/fabric':
|
|
switch (bundleType) {
|
|
case RN_FB_DEV:
|
|
case RN_FB_PROD:
|
|
case RN_FB_PROFILING:
|
|
return 'shared/forks/ReactFeatureFlags.native-fabric-fb.js';
|
|
case RN_OSS_DEV:
|
|
case RN_OSS_PROD:
|
|
case RN_OSS_PROFILING:
|
|
return 'shared/forks/ReactFeatureFlags.native-fabric-oss.js';
|
|
default:
|
|
throw Error(
|
|
`Unexpected entry (${entry}) and bundleType (${bundleType})`
|
|
);
|
|
}
|
|
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_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
case FB_WWW_PROFILING:
|
|
return 'shared/forks/ReactFeatureFlags.www.js';
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
|
|
'shared/ReactScheduler': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
case FB_WWW_PROFILING:
|
|
return 'shared/forks/ReactScheduler.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// This logic is forked on www to fork the formatting function.
|
|
'shared/invariant': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
case FB_WWW_PROFILING:
|
|
return 'shared/forks/invariant.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// This logic is forked on www to blacklist warnings.
|
|
'shared/lowPriorityWarning': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
case FB_WWW_PROFILING:
|
|
return 'shared/forks/lowPriorityWarning.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// This logic is forked on www to blacklist warnings.
|
|
'shared/warning': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
case FB_WWW_PROFILING:
|
|
return 'shared/forks/warning.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_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
case FB_WWW_PROFILING:
|
|
return 'react/src/forks/ReactCurrentOwner.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// Different wrapping/reporting for caught errors.
|
|
'shared/invokeGuardedCallback': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
case FB_WWW_PROFILING:
|
|
return 'shared/forks/invokeGuardedCallback.www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// Different dialogs for caught errors.
|
|
'react-reconciler/src/ReactFiberErrorDialog': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
case FB_WWW_PROFILING:
|
|
// Use the www fork which shows an error dialog.
|
|
return 'react-reconciler/src/forks/ReactFiberErrorDialog.www.js';
|
|
case RN_OSS_DEV:
|
|
case RN_OSS_PROD:
|
|
case RN_OSS_PROFILING:
|
|
case RN_FB_DEV:
|
|
case RN_FB_PROD:
|
|
case RN_FB_PROFILING:
|
|
switch (entry) {
|
|
case 'react-native-renderer':
|
|
case 'react-native-renderer/fabric':
|
|
// Use the RN fork which plays well with redbox.
|
|
return 'react-reconciler/src/forks/ReactFiberErrorDialog.native.js';
|
|
default:
|
|
return null;
|
|
}
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
'react-reconciler/src/ReactFiberHostConfig': (
|
|
bundleType,
|
|
entry,
|
|
dependencies,
|
|
moduleType
|
|
) => {
|
|
if (dependencies.indexOf('react-reconciler') !== -1) {
|
|
return null;
|
|
}
|
|
if (moduleType !== RENDERER && moduleType !== RECONCILER) {
|
|
return null;
|
|
}
|
|
// eslint-disable-next-line no-for-of-loops/no-for-of-loops
|
|
for (let rendererInfo of inlinedHostConfigs) {
|
|
if (rendererInfo.entryPoints.indexOf(entry) !== -1) {
|
|
return `react-reconciler/src/forks/ReactFiberHostConfig.${
|
|
rendererInfo.shortName
|
|
}.js`;
|
|
}
|
|
}
|
|
throw new Error(
|
|
'Expected ReactFiberHostConfig to always be replaced with a shim, but ' +
|
|
`found no mention of "${entry}" entry point in ./scripts/shared/inlinedHostConfigs.js. ` +
|
|
'Did you mean to add it there to associate it with a specific renderer?'
|
|
);
|
|
},
|
|
|
|
// We wrap top-level listeners into guards on www.
|
|
'react-dom/src/events/EventListener': (bundleType, entry) => {
|
|
switch (bundleType) {
|
|
case FB_WWW_DEV:
|
|
case FB_WWW_PROD:
|
|
case FB_WWW_PROFILING:
|
|
// Use the www fork which is integrated with TimeSlice profiling.
|
|
return 'react-dom/src/events/forks/EventListener-www.js';
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
|
|
// React DOM uses different top level event names and supports mouse events.
|
|
'events/ResponderTopLevelEventTypes': (bundleType, entry) => {
|
|
if (entry === 'react-dom' || entry.startsWith('react-dom/')) {
|
|
return 'events/forks/ResponderTopLevelEventTypes.dom.js';
|
|
}
|
|
return null;
|
|
},
|
|
});
|
|
|
|
module.exports = forks;
|