chore: upgrade to Expo SDK 56 (RN 0.85, React 19.2)#264
Conversation
- Bump expo to ^55 across root + ExampleApp - Align RN-ecosystem deps to SDK 55 bundled versions (reanimated 4.2.1, worklets 0.7.4, gesture-handler 2.30, screens 4.23, safe-area 5.6.2, expo-image/asset/font/etc. 55.x) - Normalize all 6 modules to expo-modules-core ~55.0.25 and @types/react ~19.2.16 (incl. fixing stale text-recognition: 2.2.0/18.3.12/ts5.1.6) - Fix ExampleApp tsconfig moduleResolution conflict (inherit Node16 base) - Fix React 19 useRef zero-arg calls (Screen, TextField, navigationUtilities) - Update committed yarn zero-install cache https://claude.ai/code/session_01LF1Ar84ivSVfCKEXbL9XJD
BREAKING CHANGE: modules now require Expo SDK 56 and raise the iOS deployment target to 16.4 (from 15.1). Dependencies - Bump expo to ^56 (root, ExampleApp, packages/tsconfig) - Align RN-ecosystem deps to SDK 56 bundled versions (RN 0.85.3, react/react-dom 19.2.3, reanimated 4.3.1, worklets 0.8.3, gesture-handler 2.31.1, screens 4.25.2, safe-area 5.7.0, expo-* 56.x) - Normalize all 6 modules to expo-modules-core ~56.0.14; core jest-expo ~56.0.4 - Bump @react-native/metro-config to 0.85.3, react-test-renderer 19.2.3 Native / config breaking changes - iOS deployment target 15.1 -> 16.4 in all 5 iOS podspecs + app.json (document-scanner is Android-only; no iOS podspec) - Android gradle fallbacks: compileSdk/targetSdk 34->36, minSdk 21->24, Kotlin 1.8.10 -> 2.1.20; app.json compileSdkVersion 35->36 - RN 0.85 moved the RN Jest preset: add @react-native/jest-preset and reference it from core's jest.config.js - Dedupe packages/tsconfig expo (was pinning expo 54), fixing expo-doctor duplicate-native-module warning - Pin ExampleApp tsc jsx to react-native (classic) since SDK 56's base switched to the automatic runtime, flagging classic React imports - Remove unused metro-react-native-babel-preset from root - Bump CI Node floor 18 -> 20 (.circleci, release.yml) for SDK 56 https://claude.ai/code/session_01LF1Ar84ivSVfCKEXbL9XJD
Replace the temporary tsc jsx=react-native pin with the SDK 56 default automatic runtime (react-jsx): - Drop now-unnecessary `import React` from 18 components/screens - Disable react-in-jsx-scope / jsx-uses-react eslint rules (no longer needed under the automatic runtime) https://claude.ai/code/session_01LF1Ar84ivSVfCKEXbL9XJD
- README compatibility table: ^56.0.0 -> ^6.0.0 - Changeset marking all six modules as a major bump (SDK 56, iOS 16.4 min) https://claude.ai/code/session_01LF1Ar84ivSVfCKEXbL9XJD
🦋 Changeset detectedLatest commit: 829bd97 The changes in this PR will be included in the next version bump. This PR includes changesets to release 6 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
…-ZOf3M # Conflicts: # .circleci/config.yml
SDK 56's ExpoModulesCore brings SwiftUI (which also defines `Text`) into scope, making the bare `Text` parameter ambiguous under the Xcode 26.4 toolchain. Fully-qualify it as `MLKitTextRecognition.Text`. https://claude.ai/code/session_01LF1Ar84ivSVfCKEXbL9XJD
|
Hi @trevor-coleman — thanks for putting this upgrade together. 🙏 I'm building an Expo SDK 56 / RN 0.85.3 / React 19.2 app (new architecture) and react-native-mlkit-document-scanner is exactly the lib I want for on-device, PDF-output scanning. The current npm release (v5) is pinned to SDK 54 / RN 0.81, so this PR is the thing blocking me from adopting it — I'm otherwise stuck on a heavier interim workaround. Is there anything holding this from merging, and is there a rough ETA for the v6 release? It looks mergeable but hasn't had a review assigned yet. Happy to help however's useful — I can test the branch (or a next/beta tag) against a real SDK 56 / RN 0.85 new-arch build and report back. Thanks again! Sura |
|
Please what is this PR waiting for? Could I help somehow? I would like to use this package in my app |
Summary
Upgrades the entire monorepo (six modules + internal packages + ExampleApp) from Expo SDK 54 → 56, stepping through 55 to keep each change reversible. This is a major bump for all six published modules (
^5 → ^6) because it raises the iOS minimum deployment target to 16.4 and moves to the SDK 56 native toolchain. No public JS/TS API changes — it's a native-toolchain + peer-dependency bump.Done incrementally with a green checkpoint at SDK 55, then SDK 56:
eada311— Expo SDK 55 (RN 0.83.6, React 19.2.0)c532f7c— Expo SDK 56 (RN 0.85.3, React 19.2.3) + native/config breaking changes796cda1— adopt React 19 automatic JSX runtime (cleanup)39daa79— README compat row + major-bump changesetKey version changes
expo^54→^56.0.8react/react-dom19.1.0→19.2.3react-native0.81.5→0.85.3react-native-reanimated~4.1.1→~4.3.1react-native-worklets0.5.1→0.8.3react-native-screens~4.16.0→~4.25.2react-native-gesture-handler~2.28.0→~2.31.1react-native-safe-area-context~5.6.0→~5.7.0expo-*(image/asset/font/picker/…)5x.x→56.x@react-native/metro-config^0.76.0→0.85.3jest-expo~54.0.13→~56.0.4expo-modules-core~3.0.25(text-rec~2.2.0) →~56.0.14@types/react~19.1.10(text-rec~18.3.12) →~19.2.16@react-native/jest-preset0.85.3expo^54.0.23→^56.0.8(The New Architecture is preserved throughout — no
newArchEnabled: falseanywhere.)Known breaking changes — status
app.json(document-scanner is Android-only, no iOS podspec)expo-modules-core/@types/reactdrift (incl. stale text-recognition)~56.0.14/~19.2.16(+ text-rectypescript ~5.1.6 → ~5.9.2)autoimage already provides the SDK 56 toolchain (Xcode 26.4). Bumped the JS CI Node floor 18 → 20 (.circleci,release.yml) which SDK 56 requires@expo/vector-iconsno longer transitivemetro/src→metro/privatemetro.config.jsonly usesexpo/metro-config, no deep imports. Removed unusedmetro-react-native-babel-presetfrom rootuseHermesV1. Runtime animation validation pending native buildFileSystemcopy/move/download usage in app or module srccompileSdk/targetSdk34→36,minSdk21→24, Kotlin1.8.10→2.1.20;app.jsoncompileSdkVersion35→36pod installon macOS/EAS to confirm. Podspecs left unpinned (unchanged); if a conflict re-triggers, resolve viaexpo-build-propertiespinning, not an MLKit downgradeValidation
Local gates (all green):
yarn build(all six module TS builds via Turbo)cd apps/ExampleApp && yarn compile(tsc) — also fixed a pre-existing tsconfigmoduleResolutionconflict and React-19useReferrors that were masked at baselineyarn lintyarn testnpx expo-doctor— 19/21; the 2 failures are network-sandbox artifacts in this environment (Expo config-schema API + RN Directory are unreachable), not project issuesNative builds (iOS/Android prebuild + pod install + compile) and on-device smoke tests were not runnable in this Linux CI environment (no macOS/Xcode toolchain) — they're delegated to EAS on this PR, using EAS's default
autoimage for SDK 56.Notes for review
.yarn/cache/), matching the existing convention (908 zips were already tracked).https://claude.ai/code/session_01LF1Ar84ivSVfCKEXbL9XJD