Files
orca/mobile/package.json
T
NeilandKelvin Amoaba 5d61e00c6d build(mobile): upgrade to Expo SDK 58 and React Native 0.88 (#37935)
* build(mobile): upgrade to Expo SDK 58 and React Native 0.88

Expo 58 drops Zod from @expo/cli, which clears the last Zod 3 advisory
(GHSA-mrhx-c7xc-m3w5) in mobile along with its local patch and override.

- Expo 55 -> 58, React Native 0.83 -> 0.88, React 19.3, gesture-handler 3,
  webview 14, reanimated 4.7, worklets 0.13 (SDK 58 bundled versions,
  pinned below today's batch to respect minimumReleaseAge).
- Port the react-native and react-native-webview patches unchanged; drop
  expo-constants, expo-notifications, @expo/cli, expo-router, zod and
  query-string patches plus the zod/query-string/xcode>uuid overrides,
  which upstream fixed or no longer need.
- iOS minimum rises to 16.4 (Expo 58 / RN 0.88 requirement).
- Migrate to RN 0.88 strict types: instance ref types, NamedStyles,
  AppState.currentState, list header/footer nulls.
- Replace removed runtime APIs: InteractionManager -> idle callback with a
  macrotask fallback; StyleSheet.absoluteFillObject -> absoluteFill;
  FileHandle.readBytes -> readBytesSync (it became async).
- Resolve react-native/asset-registry for shared assets in Metro and alias
  the old registry path for react-native-svg in the desktop mobile-web bundle.
- Reduce the iOS scene plugin to the reconnect override; Expo 58's template
  now ships the scene delegate itself.

* fix(mobile): bridge react-native-svg web imports and libsodium runtime for RN 0.88

- Share react-native-svg web shims between the mobile-web build and its render
  checks: map the old asset-registry path to react-native-web's registry and stub
  the Android-only touch-sound TurboModule.
- Patch react-native-libsodium 1.7.0 to read the JSI runtime from the bridge proxy;
  RN 0.88 removed RCTCxxBridge.runtime.

* fix(mobile): use Expo 58's legacy promise resolver for audio permissions

* fix(mobile): skip null handles in the RPC recording timer shims for RN 0.88 types

* style(mobile): format MobilePRSidebar after rebase

* fix(mobile): name RN 0.88 text input refs for declarations; allow queued back in stack render check

- Type text input refs with an exported interface so declaration emit can name hook results
  (RN 0.88 aliases TextInputInstance to an unexported class).
- Expo Router 58 drains back() after a commit; check the interrupted push's exit from the
  frame it starts, bounded to three frames of lag.

* chore(mobile): justify the text input handle interface for React Doctor

* chore(mobile): use a nameable intersection alias for text input refs

* fix(mobile): use sync expo-file-system writes, copies and moves on Expo 58

Expo 58 made File.write/copy/move and FileHandle.writeBytes return promises.
Our callers never awaited them, so failures escaped their try/catch and the
store's tmp-then-move and PDF writes could race their close or rename.

* build(mobile): raise the page bundle budget to 10 MiB for Expo 58

Expo 58 adds about 310 KB to the page: expo-router (+258 KB, now carrying
React Navigation, net about +110 KB) and Reanimated 4.7 (+152 KB). Main had
85 KB of headroom left. 10 MiB still stays within the 10 MiB per-asset contract.

* fix(mobile): drop the window-metrics seed RN 0.88 removed from Android

RN 0.88 no longer holds window metrics: DeviceInfoModule reads the activity's
WindowMetrics on demand and setWindowDisplayMetrics is gone, so MainActivity
no longer compiled. Layout scale still comes from the screen metrics we reseed.

---------

Co-authored-by: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com>
2026-11-11 23:30:02 +00:00

110 lines
4.1 KiB
JSON

{
"name": "orca-mobile",
"version": "0.0.1",
"private": true,
"main": "index.js",
"scripts": {
"start": "node scripts/start-expo.mjs",
"android": "expo run:android",
"ios": "expo run:ios",
"native": "node scripts/native-client.mjs",
"postinstall": "node scripts/build-terminal-webview-engine.mjs && node scripts/build-mermaid-page-engine.mjs && node scripts/build-katex-page-style.mjs && node scripts/build-terminal-document-script.mjs",
"test": "vitest run",
"typecheck": "node ../config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --project=mobile/tsconfig.json",
"typecheck:tests": "node ../config/scripts/typecheck/project-execution/run-typecheck-projects-in-parallel.mjs --project=mobile/tsconfig.test.json",
"check:tests-typecheck": "node scripts/check-tests-typecheck-ratchet.mjs",
"rpc:record": "tsx --conditions=orca-source scripts/rpc-recording.mts",
"rpc:diff": "tsx --conditions=orca-source scripts/rpc-diff.mts",
"lint": "oxlint",
"format": "oxfmt --write .",
"format:check": "oxfmt --check .",
"mock-server": "npx tsx scripts/mock-server.ts",
"repro:workspace-picker-lag": "npx tsx scripts/repro-workspace-picker-lag.ts",
"start:emulator": "node scripts/start-emulator.mjs"
},
"dependencies": {
"@formatjs/intl-pluralrules": "6.3.16",
"@noble/hashes": "1.8.0",
"@orca/expo-two-way-audio": "file:./packages/expo-two-way-audio",
"@react-native-async-storage/async-storage": "^2.2.0",
"@tanstack/query-persist-client-core": "5.105.3",
"@tanstack/react-query": "5.105.3",
"@xterm/addon-unicode11": "0.10.0-beta.330",
"@xterm/addon-webgl": "0.20.0-beta.329",
"@xterm/xterm": "6.1.0-beta.336",
"buffer": "^6.0.3",
"diff": "8.0.4",
"expo": "~58.0.22",
"expo-build-properties": "^58.0.12",
"expo-camera": "^58.0.14",
"expo-clipboard": "^58.0.4",
"expo-constants": "^58.0.14",
"expo-crypto": "^58.0.7",
"expo-dev-client": "~58.0.18",
"expo-document-picker": "^58.0.4",
"expo-file-system": "58.0.13",
"expo-haptics": "^58.0.7",
"expo-image-picker": "^58.0.10",
"expo-keep-awake": "~58.0.3",
"expo-linking": "^58.0.15",
"expo-localization": "~58.0.5",
"expo-modules-core": "~58.0.29",
"expo-network": "~58.0.4",
"expo-notifications": "^58.1.7",
"expo-router": "^58.0.29",
"expo-secure-store": "^58.0.2",
"expo-splash-screen": "^58.0.12",
"expo-status-bar": "^58.0.4",
"expo-task-manager": "~58.0.13",
"fflate": "0.8.3",
"i18next": "26.5.11",
"katex": "0.18.10",
"lowlight": "^3.3.0",
"lucide-react-native": "^1.14.0",
"markdown-it": "^14.3.2",
"markdown-it-cjk-friendly": "^2.0.3",
"markdown-it-footnote": "^4.0.0",
"mermaid": "11.17.2",
"react": "19.3.0",
"react-dom": "19.3.0",
"react-native": "0.88.1",
"react-native-gesture-handler": "^3.3.0",
"react-native-libsodium": "1.7.0",
"react-native-reanimated": "4.7.1",
"react-native-safe-area-context": "^5.10.1",
"react-native-screens": "^4.30.1",
"react-native-svg": "15.16.0",
"react-native-web": "^0.21.4",
"react-native-webview": "14.0.1",
"react-native-worklets": "0.13.0",
"remend": "1.4.0",
"smol-toml": "1.9.1",
"tweetnacl": "^1.0.3",
"zod": "~4.6.7"
},
"devDependencies": {
"@orca/process-host": "link:../src/packages/process-host",
"@react-native/metro-config": "0.88.1",
"@types/markdown-it": "14.1.2",
"@types/markdown-it-footnote": "^3.0.4",
"@types/mdast": "^4.0.4",
"@types/react": "~19.2.18",
"@types/react-test-renderer": "19.1.0",
"@types/ws": "^8.18.2",
"acorn": "8.18.0",
"esbuild": "0.28.2",
"expo-module-scripts": "^56.0.3",
"happy-dom": "^21.0.4",
"oxfmt": "^0.74.0",
"oxlint": "^1.88.0",
"react-test-renderer": "19.3.0",
"tsx": "^4.23.15",
"typescript": "^7.0.2",
"typescript-api": "npm:typescript@6.0.3",
"vite": "^8.3.4",
"vitest": "5.0.5",
"ws": "^8.22.0"
},
"packageManager": "pnpm@12.14.0+sha512.c18ba6d87993d3d164cb5e8948f32b2c06ee854487e06cd8d86781342fb3e5bb4634367034711e86802baa9c37bea906ce1929ad08d70884c97d801df13389a6"
}