From a0d39e7a9c26446b6fe4af4ab7be00aa1c68ddca Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Tue, 19 May 2026 11:53:54 -0700 Subject: [PATCH] Bump minimum Node.js version to 22 (#56887) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56887 Drop support for Node.js 20. The minimum supported version is now `^22.13.0 || ^24.3.0 || >= 26.0.0`. Node.js 20 reached end-of-life in April 2026 and is no longer actively maintained. This aligns React Native with the upcoming Metro requirement. Changelog: [General][Breaking] - Require Node.js >= 22.13.0 Reviewed By: christophpurrer, cortinico Differential Revision: D105685641 fbshipit-source-id: f490e5a13e4289daba98c4d56dd8fdd341aef0db --- .github/workflows/test-all.yml | 4 +++- packages/assets/package.json | 2 +- packages/babel-plugin-codegen/package.json | 2 +- packages/community-cli-plugin/package.json | 2 +- packages/core-cli-utils/package.json | 2 +- packages/debugger-frontend/package.json | 2 +- packages/debugger-shell/package.json | 2 +- packages/dev-middleware/package.json | 2 +- packages/eslint-config-react-native/package.json | 2 +- packages/eslint-plugin-react-native/package.json | 2 +- packages/eslint-plugin-specs/package.json | 2 +- packages/gradle-plugin/package.json | 2 +- packages/jest-preset/package.json | 2 +- packages/metro-config/package.json | 2 +- packages/new-app-screen/package.json | 2 +- packages/polyfills/package.json | 2 +- packages/react-native-babel-preset/package.json | 2 +- packages/react-native-babel-transformer/package.json | 2 +- packages/react-native-codegen/package.json | 2 +- packages/react-native-compatibility-check/package.json | 2 +- packages/react-native/package.json | 2 +- packages/rn-tester/package.json | 2 +- packages/virtualized-lists/package.json | 2 +- private/helloworld/package.json | 2 +- private/react-native-codegen-typescript-test/package.json | 2 +- 25 files changed, 27 insertions(+), 25 deletions(-) diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index b64a22f5f6a..a19b2bbdc31 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -451,6 +451,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v6 + - name: Setup Node.js + uses: ./.github/actions/setup-node - name: Install dependencies uses: ./.github/actions/yarn-install - name: Lint file structure @@ -482,7 +484,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: ["24", "22", "20.19.4"] + node-version: ["24", "22.13.0"] steps: - name: Checkout uses: actions/checkout@v6 diff --git a/packages/assets/package.json b/packages/assets/package.json index c9b1495a66b..f127ba2b154 100644 --- a/packages/assets/package.json +++ b/packages/assets/package.json @@ -17,7 +17,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "files": [ "path-support.js", diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index fe08d84d97d..3ae6ff190ea 100644 --- a/packages/babel-plugin-codegen/package.json +++ b/packages/babel-plugin-codegen/package.json @@ -19,7 +19,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "files": [ "index.js" diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index b24c4e079ff..be7c4d71059 100644 --- a/packages/community-cli-plugin/package.json +++ b/packages/community-cli-plugin/package.json @@ -55,6 +55,6 @@ } }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } } diff --git a/packages/core-cli-utils/package.json b/packages/core-cli-utils/package.json index b7bb0beff18..794add883bd 100644 --- a/packages/core-cli-utils/package.json +++ b/packages/core-cli-utils/package.json @@ -37,6 +37,6 @@ "dependencies": {}, "devDependencies": {}, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } } diff --git a/packages/debugger-frontend/package.json b/packages/debugger-frontend/package.json index 7935d24a28a..40ccadb4510 100644 --- a/packages/debugger-frontend/package.json +++ b/packages/debugger-frontend/package.json @@ -20,6 +20,6 @@ "BUILD_INFO" ], "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } } diff --git a/packages/debugger-shell/package.json b/packages/debugger-shell/package.json index c81ab54ea16..9e7c16369fd 100644 --- a/packages/debugger-shell/package.json +++ b/packages/debugger-shell/package.json @@ -38,7 +38,7 @@ }, "license": "MIT", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "dependencies": { "cross-spawn": "^7.0.6", diff --git a/packages/dev-middleware/package.json b/packages/dev-middleware/package.json index 918a0b0741a..5b9b7481442 100644 --- a/packages/dev-middleware/package.json +++ b/packages/dev-middleware/package.json @@ -51,6 +51,6 @@ "wait-for-expect": "^3.0.2" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } } diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index 14e3321b0c2..45682f40c08 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -16,7 +16,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "main": "index.js", "exports": { diff --git a/packages/eslint-plugin-react-native/package.json b/packages/eslint-plugin-react-native/package.json index 7963be48c3e..872d7b789e3 100644 --- a/packages/eslint-plugin-react-native/package.json +++ b/packages/eslint-plugin-react-native/package.json @@ -22,6 +22,6 @@ "hermes-eslint": "0.36.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } } diff --git a/packages/eslint-plugin-specs/package.json b/packages/eslint-plugin-specs/package.json index f4e8add753c..e8ed9d1e770 100644 --- a/packages/eslint-plugin-specs/package.json +++ b/packages/eslint-plugin-specs/package.json @@ -36,6 +36,6 @@ "hermes-eslint": "0.36.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } } diff --git a/packages/gradle-plugin/package.json b/packages/gradle-plugin/package.json index c2345f232ea..236f12d3986 100644 --- a/packages/gradle-plugin/package.json +++ b/packages/gradle-plugin/package.json @@ -16,7 +16,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "scripts": { "build": "./gradlew build", diff --git a/packages/jest-preset/package.json b/packages/jest-preset/package.json index a0957f4c1b1..987afe28dac 100644 --- a/packages/jest-preset/package.json +++ b/packages/jest-preset/package.json @@ -14,7 +14,7 @@ }, "license": "MIT", "engines": { - "node": ">= 20.19.4" + "node": ">= 22.13.0" }, "main": "./jest-preset.js", "files": [ diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index fe4641245ea..a95b6c14753 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -16,7 +16,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "exports": { ".": "./src/index.js", diff --git a/packages/new-app-screen/package.json b/packages/new-app-screen/package.json index fd074453d84..d3c86465358 100644 --- a/packages/new-app-screen/package.json +++ b/packages/new-app-screen/package.json @@ -30,6 +30,6 @@ } }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } } diff --git a/packages/polyfills/package.json b/packages/polyfills/package.json index 0b3aecb1a0b..dc3df5d594f 100644 --- a/packages/polyfills/package.json +++ b/packages/polyfills/package.json @@ -18,7 +18,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "files": [ "console.js", diff --git a/packages/react-native-babel-preset/package.json b/packages/react-native-babel-preset/package.json index 570b47f6aec..76bc4427425 100644 --- a/packages/react-native-babel-preset/package.json +++ b/packages/react-native-babel-preset/package.json @@ -13,7 +13,7 @@ ], "license": "MIT", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "main": "src/index.js", "files": [ diff --git a/packages/react-native-babel-transformer/package.json b/packages/react-native-babel-transformer/package.json index 28df1fe9114..cffaffd96b4 100644 --- a/packages/react-native-babel-transformer/package.json +++ b/packages/react-native-babel-transformer/package.json @@ -14,7 +14,7 @@ ], "license": "MIT", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "main": "src/index.js", "files": [ diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index 5d2b5b9c4c6..0e28eb22168 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -18,7 +18,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "scripts": { "build": "yarn clean && node scripts/build.js --verbose", diff --git a/packages/react-native-compatibility-check/package.json b/packages/react-native-compatibility-check/package.json index 2d3058ba62c..7751de0f57c 100644 --- a/packages/react-native-compatibility-check/package.json +++ b/packages/react-native-compatibility-check/package.json @@ -19,7 +19,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "exports": { ".": "./src/index.js", diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 97b081c2702..47d4675facb 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -21,7 +21,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "bin": { "react-native": "cli.js" diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json index f53b38b9ce1..db6034fbac6 100644 --- a/packages/rn-tester/package.json +++ b/packages/rn-tester/package.json @@ -10,7 +10,7 @@ "directory": "packages/rn-tester" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "scripts": { "start": "react-native start", diff --git a/packages/virtualized-lists/package.json b/packages/virtualized-lists/package.json index b7b3302778c..d8c5de95406 100644 --- a/packages/virtualized-lists/package.json +++ b/packages/virtualized-lists/package.json @@ -17,7 +17,7 @@ ], "bugs": "https://github.com/facebook/react-native/issues", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "exports": { ".": { diff --git a/private/helloworld/package.json b/private/helloworld/package.json index 4dafe59bbcf..a37652822ec 100644 --- a/private/helloworld/package.json +++ b/private/helloworld/package.json @@ -33,6 +33,6 @@ "rxjs": "^7.8.1" }, "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" } } diff --git a/private/react-native-codegen-typescript-test/package.json b/private/react-native-codegen-typescript-test/package.json index dd78e1fe7c2..6c672262676 100644 --- a/private/react-native-codegen-typescript-test/package.json +++ b/private/react-native-codegen-typescript-test/package.json @@ -5,7 +5,7 @@ "description": "TypeScript related unit test for @react-native/codegen", "license": "MIT", "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + "node": "^22.13.0 || ^24.3.0 || >= 26.0.0" }, "scripts": { "build": "yarn clean && node scripts/build.js --verbose && tsc",