This commit is contained in:
EthanShoeDev
2025-09-12 11:54:59 -04:00
parent 4ffcedf677
commit f2f5224041
3 changed files with 266 additions and 202 deletions

View File

@@ -34,7 +34,7 @@
"@react-navigation/native": "^7.1.8",
"@tanstack/react-form": "^1.19.5",
"@tanstack/react-query": "^5.87.1",
"expo": "54.0.2",
"expo": "54.0.3",
"expo-build-properties": "~1.0.8",
"expo-clipboard": "~8.0.7",
"expo-constants": "~18.0.8",

View File

@@ -1,72 +1,93 @@
# Import Private Key — Detailed Plan
This plan covers implementing private key import (paste or file), improving key management UX, adding metadata display, and enabling copying the corresponding public key. It is grounded in the current code found in:
This plan covers implementing private key import (paste or file), improving key
management UX, adding metadata display, and enabling copying the corresponding
public key. It is grounded in the current code found in:
- `apps/mobile/src/app/index.tsx` (connection form + `KeyIdPicker`)
- `apps/mobile/src/components/key-manager-modal.tsx` (list, generate, rename, delete, set default)
- `apps/mobile/src/lib/secrets-manager.ts` (chunked secure store, key metadata, queries)
- `apps/mobile/src/components/key-manager-modal.tsx` (list, generate, rename,
delete, set default)
- `apps/mobile/src/lib/secrets-manager.ts` (chunked secure store, key metadata,
queries)
Relevant Expo docs (for implementation reference):
- Document Picker: https://docs.expo.dev/versions/latest/sdk/document-picker/
- File System: https://docs.expo.dev/versions/latest/sdk/filesystem/
- Clipboard (for copy public key): https://docs.expo.dev/versions/latest/sdk/clipboard/
- Clipboard (for copy public key):
https://docs.expo.dev/versions/latest/sdk/clipboard/
## Current State (from repo)
- Keys are stored via a chunked manifest around `expo-secure-store` with metadata schema: `{ priority: number; createdAtMs: int; label?: string; isDefault?: boolean }`.
- `KeyManagerModal` supports: generate key (RSA 4096), rename, delete, set default, and selection through `onSelect` (already wired and used by the forms `KeyIdPicker`).
- `generateKeyPair` uses `@dylankenneally/react-native-ssh-sftp`. We currently save only `pair.privateKey`, discard public key.
- Selection UI shows label or id; theres no import flow yet; no createdAt display; no copy public key.
- Keys are stored via a chunked manifest around `expo-secure-store` with
metadata schema:
`{ priority: number; createdAtMs: int; label?: string; isDefault?: boolean }`.
- `KeyManagerModal` supports: generate key (RSA 4096), rename, delete, set
default, and selection through `onSelect` (already wired and used by the
forms `KeyIdPicker`).
- `generateKeyPair` uses `@dylankenneally/react-native-ssh-sftp`. We currently
save only `pair.privateKey`, discard public key.
- Selection UI shows label or id; theres no import flow yet; no createdAt
display; no copy public key.
## Goals
- Import private keys via two paths:
- Paste PEM/OpenSSH text into a multiline field.
- Pick a key file via a system file picker and read its contents.
- Let users name the key before creating/storing it (applies to both Generate and Import flows).
- Let users name the key before creating/storing it (applies to both Generate
and Import flows).
- Allow users to copy the corresponding public key for any stored private key.
- Show basic metadata (createdAt) in the key list for context.
- Keep storage compatible and robust (no breaking changes to existing manifests).
- Keep storage compatible and robust (no breaking changes to existing
manifests).
## UX Plan
1) Entry points in Key Manager
- Add a secondary action “Import Key” next to the existing “Generate” button.
- When no keys exist, show both “Generate New Key” and “Import Key” prominently in the empty state.
1. Entry points in Key Manager
- Add a secondary action “Import Key” next to the existing “Generate” button.
- When no keys exist, show both “Generate New Key” and “Import Key” prominently
in the empty state.
2. Import flow (single modal sheet with tabs or steps)
2) Import flow (single modal sheet with tabs or steps)
- Step A: Choose method: “Paste PEM” or “Pick File”.
- Paste PEM: multiline `TextInput` for the private key content; live validation feedback.
- Pick File: button to open file picker (DocumentPicker). After selection, read file with FileSystem and populate a read-only preview (collapsible) + validation feedback.
- Paste PEM: multiline `TextInput` for the private key content; live
validation feedback.
- Pick File: button to open file picker (DocumentPicker). After selection,
read file with FileSystem and populate a read-only preview (collapsible) +
validation feedback.
- Step B: Name & options
- “Label” text input (required or at least prompted before confirm).
- Optional: “Set as default key” toggle.
- Optional: public key association (see Public Key section below).
- Step C: Confirm & Save
- On success, call `secretsManager.keys.utils.upsertPrivateKey` with computed `keyId`, metadata, and value.
- On success, call `secretsManager.keys.utils.upsertPrivateKey` with computed
`keyId`, metadata, and value.
- Close the import sheet and refresh list.
3) Generate flow improvements
3. Generate flow improvements
- Instead of immediate generate, open a small pre-flight form:
- Label (text input; default prefilled like “My RSA Key”).
- Key type (dropdown/segmented, default RSA).
- Key size for RSA (e.g., 2048/4096; default 4096).
- Optional comment (passed to generator if supported).
- On submit, call `generateKeyPair`, then `upsertPrivateKey` with label and useful metadata (see Data Model Changes).
- On submit, call `generateKeyPair`, then `upsertPrivateKey` with label and
useful metadata (see Data Model Changes).
4) Key list rows (metadata + actions)
- Under the title, show small muted details: “ID: … • Created: …” (formatted via date-fns).
4. Key list rows (metadata + actions)
- Under the title, show small muted details: “ID: … • Created: …” (formatted via
date-fns).
- Add an overflow/action area with:
- Copy Public Key (uses `expo-clipboard`).
- Rename (existing).
- Set Default (existing).
- Delete (existing).
- If public key is not known, show “Add Public Key” which opens a small paste dialog to attach one (stored in metadata).
- If public key is not known, show “Add Public Key” which opens a small paste
dialog to attach one (stored in metadata).
## File Picker + File Reading (Expo)
@@ -74,20 +95,23 @@ Document selection:
- Use `expo-document-picker`:
- `const res = await DocumentPicker.getDocumentAsync({ type: ['text/*', 'application/x-pem-file', 'application/octet-stream'], copyToCacheDirectory: true });`
- Handle cancelation: `res.canceled` or check `res.assets?.length` depending on SDK version.
- Handle cancelation: `res.canceled` or check `res.assets?.length` depending
on SDK version.
- Use `res.assets[0].uri` and `res.assets[0].name`.
File reading:
- Use `expo-file-system`:
- `const contents = await FileSystem.readAsStringAsync(uri, { encoding: FileSystem.EncodingType.UTF8 });`
- If using DocumentPicker with `copyToCacheDirectory: true`, the returned `uri` is readable by FileSystem on both iOS and Android.
- If using DocumentPicker with `copyToCacheDirectory: true`, the returned
`uri` is readable by FileSystem on both iOS and Android.
- Normalize line endings (`\r\n``\n`) and trim extraneous whitespace.
Validation basics:
- Accept common formats:
- OpenSSH: `-----BEGIN OPENSSH PRIVATE KEY----- ... -----END OPENSSH PRIVATE KEY-----`
- OpenSSH:
`-----BEGIN OPENSSH PRIVATE KEY----- ... -----END OPENSSH PRIVATE KEY-----`
- RSA: `-----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----`
- ECDSA/ED25519/ED448/DSA similarly.
- Quick checks:
@@ -96,15 +120,19 @@ Validation basics:
- Optional: basic type inference from header for metadata.
- Store as-is on success; more advanced parsing is a future enhancement.
## Public Key Handling
- Generated keys: `generateKeyPair` likely returns a `publicKey` alongside `privateKey`. Store that public key in metadata so users can copy it later.
- Imported keys: deriving public keys on-device for all types may require an extra JS crypto library. To keep scope small and reliable:
- MVP: Allow the user to optionally paste a corresponding public key during import (or later via “Add Public Key”).
- Stretch: Add an optional dependency to derive a public key from the private key (e.g., a pure JS RSA/ed25519 parser) and auto-populate the metadata when feasible.
- UI: “Copy Public Key” button copies `metadata.publicKey` to clipboard; if absent, offer “Add Public Key”.
- Generated keys: `generateKeyPair` likely returns a `publicKey` alongside
`privateKey`. Store that public key in metadata so users can copy it later.
- Imported keys: deriving public keys on-device for all types may require an
extra JS crypto library. To keep scope small and reliable:
- MVP: Allow the user to optionally paste a corresponding public key during
import (or later via “Add Public Key”).
- Stretch: Add an optional dependency to derive a public key from the private
key (e.g., a pure JS RSA/ed25519 parser) and auto-populate the metadata when
feasible.
- UI: “Copy Public Key” button copies `metadata.publicKey` to clipboard; if
absent, offer “Add Public Key”.
## Data Model Changes (backward-compatible)
@@ -112,54 +140,73 @@ Validation basics:
- `publicKey?: string` — OpenSSH public key (single line) or PEM.
- `keyType?: SshPrivateKeyType` — derived from header or generator input.
- `keySize?: number` — for RSA/ECDSA when known.
- `fingerprint?: string` — short identifier derived from the private key (see below).
- `fingerprint?: string` — short identifier derived from the private key (see
below).
- Keep existing: `priority`, `createdAtMs`, `label?`, `isDefault?`.
- Compute `keyId` at import/generate time:
- Prefer deterministic id using a short fingerprint: `key_<8-char-fp>`.
- Use `expo-crypto.digestStringAsync('SHA-256', privateKey)` → base16; take first 810 chars for id and show full fingerprint in row subtitle if needed.
- Use `expo-crypto.digestStringAsync('SHA-256', privateKey)` → base16; take
first 810 chars for id and show full fingerprint in row subtitle if needed.
- Fallback to current `key_<timestamp>` if hashing ever fails.
- Size considerations:
- Metadata is bounded by the ~1KB per-manifest-chunk budget; an OpenSSH public key line is typically < 1KB, so storing `publicKey` is safe.
- Metadata is bounded by the ~1KB per-manifest-chunk budget; an OpenSSH public
key line is typically < 1KB, so storing `publicKey` is safe.
## Implementation Steps
1) Secrets manager updates
- Update `keyMetadataSchema` (optional fields listed above) in `apps/mobile/src/lib/secrets-manager.ts`.
- When generating a key, store `metadata.publicKey`, `metadata.keyType`, `metadata.keySize`, and computed `fingerprint`.
- Add a tiny helper: `computeKeyFingerprint(privateKey: string): Promise<string>` using `expo-crypto`.
1. Secrets manager updates
2) Key Manager modal — UI and flows
- Add “Import Key” entry. Implement a small state machine: `mode = 'list' | 'import' | 'generate'`.
- Update `keyMetadataSchema` (optional fields listed above) in
`apps/mobile/src/lib/secrets-manager.ts`.
- When generating a key, store `metadata.publicKey`, `metadata.keyType`,
`metadata.keySize`, and computed `fingerprint`.
- Add a tiny helper:
`computeKeyFingerprint(privateKey: string): Promise<string>` using
`expo-crypto`.
2. Key Manager modal — UI and flows
- Add “Import Key” entry. Implement a small state machine:
`mode = 'list' | 'import' | 'generate'`.
- Import mode:
- Tabs or toggle between “Paste” and “Pick File”.
- Paste: multiline `TextInput`, Validate, Label input, Default toggle, Save.
- Pick File: Launch DocumentPicker, read via FileSystem, fill preview, Validate, Label input, Default toggle, Save.
- Generate mode: show label/type/size/comment inputs; on submit generate and upsert.
- Pick File: Launch DocumentPicker, read via FileSystem, fill preview,
Validate, Label input, Default toggle, Save.
- Generate mode: show label/type/size/comment inputs; on submit generate and
upsert.
- List mode rows:
- Show label, id, createdAt (formatted), and default badge.
- Row actions: Select (radio), Copy Public Key, Rename, Set Default, Delete.
- If no `metadata.publicKey`, action shows “Add Public Key” and opens a small paste dialog; on save, upsert metadata only.
- If no `metadata.publicKey`, action shows “Add Public Key” and opens a small
paste dialog; on save, upsert metadata only.
3. Copy public key
3) Copy public key
- Use `expo-clipboard`:
- `await Clipboard.setStringAsync(metadata.publicKey)`
- Show a small toast/snackbar or inline confirmation.
4) Date formatting
- Add `date-fns` and format with either `format` (e.g., `MMM d, yyyy`) or `formatDistanceToNow` for a relative display. Placement: muted line under the label in each row.
4. Date formatting
- Add `date-fns` and format with either `format` (e.g., `MMM d, yyyy`) or
`formatDistanceToNow` for a relative display. Placement: muted line under the
label in each row.
5. Validation utilities
5) Validation utilities
- Add a small util module: `parseSshPrivateKey.ts` with functions:
- `detectPrivateKeyType(pem: string): SshPrivateKeyType | 'openssh' | undefined`
- `isLikelyValidPrivateKey(pem: string): boolean`
- These are string/regex based for MVP; we can replace with stronger parsing later.
- These are string/regex based for MVP; we can replace with stronger parsing
later.
6) Error handling
- Show inline errors in the import modal (invalid format, unreadable file, empty input).
6. Error handling
- Show inline errors in the import modal (invalid format, unreadable file, empty
input).
- Disable Save until validation passes.
## Dependencies to add
- `expo-document-picker` — file selection.
@@ -168,16 +215,18 @@ Validation basics:
- `date-fns` — format timestamps.
Notes:
- Ensure proper installation via `npx expo install expo-document-picker expo-file-system expo-clipboard date-fns`.
- For DocumentPicker, prefer `copyToCacheDirectory: true` to guarantee a readable `uri`.
- Ensure proper installation via
`npx expo install expo-document-picker expo-file-system expo-clipboard date-fns`.
- For DocumentPicker, prefer `copyToCacheDirectory: true` to guarantee a
readable `uri`.
## Security & Privacy
- Never log key material or show it in error messages.
- Keep logs behind a debug flag; redact key strings in any analytics.
- Continue storing private keys in `SecureStore` (already handled), avoid moving them to less secure storage.
- Continue storing private keys in `SecureStore` (already handled), avoid moving
them to less secure storage.
## Testing Plan
@@ -189,9 +238,11 @@ Notes:
- Copy public key present vs. absent → “Add Public Key” flow wiring.
- CreatedAt formatting appears correctly and is stable across renames.
## Implementation Notes (cross-cutting)
- Keep all key writes going through `upsertPrivateKey` so React Query invalidation stays consistent.
- Preserve `createdAtMs` on upserts (already implemented), add `fingerprint` only once when first inserted.
- If adding new metadata fields, mark them optional in zod to avoid breaking existing entries.
- Keep all key writes going through `upsertPrivateKey` so React Query
invalidation stays consistent.
- Preserve `createdAtMs` on upserts (already implemented), add `fingerprint`
only once when first inserted.
- If adding new metadata fields, mark them optional in zod to avoid breaking
existing entries.

285
pnpm-lock.yaml generated
View File

@@ -40,7 +40,7 @@ importers:
version: 1.5.20(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
'@expo/vector-icons':
specifier: ^15.0.2
version: 15.0.2(expo-font@14.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
version: 15.0.2(expo-font@14.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
'@fressh/assets':
specifier: workspace:*
version: link:../../packages/assets
@@ -66,62 +66,62 @@ importers:
specifier: ^5.87.1
version: 5.87.1(react@19.1.0)
expo:
specifier: 54.0.2
version: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
specifier: 54.0.3
version: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-build-properties:
specifier: ~1.0.8
version: 1.0.8(expo@54.0.2)
version: 1.0.8(expo@54.0.3)
expo-clipboard:
specifier: ~8.0.7
version: 8.0.7(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
version: 8.0.7(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-constants:
specifier: ~18.0.8
version: 18.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
version: 18.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-crypto:
specifier: ~15.0.7
version: 15.0.7(expo@54.0.2)
version: 15.0.7(expo@54.0.3)
expo-dev-client:
specifier: ~6.0.12
version: 6.0.12(expo@54.0.2)
version: 6.0.12(expo@54.0.3)
expo-document-picker:
specifier: ~14.0.7
version: 14.0.7(expo@54.0.2)
version: 14.0.7(expo@54.0.3)
expo-file-system:
specifier: ~19.0.12
version: 19.0.12(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
version: 19.0.12(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-font:
specifier: ~14.0.8
version: 14.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
version: 14.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-haptics:
specifier: ~15.0.7
version: 15.0.7(expo@54.0.2)
version: 15.0.7(expo@54.0.3)
expo-image:
specifier: ~3.0.8
version: 3.0.8(expo@54.0.2)(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
version: 3.0.8(expo@54.0.3)(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-linking:
specifier: ~8.0.8
version: 8.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
version: 8.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-router:
specifier: 6.0.1
version: 6.0.1(@types/react@19.1.12)(expo-constants@18.0.8)(expo-linking@8.0.8)(expo@54.0.2)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.0(@babel/core@7.28.3)(react-native-worklets@0.5.1(@babel/core@7.28.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.1(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
version: 6.0.1(@types/react@19.1.12)(expo-constants@18.0.8)(expo-linking@8.0.8)(expo@54.0.3)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.0(@babel/core@7.28.3)(react-native-worklets@0.5.1(@babel/core@7.28.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.1(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-secure-store:
specifier: ~15.0.7
version: 15.0.7(expo@54.0.2)
version: 15.0.7(expo@54.0.3)
expo-splash-screen:
specifier: ~31.0.9
version: 31.0.9(expo@54.0.2)
version: 31.0.9(expo@54.0.3)
expo-status-bar:
specifier: ~3.0.8
version: 3.0.8(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-symbols:
specifier: ~1.0.7
version: 1.0.7(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
version: 1.0.7(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-system-ui:
specifier: ~6.0.7
version: 6.0.7(expo@54.0.2)(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
version: 6.0.7(expo@54.0.3)(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-web-browser:
specifier: ~15.0.7
version: 15.0.7(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
version: 15.0.7(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
react:
specifier: 19.1.0
version: 19.1.0
@@ -1039,6 +1039,9 @@ packages:
'@expo/config@12.0.8':
resolution: {integrity: sha512-yFadXa5Cmja57EVOSyEYV1hF7kCaSbPnd1twx0MfvTr1Yj2abIbrEu2MUZqcvElNQOtgADnLRP0YJiuEdgoO5A==}
'@expo/config@12.0.9':
resolution: {integrity: sha512-HiDVVaXYKY57+L1MxSF3TaYjX6zZlGBnuWnOKZG+7mtsLD+aNTtW4bZM0pZqZfoRumyOU0SfTCwT10BWtUUiJQ==}
'@expo/devcert@1.2.0':
resolution: {integrity: sha512-Uilcv3xGELD5t/b0eM4cxBFEKQRIivB3v7i+VhWLV/gL98aw810unLKKJbGAxAIhY6Ipyz8ChWibFsKFXYwstA==}
@@ -1069,8 +1072,8 @@ packages:
'@expo/json-file@10.0.7':
resolution: {integrity: sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw==}
'@expo/metro-config@54.0.2':
resolution: {integrity: sha512-RYnqFlqzTwdSOd/2OcLT/8td64ybfV5Q01YKZRUhUaszuOshS3hXVHdOPBpWDYQk6h2rWew8ds9FGiJaPyRVKw==}
'@expo/metro-config@54.0.3':
resolution: {integrity: sha512-TQ5MKSGFB6zJxi+Yr8VYXQFHzRXgvSJzNsHX1otTqnxjXbptwYiXhljAqGSjr3pByq4+sHX/GifMk6fGgAANmA==}
peerDependencies:
expo: '*'
peerDependenciesMeta:
@@ -2698,9 +2701,6 @@ packages:
babel-plugin-react-native-web@0.21.1:
resolution: {integrity: sha512-7XywfJ5QIRMwjOL+pwJt2w47Jmi5fFLvK7/So4fV4jIN6PcRbylCp9/l3cJY4VJbSz3lnWTeHDTD1LKIc1C09Q==}
babel-plugin-syntax-hermes-parser@0.25.1:
resolution: {integrity: sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==}
babel-plugin-syntax-hermes-parser@0.29.1:
resolution: {integrity: sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==}
@@ -2712,8 +2712,8 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0 || ^8.0.0-0
babel-preset-expo@54.0.0:
resolution: {integrity: sha512-a0Ej4ik6xzvtrA4Ivblov3XVvfntIoqnXOy2jG2k/3hzWqzrJxKyY2gUW9ZCMAicGevj2ju28q+TsK29uTe0eQ==}
babel-preset-expo@54.0.1:
resolution: {integrity: sha512-ziLpj+I/IxQdblHCpuzcyukTpzunq6h/QFsbWhk5DTd4suqB+Vl0Neacd+e38YeKXBabmxCOv8VJN3qk39Md4w==}
peerDependencies:
'@babel/runtime': ^7.20.0
expo: '*'
@@ -3646,6 +3646,12 @@ packages:
expo: '*'
react-native: '*'
expo-file-system@19.0.13:
resolution: {integrity: sha512-ACDxp9/HA30XxqLEX39dTNvjf/9R64woMoeySu02xoclGl98VsHTQhKk0GF4BxjD0KwA9jamS/scTaC9P0BWLA==}
peerDependencies:
expo: '*'
react-native: '*'
expo-font@14.0.8:
resolution: {integrity: sha512-bTUHaJWRZ7ywP8dg3f+wfOwv6RwMV3mWT2CDUIhsK70GjNGlCtiWOCoHsA5Od/esPaVxqc37cCBvQGQRFStRlA==}
peerDependencies:
@@ -3775,8 +3781,8 @@ packages:
expo: '*'
react-native: '*'
expo@54.0.2:
resolution: {integrity: sha512-0YcsvMuiZlVFVZRdD4PlhwsYrTmcN1qm5b1IRSLIeLZjH6ZnQwBb3KBSnK8WRC9V6EUPSbuLGpNT5AEewrtakQ==}
expo@54.0.3:
resolution: {integrity: sha512-hh9PgItWlG3IjjkzkavxVGqsZ8fdWsDw2CLGyOTDx2SDsHbFpYZwL0HVrmMSv8mCI2qXkwutt5fyPtAPHd/VhQ==}
hasBin: true
peerDependencies:
'@expo/dom-webview': '*'
@@ -4115,15 +4121,9 @@ packages:
hastscript@9.0.1:
resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
hermes-estree@0.25.1:
resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
hermes-estree@0.29.1:
resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==}
hermes-parser@0.25.1:
resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
hermes-parser@0.29.1:
resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==}
@@ -7818,22 +7818,22 @@ snapshots:
'@eslint/core': 0.15.2
levn: 0.4.1
'@expo/cli@54.0.2(expo-router@6.0.1)(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))':
'@expo/cli@54.0.2(expo-router@6.0.1)(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))':
dependencies:
'@0no-co/graphql.web': 1.2.0
'@expo/code-signing-certificates': 0.0.5
'@expo/config': 12.0.8
'@expo/config': 12.0.9
'@expo/config-plugins': 54.0.1
'@expo/devcert': 1.2.0
'@expo/env': 2.0.7
'@expo/image-utils': 0.8.7
'@expo/json-file': 10.0.7
'@expo/metro': 0.1.1
'@expo/metro-config': 54.0.2(expo@54.0.2)
'@expo/metro-config': 54.0.3(expo@54.0.3)
'@expo/osascript': 2.3.7
'@expo/package-manager': 1.9.7
'@expo/plist': 0.4.7
'@expo/prebuild-config': 54.0.1(expo@54.0.2)
'@expo/prebuild-config': 54.0.1(expo@54.0.3)
'@expo/schema-utils': 0.1.7
'@expo/server': 0.7.4
'@expo/spawn-async': 1.7.2
@@ -7853,7 +7853,7 @@ snapshots:
connect: 3.7.0
debug: 4.4.1
env-editor: 0.4.2
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
freeport-async: 2.0.0
getenv: 2.0.0
glob: 10.4.5
@@ -7885,7 +7885,7 @@ snapshots:
wrap-ansi: 7.0.0
ws: 8.18.3
optionalDependencies:
expo-router: 6.0.1(@types/react@19.1.12)(expo-constants@18.0.8)(expo-linking@8.0.8)(expo@54.0.2)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.0(@babel/core@7.28.3)(react-native-worklets@0.5.1(@babel/core@7.28.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.1(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-router: 6.0.1(@types/react@19.1.12)(expo-constants@18.0.8)(expo-linking@8.0.8)(expo@54.0.3)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.0(@babel/core@7.28.3)(react-native-worklets@0.5.1(@babel/core@7.28.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.1(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
transitivePeerDependencies:
- bufferutil
@@ -7958,6 +7958,24 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@expo/config@12.0.9':
dependencies:
'@babel/code-frame': 7.10.4
'@expo/config-plugins': 54.0.1
'@expo/config-types': 54.0.8
'@expo/json-file': 10.0.7
deepmerge: 4.3.1
getenv: 2.0.0
glob: 10.4.5
require-from-string: 2.0.2
resolve-from: 5.0.0
resolve-workspace-root: 2.0.0
semver: 7.7.2
slugify: 1.6.6
sucrase: 3.35.0
transitivePeerDependencies:
- supports-color
'@expo/devcert@1.2.0':
dependencies:
'@expo/sudo-prompt': 9.3.2
@@ -8022,12 +8040,12 @@ snapshots:
'@babel/code-frame': 7.10.4
json5: 2.2.3
'@expo/metro-config@54.0.2(expo@54.0.2)':
'@expo/metro-config@54.0.3(expo@54.0.3)':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/core': 7.28.3
'@babel/generator': 7.28.3
'@expo/config': 12.0.8
'@expo/config': 12.0.9
'@expo/env': 2.0.7
'@expo/json-file': 10.0.7
'@expo/metro': 0.1.1
@@ -8046,16 +8064,16 @@ snapshots:
postcss: 8.4.49
resolve-from: 5.0.0
optionalDependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
'@expo/metro-runtime@6.1.1(expo@54.0.2)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)':
'@expo/metro-runtime@6.1.1(expo@54.0.3)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)':
dependencies:
anser: 1.4.10
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
pretty-format: 29.7.0
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
@@ -8109,7 +8127,7 @@ snapshots:
base64-js: 1.5.1
xmlbuilder: 15.1.1
'@expo/prebuild-config@54.0.1(expo@54.0.2)':
'@expo/prebuild-config@54.0.1(expo@54.0.3)':
dependencies:
'@expo/config': 12.0.8
'@expo/config-plugins': 54.0.1
@@ -8118,7 +8136,7 @@ snapshots:
'@expo/json-file': 10.0.7
'@react-native/normalize-colors': 0.81.4
debug: 4.4.1
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
resolve-from: 5.0.0
semver: 7.7.2
xml2js: 0.6.0
@@ -8142,9 +8160,9 @@ snapshots:
'@expo/sudo-prompt@9.3.2': {}
'@expo/vector-icons@15.0.2(expo-font@14.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)':
'@expo/vector-icons@15.0.2(expo-font@14.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)':
dependencies:
expo-font: 14.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-font: 14.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
@@ -9838,10 +9856,6 @@ snapshots:
babel-plugin-react-native-web@0.21.1: {}
babel-plugin-syntax-hermes-parser@0.25.1:
dependencies:
hermes-parser: 0.25.1
babel-plugin-syntax-hermes-parser@0.29.1:
dependencies:
hermes-parser: 0.29.1
@@ -9871,7 +9885,7 @@ snapshots:
'@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3)
'@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.3)
babel-preset-expo@54.0.0(@babel/core@7.28.3)(@babel/runtime@7.28.3)(expo@54.0.2)(react-refresh@0.14.2):
babel-preset-expo@54.0.1(@babel/core@7.28.3)(@babel/runtime@7.28.3)(expo@54.0.3)(react-refresh@0.14.2):
dependencies:
'@babel/helper-module-imports': 7.27.1
'@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3)
@@ -9891,14 +9905,14 @@ snapshots:
'@react-native/babel-preset': 0.81.4(@babel/core@7.28.3)
babel-plugin-react-compiler: 19.1.0-rc.3
babel-plugin-react-native-web: 0.21.1
babel-plugin-syntax-hermes-parser: 0.25.1
babel-plugin-syntax-hermes-parser: 0.29.1
babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.3)
debug: 4.4.1
react-refresh: 0.14.2
resolve-from: 5.0.0
optionalDependencies:
'@babel/runtime': 7.28.3
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- '@babel/core'
- supports-color
@@ -10946,93 +10960,98 @@ snapshots:
signal-exit: 3.0.7
strip-final-newline: 2.0.0
expo-asset@12.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
expo-asset@12.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
dependencies:
'@expo/image-utils': 0.8.7
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
transitivePeerDependencies:
- supports-color
expo-build-properties@1.0.8(expo@54.0.2):
expo-build-properties@1.0.8(expo@54.0.3):
dependencies:
ajv: 8.17.1
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
semver: 7.7.2
expo-clipboard@8.0.7(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
expo-clipboard@8.0.7(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
expo-constants@18.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
expo-constants@18.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
dependencies:
'@expo/config': 12.0.8
'@expo/env': 2.0.7
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
transitivePeerDependencies:
- supports-color
expo-crypto@15.0.7(expo@54.0.2):
expo-crypto@15.0.7(expo@54.0.3):
dependencies:
base64-js: 1.5.1
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-dev-client@6.0.12(expo@54.0.2):
expo-dev-client@6.0.12(expo@54.0.3):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-dev-launcher: 6.0.11(expo@54.0.2)
expo-dev-menu: 7.0.11(expo@54.0.2)
expo-dev-menu-interface: 2.0.0(expo@54.0.2)
expo-manifests: 1.0.8(expo@54.0.2)
expo-updates-interface: 2.0.0(expo@54.0.2)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-dev-launcher: 6.0.11(expo@54.0.3)
expo-dev-menu: 7.0.11(expo@54.0.3)
expo-dev-menu-interface: 2.0.0(expo@54.0.3)
expo-manifests: 1.0.8(expo@54.0.3)
expo-updates-interface: 2.0.0(expo@54.0.3)
transitivePeerDependencies:
- supports-color
expo-dev-launcher@6.0.11(expo@54.0.2):
expo-dev-launcher@6.0.11(expo@54.0.3):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-dev-menu: 7.0.11(expo@54.0.2)
expo-manifests: 1.0.8(expo@54.0.2)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-dev-menu: 7.0.11(expo@54.0.3)
expo-manifests: 1.0.8(expo@54.0.3)
transitivePeerDependencies:
- supports-color
expo-dev-menu-interface@2.0.0(expo@54.0.2):
expo-dev-menu-interface@2.0.0(expo@54.0.3):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-dev-menu@7.0.11(expo@54.0.2):
expo-dev-menu@7.0.11(expo@54.0.3):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-dev-menu-interface: 2.0.0(expo@54.0.2)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-dev-menu-interface: 2.0.0(expo@54.0.3)
expo-document-picker@14.0.7(expo@54.0.2):
expo-document-picker@14.0.7(expo@54.0.3):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-file-system@19.0.12(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
expo-file-system@19.0.12(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
expo-font@14.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
expo-file-system@19.0.13(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
expo-font@14.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
dependencies:
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
fontfaceobserver: 2.3.0
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
expo-haptics@15.0.7(expo@54.0.2):
expo-haptics@15.0.7(expo@54.0.3):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-image@3.0.8(expo@54.0.2)(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
expo-image@3.0.8(expo@54.0.3)(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
optionalDependencies:
@@ -11040,14 +11059,14 @@ snapshots:
expo-json-utils@0.15.0: {}
expo-keep-awake@15.0.7(expo@54.0.2)(react@19.1.0):
expo-keep-awake@15.0.7(expo@54.0.3)(react@19.1.0):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react: 19.1.0
expo-linking@8.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
expo-linking@8.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
dependencies:
expo-constants: 18.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-constants: 18.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
invariant: 2.2.4
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
@@ -11055,10 +11074,10 @@ snapshots:
- expo
- supports-color
expo-manifests@1.0.8(expo@54.0.2):
expo-manifests@1.0.8(expo@54.0.3):
dependencies:
'@expo/config': 12.0.8
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-json-utils: 0.15.0
transitivePeerDependencies:
- supports-color
@@ -11078,9 +11097,9 @@ snapshots:
react: 19.1.0
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
expo-router@6.0.1(@types/react@19.1.12)(expo-constants@18.0.8)(expo-linking@8.0.8)(expo@54.0.2)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.0(@babel/core@7.28.3)(react-native-worklets@0.5.1(@babel/core@7.28.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.1(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
expo-router@6.0.1(@types/react@19.1.12)(expo-constants@18.0.8)(expo-linking@8.0.8)(expo@54.0.3)(react-dom@19.1.0(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.0(@babel/core@7.28.3)(react-native-worklets@0.5.1(@babel/core@7.28.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.1(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
dependencies:
'@expo/metro-runtime': 6.1.1(expo@54.0.2)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
'@expo/metro-runtime': 6.1.1(expo@54.0.3)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
'@expo/schema-utils': 0.1.7
'@expo/server': 0.7.4
'@radix-ui/react-slot': 1.2.0(@types/react@19.1.12)(react@19.1.0)
@@ -11091,9 +11110,9 @@ snapshots:
client-only: 0.0.1
debug: 4.4.1
escape-string-regexp: 4.0.0
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-linking: 8.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-linking: 8.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
fast-deep-equal: 3.1.3
invariant: 2.2.4
nanoid: 3.3.11
@@ -11121,14 +11140,14 @@ snapshots:
- '@types/react-dom'
- supports-color
expo-secure-store@15.0.7(expo@54.0.2):
expo-secure-store@15.0.7(expo@54.0.3):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-splash-screen@31.0.9(expo@54.0.2):
expo-splash-screen@31.0.9(expo@54.0.3):
dependencies:
'@expo/prebuild-config': 54.0.1(expo@54.0.2)
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
'@expo/prebuild-config': 54.0.1(expo@54.0.3)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- supports-color
@@ -11138,50 +11157,50 @@ snapshots:
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
react-native-is-edge-to-edge: 1.2.1(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-symbols@1.0.7(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
expo-symbols@1.0.7(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
sf-symbols-typescript: 2.1.0
expo-system-ui@6.0.7(expo@54.0.2)(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
expo-system-ui@6.0.7(expo@54.0.3)(react-native-web@0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
dependencies:
'@react-native/normalize-colors': 0.81.4
debug: 4.4.1
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
optionalDependencies:
react-native-web: 0.21.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- supports-color
expo-updates-interface@2.0.0(expo@54.0.2):
expo-updates-interface@2.0.0(expo@54.0.3):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-web-browser@15.0.7(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
expo-web-browser@15.0.7(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)):
dependencies:
expo: 54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo: 54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
react-native: 0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0)
expo@54.0.2(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
expo@54.0.3(@babel/core@7.28.3)(@expo/metro-runtime@6.1.1)(expo-router@6.0.1)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0):
dependencies:
'@babel/runtime': 7.28.3
'@expo/cli': 54.0.2(expo-router@6.0.1)(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
'@expo/config': 12.0.8
'@expo/cli': 54.0.2(expo-router@6.0.1)(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
'@expo/config': 12.0.9
'@expo/config-plugins': 54.0.1
'@expo/devtools': 0.1.7(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
'@expo/fingerprint': 0.15.0
'@expo/metro': 0.1.1
'@expo/metro-config': 54.0.2(expo@54.0.2)
'@expo/vector-icons': 15.0.2(expo-font@14.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
'@expo/metro-config': 54.0.3(expo@54.0.3)
'@expo/vector-icons': 15.0.2(expo-font@14.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
'@ungap/structured-clone': 1.3.0
babel-preset-expo: 54.0.0(@babel/core@7.28.3)(@babel/runtime@7.28.3)(expo@54.0.2)(react-refresh@0.14.2)
expo-asset: 12.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-file-system: 19.0.12(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-font: 14.0.8(expo@54.0.2)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-keep-awake: 15.0.7(expo@54.0.2)(react@19.1.0)
babel-preset-expo: 54.0.1(@babel/core@7.28.3)(@babel/runtime@7.28.3)(expo@54.0.3)(react-refresh@0.14.2)
expo-asset: 12.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-constants: 18.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-file-system: 19.0.13(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))
expo-font: 14.0.8(expo@54.0.3)(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
expo-keep-awake: 15.0.7(expo@54.0.3)(react@19.1.0)
expo-modules-autolinking: 3.0.10
expo-modules-core: 3.0.15(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
pretty-format: 29.7.0
@@ -11190,7 +11209,7 @@ snapshots:
react-refresh: 0.14.2
whatwg-url-without-unicode: 8.0.0-3
optionalDependencies:
'@expo/metro-runtime': 6.1.1(expo@54.0.2)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
'@expo/metro-runtime': 6.1.1(expo@54.0.3)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.4(@babel/core@7.28.3)(@types/react@19.1.12)(react@19.1.0))(react@19.1.0)
transitivePeerDependencies:
- '@babel/core'
- bufferutil
@@ -11605,14 +11624,8 @@ snapshots:
property-information: 7.1.0
space-separated-tokens: 2.0.2
hermes-estree@0.25.1: {}
hermes-estree@0.29.1: {}
hermes-parser@0.25.1:
dependencies:
hermes-estree: 0.25.1
hermes-parser@0.29.1:
dependencies:
hermes-estree: 0.29.1