Skip to content

Commit c872048

Browse files
feat: peer deps check (#1752)
1 parent 9660127 commit c872048

File tree

5 files changed

+115
-7
lines changed

5 files changed

+115
-7
lines changed

package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
"@release-it/conventional-changelog": "^10.0.0",
7878
"@relmify/jest-serializer-strip-ansi": "^1.0.2",
7979
"@types/jest": "^29.5.14",
80+
"@types/node": "^22.13.8",
8081
"@types/react": "^19.0.0",
8182
"@types/react-test-renderer": "^19.0.0",
8283
"babel-jest": "^29.7.0",
@@ -87,9 +88,9 @@
8788
"flow-bin": "~0.170.0",
8889
"jest": "^29.7.0",
8990
"prettier": "^2.8.8",
90-
"react": "^19.0.0",
91+
"react": "19.0.0",
9192
"react-native": "0.78.0",
92-
"react-test-renderer": "^19.0.0",
93+
"react-test-renderer": "19.0.0",
9394
"release-it": "^18.0.0",
9495
"typescript": "^5.6.3",
9596
"typescript-eslint": "^8.19.1"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/* eslint-disable @typescript-eslint/no-require-imports */
2+
3+
// Mock the require calls
4+
jest.mock('react/package.json', () => ({ version: '19.0.0' }));
5+
jest.mock('react-test-renderer/package.json', () => ({ version: '19.0.0' }));
6+
7+
describe('ensurePeerDeps', () => {
8+
const originalEnv = process.env;
9+
10+
beforeEach(() => {
11+
jest.resetModules();
12+
process.env = { ...originalEnv };
13+
delete process.env.RNTL_SKIP_DEPS_CHECK;
14+
});
15+
16+
afterEach(() => {
17+
process.env = originalEnv;
18+
});
19+
20+
it('should not throw when versions match', () => {
21+
expect(() => require('../ensure-peer-deps')).not.toThrow();
22+
});
23+
24+
it('should throw when react-test-renderer is missing', () => {
25+
jest.mock('react-test-renderer/package.json', () => {
26+
throw new Error('Module not found');
27+
});
28+
29+
expect(() => require('../ensure-peer-deps')).toThrow(
30+
'Missing dev dependency "react-test-renderer@19.0.0"',
31+
);
32+
});
33+
34+
it('should throw when react-test-renderer version mismatches', () => {
35+
jest.mock('react-test-renderer/package.json', () => ({ version: '18.2.0' }));
36+
37+
expect(() => require('../ensure-peer-deps')).toThrow(
38+
'Incorrect version of "react-test-renderer" detected. Expected "19.0.0", but found "18.2.0"',
39+
);
40+
});
41+
42+
it('should skip dependency check when RNTL_SKIP_DEPS_CHECK is set', () => {
43+
process.env.RNTL_SKIP_DEPS_CHECK = '1';
44+
jest.mock('react-test-renderer/package.json', () => {
45+
throw new Error('Module not found');
46+
});
47+
48+
expect(() => require('../ensure-peer-deps')).not.toThrow();
49+
});
50+
});

src/helpers/ensure-peer-deps.ts

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
function ensurePeerDeps() {
2+
const reactVersion = getPackageVersion('react');
3+
ensurePackage('react-test-renderer', reactVersion);
4+
}
5+
6+
function ensurePackage(name: string, expectedVersion: string) {
7+
const actualVersion = getPackageVersion(name);
8+
if (!actualVersion) {
9+
const error = new Error(
10+
`Missing dev dependency "${name}@${expectedVersion}".\n\nFix it by running:\nnpm install -D ${name}@${expectedVersion}`,
11+
);
12+
Error.captureStackTrace(error, ensurePeerDeps);
13+
throw error;
14+
}
15+
16+
if (expectedVersion !== actualVersion) {
17+
const error = new Error(
18+
`Incorrect version of "${name}" detected. Expected "${expectedVersion}", but found "${actualVersion}".\n\nFix it by running:\nnpm install -D ${name}@${expectedVersion}`,
19+
);
20+
Error.captureStackTrace(error, ensurePeerDeps);
21+
throw error;
22+
}
23+
}
24+
25+
function getPackageVersion(name: string) {
26+
try {
27+
// eslint-disable-next-line @typescript-eslint/no-require-imports
28+
const packageJson = require(`${name}/package.json`);
29+
return packageJson.version;
30+
} catch {
31+
return null;
32+
}
33+
}
34+
35+
if (!process.env.RNTL_SKIP_DEPS_CHECK) {
36+
ensurePeerDeps();
37+
}

src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import './helpers/ensure-peer-deps';
12
import './matchers/extend-expect';
23

34
import { getIsReactActEnvironment, setReactActEnvironment } from './act';

yarn.lock

+24-5
Original file line numberDiff line numberDiff line change
@@ -2838,6 +2838,7 @@ __metadata:
28382838
"@release-it/conventional-changelog": "npm:^10.0.0"
28392839
"@relmify/jest-serializer-strip-ansi": "npm:^1.0.2"
28402840
"@types/jest": "npm:^29.5.14"
2841+
"@types/node": "npm:^22.13.8"
28412842
"@types/react": "npm:^19.0.0"
28422843
"@types/react-test-renderer": "npm:^19.0.0"
28432844
babel-jest: "npm:^29.7.0"
@@ -2851,10 +2852,10 @@ __metadata:
28512852
jest-matcher-utils: "npm:^29.7.0"
28522853
prettier: "npm:^2.8.8"
28532854
pretty-format: "npm:^29.7.0"
2854-
react: "npm:^19.0.0"
2855+
react: "npm:19.0.0"
28552856
react-native: "npm:0.78.0"
28562857
react-native-gesture-handler: "npm:^2.23.1"
2857-
react-test-renderer: "npm:^19.0.0"
2858+
react-test-renderer: "npm:19.0.0"
28582859
redent: "npm:^3.0.0"
28592860
release-it: "npm:^18.0.0"
28602861
typescript: "npm:^5.6.3"
@@ -3008,6 +3009,15 @@ __metadata:
30083009
languageName: node
30093010
linkType: hard
30103011

3012+
"@types/node@npm:^22.13.8":
3013+
version: 22.13.8
3014+
resolution: "@types/node@npm:22.13.8"
3015+
dependencies:
3016+
undici-types: "npm:~6.20.0"
3017+
checksum: 10c0/bfc92b734a9dce6ac5daee0a52feccdf5dcb3804d895e4bc5384e2f4644612b8801725cd03c8c3c0888fb5eeb16b875877ac44b77641e0196dc1a837b1c2a366
3018+
languageName: node
3019+
linkType: hard
3020+
30113021
"@types/normalize-package-data@npm:^2.4.3":
30123022
version: 2.4.4
30133023
resolution: "@types/normalize-package-data@npm:2.4.4"
@@ -3031,7 +3041,16 @@ __metadata:
30313041
languageName: node
30323042
linkType: hard
30333043

3034-
"@types/react@npm:*, @types/react@npm:^19.0.0":
3044+
"@types/react@npm:*":
3045+
version: 19.0.10
3046+
resolution: "@types/react@npm:19.0.10"
3047+
dependencies:
3048+
csstype: "npm:^3.0.2"
3049+
checksum: 10c0/41884cca21850c8b2d6578b172ca0ca4fff6021251a68532b19f2031ac23dc5a9222470208065f8d9985d367376047df2f49ece8d927f7d04cdc94922b1eb34b
3050+
languageName: node
3051+
linkType: hard
3052+
3053+
"@types/react@npm:^19.0.0":
30353054
version: 19.0.8
30363055
resolution: "@types/react@npm:19.0.8"
30373056
dependencies:
@@ -9261,7 +9280,7 @@ __metadata:
92619280
languageName: node
92629281
linkType: hard
92639282

9264-
"react-test-renderer@npm:^19.0.0":
9283+
"react-test-renderer@npm:19.0.0":
92659284
version: 19.0.0
92669285
resolution: "react-test-renderer@npm:19.0.0"
92679286
dependencies:
@@ -9273,7 +9292,7 @@ __metadata:
92739292
languageName: node
92749293
linkType: hard
92759294

9276-
"react@npm:^19.0.0":
9295+
"react@npm:19.0.0":
92779296
version: 19.0.0
92789297
resolution: "react@npm:19.0.0"
92799298
checksum: 10c0/9cad8f103e8e3a16d15cb18a0d8115d8bd9f9e1ce3420310aea381eb42aa0a4f812cf047bb5441349257a05fba8a291515691e3cb51267279b2d2c3253f38471

0 commit comments

Comments
 (0)