Skip to content

Commit 38bc3c5

Browse files
committed
Detect react-native-renderer mismatch, too
1 parent 8dd152f commit 38bc3c5

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

packages/react-native-renderer/src/ReactNativeRenderer.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,20 @@ import {disableLegacyMode} from 'shared/ReactFeatureFlags';
5656
// Module provided by RN:
5757
import {ReactFiberErrorDialog} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface';
5858

59+
import reactNativePackageVersion from 'shared/ReactVersion';
60+
import * as IsomorphicReactPackage from 'react';
61+
62+
const isomorphicReactPackageVersion = IsomorphicReactPackage.version;
63+
if (isomorphicReactPackageVersion !== reactNativePackageVersion) {
64+
throw new Error(
65+
'Incompatible React versions: The "react" and "react-native-renderer" packages must ' +
66+
'have the exact same version. Instead got:\n' +
67+
` - react: ${isomorphicReactPackageVersion}\n` +
68+
` - react-native-renderer: ${reactNativePackageVersion}\n` +
69+
'Learn more: https://react.dev/warnings/version-mismatch',
70+
);
71+
}
72+
5973
if (typeof ReactFiberErrorDialog.showErrorDialog !== 'function') {
6074
throw new Error(
6175
'Expected ReactFiberErrorDialog.showErrorDialog to be a function.',

packages/react/src/__tests__/ReactMismatchedVersions-test.js

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,22 @@ describe('ReactMismatchedVersions-test', () => {
1515
require('web-streams-polyfill/ponyfill/es6').ReadableStream;
1616
global.TextEncoder = require('util').TextEncoder;
1717

18-
jest.mock('react', () => {
19-
const actualReact = jest.requireActual('react');
20-
return {
21-
...actualReact,
22-
version: '18.0.0-whoa-this-aint-the-right-react',
23-
__actualVersion: actualReact.version,
24-
};
18+
let React;
19+
let actualReactVersion;
20+
21+
beforeEach(() => {
22+
jest.resetModules();
23+
jest.mock('react', () => {
24+
const actualReact = jest.requireActual('react');
25+
return {
26+
...actualReact,
27+
version: '18.0.0-whoa-this-aint-the-right-react',
28+
__actualVersion: actualReact.version,
29+
};
30+
});
31+
React = require('react');
32+
actualReactVersion = React.__actualVersion;
2533
});
26-
const React = require('react');
27-
const actualReactVersion = React.__actualVersion;
2834

2935
test('importing "react-dom/client" throws if version does not match React version', async () => {
3036
expect(() => require('react-dom/client')).toThrow(
@@ -124,4 +130,14 @@ describe('ReactMismatchedVersions-test', () => {
124130
` - react-dom: ${actualReactVersion}`,
125131
);
126132
});
133+
134+
// @gate source
135+
test('importing "react-native-renderer" throws if version does not match React version', async () => {
136+
expect(() => require('react-native-renderer')).toThrow(
137+
'Incompatible React versions: The "react" and "react-native-renderer" packages ' +
138+
'must have the exact same version. Instead got:\n' +
139+
' - react: 18.0.0-whoa-this-aint-the-right-react\n' +
140+
` - react-native-renderer: ${actualReactVersion}`,
141+
);
142+
});
127143
});

0 commit comments

Comments
 (0)