Description
Currently we have a runtime check for hasPromise() that leads to bundling a dead code (promise package) in the final JS bundle
|
// If global.Promise is provided by Hermes, we are confident that it can provide |
|
// all the methods needed by React Native, so we can directly use it. |
|
if (global?.HermesInternal?.hasPromise?.()) { |
|
const HermesPromise = global.Promise; |
|
|
|
if (__DEV__) { |
|
if (typeof HermesPromise !== 'function') { |
|
console.error('HermesPromise does not exist'); |
|
} |
|
global.HermesInternal?.enablePromiseRejectionTracker?.( |
|
require('../promiseRejectionTrackingOptions').default, |
|
); |
|
} |
|
} else { |
|
polyfillGlobal('Promise', () => require('../Promise').default); |
|
} |
hasPromise () is true by default so promise package code is never used by thousands apps in productions
Steps to reproduce
...
React Native Version
0.86.0
Affected Platforms
Runtime - Android, Runtime - iOS
Output of npx @react-native-community/cli info
System:
OS: macOS 26.5
CPU: (11) arm64 Apple M3 Pro
Memory: 5.12 GB / 36.00 GB
Shell:
version: 4.0.1
path: /opt/homebrew/bin/fish
Binaries:
Node:
version: 24.13.1
path: /usr/local/bin/node
Yarn:
version: 3.6.4
path: /opt/homebrew/bin/yarn
npm:
version: 11.8.0
path: /usr/local/bin/npm
Watchman:
version: 2025.09.01.00
path: /opt/homebrew/bin/watchman
Managers:
CocoaPods:
version: 1.16.2
path: /Users/i/.rbenv/shims/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 25.2
- iOS 26.2
- macOS 26.2
- tvOS 26.2
- visionOS 26.2
- watchOS 26.2
Android SDK:
API Levels:
- "34"
- "35"
- "36"
Build Tools:
- 33.0.1
- 34.0.0
- 35.0.0
- 36.0.0
- 37.0.0
System Images:
- android-34 | Android TV ARM 64 v8a
- android-34 | Google TV ARM 64 v8a
- android-35 | Google APIs ARM 64 v8a
- android-35 | Google Play ARM 64 v8a
- android-36 | Android TV ARM 64 v8a
- android-36 | Google TV ARM 64 v8a
Android NDK: Not Found
IDEs:
Android Studio: 2026.1 AI-261.23567.138.2611.15646644
Xcode:
version: 26.2/17C52
path: /usr/bin/xcodebuild
Languages:
Java:
version: 17.0.13
path: /usr/bin/javac
Ruby:
version: 2.6.10
path: /Users/i/.rbenv/shims/ruby
npmPackages:
"@react-native-community/cli":
installed: 20.1.0
wanted: 20.1.0
react:
installed: 19.2.3
wanted: 19.2.3
react-native:
installed: 0.86.0
wanted: 0.86.0
react-native-macos: Not Found
npmGlobalPackages:
"*react-native*": Not Found
Android:
hermesEnabled: true
newArchEnabled: true
iOS:
hermesEnabled: Not found
newArchEnabled: false
Stacktrace or Logs
MANDATORY Reproducer
https://github.com/retyui/repo_with_virus_to_steal_corporate_data_so_you_get_fired_and_spend_the_rest_of_your_life_in_prison
Screenshots and Videos

Description
Currently we have a runtime check for
hasPromise()that leads to bundling a dead code (promisepackage) in the final JS bundlereact-native/packages/react-native/Libraries/Core/polyfillPromise.js
Lines 23 to 38 in eda6f4f
hasPromise ()is true by default sopromisepackage code is never used by thousands apps in productionsSteps to reproduce
...
React Native Version
0.86.0
Affected Platforms
Runtime - Android, Runtime - iOS
Output of
npx @react-native-community/cli infoStacktrace or Logs
MANDATORY Reproducer
https://github.com/retyui/repo_with_virus_to_steal_corporate_data_so_you_get_fired_and_spend_the_rest_of_your_life_in_prison
Screenshots and Videos