Skip to content

Upgrade to Expo SDK 56 (preview)#23

Draft
alpine-agent wants to merge 4 commits into
jonsamp:mainfrom
alpine-agent:upgrade/sdk-56
Draft

Upgrade to Expo SDK 56 (preview)#23
alpine-agent wants to merge 4 commits into
jonsamp:mainfrom
alpine-agent:upgrade/sdk-56

Conversation

@alpine-agent

Copy link
Copy Markdown

Summary

Upgrade word-check from Expo SDK 55 → SDK 56 (currently 56.0.0-preview.6 on the next dist-tag).

Followed the SDK beta upgrade flow: npx expo install expo@next --fix, which moved expo and the expo-* packages to ~56.x, RN to 0.85.3, React 19.2.3, and TypeScript ~6.0.3.

Adjustments needed beyond --fix

  • expo-router 56 vendors react-navigation internally and no longer exposes @react-navigation/native / @react-navigation/bottom-tabs transitively. Reroute imports:
    • app/_layout.tsx: ThemeProvider, DarkTheme, DefaultTheme → from expo-router
    • app/(tabs)/_layout.tsx: BottomTabBarProps → from expo-router/build/react-navigation/bottom-tabs so its type matches what <Tabs> expects
  • Bumped ts-jest to ^29.4.9 — 29.4.6 only supports TS <6.
  • Added types: ["jest", "node"] to tsconfig.json. With TS 6 + the customConditions: ["react-native"] from expo/tsconfig.base, @types/jest globals are no longer auto-discovered in test files.
  • Added resolutions for @expo/log-box and @expo/dom-webview to resolve a yarn 1 hoisting duplicate flagged by expo-doctor.

Caveats

  • SDK 56 is still in preview (56.0.0-preview.6) — not GA. Expo Go for SDK 56 is TestFlight External Beta only; physical-device testing needs a dev client build.
  • @rnrepo/expo-config-plugin@0.2.0-beta.0 declares expo@^54 as a peer — yarn warns but it installs. May want a newer plugin version once one is published.

Test plan

  • npx expo-doctor — 18/18 checks pass
  • yarn test — 14/14 pass
  • yarn lint — clean
  • tsc --noEmit — only the two pre-existing Themed.tsx errors from main, no new type errors introduced
  • Metro bundles successfully (1643 modules, iOS, prod)
  • Build an iOS dev client and smoke-test on device/simulator
  • Build an Android dev client and smoke-test
  • Verify web build (expo export --platform web)

Run via the SDK beta upgrade flow: `npx expo install expo@next --fix`,
which moved expo and the expo-* packages to ~56.x, RN to 0.85.3, React
19.2.3, and TypeScript ~6.0.3.

Adjustments needed on top of `--fix`:
- expo-router 56 vendors react-navigation internally and no longer
  exposes `@react-navigation/native` and `@react-navigation/bottom-tabs`
  transitively. Reroute imports:
  - `_layout.tsx`: `ThemeProvider`, `DarkTheme`, `DefaultTheme` now come
    from `expo-router`.
  - `(tabs)/_layout.tsx`: `BottomTabBarProps` now comes from
    `expo-router/build/react-navigation/bottom-tabs` so its type matches
    what `<Tabs>` expects.
- Bumped `ts-jest` to ^29.4.9 (required for TS 6 support).
- Added `types: ["jest", "node"]` to tsconfig.json — TS 6 + the
  `customConditions: ["react-native"]` from expo's base no longer
  auto-discovers @types/jest globals in test files.
- Added `resolutions` for `@expo/log-box` and `@expo/dom-webview` to
  resolve a yarn 1 hoisting duplicate flagged by expo-doctor.

Verified:
- `npx expo-doctor`: 18/18 checks pass
- `yarn test`: 14/14 pass
- `yarn lint`: clean
- `tsc --noEmit`: only the two pre-existing `Themed.tsx` errors from
  `main`; no new type errors
- Metro bundles successfully (1643 modules, iOS, prod)
`@react-native/dev-middleware@0.85.3` (RN 0.85, SDK 56) requires
`^22.13.0` minimum; the previously pinned `22.12.0` failed `yarn
install` on EAS Build with "engine \"node\" is incompatible".
- Rename `release.yml` → `upload.yml` (qru convention).
  Same content; only `name:` field changed to "Upload to app stores".
- Add `submit.yml` from qru — manual workflow_dispatch that submits
  the latest TestFlight build for App Review and promotes the
  internal Play Store track to production. Uses ASC API + Play
  Developer API, reading the iOS app ID from
  `submit.production.ios.ascAppId` and the Android package name from
  `app.config.ts` so no per-app constants are hardcoded.
- `build.yml` already matches qru's; left unchanged.
In SDK 56, `expo-router/unstable-native-tabs` requires the ScrollView
inside each tab screen to be a direct child of the screen, OR the
wrapping component must opt out of RN's view collapsing optimization.
Without `collapsable={false}` on the wrapper, iOS reparents the
ScrollView under the wrong native view; gesture recognizers don't
attach, scrolling and Pressable taps inside it become no-ops.

Symptom on the SDK 56 build: Practice and Settings tabs were entirely
inert (Pressables didn't respond, content didn't scroll). Check tab
appeared fine because its tappable controls are above the ScrollView.

Adding `collapsable={false}` to the outer themed `<View>` on all three
tab screens.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant