Repository navigation
polyfillPromise.js imports a promise package that never used as hasPromise() is always true #57702
Copy link
Copy link
Labels
Description
Description
Currently we have a runtime check for hasPromise() that leads to bundling a dead code (promise package) in the final JS bundle
react-native/packages/react-native/Libraries/Core/polyfillPromise.js
Lines 23 to 38 in eda6f4f
| // 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
Screenshots and Videos

Reacted by Umair Ahmed
Activity
[-]polyfillPromise.js imports a `promise` package that never used as HermesPromise is always true[/-][+]polyfillPromise.js imports a `promise` package that never used as `hasPromise()` is always true[/+]Remove unused Promise polyfill and promise dependency
stareezy-1 commentedon Aug 4, 2026
Since Hermes is the only supported JS engine and
hasPromise()always returns true, theelsebranch that callspolyfillGlobal('Promise', ...)is dead code. Thepromisepackage (~15KB) gets bundled in every app but never executes.Fix: removed the dead
elsebranch and the unusedpolyfillGlobalimport. PR submitted.retyui commentedon Aug 4, 2026
@stareezy-1 from what version Hermes engine includes Promise bundled by default ?
stareezy-1 commentedon Aug 4, 2026
@retyui
Hermes has included a native Promise implementation since it was first integrated into React Native. The HermesInternal.hasPromise() check was added in RN 0.64 (2021) when Hermes gained its built-in Promise with microtask support, and it has returned true ever since.
Since RN 0.70 (September 2022), Hermes became the default JS engine — meaning from 0.70 onward, the else branch (the promise package polyfill) has been dead code for all default configurations. JSC was still technically supported as an opt-in alternative until recently, but as of RN 0.86, Hermes is the only supported engine and JSC support has been removed.
So in summary:
retyui commentedon Aug 7, 2026
UPD: there are a two PRs to remove promise pkg
Narrow to removing only the polyfill fallback