From 4852bfa96c1b70f5c6eb938230ac811c249f544e Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Mon, 4 May 2026 18:04:24 +0100 Subject: [PATCH 1/8] fix(metro-config): Fix incorrect `BABEL_ENV` restoration in Babel transformer (#45348) # Why Resolves #44687 A typo in the Babel transformer here means that `BABEL_ENV` is incorrectly restored to the incorrect value. See: https://github.com/facebook/metro/blob/5c4606f242b142f05efb082b2a5c8ea2445e0971/packages/metro-babel-transformer/src/index.js#L144 Regressed in #44366 / #44320 # How - Fix inverted condition # Test Plan # Checklist - [x] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- packages/@expo/metro-config/CHANGELOG.md | 1 + packages/@expo/metro-config/build/babel-transformer.js | 2 +- packages/@expo/metro-config/src/babel-transformer.ts | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/@expo/metro-config/CHANGELOG.md b/packages/@expo/metro-config/CHANGELOG.md index 58027655485247..46bd21739172de 100644 --- a/packages/@expo/metro-config/CHANGELOG.md +++ b/packages/@expo/metro-config/CHANGELOG.md @@ -13,6 +13,7 @@ - Respect `enableBabelRCLookup` in `loadBabelConfig` to skip Babel config file discovery ([#44841](https://github.com/expo/expo/pull/44841) by [@zoontek](https://github.com/zoontek)) - Fix mangled async chunk filenames for catch-all routes ([#43547](https://github.com/expo/expo/pull/43547) by [@hassankhan](https://github.com/hassankhan)) - Fixed DOM Components rendering issues on Android 9 devices. ([#43156](https://github.com/expo/expo/pull/43156) by [@kudo](https://github.com/kudo)) +- Fix `BABEL_ENV` being incorrectly restored ([#45348](https://github.com/expo/expo/pull/45348) by [@kitten](https://github.com/kitten)) ### πŸ’‘ Others diff --git a/packages/@expo/metro-config/build/babel-transformer.js b/packages/@expo/metro-config/build/babel-transformer.js index 7cef7a398333d5..afe43e11d0d9de 100644 --- a/packages/@expo/metro-config/build/babel-transformer.js +++ b/packages/@expo/metro-config/build/babel-transformer.js @@ -145,7 +145,7 @@ plugins, }) => { } finally { // Restore the old process.env.BABEL_ENV - if (OLD_BABEL_ENV != null) { + if (OLD_BABEL_ENV == null) { // We have to treat this as a special case because writing undefined to // an environment variable coerces it to the string 'undefined'. To // unset it, we must delete it. diff --git a/packages/@expo/metro-config/src/babel-transformer.ts b/packages/@expo/metro-config/src/babel-transformer.ts index 2d5a1085c1354b..2cc07366b9ad34 100644 --- a/packages/@expo/metro-config/src/babel-transformer.ts +++ b/packages/@expo/metro-config/src/babel-transformer.ts @@ -222,7 +222,7 @@ const transform: BabelTransformer['transform'] = ({ return { ast: result.ast, metadata: result.metadata }; } finally { // Restore the old process.env.BABEL_ENV - if (OLD_BABEL_ENV != null) { + if (OLD_BABEL_ENV == null) { // We have to treat this as a special case because writing undefined to // an environment variable coerces it to the string 'undefined'. To // unset it, we must delete it. From 59f297d0d5b6c196ec862cfbe25c448d7c47cbbb Mon Sep 17 00:00:00 2001 From: Jakub Tkacz <32908614+Ubax@users.noreply.github.com> Date: Mon, 4 May 2026 19:17:29 +0200 Subject: [PATCH 2/8] [expo-router][docs] add 55->56 migration guide (#45216) # Why # How # Test Plan # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --------- Co-authored-by: Aman Mittal --- docs/constants/navigation.js | 1 + docs/pages/router/migrate/sdk-55-to-56.mdx | 55 ++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 docs/pages/router/migrate/sdk-55-to-56.mdx diff --git a/docs/constants/navigation.js b/docs/constants/navigation.js index 6c1b98bab0e8bb..d880c7331f7968 100644 --- a/docs/constants/navigation.js +++ b/docs/constants/navigation.js @@ -300,6 +300,7 @@ export const general = [ makeGroup('Migration', [ makePage('router/migrate/from-react-navigation.mdx'), makePage('router/migrate/from-expo-webpack.mdx'), + makePage('router/migrate/sdk-55-to-56.mdx'), ]), ]), makeSection( diff --git a/docs/pages/router/migrate/sdk-55-to-56.mdx b/docs/pages/router/migrate/sdk-55-to-56.mdx new file mode 100644 index 00000000000000..a183be65f2bda4 --- /dev/null +++ b/docs/pages/router/migrate/sdk-55-to-56.mdx @@ -0,0 +1,55 @@ +--- +title: Migrate Expo Router from SDK 55 to SDK 56 +sidebar_title: SDK 55 to 56 +description: Learn how to migrate Expo Router from SDK 55 to 56 using a codemod or manually. +--- + +import { Terminal } from '~/ui/components/Snippet'; + +In **SDK 56 and later**, Expo Router no longer supports importing from external `@react-navigation/*` packages in application code. Update those imports to the matching `expo-router` entry points. The runtime API is unchanged - only the module specifiers move. + +## Automated migration + +Run the codemod from the root of your project. It rewrites `@react-navigation/*` imports in your application code to the matching `expo-router` entry points. + + + +Replace `src` with the directory or glob that contains your application code. + +## Manual migration + +If you cannot run the codemod, repoint each import by hand: + +```tsx +// Before (SDK 55) +import { ThemeProvider, DarkTheme } from '@react-navigation/native'; +import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs'; + +// After (SDK 56) +import { ThemeProvider, DarkTheme } from 'expo-router/react-navigation'; +import { createMaterialTopTabNavigator } from 'expo-router/js-top-tabs'; +``` + +Use the following table to map each React Navigation import in your code to its `expo-router` equivalent: + +| React Navigation source | Expo Router target | +| ------------------------------------- | --------------------------------------------------------------------------------- | +| `@react-navigation/native` | `expo-router/react-navigation` | +| `@react-navigation/core` | `expo-router/react-navigation` | +| `@react-navigation/elements` | `expo-router/react-navigation` | +| `@react-navigation/routers` | `expo-router/react-navigation` | +| `@react-navigation/stack` | `expo-router/js-stack` | +| `@react-navigation/bottom-tabs` | `expo-router/js-tabs` | +| `@react-navigation/material-top-tabs` | `expo-router/js-top-tabs` | +| `@react-navigation/native-stack` | No direct equivalent. Use the [`Stack`](/router/advanced/stack) layout instead. | +| `@react-navigation/drawer` | No direct equivalent. Use the [`Drawer`](/router/advanced/drawer) layout instead. | + +## Libraries + +Many third-party libraries still import from `@react-navigation/core`. To ease the SDK 56 transition, Expo CLI automatically rewrites those imports to `expo-router` when they originate from **node_modules**. Your application code is unaffected by this rewrite. + +This is a temporary compatibility shim. A dedicated library migration guide will explain the replacement before the automatic rewrite is removed. + +To opt out, set `EXPO_ROUTER_DISABLE_RN_NAVIGATION_CHECK=1` in your environment before starting the bundler. This also disables the bundler error for application code that imports from `@react-navigation/*`. + + From ec0d4f20decdb946f7286ca270ea96f37455b11a Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Mon, 4 May 2026 18:42:23 +0100 Subject: [PATCH 3/8] chore: Upgrade to `metro@0.84.4` (#45261) # Summary Changes within range: https://github.com/facebook/metro/compare/v0.84.3...v0.84.4 Upgrades to `@expo/metro@56.0.0-rc.2` / `metro@0.84.4` Supersedes #45194 # Test Plan # Checklist - [ ] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- packages/@expo/cli/package.json | 2 +- packages/@expo/metro-config/package.json | 2 +- packages/babel-preset-expo/package.json | 2 +- packages/expo-doctor/package.json | 2 +- packages/expo-module-scripts/package.json | 2 +- packages/expo/package.json | 2 +- pnpm-lock.yaml | 587 +++++----------------- 7 files changed, 137 insertions(+), 462 deletions(-) diff --git a/packages/@expo/cli/package.json b/packages/@expo/cli/package.json index 73eecb51734186..881d613d688699 100644 --- a/packages/@expo/cli/package.json +++ b/packages/@expo/cli/package.json @@ -58,7 +58,7 @@ "@expo/inline-modules": "workspace:0.0.1", "@expo/json-file": "workspace:^10.0.12", "@expo/log-box": "workspace:55.0.7", - "@expo/metro": "56.0.0-rc.1", + "@expo/metro": "56.0.0-rc.2", "@expo/metro-config": "workspace:~55.0.9", "@expo/osascript": "workspace:^2.4.2", "@expo/package-manager": "workspace:^1.10.3", diff --git a/packages/@expo/metro-config/package.json b/packages/@expo/metro-config/package.json index 189c845c8920e1..5d23e51d26f520 100644 --- a/packages/@expo/metro-config/package.json +++ b/packages/@expo/metro-config/package.json @@ -39,7 +39,7 @@ "@expo/config": "workspace:~55.0.8", "@expo/env": "workspace:~2.1.1", "@expo/json-file": "workspace:~10.0.12", - "@expo/metro": "56.0.0-rc.1", + "@expo/metro": "56.0.0-rc.2", "@expo/spawn-async": "^1.7.2", "browserslist": "^4.25.0", "chalk": "^4.1.0", diff --git a/packages/babel-preset-expo/package.json b/packages/babel-preset-expo/package.json index 4123befcfc3455..ba92f2d2cabff6 100644 --- a/packages/babel-preset-expo/package.json +++ b/packages/babel-preset-expo/package.json @@ -85,7 +85,7 @@ }, "devDependencies": { "@babel/core": "^7.26.0", - "@expo/metro": "56.0.0-rc.1", + "@expo/metro": "56.0.0-rc.2", "@expo/metro-config": "workspace:*", "@types/babel__core": "^7.20.5", "@types/babel__generator": "^7.27.0", diff --git a/packages/expo-doctor/package.json b/packages/expo-doctor/package.json index 9b8c502248ad40..864c37965d61ae 100644 --- a/packages/expo-doctor/package.json +++ b/packages/expo-doctor/package.json @@ -39,7 +39,7 @@ "@expo/config": "workspace:*", "@expo/env": "workspace:*", "@expo/json-file": "workspace:*", - "@expo/metro": "56.0.0-rc.1", + "@expo/metro": "56.0.0-rc.2", "@expo/schemer": "workspace:*", "@expo/spawn-async": "^1.7.2", "@types/debug": "^4.1.8", diff --git a/packages/expo-module-scripts/package.json b/packages/expo-module-scripts/package.json index e5ebaca45ee32e..580a3c5b2964bc 100644 --- a/packages/expo-module-scripts/package.json +++ b/packages/expo-module-scripts/package.json @@ -88,7 +88,7 @@ "ts-jest": "~29.4.7" }, "devDependencies": { - "@expo/metro": "56.0.0-rc.1", + "@expo/metro": "56.0.0-rc.2", "@babel/core": "^7.26.0" } } diff --git a/packages/expo/package.json b/packages/expo/package.json index 6a56eac66459ff..a2cb288f0ab8bf 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -83,7 +83,7 @@ "@expo/fingerprint": "workspace:0.16.5", "@expo/local-build-cache-provider": "workspace:55.0.6", "@expo/log-box": "workspace:55.0.7", - "@expo/metro": "56.0.0-rc.1", + "@expo/metro": "56.0.0-rc.2", "@expo/metro-config": "workspace:55.0.9", "@expo/vector-icons": "^15.0.2", "@ungap/structured-clone": "^1.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1022823717e234..b2eaa6d2810586 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -219,7 +219,7 @@ importers: version: 2.30.0(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) react-native-keyboard-controller: specifier: ^1.20.7 - version: 1.21.0(react-native-reanimated@4.3.0(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.1(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + version: 1.21.6(react-native-reanimated@4.3.0(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.1(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) react-native-pager-view: specifier: 6.9.1 version: 6.9.1(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) @@ -290,7 +290,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.3.11 + version: 1.3.13 '@types/pngjs': specifier: ^6.0.5 version: 6.0.5 @@ -1105,7 +1105,7 @@ importers: version: 2.30.0(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) react-native-keyboard-controller: specifier: ^1.20.7 - version: 1.21.0(react-native-reanimated@4.3.0(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.1(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + version: 1.21.6(react-native-reanimated@4.3.0(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.1(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) react-native-maps: specifier: 1.27.2 version: 1.27.2(react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) @@ -1804,8 +1804,8 @@ importers: specifier: workspace:55.0.7 version: link:../log-box '@expo/metro': - specifier: 56.0.0-rc.1 - version: 56.0.0-rc.1 + specifier: 56.0.0-rc.2 + version: 56.0.0-rc.2 '@expo/metro-config': specifier: workspace:~55.0.9 version: link:../metro-config @@ -2530,8 +2530,8 @@ importers: specifier: workspace:~10.0.12 version: link:../json-file '@expo/metro': - specifier: 56.0.0-rc.1 - version: 56.0.0-rc.1 + specifier: 56.0.0-rc.2 + version: 56.0.0-rc.2 '@expo/spawn-async': specifier: ^1.7.2 version: 1.7.2 @@ -2598,7 +2598,7 @@ importers: version: link:../../expo-module-scripts metro-minify-terser: specifier: ^0.84.2 - version: 0.84.2 + version: 0.84.4 sass: specifier: ^1.60.0 version: 1.98.0 @@ -2787,7 +2787,7 @@ importers: version: 7.28.6(@babel/core@7.29.0) typescript: specifier: ^5.0.0 || ^5.0.0-0 || ^6.0.0 - version: 5.9.3 + version: 6.0.3 devDependencies: '@babel/cli': specifier: ^7.23.4 @@ -2997,8 +2997,8 @@ importers: specifier: ^7.26.0 version: 7.29.0 '@expo/metro': - specifier: 56.0.0-rc.1 - version: 56.0.0-rc.1 + specifier: 56.0.0-rc.2 + version: 56.0.0-rc.2 '@expo/metro-config': specifier: workspace:* version: link:../@expo/metro-config @@ -3320,7 +3320,7 @@ importers: version: 29.7.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.18)(@types/node@25.5.0)(typescript@6.0.3)) ts-jest: specifier: ^29.1.2 - version: 29.4.6(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.18)(@types/node@25.5.0)(typescript@6.0.3)))(typescript@6.0.3) + version: 29.4.9(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.18)(@types/node@25.5.0)(typescript@6.0.3)))(typescript@6.0.3) packages/expo: dependencies: @@ -3352,8 +3352,8 @@ importers: specifier: workspace:55.0.7 version: link:../@expo/log-box '@expo/metro': - specifier: 56.0.0-rc.1 - version: 56.0.0-rc.1 + specifier: 56.0.0-rc.2 + version: 56.0.0-rc.2 '@expo/metro-config': specifier: workspace:55.0.9 version: link:../@expo/metro-config @@ -3395,7 +3395,7 @@ importers: version: 0.21.2(encoding@0.1.13)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react-native-webview: specifier: '*' - version: 13.16.0(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + version: 13.16.1(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) react-refresh: specifier: ^0.14.2 version: 0.14.2 @@ -4108,8 +4108,8 @@ importers: specifier: workspace:* version: link:../@expo/json-file '@expo/metro': - specifier: 56.0.0-rc.1 - version: 56.0.0-rc.1 + specifier: 56.0.0-rc.2 + version: 56.0.0-rc.2 '@expo/schemer': specifier: workspace:* version: link:../@expo/schemer @@ -4735,8 +4735,8 @@ importers: specifier: ^7.26.0 version: 7.29.0 '@expo/metro': - specifier: 56.0.0-rc.1 - version: 56.0.0-rc.1 + specifier: 56.0.0-rc.2 + version: 56.0.0-rc.2 packages/expo-module-template: devDependencies: @@ -7364,7 +7364,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {'0': node >=0.10.0} + engines: {node: '>=0.10.0'} '@expo/code-signing-certificates@0.0.6': resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} @@ -7400,8 +7400,8 @@ packages: peerDependencies: '@modelcontextprotocol/sdk': ^1.26.0 - '@expo/metro@56.0.0-rc.1': - resolution: {integrity: sha512-6GRqMdex3WkUccCTItY1I/K5PoZ6nehpJwNCig+7eqf9b+P2oDSZ4W/CFnNMJuJBktLAn2bgL+cJEyEdjWWbmw==} + '@expo/metro@56.0.0-rc.2': + resolution: {integrity: sha512-VgEkAshU/uVkOXux199M1i5in5rXw3PMOEHlTkl0Zi1BLP1zOL6mOIRXHG/8ZQ/6qDTJtpYgComI4/v42JOqFg==} '@expo/multipart-body-parser@1.1.0': resolution: {integrity: sha512-XOaS79wFIJgx0J7oUzRb+kZsnZmFqGpisu0r8RPO3b0wjbW7xpWgiXmRR4RavKeGiVAPauZOi4vad7cJ3KCspg==} @@ -9023,8 +9023,8 @@ packages: '@types/braces@3.0.5': resolution: {integrity: sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==} - '@types/bun@1.3.11': - resolution: {integrity: sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg==} + '@types/bun@1.3.13': + resolution: {integrity: sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw==} '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} @@ -10109,8 +10109,8 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - bun-types@1.3.11: - resolution: {integrity: sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg==} + bun-types@1.3.13: + resolution: {integrity: sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA==} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -11742,11 +11742,6 @@ packages: resolution: {integrity: sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==} engines: {node: '>= 10.x'} - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - handlebars@4.7.9: resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} engines: {node: '>=0.4.7'} @@ -13021,119 +13016,61 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - metro-babel-transformer@0.84.2: - resolution: {integrity: sha512-UZqjh1VMRDm0WasifM0aN+JreCn3CW0BaPoZgDXb0xOMFSF9dKZJsKhcrpzkjL1+qwmHFYjlhGiQ+tvXdSx+OQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-babel-transformer@0.84.3: - resolution: {integrity: sha512-svAA+yMLpeMiGcz/jKJs4oHpIGEx4nBqNEJ5AGj4CYIg1efvK+A0TjR6tgIuc6tKO5e8JmN/1lglpN2+f3/z/w==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-cache-key@0.84.2: - resolution: {integrity: sha512-+yJxLYu5nhKp7jZD6wtx4dMoSqLzK6MeYVkjMaUgjuh2Lu8DwGrxRnbmIVnn5Z9AQOs/K4eOWmuD7N2p64UCMw==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-cache-key@0.84.3: - resolution: {integrity: sha512-TnSL1Fdvrw+2glTdBSRmA5TL8l/i16ECjsrUdf3E5HncA+sNx8KcwDG8r+3ct1UhfYcusJypzZqTN55FZZcwGg==} + metro-babel-transformer@0.84.4: + resolution: {integrity: sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-cache@0.84.2: - resolution: {integrity: sha512-jPX2fwOc/MmP2KRScSg2jFtVN9BTd+QN6j/3qZ+HIbEAsePLONozbKR2kCIBGvVeBTe7js48WXziI4+AdfwfFQ==} + metro-cache-key@0.84.4: + resolution: {integrity: sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-cache@0.84.3: - resolution: {integrity: sha512-0QElxwLaHqLZf+Xqio8QrjVbuXP/8sJfQBGSPiITlKDVXrVLefuzYVSH9Sj+QL6lrPj2gYZd/iwQh1yZuVKnLA==} + metro-cache@0.84.4: + resolution: {integrity: sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-config@0.84.2: - resolution: {integrity: sha512-ze7IgJwLJoXoTxeXW86xqqKoxXjE0gZg5w8kW2mawaWLSfuvI0KgVaaERXgoVuWl+DQU2q22tIeAEdsCyUZvBQ==} + metro-config@0.84.4: + resolution: {integrity: sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-config@0.84.3: - resolution: {integrity: sha512-JmCzZWOETR+O22q8oPBWyQppx3roU9EbkbGzD8Gf1jukQ4b5T1fTzqqHruu6K4sTiNq5zVQySmKF6bp4kVARew==} + metro-core@0.84.4: + resolution: {integrity: sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-core@0.84.2: - resolution: {integrity: sha512-s9Ko372nzfbu5Y2uhWDlB/g3E6mba3Es95QzF/8IwNM4ynZgqM9rfnU0PR54onGvDGDfj44jbooSxaA1D09rDA==} + metro-file-map@0.84.4: + resolution: {integrity: sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-core@0.84.3: - resolution: {integrity: sha512-cc0pvAa80ai1nDmqqz0P59a+0ZqCZ/YHU/3jEekZL6spFnYDfX8iDLdn9FR6kX+67rmzKxHNrbrSRFLX2AYocw==} + metro-minify-terser@0.84.4: + resolution: {integrity: sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-file-map@0.84.2: - resolution: {integrity: sha512-ZgX1lXO9YJCgTY6OSuwvRcHdhXjAFd1DdYC4g2B+d7yAtLUW1/OqwTLpW6ixl1zqZDDQSDSYZXDsN7DL2IumBw==} + metro-resolver@0.84.4: + resolution: {integrity: sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-file-map@0.84.3: - resolution: {integrity: sha512-1cL4m4Jv1yRUt9RJExZQLfccscdlMNOcRG6LHLtmJhf3BG9j3MujPVc7CIpKYdFl+KUl+sdjge6oO3+meKCHQA==} + metro-runtime@0.84.4: + resolution: {integrity: sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-minify-terser@0.84.2: - resolution: {integrity: sha512-1TNGPN4oUose+XSHsdDUvcvPHQxKP5lZNbiS6UteTXX+6zFNu+IzxqSokyrDoj9BSjVbdClrB3okuI+Fpls3LA==} + metro-source-map@0.84.4: + resolution: {integrity: sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-minify-terser@0.84.3: - resolution: {integrity: sha512-3ofrG2OQyJbO9RNhCfOcl8QU7EE2WrSsnN5dFkuZaJO5+4Imujr9bUXmspeNlXRsOVk0F/rVRbEFH98lFSCkBQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-resolver@0.84.2: - resolution: {integrity: sha512-2i6OQJIv18+olvLnmcM20uhi1T729+25izZozqOugSaV0YGzMV/EXkYFqxkXC9iNsantGcI/w9PgaI89wLK6JQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-resolver@0.84.3: - resolution: {integrity: sha512-pjEzGDtoM8DTHAIPK/9u9ZxszEiuRohYUVImWvgbnB91V4gqYJpQcoEYUugf2NIm1lrX5HNu0OvNqWmPBnGYjA==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-runtime@0.84.2: - resolution: {integrity: sha512-NzzORY2+mmN3tLhsZ7N4GDOBERusalyM1o1k36euulUIEe8UkDhwzcsRexvxKaSkrGLiRQ9PYDLp9uxPkQ+A0Q==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-runtime@0.84.3: - resolution: {integrity: sha512-o7HLRfMyVk9N2dUZ9VjQfB6xxUItL9Pi9WcqxURE7MEKOH6wbGt9/E92YdYLluTOtkzYAEVfdC6h6lcxqA+hMQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-source-map@0.84.2: - resolution: {integrity: sha512-m6rRVBefzaAyn6dBk5GOabVchCQ3VIS1/MhCj61dJB5cqLOOx34BV3DRFwnDBkuPw2RR/LUoul0U1sixlS9VQg==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-source-map@0.84.3: - resolution: {integrity: sha512-jS48CeSzw78M8y6VE0f9uy3lVmfbOS677j2VCxnlmlYmnahcXuC6IhoN9K6LynNvos9517yUadcfgioju38xYQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-symbolicate@0.84.2: - resolution: {integrity: sha512-o0RY49012YcGE1E4GsZtgzFCBPeoxlASzIsD5CNOTmAoKDIroHfTFFiYCGPLCGwRwQjMaCChhoH0TZCjAyyCKA==} + metro-symbolicate@0.84.4: + resolution: {integrity: sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} hasBin: true - metro-symbolicate@0.84.3: - resolution: {integrity: sha512-J9Tpo8NCycYrozRvBIUyOwGAu4xkawOsAppmTscFiaegK0WvuDGwIM53GbzVSnytCHjVAF0io5GQxpkrKTuc7g==} + metro-transform-plugins@0.84.4: + resolution: {integrity: sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - hasBin: true - metro-transform-plugins@0.84.2: - resolution: {integrity: sha512-/821YLQv4PgD1NOruzPkr0r3HDALXqwCEECewyEQZ5hmSb8jzf1VdEpf3F8fx8zI4/5dHY/rARDVVuHCEb/Xrg==} + metro-transform-worker@0.84.4: + resolution: {integrity: sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-transform-plugins@0.84.3: - resolution: {integrity: sha512-8S3baq2XhBaafHEH5Q8sJW6tmzsEJk80qKc3RU/nZV1MsnYq94RdjTUR6AyKjQd6Rfsk1BtBxhtiNnk7mgslCg==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-transform-worker@0.84.2: - resolution: {integrity: sha512-aR09svo3WC7OTYk5YB0VY0iSXOGrPdfmQWIxG8ADD2cKf/B95VR+y4GgVUbqB31buNvgtU+iCx9186i/YaNGlw==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro-transform-worker@0.84.3: - resolution: {integrity: sha512-Wjba7PyYktNRsHbPmkx2J2UX32rAzcDXjCu49zPHeF/viJlYJhwRaNePQcHaCRqQ+kmgQT4ThprsnJfDj71ZMA==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - metro@0.84.2: - resolution: {integrity: sha512-Qw7sl+e34cf/0LYEvDfVPiWvXmkvpuVgFqjzhPCc9Mw30NsvRFYZEH6I9zEHlpjugIveV+Jzdqt3YSPMU+Hx/w==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - hasBin: true - - metro@0.84.3: - resolution: {integrity: sha512-1h3lbVrE6hGf1e/764HfhPGg/bGrWMJDDh7G2rc4gFYZboVuI40BlG/y+UhtbhQDNlO/csMvrcnK0YrTlHUVew==} + metro@0.84.4: + resolution: {integrity: sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} hasBin: true @@ -13489,12 +13426,8 @@ packages: nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} - ob1@0.84.2: - resolution: {integrity: sha512-JID0ti8tDRQZJdQ3l+UeVAsKP+dW5Ucmktes/J9FwqP5KarafoTMqWvw4LRKrMtA7yWT3r/+E2w5wapd89GToA==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - ob1@0.84.3: - resolution: {integrity: sha512-J7554Ef8bzmKaDY365Afq6PF+qtdnY/d5PKUQFrsKlZHV/N3OGZewVrvDrQDyX5V5NJjTpcAKtlrFZcDr+HvpQ==} + ob1@0.84.4: + resolution: {integrity: sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} object-assign@4.1.1: @@ -14127,13 +14060,6 @@ packages: react: 19.2.3 react-native: 0.85.2 - react-native-keyboard-controller@1.21.0: - resolution: {integrity: sha512-mLHJysehhSzYoM8BAD2DSjVZEcF69t16ZCJrCAos6sfVtbB3tL+kgGZFX+jNVz/f9BEhqnBFO0EA1tc/V6Hkgw==} - peerDependencies: - react: 19.2.3 - react-native: 0.85.2 - react-native-reanimated: '>=3.0.0' - react-native-keyboard-controller@1.21.6: resolution: {integrity: sha512-nAXCmar/W8Gn4iQV7O5fAVuTh57JszCsqTS+cfR95WFOLR/AfbwfPz/+sWyz/q2SOIe2VpyQzq6hzYiwErhqqw==} peerDependencies: @@ -14246,12 +14172,6 @@ packages: react: 19.2.3 react-dom: 19.2.3 - react-native-webview@13.16.0: - resolution: {integrity: sha512-Nh13xKZWW35C0dbOskD7OX01nQQavOzHbCw9XoZmar4eXCo7AvrYJ0jlUfRVVIJzqINxHlpECYLdmAdFsl9xDA==} - peerDependencies: - react: 19.2.3 - react-native: 0.85.2 - react-native-webview@13.16.1: resolution: {integrity: sha512-If0eHhoEdOYDcHsX+xBFwHMbWBGK1BvGDQDQdVkwtSIXiq1uiqjkpWVP2uQ1as94J0CzvFE9PUNDuhiX0Z6ubw==} peerDependencies: @@ -14313,6 +14233,7 @@ packages: react-server-dom-webpack@19.0.4: resolution: {integrity: sha512-z49wXjknNnbgLgTAuTKLsbDQmkcQT4MXizLCVH2odd7BRVssJuWiydY3Todq/m3HSjoJRnutPE2SpyzksTaXow==} engines: {node: '>=0.10.0'} + deprecated: High Security Vulnerability in React Server Components peerDependencies: react: 19.2.3 react-dom: 19.2.3 @@ -15248,33 +15169,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-jest@29.4.6: - resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 || ^30.0.0 - '@jest/types': ^29.0.0 || ^30.0.0 - babel-jest: ^29.0.0 || ^30.0.0 - esbuild: '*' - jest: ^29.0.0 || ^30.0.0 - jest-util: ^29.0.0 || ^30.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - jest-util: - optional: true - ts-jest@29.4.9: resolution: {integrity: sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -15609,19 +15503,22 @@ packages: uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@7.0.3: resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true v8-compile-cache-lib@3.0.1: @@ -17385,22 +17282,22 @@ snapshots: - bufferutil - utf-8-validate - '@expo/metro@56.0.0-rc.1': - dependencies: - metro: 0.84.3 - metro-babel-transformer: 0.84.3 - metro-cache: 0.84.3 - metro-cache-key: 0.84.3 - metro-config: 0.84.3 - metro-core: 0.84.3 - metro-file-map: 0.84.3 - metro-minify-terser: 0.84.3 - metro-resolver: 0.84.3 - metro-runtime: 0.84.3 - metro-source-map: 0.84.3 - metro-symbolicate: 0.84.3 - metro-transform-plugins: 0.84.3 - metro-transform-worker: 0.84.3 + '@expo/metro@56.0.0-rc.2': + dependencies: + metro: 0.84.4 + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-config: 0.84.4 + metro-core: 0.84.4 + metro-file-map: 0.84.4 + metro-minify-terser: 0.84.4 + metro-resolver: 0.84.4 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 + metro-symbolicate: 0.84.4 + metro-transform-plugins: 0.84.4 + metro-transform-worker: 0.84.4 transitivePeerDependencies: - bufferutil - supports-color @@ -18871,9 +18768,9 @@ snapshots: '@react-native/dev-middleware': 0.85.2(patch_hash=563dd3c12ac9064f72bebd975abb206061af92d430d10341a2fce54810b5128f) debug: 4.4.3 invariant: 2.2.4 - metro: 0.84.2 - metro-config: 0.84.2 - metro-core: 0.84.2 + metro: 0.84.4 + metro-config: 0.84.4 + metro-core: 0.84.4 semver: 7.7.4 optionalDependencies: '@react-native/metro-config': 0.85.2(@babel/core@7.29.0) @@ -18940,8 +18837,8 @@ snapshots: dependencies: '@react-native/js-polyfills': 0.85.2 '@react-native/metro-babel-transformer': 0.85.2(@babel/core@7.29.0) - metro-config: 0.84.2 - metro-runtime: 0.84.2 + metro-config: 0.84.4 + metro-runtime: 0.84.4 transitivePeerDependencies: - '@babel/core' - bufferutil @@ -19350,9 +19247,9 @@ snapshots: '@types/braces@3.0.5': {} - '@types/bun@1.3.11': + '@types/bun@1.3.13': dependencies: - bun-types: 1.3.11 + bun-types: 1.3.13 '@types/cacheable-request@6.0.3': dependencies: @@ -20586,7 +20483,7 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bun-types@1.3.11: + bun-types@1.3.13: dependencies: '@types/node': 22.19.15 @@ -22594,15 +22491,6 @@ snapshots: graphql@15.10.1: {} - handlebars@4.7.8: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - handlebars@4.7.9: dependencies: minimist: 1.2.8 @@ -24187,94 +24075,51 @@ snapshots: methods@1.1.2: {} - metro-babel-transformer@0.84.2: - dependencies: - '@babel/core': 7.29.0 - flow-enums-runtime: 0.0.6 - hermes-parser: 0.33.3 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - - metro-babel-transformer@0.84.3: + metro-babel-transformer@0.84.4: dependencies: '@babel/core': 7.29.0 flow-enums-runtime: 0.0.6 hermes-parser: 0.35.0 - metro-cache-key: 0.84.3 + metro-cache-key: 0.84.4 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-cache-key@0.84.2: - dependencies: - flow-enums-runtime: 0.0.6 - - metro-cache-key@0.84.3: + metro-cache-key@0.84.4: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.84.2: + metro-cache@0.84.4: dependencies: exponential-backoff: 3.1.3 flow-enums-runtime: 0.0.6 https-proxy-agent: 7.0.6 - metro-core: 0.84.2 + metro-core: 0.84.4 transitivePeerDependencies: - supports-color - metro-cache@0.84.3: - dependencies: - exponential-backoff: 3.1.3 - flow-enums-runtime: 0.0.6 - https-proxy-agent: 7.0.6 - metro-core: 0.84.3 - transitivePeerDependencies: - - supports-color - - metro-config@0.84.2: + metro-config@0.84.4: dependencies: connect: 3.7.0 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.84.2 - metro-cache: 0.84.2 - metro-core: 0.84.2 - metro-runtime: 0.84.2 + metro: 0.84.4 + metro-cache: 0.84.4 + metro-core: 0.84.4 + metro-runtime: 0.84.4 yaml: 2.8.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-config@0.84.3: - dependencies: - connect: 3.7.0 - flow-enums-runtime: 0.0.6 - jest-validate: 29.7.0 - metro: 0.84.3 - metro-cache: 0.84.3 - metro-core: 0.84.3 - metro-runtime: 0.84.3 - yaml: 2.8.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - metro-core@0.84.2: - dependencies: - flow-enums-runtime: 0.0.6 - lodash.throttle: 4.1.1 - metro-resolver: 0.84.2 - - metro-core@0.84.3: + metro-core@0.84.4: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.84.3 + metro-resolver: 0.84.4 - metro-file-map@0.84.2: + metro-file-map@0.84.4: dependencies: debug: 4.4.3 fb-watchman: 2.0.2 @@ -24288,110 +24133,46 @@ snapshots: transitivePeerDependencies: - supports-color - metro-file-map@0.84.3: - dependencies: - debug: 4.4.3 - fb-watchman: 2.0.2 - flow-enums-runtime: 0.0.6 - graceful-fs: 4.2.11 - invariant: 2.2.4 - jest-worker: 29.7.0 - micromatch: 4.0.8 - nullthrows: 1.1.1 - walker: 1.0.8 - transitivePeerDependencies: - - supports-color - - metro-minify-terser@0.84.2: - dependencies: - flow-enums-runtime: 0.0.6 - terser: 5.46.1 - - metro-minify-terser@0.84.3: + metro-minify-terser@0.84.4: dependencies: flow-enums-runtime: 0.0.6 terser: 5.46.1 - metro-resolver@0.84.2: - dependencies: - flow-enums-runtime: 0.0.6 - - metro-resolver@0.84.3: - dependencies: - flow-enums-runtime: 0.0.6 - - metro-runtime@0.84.2: + metro-resolver@0.84.4: dependencies: - '@babel/runtime': 7.29.2 flow-enums-runtime: 0.0.6 - metro-runtime@0.84.3: + metro-runtime@0.84.4: dependencies: '@babel/runtime': 7.29.2 flow-enums-runtime: 0.0.6 - metro-source-map@0.84.2: + metro-source-map@0.84.4: dependencies: '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.84.2 - nullthrows: 1.1.1 - ob1: 0.84.2 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - - metro-source-map@0.84.3: - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - metro-symbolicate: 0.84.3 - nullthrows: 1.1.1 - ob1: 0.84.3 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - - metro-symbolicate@0.84.2: - dependencies: - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - metro-source-map: 0.84.2 + metro-symbolicate: 0.84.4 nullthrows: 1.1.1 + ob1: 0.84.4 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.84.3: + metro-symbolicate@0.84.4: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.84.3 + metro-source-map: 0.84.4 nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.84.2: - dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - flow-enums-runtime: 0.0.6 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - - metro-transform-plugins@0.84.3: + metro-transform-plugins@0.84.4: dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 @@ -24402,94 +24183,27 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.84.2: - dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - flow-enums-runtime: 0.0.6 - metro: 0.84.2 - metro-babel-transformer: 0.84.2 - metro-cache: 0.84.2 - metro-cache-key: 0.84.2 - metro-minify-terser: 0.84.2 - metro-source-map: 0.84.2 - metro-transform-plugins: 0.84.2 - nullthrows: 1.1.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - metro-transform-worker@0.84.3: - dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - flow-enums-runtime: 0.0.6 - metro: 0.84.3 - metro-babel-transformer: 0.84.3 - metro-cache: 0.84.3 - metro-cache-key: 0.84.3 - metro-minify-terser: 0.84.3 - metro-source-map: 0.84.3 - metro-transform-plugins: 0.84.3 - nullthrows: 1.1.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - metro@0.84.2: + metro-transform-worker@0.84.4: dependencies: - '@babel/code-frame': 7.29.0 '@babel/core': 7.29.0 '@babel/generator': 7.29.1 '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 - accepts: 2.0.0 - chalk: 4.1.2 - ci-info: 2.0.0 - connect: 3.7.0 - debug: 4.4.3 - error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 - graceful-fs: 4.2.11 - hermes-parser: 0.33.3 - image-size: 1.2.1 - invariant: 2.2.4 - jest-worker: 29.7.0 - jsc-safe-url: 0.2.4 - lodash.throttle: 4.1.1 - metro-babel-transformer: 0.84.2 - metro-cache: 0.84.2 - metro-cache-key: 0.84.2 - metro-config: 0.84.2 - metro-core: 0.84.2 - metro-file-map: 0.84.2 - metro-resolver: 0.84.2 - metro-runtime: 0.84.2 - metro-source-map: 0.84.2 - metro-symbolicate: 0.84.2 - metro-transform-plugins: 0.84.2 - metro-transform-worker: 0.84.2 - mime-types: 3.0.2 + metro: 0.84.4 + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-minify-terser: 0.84.4 + metro-source-map: 0.84.4 + metro-transform-plugins: 0.84.4 nullthrows: 1.1.1 - serialize-error: 2.1.0 - source-map: 0.5.7 - throat: 5.0.0 - ws: 7.5.10 - yargs: 17.7.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.84.3: + metro@0.84.4: dependencies: '@babel/code-frame': 7.29.0 '@babel/core': 7.29.0 @@ -24499,7 +24213,6 @@ snapshots: '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 accepts: 2.0.0 - chalk: 4.1.2 ci-info: 2.0.0 connect: 3.7.0 debug: 4.4.3 @@ -24512,18 +24225,18 @@ snapshots: jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.84.3 - metro-cache: 0.84.3 - metro-cache-key: 0.84.3 - metro-config: 0.84.3 - metro-core: 0.84.3 - metro-file-map: 0.84.3 - metro-resolver: 0.84.3 - metro-runtime: 0.84.3 - metro-source-map: 0.84.3 - metro-symbolicate: 0.84.3 - metro-transform-plugins: 0.84.3 - metro-transform-worker: 0.84.3 + metro-babel-transformer: 0.84.4 + metro-cache: 0.84.4 + metro-cache-key: 0.84.4 + metro-config: 0.84.4 + metro-core: 0.84.4 + metro-file-map: 0.84.4 + metro-resolver: 0.84.4 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 + metro-symbolicate: 0.84.4 + metro-transform-plugins: 0.84.4 + metro-transform-worker: 0.84.4 mime-types: 3.0.2 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -24916,11 +24629,7 @@ snapshots: nwsapi@2.2.23: {} - ob1@0.84.2: - dependencies: - flow-enums-runtime: 0.0.6 - - ob1@0.84.3: + ob1@0.84.4: dependencies: flow-enums-runtime: 0.0.6 @@ -25578,13 +25287,6 @@ snapshots: react: 19.2.3 react-native: 0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - react-native-keyboard-controller@1.21.0(react-native-reanimated@4.3.0(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.1(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): - dependencies: - react: 19.2.3 - react-native: 0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - react-native-is-edge-to-edge: 1.3.1(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) - react-native-reanimated: 4.3.0(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.1(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) - react-native-keyboard-controller@1.21.6(react-native-reanimated@4.3.0(patch_hash=1e34e4238541638db96b94d5a2e974e73f3b801788a3d8f5c3f4b237a0559138)(react-native-worklets@0.8.1(patch_hash=3f49a21b44ba558989a3366eeff9c92ee331e18b736dbe89c5962ecc6f2802f1)(@babel/core@7.29.0)(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3))(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): dependencies: react: 19.2.3 @@ -25703,13 +25405,6 @@ snapshots: transitivePeerDependencies: - encoding - react-native-webview@13.16.0(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): - dependencies: - escape-string-regexp: 4.0.0 - invariant: 2.2.4 - react: 19.2.3 - react-native: 0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3) - react-native-webview@13.16.1(react-native@0.85.2(@babel/core@7.29.0)(@react-native/jest-preset@0.85.2(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3): dependencies: escape-string-regexp: 4.0.0 @@ -25756,8 +25451,8 @@ snapshots: hermes-compiler: 250829098.0.10 invariant: 2.2.4 memoize-one: 5.2.1 - metro-runtime: 0.84.2 - metro-source-map: 0.84.2 + metro-runtime: 0.84.4 + metro-source-map: 0.84.4 nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 @@ -26881,26 +26576,6 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.18)(@types/node@25.5.0)(typescript@6.0.3)))(typescript@6.0.3): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.8 - jest: 29.7.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.18)(@types/node@25.5.0)(typescript@6.0.3)) - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.4 - type-fest: 4.41.0 - typescript: 6.0.3 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.29.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.29.0) - jest-util: 29.7.0 - ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.7.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.18)(@types/node@25.5.0)(typescript@6.0.3)))(typescript@6.0.3): dependencies: bs-logger: 0.2.6 From 034450871ed1fc4eb846fa2eeb5f7696def151e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nishan=20=28o=5E=E2=96=BD=5Eo=29?= Date: Mon, 4 May 2026 23:37:03 +0530 Subject: [PATCH 4/8] [ui] Universal `TextInput` (#45205) # Why Adds a universal `TextInput` to `@expo/ui` that mirrors RN's [TextInput](https://reactnative.dev/docs/textinput) API but routes to SwiftUI TextField on iOS, Compose TextField on Android, and RN's `TextInput` on web. # How Built on top of the existing `@expo/ui/swift-ui` and `@expo/ui/jetpack-compose` `TextField` / `SecureField` components. Most props pass through; a few needed new native plumbing (selection observable, `onGeometryChange` / `onSizeChanged` modifiers, worklet text/selection writes). ## API differences from RN's TextInput A few things deliberately diverge. ### `value` is an `ObservableState`, not a string We can assume that when you use a `value` prop, you want a controlled input. Existing RN's TextInput is not truly controlled input as it propagates events asynchronously which can lead to flickers. Also mentioned [here](https://reactnative.dev/docs/textinput#value). So currently only incentive to use Expo's universal TextInput is when you need controlled TextInputs plus any extra features offered by TextField on SwiftUI and Compose (via `modifiers` prop support). So we only support `ObservableState` for `value` prop instead of `string` ```ts const text = useNativeState('hello'); ``` ### `selection` is also an `ObservableState` ```ts const selection = useNativeState({ start: 0, end: 0 }); // imperative selection.value = { start: 0, end: 7 }; ``` ### `onChangeText` supports passing a worklet as well as regular function. Add the `'worklet'` directive and it runs synchronously on the UI thread. ```tsx { 'worklet'; const formatted = formatPhone(v); if (formatted !== v) maskedPhone.value = formatted; }} /> ``` ## Unsupported RN props | Prop | Reason / workaround | |---|---| | `allowFontScaling` | Planned. iOS `.dynamicTypeSize(.large)`, Android `LocalDensity(fontScale = 1f)`, web pass-through. | | `clearButtonMode` (iOS) | SwiftUI doesn't expose it. Try `.searchable` modifier or UIKit reach-in. | | `contextMenuHidden` | iOS needs UIKit reach-in. Android could ship via [`LocalTextToolbar`](https://developer.android.com/reference/kotlin/androidx/compose/ui/platform/LocalTextToolbar). | | `dataDetectorTypes` (iOS) | No SwiftUI API | | `disableFullscreenUI` (Android) | Compose's `KeyboardOptions` doesn't surface it. | | `disableKeyboardShortcuts` (iOS) | Hides iPad keyboard's system shortcut bar. UIKit-only. | | `enablesReturnKeyAutomatically` (iOS) | No SwiftUI API | | `importantForAutofill` (Android) | Already implicit via `autoComplete`. | | `inlineImageLeft` / `inlineImagePadding` (Android) | Use a `leadingIcon` slot from `@expo/ui/jetpack-compose`'s `TextField`. | | `inputAccessoryViewID` / `inputAccessoryViewButtonLabel` (iOS) | Future: `keyboardToolbar` slot via `.toolbar(placement: .keyboard)`. | | `keyboardAppearance` (iOS) | UIKit reach-in. | | `lineBreakStrategyIOS` | No SwiftUI TextField API | | `lineBreakModeIOS` | No SwiftUI TextField API | | `maxFontSizeMultiplier` | Planned. Same wiring as `allowFontScaling`, numeric cap. | | `onChange` | Use `onChangeText`. | | `onEndEditing` | Use `onBlur` or `onSubmitEditing`. | | `onKeyPress` | Compose has no per-keystroke event for soft keyboards; SwiftUI has nothing. Diff successive `onChangeText` values for backspace-on-empty. | | `onLayout` | Use `Host`'s `onLayout`. | | `onPressIn` / `onPressOut` | Tap events on `Host`. | | `onScroll` | TODO | | `passwordRules` (iOS) | No SwiftUI TextField API | | `rejectResponderTermination` (iOS) | No SwiftUI API | | `returnKeyLabel` (Android) | No API in Compose. Use `returnKeyType`. | | `scrollEnabled` | No clean SwiftUI/Compose API. TODO: Analyse further | | `showSoftInputOnFocus` | Planned (Android via Compose 1.7's `KeyboardOptions.showKeyboardOnFocus`). iOS needs UIKit reach-in. | | `smartInsertDelete` (iOS) | UIKit smart-whitespace handling. Default is correct. | | `spellCheck` (iOS) | `autoCorrect={false}` covers it cross-platform. | | `submitBehavior` | No SwiftUI/Compose clean API. TODO: Might need custom native handling. Plan next | | `textBreakStrategy` (Android) | No Compose API | # Test Plan Added universal TextInput in NCL. https://github.com/user-attachments/assets/ce147ada-4e59-448a-97a9-ba25643df159 # Checklist - [x] I added a `changelog.md` entry and rebuilt the package sources according to [this short guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting) - [x] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). - [x] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) --- .../screens/UI/TextFieldScreen.android.tsx | 37 +++ .../src/screens/UI/TextFieldScreen.ios.tsx | 32 +- .../screens/UIUniversal/TextInputScreen.tsx | 287 +++++++++++++++++ .../screens/UIUniversal/UIUniversalScreen.tsx | 8 + packages/expo-ui/CHANGELOG.md | 1 + .../main/java/expo/modules/ui/ExpoUIModule.kt | 8 +- .../java/expo/modules/ui/ModifierRegistry.kt | 25 ++ .../java/expo/modules/ui/SemanticsModifier.kt | 50 +++ .../java/expo/modules/ui/TextFieldView.kt | 149 ++++++++- packages/expo-ui/build/State/utils.d.ts | 2 +- packages/expo-ui/build/State/utils.d.ts.map | 2 +- .../jetpack-compose/TextField/index.d.ts | 57 +++- .../jetpack-compose/TextField/index.d.ts.map | 2 +- .../jetpack-compose/modifiers/index.d.ts | 14 + .../jetpack-compose/modifiers/index.d.ts.map | 2 +- .../build/swift-ui/SecureField/index.d.ts | 38 ++- .../build/swift-ui/SecureField/index.d.ts.map | 2 +- .../build/swift-ui/TextField/index.d.ts | 40 ++- .../build/swift-ui/TextField/index.d.ts.map | 2 +- .../build/swift-ui/modifiers/index.d.ts | 20 +- .../build/swift-ui/modifiers/index.d.ts.map | 2 +- .../build/universal/State.android.d.ts | 5 + .../build/universal/State.android.d.ts.map | 1 + packages/expo-ui/build/universal/State.d.ts | 8 + .../expo-ui/build/universal/State.d.ts.map | 1 + .../expo-ui/build/universal/State.ios.d.ts | 5 + .../build/universal/State.ios.d.ts.map | 1 + .../expo-ui/build/universal/Text/types.d.ts | 7 +- .../build/universal/Text/types.d.ts.map | 2 +- .../universal/TextInput/index.android.d.ts | 4 + .../TextInput/index.android.d.ts.map | 1 + .../build/universal/TextInput/index.d.ts | 4 + .../build/universal/TextInput/index.d.ts.map | 1 + .../build/universal/TextInput/index.ios.d.ts | 4 + .../universal/TextInput/index.ios.d.ts.map | 1 + .../build/universal/TextInput/types.d.ts | 258 ++++++++++++++++ .../build/universal/TextInput/types.d.ts.map | 1 + .../build/universal/TextInput/utils.d.ts | 16 + .../build/universal/TextInput/utils.d.ts.map | 1 + packages/expo-ui/build/universal/index.d.ts | 2 + .../expo-ui/build/universal/index.d.ts.map | 2 +- .../build/universal/transformStyle.ios.d.ts | 3 + .../universal/transformStyle.ios.d.ts.map | 2 +- packages/expo-ui/ios/ExpoUIModule.swift | 6 + .../Modifiers/OnGeometryChangeModifier.swift | 38 +++ .../ios/Modifiers/ViewModifierRegistry.swift | 24 ++ packages/expo-ui/ios/SecureFieldView.swift | 53 +++- packages/expo-ui/ios/TextFieldView.swift | 201 ++++++++---- packages/expo-ui/src/State/utils.ts | 6 +- .../src/jetpack-compose/TextField/index.tsx | 92 +++++- .../src/jetpack-compose/modifiers/index.ts | 14 + .../src/swift-ui/SecureField/index.tsx | 76 +++-- .../expo-ui/src/swift-ui/TextField/index.tsx | 57 +++- .../expo-ui/src/swift-ui/modifiers/index.ts | 21 ++ .../expo-ui/src/universal/State.android.ts | 3 + packages/expo-ui/src/universal/State.ios.ts | 3 + packages/expo-ui/src/universal/State.ts | 27 ++ packages/expo-ui/src/universal/Text/types.ts | 7 +- .../src/universal/TextInput/index.android.tsx | 228 ++++++++++++++ .../src/universal/TextInput/index.ios.tsx | 226 ++++++++++++++ .../expo-ui/src/universal/TextInput/index.tsx | 126 ++++++++ .../expo-ui/src/universal/TextInput/types.ts | 288 ++++++++++++++++++ .../expo-ui/src/universal/TextInput/utils.ts | 115 +++++++ packages/expo-ui/src/universal/index.ts | 2 + .../src/universal/transformStyle.ios.ts | 51 ++++ 65 files changed, 2612 insertions(+), 162 deletions(-) create mode 100644 apps/native-component-list/src/screens/UIUniversal/TextInputScreen.tsx create mode 100644 packages/expo-ui/android/src/main/java/expo/modules/ui/SemanticsModifier.kt create mode 100644 packages/expo-ui/build/universal/State.android.d.ts create mode 100644 packages/expo-ui/build/universal/State.android.d.ts.map create mode 100644 packages/expo-ui/build/universal/State.d.ts create mode 100644 packages/expo-ui/build/universal/State.d.ts.map create mode 100644 packages/expo-ui/build/universal/State.ios.d.ts create mode 100644 packages/expo-ui/build/universal/State.ios.d.ts.map create mode 100644 packages/expo-ui/build/universal/TextInput/index.android.d.ts create mode 100644 packages/expo-ui/build/universal/TextInput/index.android.d.ts.map create mode 100644 packages/expo-ui/build/universal/TextInput/index.d.ts create mode 100644 packages/expo-ui/build/universal/TextInput/index.d.ts.map create mode 100644 packages/expo-ui/build/universal/TextInput/index.ios.d.ts create mode 100644 packages/expo-ui/build/universal/TextInput/index.ios.d.ts.map create mode 100644 packages/expo-ui/build/universal/TextInput/types.d.ts create mode 100644 packages/expo-ui/build/universal/TextInput/types.d.ts.map create mode 100644 packages/expo-ui/build/universal/TextInput/utils.d.ts create mode 100644 packages/expo-ui/build/universal/TextInput/utils.d.ts.map create mode 100644 packages/expo-ui/ios/Modifiers/OnGeometryChangeModifier.swift create mode 100644 packages/expo-ui/src/universal/State.android.ts create mode 100644 packages/expo-ui/src/universal/State.ios.ts create mode 100644 packages/expo-ui/src/universal/State.ts create mode 100644 packages/expo-ui/src/universal/TextInput/index.android.tsx create mode 100644 packages/expo-ui/src/universal/TextInput/index.ios.tsx create mode 100644 packages/expo-ui/src/universal/TextInput/index.tsx create mode 100644 packages/expo-ui/src/universal/TextInput/types.ts create mode 100644 packages/expo-ui/src/universal/TextInput/utils.ts diff --git a/apps/native-component-list/src/screens/UI/TextFieldScreen.android.tsx b/apps/native-component-list/src/screens/UI/TextFieldScreen.android.tsx index 6e37d46e3ea0ee..1233e9858d94f9 100644 --- a/apps/native-component-list/src/screens/UI/TextFieldScreen.android.tsx +++ b/apps/native-component-list/src/screens/UI/TextFieldScreen.android.tsx @@ -33,6 +33,11 @@ export default function TextFieldScreen() { selection: { start: 0, end: 0 }, }); + const imperativeText = useNativeState('Select me!'); + const imperativeSelection = useNativeState<{ start: number; end: number }>({ start: 0, end: 0 }); + const imperativeRef = React.useRef(null); + const [imperativeSelDisplay, setImperativeSelDisplay] = React.useState({ start: 0, end: 0 }); + const [outlined, setOutlined] = React.useState(false); const [enabled, setEnabled] = React.useState(true); const [readOnly, setReadOnly] = React.useState(false); @@ -179,6 +184,38 @@ export default function TextFieldScreen() { + {/* Imperative Selection */} + + + Imperative Selection + + + Type something... + + + + {`Selection: ${imperativeSelDisplay.start}–${imperativeSelDisplay.end}`} + + + + + + + + {/* Props */} diff --git a/apps/native-component-list/src/screens/UI/TextFieldScreen.ios.tsx b/apps/native-component-list/src/screens/UI/TextFieldScreen.ios.tsx index 685f5756a0f00b..bf5e313e4252cd 100644 --- a/apps/native-component-list/src/screens/UI/TextFieldScreen.ios.tsx +++ b/apps/native-component-list/src/screens/UI/TextFieldScreen.ios.tsx @@ -3,6 +3,7 @@ import { Host, TextField, TextFieldRef, + TextFieldSelection, SecureField, Form, Section, @@ -29,16 +30,23 @@ import { runOnJS } from 'react-native-worklets'; export default function TextFieldScreen() { const textRef = React.useRef(null); - const phoneRef = React.useRef(null); - const [selection, setSelection] = React.useState<{ start: number; end: number } | null>(null); - - const setPhoneCursor = React.useCallback((position: number) => { - phoneRef.current?.setSelection(position, position); - }, []); const username = useNativeState('johndoe'); const imperativeText = useNativeState('Select me!'); + const imperativeSelection = useNativeState({ start: 0, end: 0 }); + const [imperativeSelDisplay, setImperativeSelDisplay] = React.useState({ + start: 0, + end: 0, + }); const maskedPhone = useNativeState(''); + const phoneSelection = useNativeState({ start: 0, end: 0 }); + + const setPhoneCursor = React.useCallback( + (position: number) => { + phoneSelection.value = { start: position, end: position }; + }, + [phoneSelection] + ); const submitLabelOptions = [ 'continue', @@ -101,8 +109,8 @@ export default function TextFieldScreen() { {/* Worklet-based phone masking β€” updates synchronously on the UI thread */}
{ @@ -175,12 +183,13 @@ export default function TextFieldScreen() { - Selection: {selection ? `${selection.start}–${selection.end}` : 'none'} + {`Selection: ${imperativeSelDisplay.start}–${imperativeSelDisplay.end}`}