Repository navigation
Conversation
Core upgrades: - React Native 0.87.1 -> 0.88.0, React 19.2.8 -> 19.3.1 and the matching @react-native/* toolchain packages - Re.Pack + repack-plugin-reanimated 5.4.2 -> 5.4.3-canary-20261022091009, rspack 2.2.6 -> 2.2.9, Module Federation 2.9.1 -> 2.9.2 Skia rename + charts: - @shopify/react-native-skia -> react-native-skia 2.15.1 (pinned below 3.x, which victory-native 43 does not support yet) - victory-native 42.0.1 -> 43.0.1 Edge-to-edge: - drop react-native-edge-to-edge; RN 0.88 owns edge-to-edge via edgeToEdgeEnabled, so AppTheme goes back to the AppCompat parent Fixes / chores: - resolve an Android font family in matchFont() so victory-native's chart axis labels are no longer invisible on Android - delete the react-native-bottom-tabs 1.4.0 patch and the @babel/plugin-syntax-typescript workaround, both obsolete now - alias expo-font to false in the auth container (vector-icons' web-only probe) - add @react-native/metro-config so align-deps keeps one react-native peer - bump the remaining compatible catalog deps (screens, gesture-handler, reanimated, safe-area-context, bottom-tabs, @legendapp/list, vector-icons 14, navigation, align-deps 5, bootsplash)
Picks up the Fastify FSTDEP023 fix (dev-server now passes disableRequestLogging through LogController instead of the deprecated top-level option). Verified no deprecation warning on a live dev server.
Re.Pack 5.4.3-canary-20261104085523 picks up callstack/repack#1516 (HermesBytecodePlugin composes source maps for every chunk). Dependency refresh: - react-native and @react-native/* 0.88.0 -> 0.88.1 - @rspack/core 2.2.9 -> 2.3.1 - @module-federation/enhanced and error-codes 2.9.2 -> 2.9.3 - react-native-safe-area-context 5.10.1 -> 5.11.1 - react-native-screens 4.30.0 -> 4.30.1 - react-native-skia 2.15.1 -> 2.15.2 (victory-native 43 still caps it below 3.0) - react-native-worklets 0.13.0 -> 0.13.1 - react-native-paper 5.15.3 -> 5.15.4 (patch renamed, applies unchanged) - @legendapp/list 3.6.0 -> 3.7.1 - react-native-bootsplash 7.3.4 -> 7.3.5 - @typescript-eslint/* ^8.72.0 -> ^8.72.1 Podfile.lock and REACT_NATIVE_PATH regenerated for 0.88.1.
The 5.4.3 release is identical to 5.4.3-canary-20261104085523 apart from version strings. Podfile.lock refreshed for the callstack-repack pod version.
dannyhw
marked this pull request as ready for review
November 4, 2026 16:35
This branch has not been deployed
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.
What
Upgrades the showcase to React Native 0.88.1 and Re.Pack 5.4.3, renames Skia to the new
react-native-skiapackage, moves to victory-native 43, and dropsreact-native-edge-to-edgenow that RN owns edge-to-edge.Everything was verified end to end on the iOS Simulator and an Android emulator (details below).
Core
@react-native/*@rspack/core@module-federation/enhanced/error-codesreact-native-safe-area-contextreact-native-screensreact-native-workletsreact-native-paper@legendapp/listreact-native-bootsplash@typescript-eslint/*Re.Pack 5.4.3
Re.Pack 5.4.3 was validated through its canaries; the published 5.4.3 packages are identical to
5.4.3-canary-20261104085523apart from version strings, so the results below apply to the release. It includes everything in callstack/repack#1485, including the Fastify FSTDEP023 fix (#1513): no deprecation warning on any of the four dev servers, while normal logs still stream.It also includes callstack/repack#1516:
HermesBytecodePluginnow runshermescafter every asset has been written, so every chunk's source map gets composed. Comparing every published package against the previous canary, this is the only code change. This app doesn't enable the plugin, so it was tested with a temporary config on the trading mini app (66 lazy chunks), 3 builds per platform before and after:…20261103170520)…20261104085523)Looking up bytecode positions the way a crash reporter would: with the new maps, 2,024 of 2,024 app-code positions resolve to the correct line in the correct source file. With the old maps, 7 did, 1,827 pointed at the wrong file or line, and 190 had no mapping.
Skia rename + charts
@shopify/react-native-skia→react-native-skia. Same code, new package name (pod name changes too, soPodfile.lockis refreshed).react-native-skia >=2.15.1 <3.0.0, so 3.x (3.9.1 is current) is still unsupported by the charting layer. Worth revisiting when victory-native ships Skia 3 support.Skia.PathBuilder, which lets us delete theSkPath.addPath()deprecation-warning shim that 41/42 needed.Edge-to-edge
react-native-edge-to-edgeis removed andAppThemegoes back toTheme.AppCompat.DayNight.NoActionBar(the RN 0.88 template value, and the same base asTheme.BootSplash).edgeToEdgeEnabled=truestays ingradle.properties— RN core handles the insets, and content draws behind both bars on device.Fix: invisible chart labels on Android
Found while testing this branch: the price chart drew fine on Android but its y-axis labels were missing (they rendered on iOS). Root cause is in app code, not the bump —
matchFont()defaults to the family"System", which Skia's Android font manager does not expose (listFontFamilies()returnssans-serif,arial, …), so it resolves a glyph-less typeface (measureText('$82.1k').width === 0) and victory-native measures a zero-height label and skips it.packages/trading/src/screens/AssetDetailsScreen.tsx:130now asks forsans-serifon Android and keepsSystemelsewhere. The old@shopify/react-native-skia@2.14matchFontJS is byte-identical, so this was a latent bug rather than a regression.Smaller changes
patches/react-native-bottom-tabs@1.4.0.patch— obsolete against RN 0.88.@babel/plugin-syntax-typescriptcatalog entry; Re.Pack 5.4.3 declares it as a dependency now.@react-native/metro-configto the catalog and packages — without it align-deps pulls a secondreact-nativepeer copy and instantiates it twice.expo-fonttofalseinpackages/auth/rspack.config.ts, matching the host: vector-icons 14 probes it behind atry/catchon web only, and the native font is always bundled.allowBuildsupdated for the renamed Skia package. TheminimumReleaseAgeExcludelist is removed: every pinned version is now past pnpm's default release-age window.Deliberately not updated
@react-native/babel-presetpeers^7), Jest on ^29, ESLint on ^9.39.5, TypeScript on ^6.0.3 (typescript-eslint caps at<6.1).Verification
pnpm install,pnpm peers check(clean),pnpm -r typecheck,pnpm -r lint,pnpm -r test,pnpm format:check,pnpm check-depsall pass. Production rspack bundles build for host + trading + wallet + auth on both iOS and Android.bundle exec pod installis clean,xcodebuildDebug builds, and./gradlew assembleDebugsucceeds including the renamed:react-native-skiamodule.Runtime, on an iPhone 17 simulator and a Pixel emulator, through the full demo: auth sign-in → live Markets prices → asset details (Skia chart with axis labels on both platforms) → trade bottom sheet → wallet holdings → account → sign out → sign back in. All four dev servers (host 8081, trading 9001, wallet 9002, auth 9003) served
/{platform}/mf-manifest.jsonfor both platforms, the host dev bundle built to ~11.6 MB for iOS and Android, and every container reportedCompiled ios/Compiled android.Dev-loop check on the Re.Pack 5.4.3 canary: editing a screen in the
authcontainer triggered a watch rebuild in 0.6s/0.7s, the rebuilt__federation_expose_*.chunk.bundleserved the new code, and the running app picked it up. HMR sockets stayed connected to the host, auth and trading servers concurrently, andSIGINTshuts each server down in ~100ms.Re-verified on 0.88.1 + Re.Pack 5.4.3
Lint, typecheck, tests, format check and
check-depspass, and production bundles build for all four apps on both platforms. A freshpod install→xcodebuildDebug build works without the.last_build_configurationworkaround described below, and./gradlew assembleDebugsucceeds. On the iPhone 17 simulator: Markets with live prices → Skia chart → trade sheet → wallet → account → sign out → sign in, with no JS errors; hot reload of theauthremote applies in 0.2–0.3s; dev servers exit in under 100ms onSIGINT. Re-run on the published 5.4.3: the same checks and bundles pass,pod installand an incremental Debug build succeed, and the full flow, hot reload, and sub-100ms shutdown were repeated on the iPhone 17 simulator and on an Android 15 emulator (Pixel;assembleDebugAPK). On Android the Skia chart draws with its axis labels, the trade sheet opens, wallet updates live, and sign out / sign in works. No JS errors on either platform.Release builds on Re.Pack 5.4.3: an iOS
Releasesimulator build and an AndroidassembleReleaseAPK (R8 minification on), each with a Hermes bytecode main bundle and no dev server running. The auth, trading and wallet remotes were production bundles (react-native bundle --dev false) served from a static file server on their usual ports. On both platforms the full flow works (sign in → live Markets → Skia chart with axis labels → trade sheet → wallet → account → sign out → sign in), every remote request returned 200, and there were no crashes or JS errors. For the local Android run the release manifest temporarily allowed cleartext HTTP to reachhttp://localhost; that change isn't part of this PR.Known upstream noise (pre-existing, unchanged by this PR)
@gorhom/bottom-sheetpasses a deps array touseAnimatedStyle, so Reanimated logsDependencies should only be used on the web…repeatedly while the sheet is mounted.Re.Pack 5.4.3 adds a plugin check, so the auth dev server logs a
ReanimatedPluginadvisory because auth listsreact-native-reanimatedindependencies(trading/wallet usepeerDependencies, which is why only auth warns). Auth has no animations, so it is harmless, and auth never configured the plugin onmaineither — not a regression. Tidying that dep is out of scope here.Could not find generated setter for class com.reactnative.skia.Skia*ViewManageron Android — benign, from the new package id.On shutdown,
@rspack/core's Node bindings printObjectRef is not unref, it considered as a memory leak— cosmetic, does not delay exit.RN 0.88.0 prebuilt-core pitfall (Re.Pack-unrelated, hit locally; did not reproduce on 0.88.1): after a fresh
pod install, a Debug build fails to link withUndefined symbols: facebook::react::Sealable::Sealable(), and if an stale bundle is reused the app then dies at launch withSymbol not found: ...hermes::cdp::CDPDebugAPI::addConsoleMessage....pod installstages the ReleaseReact.xcframeworkandhermesvm, butreplace-rncore-version.js/replace_hermes_version.jsskip their swap whenPods/<pod>/.last_build_configurationis absent, because they assume the staged artifact is Debug. Workaround: writeReleaseintoPods/React-Core-prebuilt/.last_build_configurationandPods/hermes-engine/.last_build_configuration, then rebuild — both printReplacing …/Done replacing hermes-engineand the build succeeds. Worth reporting upstream.pod installintermittently dies with CocoaPodsArgumentError - pathname contains null byte(known pnpm-monorepo flake, cocoapods#12866); re-running succeeds.HermesBytecodePlugincan't find hermesc under pnpm on RN 0.82+ (not used by this app, unchanged since 5.4.2): the default lookup joins<context>/node_modules/react-native/../hermes-compilerwithout resolving the pnpm symlink, then falls back tosdks/hermesc, which RN 0.88 no longer ships. PassingreactNativePath: fs.realpathSync(...)works around it. When hermesc fails,react-native bundlestill exits 0 and leaves the chunks as plain JS.