feat(react-native): support Expo SDK 56 (React Native 0.85)#4584
Open
developerdanx wants to merge 1 commit into
Open
feat(react-native): support Expo SDK 56 (React Native 0.85)#4584developerdanx wants to merge 1 commit into
developerdanx wants to merge 1 commit into
Conversation
Contributor
📦 Alpha Package Version PublishedUse Use |
Contributor
📱 Expo Go Preview Published
Upgrade @factorialco/f0-react-native to Expo SDK 56 / React Native 0.85 / React 19.2.
LinksQR Code |
Upgrade @factorialco/f0-react-native to Expo SDK 56 / React Native 0.85 / React 19.2. - Bump expo ~56.0.12, react-native 0.85.3, and react/react-dom/react-test-renderer to exactly 19.2.3 (RN 0.85.3's bundled react-native-renderer requires the exact React version; the loose ^19.2.3 peer otherwise resolves a newer 19.2.x that fails RN's runtime check — react/react-native#57079). All expo-* + native libs aligned to the SDK 56 bundled versions (reanimated 4.3.1, worklets 0.8.3, screens 4.25.2, safe-area-context 5.7.0, gesture-handler 2.31.1, svg 15.15.4, etc.) - uniwind ^1.9.0 — 1.2.7 predates SDK 56 and its older custom Metro resolver throws "Unexpectedly escaped traversal" in pnpm monorepos (uni-stack/uniwind#505, fixed in v1.6.3); 1.9.0 is the current release pinned to Expo 56 / RN 0.85.3 / Metro 0.84.4 - Migrate F0BlurView to the SDK 55+ expo-blur API (experimentalBlurMethod -> blurMethod) - babel.config: add react-native-worklets/plugin only for app bundles (Metro), keep it off for the builder-bob library build so consumers workletize - jest: switch preset to @react-native/jest-preset (RN 0.85), mock react-native-worklets, add @types/react-test-renderer; adapt specs to the stricter react-test-renderer 19.2 types - Realign expo-* peer deps (expo-image/blur loosened; expo-clipboard moved to peerDependencies); root pnpm React-island override -> 19.2.3 - Update snapshots for the React 19.2 useId() id format Verified on iPhone 17 Pro (Expo Go, SDK 56.0.0): Design Tokens plus component showcases (Activity, AnimatedF0Text, F0BlurView, F0Avatar, F0Progress) render cleanly. Gate green: lint, tsc, test (489), build. BREAKING CHANGE: targets Expo SDK 56 / React Native 0.85 / React 19.2 — consumers must upgrade their app. F0BlurView's experimentalBlurMethod prop is renamed to blurMethod, and the uniwind peer dependency is raised to ^1.9.0.
753e941 to
57fb7ea
Compare
This was referenced Jun 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Upgrades
@factorialco/f0-react-nativefrom Expo SDK 54 to Expo SDK 56 (React Native 0.85, React 19.2.3, Hermes v1, New Architecture).This is the design-system half of the SDK 56 upgrade; the Factorial mobile app will consume the published version next.
Version matrix
Notable changes
experimentalBlurMethod→blurMethod.react-native-worklets/pluginonly for app bundles (Metro caller). The builder-bob library build keeps it off, so consumers workletize at bundle time (unchanged published behaviour); the bundled playground app now workletizes its own Reanimated worklets.@react-native/jest-preset(the RN 0.85react-native/jest-presetshim throws),react-native-workletsmocked,@types/react-test-rendereradded, and thereact-test-renderer19.2 type tightening handled inF0Button/F0Step/PressableFeedbackspecs.expo-image/expo-blurloosened,expo-clipboardmoved fromdependenciestopeerDependencies. Root pnpm React-island override → 19.2.3.useId()id format change («rN»→_rN_) in svg gradient/clipPath ids.Why uniwind 1.9 / react 19.2.3 (not the latest patch)
Both surfaced during on-device testing and were then verified against upstream sources.
uniwind→ ^1.9.0The playground failed to bundle on
uniwind@1.2.7. Two reasons:metropeer deps) only lands in v1.8.0+.nativeResolver(uniwind/dist/metro/index.cjs) computed its package root via Metro's context-dependent resolver, yielding a path that escapes the file-map root, sometro-file-mapthrowsInvariant Violation: Unexpectedly escaped traversal(TreeFS). This is a uniwind resolver issue in pnpm/Bun monorepos — not a Metro-0.84-specific incompatibility (that invariant is unchanged across metro-file-map 0.80–0.84). Upstream: uni-stack/uniwind#505, fixed in v1.6.3 (#506 — switched torequire.resolve).We move to ^1.9.0: the current release, pinned against Expo 56 / RN 0.85.3 / Metro 0.84.4, carrying both the v1.6.3 resolver fix and a v1.9.0 multiple-instances fix (#570). (v1.6.3 is the minimum with the fix; v1.8.0 the minimum with SDK 56 support.)
react→ exactly 19.2.3RN 0.85.3 embeds
react-native-renderer19.2.3 and asserts at startup thatReact.versionis byte-for-byte equal:if ("19.2.3" !== React.version) throw "Incompatible React versions…". RN's peer range is the loose^19.2.3, so a package manager installs the latest 19.2.x (we got 19.2.7) which then fails that strict runtime check. Pinningreact/react-dom/react-test-rendererto exactly 19.2.3 — the version Expo SDK 56'sbundledNativeModules.jsonpins — is the fix. Upstream: facebook/react-native#57079. (Thereact.dev/warnings/version-mismatchURL in the error is a generic "learn more" link; the exact-match rule itself lives in RN's bundled renderer, not that page.)Verification
pnpm lint✅ ·pnpm tsc✅ ·pnpm test✅ (489 tests) ·pnpm build(builder-bob) ✅Notes
ViewConfigIgnorebabel/jest workaround was re-validated against RN 0.85 (same path + exports) — no change required.