Skip to content

Latest commit

 

History

History
208 lines (180 loc) · 18.2 KB

File metadata and controls

208 lines (180 loc) · 18.2 KB

React Native upstream tracking

Tracking document for the Meta React Native changes selectively synchronized into this fork's main (React Native macOS 0.87).

fork.md remains the source of truth for the Microsoft React Native macOS baseline and every macOS-specific local patch. This document is deliberately separate: it records changes sourced directly from Meta before Microsoft has merged them, so the two upstream histories never get conflated.

Source refs

Source Remote Branch Commit
Local fork last functional tip main f843e0d16764cf58ee2704857f20fac81dda7005
Microsoft macOS baseline upstream 0.87-merge d8c588e4a67cbe9d3cdebb27a8909a93448807cd
Meta React Native stable react-native 0.87-stable b8d50a9dff21954d1c00f7be778de31ec49fb83d
Meta React Native main (sync snapshot) react-native main 4338af051488
Shared merge base ce057d6554b5ed44070336fa2353d7d6624eab92

Snapshot taken 2026-08-18:

git rev-list --left-right --count \
  upstream/0.87-merge...react-native/0.87-stable
# 79 62 (Microsoft-only, Meta-only)

The counts measure different platform integration histories, not quality or priority. Never merge the branch wholesale.

Local Meta syncs

Meta commit Status Local commit Intent / verification
65c816879c applied — verification blocked e0a118d379 Fix parentNode for nested Modal/portal roots. git apply --check passed; the source integration test needs @react-native/fantom, which this fork checkout does not provide. Run it after restoring the Fantom test environment, plus a macOS Modal focus/blur capture-and-bubble acceptance check.
79de55fbf5 applied — verification blocked e615acfbf5 Harden window and navigator descriptors in the JS runtime. The associated integration test also depends on the absent Fantom environment.
330080c46b applied — verification blocked 7bce075286 Make inspector tracing state move-only for Swift C++ interop and update C++ API snapshots. cxx-api-validate cannot run: the checkout lacks Python doxmlparser; rerun it in the documented toolchain.
8fffb64288 applied — verification blocked 3e72f8bd77 Use framework-style import for RNTester Fabric component plugins. Validate in an RNTester macOS build.
3ece12505b, e730105453 applied 24915b8f85, 6499e71ed2 Remove deprecated Jest-preset and polyfills subpath redirects.
85d24122f5, 6c5b9b1ae0, 9b76007ae0, 7dcf5de123, cc77834b28 applied — validation blocked 0a081311c5, 9eaf09671c, 602f22300a, f264b7ca1e, c89e9ad544 Adopt react-native/setup-env and keep it graph-reachable; validate a Metro app launch.
f1cfad0197, 0b70d7c95f, d4f22ae63d, e2d6d3230b, d6baa433cb applied — passes generated type test 1be1b98109, 2e026d56d1, 824f66a9f4, 084afb2f44, 63a5c02e83 Adopt Meta's public API removals and Strict TS API. The nested workspace had resolved react-native to the parent project's installed package, so React.ComponentRef crossed incompatible React declaration graphs and became never. Map the typetest's react-native import to this checkout's types_generated/index.d.ts; test-generated-typescript now passes.
d7288bd6a7, 9a7b821a02, f3e11c2557, 31cf29a5b3 applied — validation blocked a38fa0ed02, cd6862f59a, e84d89450d, d277e7ac23 Fix HelloWorld Jest preset, exact optional generated types, extensionless scripts imports and SceneTracker removal. Generated API snapshot was rebuilt for macOS patches.
4dd4d31458 already covered The OTHER_CPLUSPLUSFLAGS module-map behavior is already present in the local rncore.rb refactor; do not duplicate it.
17f7849e0d, 8959ebd91d, e325575445, fd653cb9f3, a556d97ed7, 8a35e69faf, 034245a015, 24353daa87 deferred by policy Prebuild/Core/Hermes architecture is stable locally; retain it and do not migrate to ReactNativeHeaders/VFS changes.
486df8d410, 6e2ca18cea, f07a030b2b, 0cacb90bc0, d8b52df809, 329f8640bf, b8d50a9dff deferred by policy SwiftPM changes will be evaluated only after the non-SwiftPM upstream sync is complete.

Meta main (post-0.87) syncs

Ray's 2026-08-19 decision: cherry-pick the useful main commits identified in the audit; do not follow 0.87-stable..main wholesale (package.json on main is 1000.0.0). Sync snapshot: react-native/main 4338af051488 is 357 commits ahead of 0.87-stable. That snapshot is the fork's recorded pick window; later main movement is out of this document until a new pass.

Meta commit Status Local commit Intent / verification
0a60ec9dea applied 4c8f23967a Decimal transformOrigin tokens.
4501979c1a applied — ported af6e241eb1 Negative transformOrigin tokens. Regex + tests ported onto the already-picked decimal parser.
092734772a applied 3d71a02af2 normalize-color LRU cache. Auto-merged onto the local oklch/oklab parser.
66f27eb93e applied d1b8e3e38d Keep radial-gradient position after an explicit size.
5821fcaf5d applied 5d0d23c7a8 Reject percentage radius for circle radial gradients.
26eb36c657 applied — ported 7cc433b7b4 PlatformColor native raw fallback. Kept RCTPlatformColor / macOS color-map; added OrNil.
65008fcdd0 applied — ported 08bc4478de PlatformColor(..., {fallback}) JS. Also wired PlatformColorValueTypes.macos.js (Meta shipped ios/android only). Some ios/android JS files landed in af6e241eb1.
85e07db3e8 applied — verification blocked 30266d4643 PlatformColor fallback Fantom / CSSColor tests. Need Fantom.
31e119a2a1 applied 17db3a0602 PlatformColor lint rule + RNTester example.
711a9a5e07 applied b599c166c1 Reset EmptyLayoutMetrics on Fabric view recycle.
2b992a0d4b applied 047ebb43da Flush created animated nodes before handling events.
42be7452d5 applied b8eba2c306 Codegen infinite loop on aliases that shadow CodegenTypes members.
4bf5575490 applied 18ddb67e34 Codegen'd TurboModule event emitters no-op without a callback.
c467843ed0 applied 95f6156d87 DOMHighResTimeStamp round-trip truncation.
433e79d2f4 applied — ported f8224e9106 Touch-handler RCTAssertRCTLogWarn. Kept macOS eventNumber map.
5cb65244dc applied — ported 230e0df08e / 9ae58a7d38 Clamp pendingScrollUpdateCount for rapid prepends. Production landed first; the #53542 Jest regression was added next to this fork's existing MVCP tests (Meta's inverted-prepend fixture is not in this file).
8415753e21 applied — macOS shim 43a4d6569d / be9f567c4a Apple text layout variable-font / variation axes. Meta uses UIFontDescriptorAttributeName; be9f567c4a aliases that to NSFontDescriptorAttributeName in RCTUIKit or Debug Core fails in RCTFontUtils.mm.
376b99ff14 applied — ported a714dbf339 Object fontVariationSettings. Processor and view-config files landed with f8224e9106; d.ts in this commit. Skip Android TextInput a688608090.
7844386bbd applied — ported 738acc805c Graduate backgroundSize/Position/Repeat. Keep experimental_* aliases. Skip conflicting ReactNativeApi.d.ts / Android Kotlin.
e7bb11ae16 applied 0f88283bfc RNTester ArrayBuffer bridging header.
5e86c323ce applied 60e2387aed JS→ObjC ArrayBuffer args as NSData (intermediate before RCTArrayBuffer).
11f9a7f449 applied — ported c69eb331e1 RCTArrayBuffer zero-copy ObjC TM class. Kept macOS RCT_EXPORT_METHOD on RCTSampleTurboModule; codegen/C++ snapshots take the new type. Breaking for ObjC TM authors: ArrayBuffer is now RCTArrayBuffer *, not NSData */NSMutableData *.
19f7d144b9 applied — C++ only 90b4632c1f Shared Fabric TextAttributes / BaseTextProps / measure-cache for fontVariationSettings. Android Java/Kotlin left out. Apple 8415753e21 already consumed this field.
a688608090 skipped — Android-only TextInput fontVariationSettings on Android. Apple path is covered by 8415753e21 + 376b99ff14 + the C++ field from 19f7d144b9.
5421c5eb37 applied 26c78a1b69 Flex-growing content sizing in ScrollView.
9160010d1f applied dff2d29915 ScrollView recycled content inset.
5306e9229c applied 88a1837297 ListItemComponent TypeScript prop.
1291d7ce8e applied — ported 297c722f4c / e06759da6b Bounds-safe unmountChildComponentView assert. Follow-up uses RCTUIView instead of UIView in the index assert.
3b5d0a6526 applied 956bf784d2 extralight in RCTGetFontWeight.
5e40a1771e applied 17942cd7d4 Pixel-grid rounding no longer clips text.
0a1a06c5ea applied e0a9549f95 requestIdleCallback timeout assignment.
aa96fa64d1 applied e42e00f1a6 AccessibilityRole list conversion.
2ce2c0794b applied cc1a8ac496 Remove accidental ref-callback return values.
e71fc4e32f applied 5d126b065f RCTDevSettings init.
0b0eb8d012 applied 1dc9347250 Empty ReactCodegen input_files when no Native specs.
7f18ad0f84 applied 7d2436d11c Ellipsize single-line TextInput placeholders (Android files; Apple path unchanged).
5976273f1c applied 7eeba936eb Shadow-node ref update thread tag at Fabric install.
1b92b02f99 applied 247cf7141b Default RTL text alignment.
eb4d3892ab applied d132562b2c Shadow-without-background log advice.
b587763f40 applied 7028c242e3 Pause RedBox auto-retry while backgrounded.
e59a1d252c applied — ported dc4e727f8e Invalidate list content length on orientation change. Also clear cell metrics on horizontal flip.
1c4a46f4e3 applied — ported dc4e727f8e Ignore stale minimumViewTime viewability callbacks.
100f8fc4fd applied — C++ only dc4e727f8e Derive accessibilityTraits from role+state in one writer. Left macOS RCTViewComponentView trait writers in place.
918fb15bfe applied — ported fef6d15239 Custom font + fontWeight no longer resolves to heaviest face.
56c284e152 applied — ported fef6d15239 / e06759da6b Copy tintColor when swapping TextInput backing views. Follow-up keeps the copy iOS-only (NSView has no tintColor).
4043e818f1 applied — ported a018ac25bc role implies accessible on View/Image (Image.macos.js re-exports iOS).
3eab03df4c, 3eb330a365 applied — ported 8dd91d34de Animated addListener / event() source types. Skip ReactNativeApi.d.ts.
0dec9e275e applied 03c17fef16 Yoga sentinel upcast UB.
3e962d3800 applied 488dccc2cd Guard shrink-factor division near zero.
7fa49077c8 applied f386cda2a2 Event.cancelBubble + LegacySyntheticEvent.
49f0db4394 applied 130fdd080b Guard forced-native animations from JS updates.
88820254e5 applied 8e2b91afdb Align ref-helper Flow types.
471c612b57 applied 3ae672d35f Construct shared animation backend after UIManager has a delegate.
85a81818c6 applied 0d872f5c0c Avoid copying surface props on start/update.
fff4994af8 applied 023b756e0a Harden on-demand JS segment load when the cache file is missing.
58bf844967 applied 66e4867336 XMLHttpRequest.setRequestHeader appends duplicate headers.
c086431a4b applied ef103ce761 requestIdleCallback / cancelIdleCallback TypeScript declarations.
5906cfb060 applied — ported, Apple only 78484def44 Length-aware string conversion so \0 no longer truncates Text. Skip Android JavaTurboModule.
b743a8a35b applied — ported c38d292d50 Refresh cached DeviceInfo constants on resize. Kept macOS window-frame observers.
568eaa6b69 applied — ported 3d91fe3dc8 FileReader retains the Blob until the native read settles. This fork has no _readId; ported onto _aborted.
917d97eb12 applied — ported, production only df1d0ff803 iOS codegen still crawls libraries with no ios config. Jest fixture still conflicts.
3f8f5c216a applied a5b8b93318 Missing <mutex> in HostTarget.h.
857c3d24c1 applied f190e692c0 NativeMap/Array internal symbol visibility.
5fb3ebce1a, 5bb9639594, d84c13d511 skipped — Android-only Java / JArrayBuffer TurboModule stack.
e0aa7a8b0a, 0f1bdddfb3, 00a5aa9223, 507023622b skipped — no desktop analog Software-keyboard inset recycle, Fabric keyboardType reload, CarPlay RCTAppearance, numeric return-key accessory.
05b97de823, 8e995e8dac applied — macOS analog b691d36eb5 iOS Full Keyboard Access uses canBecomeFocused. macOS analog: acceptsFirstResponder also honors interactive role / accessibilityRole. needsPanelToBecomeKey stays false so mouse clicks do not steal focus.
f2188610c6 already covered tvOS viewToFocus. macOS TextInput / View already makeFirstResponder in their own focus/blur.
22cfb5caec, db11646c94, db662caead, 6d34b7aaff, 4bf9d4e9b0, 1492a6080f, 190e16cc32, 942d07bc19, 7115c2b97e, ee56f1e1f6, a3f20d888c, d2dfb47c1e skipped — RCT_EXPORT_METHOD drop Sample + core module export-macro cleanup. Local sample still uses the macros.
3f3425e246 skipped — macos Modal patched Remove NativeModalManager.
b67b7ba621 already covered Duplicate ScrollView Fabric subspec already commented out locally.
c3caea9b5e skipped — ios Image only Extract Image.ios.js props once. Image.macos.js re-exports Image.ios.js; picking later would cover macOS without a second file.
385fa84925, 5e11ed122a deferred by policy C++ stable-API guards + ios-prebuild header inventory.
b74adf051f deferred Idle-frame Performance timeline (inspector / cxx-api snapshots).
55195ca43f, e55da68478 deferred Layout event emitter + shadowTreeDidCommit hook. New C++ surface, no consumer yet.
11dc60c300, afc165129e deferred Require NativePerformance and drop the JS fallback.
7cdac2a15c deferred Relocate manual .d.ts under types_DEPRECATED/.
40c06121a1, f63b2a1cb5 deferred Babel Platform inlining.
146aaac7ee, 41b375eb04, 50a35dbc7d, 19f7d144b9 skipped — Android-only NaN border widths, JS exception extra-data abort, Overflow.fromString, Android font variation.

When a queued change is accepted, replace its status with applied, record the new local SHA, and state the exact validation that passed. If a required test environment is absent, write verification blocked and the unambiguous follow-up test rather than claiming a green result. Rejected changes remain listed with a short reason; do not silently remove their audit trail.

Decision record

Ray's 2026-08-18 decision: accept the Meta public API breaks and migrate workspace consumers; retain the proven local Core/Hermes prebuild architecture; defer SwiftPM-versus-CocoaPods evaluation until the rest of this upstream sync is complete.

Ray's 2026-08-19 decision: cherry-pick the useful post-0.87 main commits listed above; keep prebuild/SwiftPM/Android-only/release bookkeeping out.

Meta commits Change Recorded policy
3ece12505b, e730105453, f1cfad0197, 0b70d7c95f, d6baa433cb Remove deprecated public entry points and make Strict TS API default. Applied; workspace consumers must migrate.
85d24122f5, 6c5b9b1ae0, 9b76007ae0, 7dcf5de123, cc77834b28 Replace InitializeCore reachability with the react-native/setup-env module graph. Applied; validate Metro bootstrap.
Prebuild and SwiftPM groups above Change prebuild architecture or enable SwiftPM support. Deferred; do not cherry-pick during this pass.

Release tags, lockfile bumps, release CI and post-publish workflow commits are release bookkeeping, not fork runtime changes; they are recorded as skipped and will not be cherry-picked.

Routine

# Configure once, then refresh the Meta release line.
git remote add react-native https://github.com/facebook/react-native.git
git fetch react-native

# Check the two sources before assessing candidates.
git rev-parse upstream/0.87-merge react-native/0.87-stable
git merge-base upstream/0.87-merge react-native/0.87-stable
git rev-list --left-right --count \
  upstream/0.87-merge...react-native/0.87-stable
git log --oneline upstream/0.87-merge..react-native/0.87-stable

# A candidate must apply cleanly before it is considered for integration.
git show --format= <meta-sha> | git apply --check

Provenance and later diffs

Selective cherry-pick is correct for this fork: Meta's branch contains iOS, prebuild, SwiftPM and release changes that must not be imported wholesale into the macOS production line. It does not prevent later comparison, but a conflict-resolved pick receives a new SHA and may no longer be recognized by patch-equivalence commands such as git cherry.

The table above is therefore the authoritative source-to-local mapping for this first sync. For future accepted commits, use git cherry-pick -x <meta-sha> so the local commit also carries the upstream SHA in its message; keep the table updated when a conflict changes the patch materially. Compare future candidates against the Meta source ref, then exclude table entries and use git log --cherry-pick --right-only HEAD...react-native/0.87-stable only as a candidate heuristic—not as the record of applied work.

For every selected change:

  1. Read its code and tests; classify it as shared runtime, iOS/prebuild, SwiftPM, JavaScript toolchain, or release metadata.
  2. Check overlap with the macOS fork patches recorded in fork.md.
  3. Apply only one logical upstream fix at a time, retain/port its test, and validate the affected macOS production path.
  4. Update this table in the same local follow-up commit before proceeding to the next candidate.

Do not submit changes upstream from this fork. This is a local compatibility and delivery record.