From 96fcba90138e9f1a73ee1cc4f79a653ec12fc3a9 Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Tue, 28 Jul 2026 16:45:37 +0100 Subject: [PATCH] [RN] Update ReactPrivate and InitializeCore imports (0.87 Strict API) (#36986) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Migrate internal `Libraries/` import subpaths from `react-native` to the incoming dedicated entry points in React Native 0.87. **Motivation** See [**RFC0894: Removing deep imports from react-native**](https://github.com/react-native-community/discussions-and-proposals/pull/894) **Changes** The `react-private-interface` entry point has been created explicitly for the private contract between React ↔ React Native, and is 1:1 with the previous `ReactNativePrivateInterface` module. Both of the below `Libraries/` paths still exist, but are deprecated — this is a lagging migration that will enable cleanup in a future RN version. - `react-native/Libraries/Core/InitializeCore` → `react-native/setup-env` [react/react-native#57475](https://github.com/react/react-native/pull/57475) - `react-native/Libraries/ReactPrivate/ReactNativePrivateInterface` → `react-native/react-private-interface` [react/react-native#57495](https://github.com/react/react-native/pull/57495) ## Test Plan Flow --- packages/react-native-renderer/src/ReactFabric.js | 2 +- .../src/ReactFabricEventEmitter.js | 2 +- .../src/ReactFiberConfigFabric.js | 2 +- .../src/ReactNativeBridgeEventPlugin.js | 2 +- .../src/ReactNativeFiberInspector.js | 2 +- .../src/ReactNativeInjectionShared.js | 2 +- .../src/ReactNativePublicCompat.js | 4 ++-- .../__mocks__/react-native/react-private-interface.js | 10 ++++++++++ ...eactNativePrivateInitializeCore.js => setup-env.js} | 0 .../src/__tests__/ReactFabric-test.internal.js | 4 ++-- .../__tests__/ReactFabricFragmentRefs-test.internal.js | 2 +- .../src/__tests__/ReactNativeError-test.internal.js | 2 +- scripts/flow/react-native-host-hooks.js | 4 ++-- scripts/rollup/modules.js | 3 +-- scripts/rollup/shims/react-native/ReactFabric.js | 2 +- .../react-native/createReactNativeComponentClass.js | 2 +- 16 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 packages/react-native-renderer/src/__mocks__/react-native/react-private-interface.js rename packages/react-native-renderer/src/__mocks__/react-native/{Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js => setup-env.js} (100%) diff --git a/packages/react-native-renderer/src/ReactFabric.js b/packages/react-native-renderer/src/ReactFabric.js index d91431bd6f9..d871e775706 100644 --- a/packages/react-native-renderer/src/ReactFabric.js +++ b/packages/react-native-renderer/src/ReactFabric.js @@ -45,7 +45,7 @@ import { ReactFiberErrorDialog, createPublicRootInstance, type PublicRootInstance, -} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +} from 'react-native/react-private-interface'; import { disableLegacyMode, enableDefaultTransitionIndicator, diff --git a/packages/react-native-renderer/src/ReactFabricEventEmitter.js b/packages/react-native-renderer/src/ReactFabricEventEmitter.js index f47a6da8ea4..2ae38fe4464 100644 --- a/packages/react-native-renderer/src/ReactFabricEventEmitter.js +++ b/packages/react-native-renderer/src/ReactFabricEventEmitter.js @@ -31,7 +31,7 @@ import {runEventsInBatch} from './legacy-events/EventBatching'; import { RawEventEmitter, dispatchNativeEvent, -} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +} from 'react-native/react-private-interface'; import {getPublicInstance} from './ReactFiberConfigFabric'; import {enableNativeEventTargetEventDispatching} from './ReactNativeFeatureFlags'; diff --git a/packages/react-native-renderer/src/ReactFiberConfigFabric.js b/packages/react-native-renderer/src/ReactFiberConfigFabric.js index bf2ada73dad..83f876613e8 100644 --- a/packages/react-native-renderer/src/ReactFiberConfigFabric.js +++ b/packages/react-native-renderer/src/ReactFiberConfigFabric.js @@ -39,7 +39,7 @@ import { type PublicInstance as ReactNativePublicInstance, type PublicTextInstance, type PublicRootInstance, -} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +} from 'react-native/react-private-interface'; import { enableFragmentRefsInstanceHandles, enableFragmentRefsTextNodes, diff --git a/packages/react-native-renderer/src/ReactNativeBridgeEventPlugin.js b/packages/react-native-renderer/src/ReactNativeBridgeEventPlugin.js index 5594b88c0a7..c3d0e13acf1 100644 --- a/packages/react-native-renderer/src/ReactNativeBridgeEventPlugin.js +++ b/packages/react-native-renderer/src/ReactNativeBridgeEventPlugin.js @@ -16,7 +16,7 @@ import type {TopLevelType} from './legacy-events/TopLevelEventTypes'; import SyntheticEvent from './legacy-events/SyntheticEvent'; // Module provided by RN: -import {ReactNativeViewConfigRegistry} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +import {ReactNativeViewConfigRegistry} from 'react-native/react-private-interface'; import accumulateInto from './legacy-events/accumulateInto'; import getListener from './ReactNativeGetListener'; import forEachAccumulated from './legacy-events/forEachAccumulated'; diff --git a/packages/react-native-renderer/src/ReactNativeFiberInspector.js b/packages/react-native-renderer/src/ReactNativeFiberInspector.js index 61a993d188e..d65d5b0c33a 100644 --- a/packages/react-native-renderer/src/ReactNativeFiberInspector.js +++ b/packages/react-native-renderer/src/ReactNativeFiberInspector.js @@ -17,7 +17,7 @@ import { import getComponentNameFromType from 'shared/getComponentNameFromType'; import {HostComponent} from 'react-reconciler/src/ReactWorkTags'; // Module provided by RN: -import {getNodeFromPublicInstance} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +import {getNodeFromPublicInstance} from 'react-native/react-private-interface'; import {getNodeFromInternalInstanceHandle} from './ReactNativePublicCompat'; import {getStackByFiberInDevAndProd} from 'react-reconciler/src/ReactFiberComponentStack'; diff --git a/packages/react-native-renderer/src/ReactNativeInjectionShared.js b/packages/react-native-renderer/src/ReactNativeInjectionShared.js index 1e02d792dee..ae0ce746db5 100644 --- a/packages/react-native-renderer/src/ReactNativeInjectionShared.js +++ b/packages/react-native-renderer/src/ReactNativeInjectionShared.js @@ -14,7 +14,7 @@ * TODO: require this in packager, not in React #10932517 */ // Module provided by RN: -import 'react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore'; +import 'react-native/setup-env'; import ResponderEventPlugin from './legacy-events/ResponderEventPlugin'; import { diff --git a/packages/react-native-renderer/src/ReactNativePublicCompat.js b/packages/react-native-renderer/src/ReactNativePublicCompat.js index 53f78f73477..7d2b608f0b6 100644 --- a/packages/react-native-renderer/src/ReactNativePublicCompat.js +++ b/packages/react-native-renderer/src/ReactNativePublicCompat.js @@ -9,14 +9,14 @@ import type {Node} from './ReactNativeTypes'; import type {ElementRef, ElementType} from 'react'; -import type {PublicInstance} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +import type {PublicInstance} from 'react-native/react-private-interface'; // Modules provided by RN: import { getNodeFromPublicInstance, getNativeTagFromPublicInstance, getInternalInstanceHandleFromPublicInstance, -} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +} from 'react-native/react-private-interface'; import { findHostInstance, diff --git a/packages/react-native-renderer/src/__mocks__/react-native/react-private-interface.js b/packages/react-native-renderer/src/__mocks__/react-native/react-private-interface.js new file mode 100644 index 00000000000..33f3a3dfb11 --- /dev/null +++ b/packages/react-native-renderer/src/__mocks__/react-native/react-private-interface.js @@ -0,0 +1,10 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + */ + +module.exports = require('./Libraries/ReactPrivate/ReactNativePrivateInterface'); diff --git a/packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js b/packages/react-native-renderer/src/__mocks__/react-native/setup-env.js similarity index 100% rename from packages/react-native-renderer/src/__mocks__/react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore.js rename to packages/react-native-renderer/src/__mocks__/react-native/setup-env.js diff --git a/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js b/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js index f0afbad5b4f..1602ff93858 100644 --- a/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js +++ b/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js @@ -35,9 +35,9 @@ describe('ReactFabric', () => { React = require('react'); StrictMode = React.StrictMode; ReactFabric = require('react-native-renderer/fabric'); - ReactNativePrivateInterface = require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'); + ReactNativePrivateInterface = require('react-native/react-private-interface'); createReactNativeComponentClass = - require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface') + require('react-native/react-private-interface') .ReactNativeViewConfigRegistry.register; ({act, assertConsoleErrorDev} = require('internal-test-utils')); }); diff --git a/packages/react-native-renderer/src/__tests__/ReactFabricFragmentRefs-test.internal.js b/packages/react-native-renderer/src/__tests__/ReactFabricFragmentRefs-test.internal.js index ac4bcf36b00..5025cd7cee6 100644 --- a/packages/react-native-renderer/src/__tests__/ReactFabricFragmentRefs-test.internal.js +++ b/packages/react-native-renderer/src/__tests__/ReactFabricFragmentRefs-test.internal.js @@ -26,7 +26,7 @@ describe('Fabric FragmentRefs', () => { React = require('react'); ReactFabric = require('react-native-renderer/fabric'); createReactNativeComponentClass = - require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface') + require('react-native/react-private-interface') .ReactNativeViewConfigRegistry.register; ({act} = require('internal-test-utils')); View = createReactNativeComponentClass('RCTView', () => ({ diff --git a/packages/react-native-renderer/src/__tests__/ReactNativeError-test.internal.js b/packages/react-native-renderer/src/__tests__/ReactNativeError-test.internal.js index 8eb6421d492..4e613989a2e 100644 --- a/packages/react-native-renderer/src/__tests__/ReactNativeError-test.internal.js +++ b/packages/react-native-renderer/src/__tests__/ReactNativeError-test.internal.js @@ -17,7 +17,7 @@ describe('ReactNativeError', () => { jest.resetModules(); createReactNativeComponentClass = - require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface') + require('react-native/react-private-interface') .ReactNativeViewConfigRegistry.register; }); diff --git a/scripts/flow/react-native-host-hooks.js b/scripts/flow/react-native-host-hooks.js index 6b81b9d37a1..a7336d9d8c7 100644 --- a/scripts/flow/react-native-host-hooks.js +++ b/scripts/flow/react-native-host-hooks.js @@ -54,7 +54,7 @@ declare opaque type __PublicInstance; declare opaque type __PublicTextInstance; declare opaque type __PublicRootInstance; -declare module 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface' { +declare module 'react-native/react-private-interface' { declare export function deepFreezeAndThrowOnMutationInDev(obj: T): T; declare export const ReactFiberErrorDialog: { showErrorDialog: (error: __CapturedError) => boolean, @@ -117,7 +117,7 @@ declare module 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface' ): null | Object; } -declare module 'react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore' { +declare module 'react-native/setup-env' { } declare module 'react-native' { diff --git a/scripts/rollup/modules.js b/scripts/rollup/modules.js index 2afa0cc98b1..d72efb303c3 100644 --- a/scripts/rollup/modules.js +++ b/scripts/rollup/modules.js @@ -13,13 +13,12 @@ const importSideEffects = Object.freeze({ path: HAS_NO_SIDE_EFFECTS_ON_IMPORT, stream: HAS_NO_SIDE_EFFECTS_ON_IMPORT, 'prop-types/checkPropTypes': HAS_NO_SIDE_EFFECTS_ON_IMPORT, - 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface': - HAS_NO_SIDE_EFFECTS_ON_IMPORT, scheduler: HAS_NO_SIDE_EFFECTS_ON_IMPORT, react: HAS_NO_SIDE_EFFECTS_ON_IMPORT, 'react-dom/server': HAS_NO_SIDE_EFFECTS_ON_IMPORT, 'react/jsx-dev-runtime': HAS_NO_SIDE_EFFECTS_ON_IMPORT, 'react-dom': HAS_NO_SIDE_EFFECTS_ON_IMPORT, + 'react-native/react-private-interface': HAS_NO_SIDE_EFFECTS_ON_IMPORT, url: HAS_NO_SIDE_EFFECTS_ON_IMPORT, ReactNativeInternalFeatureFlags: HAS_NO_SIDE_EFFECTS_ON_IMPORT, 'webpack-sources/lib/helpers/createMappingsSerializer.js': diff --git a/scripts/rollup/shims/react-native/ReactFabric.js b/scripts/rollup/shims/react-native/ReactFabric.js index 69fb77af69a..e47aec516bc 100644 --- a/scripts/rollup/shims/react-native/ReactFabric.js +++ b/scripts/rollup/shims/react-native/ReactFabric.js @@ -11,7 +11,7 @@ 'use strict'; -import {BatchedBridge} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +import {BatchedBridge} from 'react-native/react-private-interface'; import type {ReactFabricType} from './ReactNativeTypes'; diff --git a/scripts/rollup/shims/react-native/createReactNativeComponentClass.js b/scripts/rollup/shims/react-native/createReactNativeComponentClass.js index 42ea979daef..0d16cd28543 100644 --- a/scripts/rollup/shims/react-native/createReactNativeComponentClass.js +++ b/scripts/rollup/shims/react-native/createReactNativeComponentClass.js @@ -11,7 +11,7 @@ 'use strict'; -import {ReactNativeViewConfigRegistry} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface'; +import {ReactNativeViewConfigRegistry} from 'react-native/react-private-interface'; import {type ViewConfig} from './ReactNativeTypes'; const {register} = ReactNativeViewConfigRegistry;