'use strict'; const fs = require('node:fs'); const {bundleTypes, moduleTypes} = require('./bundles'); const inlinedHostConfigs = require('../shared/inlinedHostConfigs'); const { UMD_DEV, UMD_PROD, UMD_PROFILING, FB_WWW_DEV, FB_WWW_PROD, FB_WWW_PROFILING, RN_OSS_DEV, RN_OSS_PROD, RN_OSS_PROFILING, RN_FB_DEV, RN_FB_PROD, RN_FB_PROFILING, } = bundleTypes; const {RENDERER, RECONCILER} = moduleTypes; const RELEASE_CHANNEL = process.env.RELEASE_CHANNEL; // Default to building in experimental mode. If the release channel is set via // an environment variable, then check if it's "experimental". const __EXPERIMENTAL__ = typeof RELEASE_CHANNEL === 'string' ? RELEASE_CHANNEL === 'experimental' : true; function findNearestExistingForkFile(path, segmentedIdentifier, suffix) { const segments = segmentedIdentifier.split('-'); while (segments.length) { const candidate = segments.join('-'); const forkPath = path + candidate + suffix; try { fs.statSync(forkPath); return forkPath; } catch (error) { // Try the next candidate. } segments.pop(); } return null; } // 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. // Fork paths are relative to the project root. They must include the full path, // including the extension. We intentionally don't use Node's module resolution // algorithm because 1) require.resolve doesn't work with ESM modules, and 2) // the behavior is easier to predict. const forks = Object.freeze({ // Without this fork, importing `shared/ReactSharedInternals` inside // the `react` package itself would not work due to a cyclical dependency. './packages/shared/ReactSharedInternals.js': ( bundleType, entry, dependencies, _moduleType, bundle ) => { if (entry === 'react') { return './packages/react/src/ReactSharedInternalsClient.js'; } if ( entry === 'react/src/ReactServer.js' || entry === 'react/src/ReactServerFB.js' ) { return './packages/react/src/ReactSharedInternalsServer.js'; } if (bundle.condition === 'react-server') { return './packages/react-server/src/ReactSharedInternalsServer.js'; } if (!entry.startsWith('react/') && dependencies.indexOf('react') === -1) { // React internals are unavailable if we can't reference the package. // We return an error because we only want to throw if this module gets used. return new Error( 'Cannot use a module that depends on ReactSharedInternals ' + 'from "' + entry + '" because it does not declare "react" in the package ' + 'dependencies or peerDependencies.' ); } return null; }, // Without this fork, importing `shared/ReactDOMSharedInternals` inside // the `react-dom` package itself would not work due to a cyclical dependency. './packages/shared/ReactDOMSharedInternals.js': ( bundleType, entry, dependencies ) => { if ( entry === 'react-dom' || entry === 'react-dom/server-rendering-stub' || entry === 'react-dom/src/ReactDOMServer.js' || entry === 'react-dom/unstable_testing' ) { if ( bundleType === FB_WWW_DEV || bundleType === FB_WWW_PROD || bundleType === FB_WWW_PROFILING ) { return './packages/react-dom/src/ReactDOMSharedInternalsFB.js'; } else { return './packages/react-dom/src/ReactDOMSharedInternals.js'; } } if ( !entry.startsWith('react-dom/') && dependencies.indexOf('react-dom') === -1 ) { // React DOM internals are unavailable if we can't reference the package. // We return an error because we only want to throw if this module gets used. return new Error( 'Cannot use a module that depends on ReactDOMSharedInternals ' + 'from "' + entry + '" because it does not declare "react-dom" in the package ' + 'dependencies or peerDependencies.' ); } return null; }, // We have a few forks for different environments. './packages/shared/ReactFeatureFlags.js': (bundleType, entry) => { switch (entry) { case 'react-native-renderer': switch (bundleType) { case RN_FB_DEV: case RN_FB_PROD: case RN_FB_PROFILING: return './packages/shared/forks/ReactFeatureFlags.native-fb.js'; case RN_OSS_DEV: case RN_OSS_PROD: case RN_OSS_PROFILING: return './packages/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 './packages/shared/forks/ReactFeatureFlags.native-fb.js'; case RN_OSS_DEV: case RN_OSS_PROD: case RN_OSS_PROFILING: return './packages/shared/forks/ReactFeatureFlags.native-oss.js'; default: throw Error( `Unexpected entry (${entry}) and bundleType (${bundleType})` ); } case 'react-test-renderer': switch (bundleType) { case RN_FB_DEV: case RN_FB_PROD: case RN_FB_PROFILING: return './packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js'; case FB_WWW_DEV: case FB_WWW_PROD: case FB_WWW_PROFILING: return './packages/shared/forks/ReactFeatureFlags.test-renderer.www.js'; } return './packages/shared/forks/ReactFeatureFlags.test-renderer.js'; default: switch (bundleType) { case FB_WWW_DEV: case FB_WWW_PROD: case FB_WWW_PROFILING: return './packages/shared/forks/ReactFeatureFlags.www.js'; case RN_FB_DEV: case RN_FB_PROD: case RN_FB_PROFILING: return './packages/shared/forks/ReactFeatureFlags.native-fb.js'; } } return null; }, './packages/scheduler/index.js': (bundleType, entry, dependencies) => { switch (bundleType) { case UMD_DEV: case UMD_PROD: case UMD_PROFILING: if (dependencies.indexOf('react') === -1) { // It's only safe to use this fork for modules that depend on React, // because they read the re-exported API from the SECRET_INTERNALS object. return null; } // Optimization: for UMDs, use the API that is already a part of the React // package instead of requiring it to be loaded via a separate