Skip to content

Migrate to Expo SDK 56 with bun — Matchimals 2.0.0#66

Open
chrisheninger wants to merge 4 commits into
mainfrom
expo-sdk-56
Open

Migrate to Expo SDK 56 with bun — Matchimals 2.0.0#66
chrisheninger wants to merge 4 commits into
mainfrom
expo-sdk-56

Conversation

@chrisheninger

Copy link
Copy Markdown
Member

Summary

Replaces the bare react-native-cli setup with Expo SDK 56 (React Native 0.85, React 19.2, New Architecture) using continuous native generation — ios/ is now generated from app.json via expo prebuild and no longer checked in. bun replaces yarn 4 as the package manager, and version is bumped to 2.0.0 to mark the Expo era.

Toolchain

  • Expo SDK 56 / RN 0.85.3 / React 19.2.3, New Architecture (Fabric)
  • bun + bun.lock (yarn 4 artifacts removed); all 21 expo-doctor checks pass
  • babel/metro/jest/tsconfig all moved to Expo presets

Native config → app.json

All previous Xcode/Podfile customizations are reproduced as config: bundle ID, build number, Apple team, all four orientations, hidden status bar, Dimbo font, ATS local networking, encryption-exempt flag, universal links, GoogleService-Info.plist, and Firebase static frameworks. A small local plugin (plugins/withFirebaseNoAdId.js) keeps $RNFirebaseAnalyticsWithoutAdIdSupport=true in the generated Podfile.

Code changes

  • src/Music migrated from react-native-video (v5, audio-only usage) to expo-audio
  • Entry point uses registerRootComponent; src/index.js and the Android babel-polyfill branch removed
  • Fabric drag fix: Card and Table previously dragged/panned by mutating left/top layout props via setNativeProps, which breaks on the new renderer (cards vanished mid-drag). Rewritten with Animated.ValueXY + translate transforms. Deck now keys cards by position-from-bottom so the next top card doesn't reuse the dragged component instance (index keys made the new card never render).
  • Unused deps dropped: react-art, react-native-gesture-handler, babel-polyfill, react-scripts

Web

react-scripts 4 replaced by Expo's Metro web (bun run web / bun run build:web); public/index.html kept as the HTML template with OG meta and webfonts intact.

Releases (fastlane removed)

Builds stay local: bun run prebuild + Xcode archive, or eas build -p ios --local. Build number is tracked via ios.buildNumber in app.json. Documented in the README.

Test plan

  • bunx expo-doctor — 21/21 checks pass
  • bunx expo prebuild output verified (Podfile vars, Info.plist, entitlements, Firebase plist)
  • Built and ran on iPad Pro simulator — menu, game start, card drag/drop, sound effects, music toggle, board pan all verified manually
  • bunx expo export -p web — bundle + public assets exported with custom template

🤖 Generated with Claude Code

chrisheninger and others added 2 commits June 12, 2026 21:47
Replace the bare react-native-cli setup with Expo's continuous native
generation: ios/ is now generated from app.json via `expo prebuild` and
no longer checked in. All native customizations (Firebase, Dimbo font,
orientations, universal links, ATS, AdId-free analytics) are expressed
as config plugins, including a local withFirebaseNoAdId Podfile plugin.

- Expo SDK 56 / React Native 0.85 / React 19.2 (New Architecture)
- bun replaces yarn 4 as package manager
- expo-audio replaces react-native-video for music and sound effects
- Expo Metro web replaces react-scripts; public/index.html kept as template
- fastlane removed; releases are built locally (prebuild + Xcode archive
  or `eas build --local`)
- Drop unused deps: react-art, react-native-gesture-handler, babel-polyfill
- Rewrite Card/Table drag with Animated translate transforms; the old
  setNativeProps left/top mutation breaks on Fabric (card vanished while
  dragging). Key deck cards by position from bottom so the next top card
  doesn't reuse the dragged instance.
- Version bumped to 2.0.0 to mark the Expo era

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chrisheninger and others added 2 commits June 12, 2026 22:25
…nsform

react-native-web's measure() reads offsetTop/Left and ignores CSS
transforms, so the translate-based drag introduced in the SDK 56 migration
made every drop map back to the deck cell (always illegal -> snap back).
measureInWindow uses getBoundingClientRect, which includes transforms on
web and returns transform-inclusive coords on native.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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