Skip to content

Commit

Permalink
Detect react-native-renderer mismatch, too
Browse files Browse the repository at this point in the history
  • Loading branch information
acdlite committed May 28, 2024
1 parent 8dd152f commit 38bc3c5
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 9 deletions.
14 changes: 14 additions & 0 deletions packages/react-native-renderer/src/ReactNativeRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,20 @@ import {disableLegacyMode} from 'shared/ReactFeatureFlags';
// Module provided by RN:
import {ReactFiberErrorDialog} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface';

import reactNativePackageVersion from 'shared/ReactVersion';
import * as IsomorphicReactPackage from 'react';

const isomorphicReactPackageVersion = IsomorphicReactPackage.version;
if (isomorphicReactPackageVersion !== reactNativePackageVersion) {
throw new Error(
'Incompatible React versions: The "react" and "react-native-renderer" packages must ' +
'have the exact same version. Instead got:\n' +
` - react: ${isomorphicReactPackageVersion}\n` +
` - react-native-renderer: ${reactNativePackageVersion}\n` +
'Learn more: https://react.dev/warnings/version-mismatch',
);
}

if (typeof ReactFiberErrorDialog.showErrorDialog !== 'function') {
throw new Error(
'Expected ReactFiberErrorDialog.showErrorDialog to be a function.',
Expand Down
34 changes: 25 additions & 9 deletions packages/react/src/__tests__/ReactMismatchedVersions-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,22 @@ describe('ReactMismatchedVersions-test', () => {
require('web-streams-polyfill/ponyfill/es6').ReadableStream;
global.TextEncoder = require('util').TextEncoder;

jest.mock('react', () => {
const actualReact = jest.requireActual('react');
return {
...actualReact,
version: '18.0.0-whoa-this-aint-the-right-react',
__actualVersion: actualReact.version,
};
let React;
let actualReactVersion;

beforeEach(() => {
jest.resetModules();
jest.mock('react', () => {
const actualReact = jest.requireActual('react');
return {
...actualReact,
version: '18.0.0-whoa-this-aint-the-right-react',
__actualVersion: actualReact.version,
};
});
React = require('react');
actualReactVersion = React.__actualVersion;
});
const React = require('react');
const actualReactVersion = React.__actualVersion;

test('importing "react-dom/client" throws if version does not match React version', async () => {
expect(() => require('react-dom/client')).toThrow(
Expand Down Expand Up @@ -124,4 +130,14 @@ describe('ReactMismatchedVersions-test', () => {
` - react-dom: ${actualReactVersion}`,
);
});

// @gate source
test('importing "react-native-renderer" throws if version does not match React version', async () => {
expect(() => require('react-native-renderer')).toThrow(
'Incompatible React versions: The "react" and "react-native-renderer" packages ' +
'must have the exact same version. Instead got:\n' +
' - react: 18.0.0-whoa-this-aint-the-right-react\n' +
` - react-native-renderer: ${actualReactVersion}`,
);
});
});

0 comments on commit 38bc3c5

Please sign in to comment.