fix(mobile): pin react-native-worklets and reanimated to the SDK 57 bundled versions - #119
Merged
Merged
Conversation
…undled versions The first native build of apps/mobile failed to compile. One error: ExpoWorkletsBridgeProvider.mm:236 no member named 'executeSync' in 'worklets::WorkletRuntime' expo/bundledNativeModules.json fixes react-native-worklets at 0.10.1 and react-native-reanimated at 4.5.1, but neither is a direct dependency — expo-router declares reanimated as a bare `*` peer and nothing pins worklets — so pnpm resolved the newest satisfying versions, 0.12.1 and 4.6.0. expo-modules-core is written against the <=0.10 worklets API, and 0.12 removed executeSync. Its peer range states the constraint correctly, but the peer is optional, so pnpm installs the mismatch with a warning rather than an error. The pins go in pnpm-workspace.yaml overrides, not only in apps/mobile's dependencies. Declaring them in the app is necessary — it should say what it links — but not sufficient: expo-modules-autolinking resolves native modules out of the store, and @expo/ui and expo-router still bound the 0.12.x copy. With the override the tree holds 0.10.1 and 4.5.1 alone and pnpm peers check is clean. Nothing in CI caught this because nothing in CI compiles native code — jest, tsc and eslint all passed throughout. That gap is filed as #118. Verified by building and running on the iOS simulator: ExpoWorkletsBridgeProvider.mm compiles, Build Succeeded, the app installs, Metro bundles 1347 modules, and the Task 7 smoke screen reports both workspace packages resolved — which also exercises the sanitize() rewrite from #110 at runtime. pnpm build 6/6, pnpm test 6/6. Closes #117 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NfHB8Q3zSQ5idotURDwkyv
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This was referenced Sep 4, 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.
Closes #117
The first native build of
apps/mobileever attempted failed to compile. One error:Root cause
expo/bundledNativeModules.jsonfixes the versions Expo SDK 57 supports:react-native-workletsreact-native-reanimatedNeither is a direct dependency.
expo-routerdeclares reanimated as a bare*peer and nothing pins worklets at all, so pnpm resolved the newest satisfying versions.expo-modules-coreis written against the <=0.10 worklets API, andexecuteSyncwas removed in 0.12.expo-modules-corestates the constraint correctly —react-native-worklets: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0— but declares the peer optional, so pnpm installs the mismatch with a warning instead of an error.Why
overridesand not just a dependency entryBoth.
apps/mobilenow declares them, because a package should say what it links — the rule from #97 and the same reasoning that addedreact-native-nitro-modulesin #110. But that alone does not fix it:expo-modules-autolinkingresolves native modules out of the pnpm store, and@expo/uiandexpo-routerstill bound the 0.12.x copy. Only the workspace-level override removes it from the tree.After the change
pnpm why react-native-workletsreports 0.10.1 alone, andpnpm peers checkno longer lists it as unmet.The override carries the condition for lifting it: both pins move together, and only when
bundledNativeModules.jsonfor the SDK in use names newer versions. Pinning below what pnpm would pick otherwise holds the tree back silently.Why CI did not catch it
Nothing in CI compiles native code. jest, tsc and eslint all passed on
mainthroughout — they never touch Objective-C++. This bug was reachable only by running a native build by hand, which had never happened before. Filed as #118, deliberately not fixed here: choosing between a full macOS build job, a cheaperprebuild+pod install, and a per-PRexpo-doctoris a real trade-off that belongs in its own change.Verification
Built and ran on the iOS simulator (iPhone 17 Pro, iOS 26.5):
ExpoWorkletsBridgeProvider.mmcompiles, thenlibExpoModulesWorkletsAdapter.alinks — the exact file that failed beforeBuild Succeeded, app installs on the simulatorexpo-router/entry.js(1347 modules) and the app rendersThe Task 7 smoke screen reports both workspace packages resolved. Its
@pulseticker/loggingline assertssanitize({access_token}).access_token === '[REDACTED]', so this run also exercises thesanitize()rewrite from #110 at runtime on a device, which until now had only unit-test coverage.Pods confirmed re-resolved:
RNReanimated (4.5.1),RNWorklets (0.10.1), alongsideNitroMmkv (4.3.2)andNitroModules (0.37.0).Not verified: Android. The same override applies, but no Android build was run —
expo-system-ui(#113) is the other Android-only gap still open.🤖 Generated with Claude Code