From e577e7a7486d441b1aff6a2b210e24c90de2b9ac Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 5 May 2026 21:31:59 +0530 Subject: [PATCH 01/40] chore: pre-expo-migration baseline - move detox to devDependencies --- ...ration 3486b5090ffb80008796fb22efd03d6f.md | 973 ++++++++++++++++++ package-lock.json | 321 ++++-- package.json | 2 +- 3 files changed, 1236 insertions(+), 60 deletions(-) create mode 100644 Expo-migration 3486b5090ffb80008796fb22efd03d6f.md diff --git a/Expo-migration 3486b5090ffb80008796fb22efd03d6f.md b/Expo-migration 3486b5090ffb80008796fb22efd03d6f.md new file mode 100644 index 000000000..505e99791 --- /dev/null +++ b/Expo-migration 3486b5090ffb80008796fb22efd03d6f.md @@ -0,0 +1,973 @@ +# Expo-migration + +# πŸš€ Shroud Wallet - Expo Migration Guide + +| Field | Value | +| --- | --- | +| Project | Shroud Wallet (`silent-pay-wallet`) | +| From | Bare React Native 0.78.2 | +| To | Expo SDK 54 + EAS Build + Development Client | +| Created | April 2026 | +| Type | Living document - update as migration progresses | + +> πŸ“Œ **Strategy:** Shroud Wallet has too many custom native modules to use Expo Managed Workflow. The correct target is **Expo Bare Workflow with a Development Client**, giving you EAS cloud builds without losing any native functionality. +> + +--- + +# πŸ“‹ Table of Contents + +1. Why Migrate to Expo +2. Migration Strategy - Which Expo Workflow +3. Compatibility Assessment +4. Package Migration Matrix +5. Pre-Migration Checklist +6. Phase 0 - Preparation +7. Phase 1 - Install Expo Core +8. Phase 2 - Configure app.json & EAS +9. Phase 3 - Replace Packages with Expo Equivalents +10. Phase 4 - Handle Custom Native Modules (Dev Client) +11. Phase 5 - EAS Build Setup +12. Phase 6 - Testing & Validation +13. Known Pitfalls for This Project +14. Post-Migration +15. Reference Links + +--- + +# 1. 🎯 Why Migrate to Expo + +## Problems with the Current Bare Setup + +| Problem | Impact | +| --- | --- | +| Local iOS/Android SDKs required on every machine | Every contributor needs full Xcode + Android Studio setup | +| Long local build times (15-30 min) | Slows down iteration | +| Inconsistent builds between machines | β€œWorks on my machine” issues | +| Complex CI setup for iOS (macOS runners only) | Expensive and slow | +| Manual code signing | Error-prone, hard to share with new contributors | +| New contributor onboarding takes hours | High barrier to contribution | + +## What Expo Gives You + +| Benefit | Detail | +| --- | --- | +| **EAS Build** | Cloud builds for iOS and Android - no local SDKs needed | +| **Automated code signing** | EAS handles provisioning profiles and certificates | +| **Faster CI** | No expensive macOS runners needed for most tasks | +| **Consistent builds** | Same output for every team member | +| **OTA updates** | Push JS-only fixes without a full app store release | +| **Dev Client** | Custom development build with all native modules included | + +## Expected Outcomes After Migration + +- Build time: 15-30 min locally β†’ 5-10 min on EAS cloud +- New contributor setup: 1-2 hours β†’ 15 minutes +- iOS builds: Requires macOS β†’ Works on any OS via EAS +- Code signing: Manual β†’ Automated via EAS + +--- + +# 2. πŸ—οΈ Migration Strategy - Which Expo Workflow + +## Why You Cannot Use Managed Workflow + +Expo Managed Workflow only works when all your native dependencies are covered by Expo’s SDK or have official Expo plugins. Shroud Wallet has multiple custom native modules with no Expo equivalent: + +| Blocker | Reason | +| --- | --- | +| `react-native-blue-crypto` | Custom BlueWallet cryptographic native module | +| `react-native-secure-key-store` | Custom keystore implementation | +| `electrum-client` | Custom TCP socket network layer | +| `react-native-tcp-socket` | Low-level TCP networking | +| `realm` | MongoDB’s native database SDK | +| `react-native-watch-connectivity` | Apple Watch integration | +| All SHA-pinned custom modules | No Expo plugin exists | + +## The Right Approach: Bare Workflow + Development Client + +``` +Bare Workflow = You keep android/ and ios/ directories +Development Client = Custom Expo Go with YOUR native modules +EAS Build = Cloud build service (replaces local compilation) +``` + +**How it works:** + +``` +Your Code (JS/TS) + ↓ +app.json + eas.json (Expo config) + ↓ +EAS Build (cloud) + ↓ +Development Client APK/IPA (contains all your native modules) + ↓ +Install once on device β†’ JS updates reload instantly +``` + +--- + +# 3. πŸ” Compatibility Assessment + +## Packages with Direct Expo Equivalent (Replace) + +| Current Package | Replace With | Notes | +| --- | --- | --- | +| `react-native-push-notification` + `@react-native-community/push-notification-ios` | `expo-notifications` | Actively maintained, Android 13+ and iOS 16+ support | +| `react-native-fs` | `expo-file-system` | Full API replacement | +| `react-native-image-picker` | `expo-image-picker` | Drop-in replacement | +| `react-native-permissions` | `expo-modules-core` + individual module permissions | Handled by each Expo module | +| `react-native-device-info` | `expo-device` + `expo-application` | Split across two packages | +| `react-native-localize` | `expo-localization` | Full replacement | +| `react-native-haptic-feedback` | `expo-haptics` | Drop-in replacement | +| `react-native-linear-gradient` | `expo-linear-gradient` | Drop-in replacement | +| `react-native-vector-icons` | `@expo/vector-icons` | Same icons, Expo-managed | +| `@react-native-clipboard/clipboard` | `expo-clipboard` | Drop-in replacement | +| `@react-native-documents/picker` | `expo-document-picker` | Drop-in replacement | +| `react-native-camera-kit` (QR only) | `expo-camera` (with barcode scanner) | If only used for QR scanning | + +## Packages That Work with Expo As-Is (Keep) + +| Package | Status | +| --- | --- | +| `react-native-reanimated` | βœ… Expo compatible | +| `react-native-gesture-handler` | βœ… Expo compatible | +| `@react-navigation/*` | βœ… Expo compatible | +| `react-native-screens` | βœ… Expo compatible | +| `react-native-safe-area-context` | βœ… Expo compatible | +| `react-native-svg` | βœ… Expo compatible | +| `react-native-qrcode-svg` | βœ… Expo compatible | +| `@react-native-async-storage/async-storage` | βœ… Expo compatible | +| `react-native-keychain` | βœ… Works via dev client | +| `react-native-biometrics` | βœ… Works via dev client | +| `lottie-react-native` | βœ… Works via dev client | +| `react-native-share` | βœ… Works via dev client | +| `react-native-watch-connectivity` | βœ… Works via dev client | +| `@bugsnag/react-native` | βœ… Has Expo plugin | +| All Bitcoin/crypto JS packages | βœ… Pure JS - no native changes needed | + +## Packages That Require Development Client (Keep with Dev Client) + +| Package | Why | Risk | +| --- | --- | --- | +| `realm` | MongoDB native SDK | Medium - test thoroughly | +| `react-native-keychain` | Native keystore access | Low | +| `react-native-tcp-socket` | Native TCP networking | Medium - Electrum depends on this | +| `electrum-client` (GitHub SHA) | Custom native network layer | High - test all wallet connectivity | +| `react-native-blue-crypto` (GitHub SHA) | Custom native crypto | High - never update without review | +| `react-native-secure-key-store` (GitHub SHA) | Custom keystore | High - security-critical | +| `react-native-camera-kit` | Native camera | Low if only for QR | +| `react-native-watch-connectivity` | Apple Watch native | Low | +| `@lodev09/react-native-true-sheet` | Native bottom sheet | Low | +| `@react-native-menu/menu` | Native context menu | Low | +| `react-native-capture-protection` (GitHub SHA) | Screenshot protection | Medium | +| `react-native-handoff` (GitHub SHA) | iOS Handoff | Low | + +## Packages to Remove + +| Package | Reason | +| --- | --- | +| `react-native-push-notification` | Replaced by `expo-notifications` | +| `@react-native-community/push-notification-ios` | Replaced by `expo-notifications` | + +--- + +# 4. πŸ“Š Package Migration Matrix + +Full command reference for every package change: + +## Remove These + +```bash +npm uninstall react-native-push-notification +npm uninstall @react-native-community/push-notification-ios +npm uninstall react-native-fs +npm uninstall react-native-image-picker +npm uninstall react-native-permissions +npm uninstall react-native-device-info +npm uninstall react-native-localize +npm uninstall react-native-haptic-feedback +npm uninstall react-native-linear-gradient +npm uninstall react-native-vector-icons +npm uninstall @react-native-clipboard/clipboard +npm uninstall @react-native-documents/picker +``` + +## Add These + +```bash +npx expo install expo-notifications +npx expo install expo-file-system +npx expo install expo-image-picker +npx expo install expo-device expo-application +npx expo install expo-localization +npx expo install expo-haptics +npx expo install expo-linear-gradient +npx expo install @expo/vector-icons +npx expo install expo-clipboard +npx expo install expo-document-picker +npx expo install expo-dev-client +npx expo install expo-modules-core +``` + +> ⚠️ Always use `npx expo install` instead of `npm install` for Expo packages. It picks the version compatible with your SDK automatically. +> + +## Import Changes Reference + +### Push Notifications + +```tsx +// BEFORE +import PushNotification from 'react-native-push-notification'; +PushNotification.localNotification({ title: 'Hello', message: 'World' }); + +// AFTER +import * as Notifications from 'expo-notifications'; +await Notifications.scheduleNotificationAsync({ + content: { title: 'Hello', body: 'World' }, + trigger: null, +}); +``` + +### File System + +```tsx +// BEFORE +import RNFS from 'react-native-fs'; +const content = await RNFS.readFile(RNFS.DocumentDirectoryPath + '/wallet.json'); + +// AFTER +import * as FileSystem from 'expo-file-system'; +const content = await FileSystem.readAsStringAsync( + FileSystem.documentDirectory + 'wallet.json' +); +``` + +### Image Picker + +```tsx +// BEFORE +import ImagePicker from 'react-native-image-picker'; +ImagePicker.launchImageLibrary({}, response => { ... }); + +// AFTER +import * as ImagePicker from 'expo-image-picker'; +const result = await ImagePicker.launchImageLibraryAsync({ ... }); +``` + +### Clipboard + +```tsx +// BEFORE +import Clipboard from '@react-native-clipboard/clipboard'; +Clipboard.setString('text'); + +// AFTER +import * as Clipboard from 'expo-clipboard'; +await Clipboard.setStringAsync('text'); +``` + +### Haptics + +```tsx +// BEFORE +import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; +ReactNativeHapticFeedback.trigger('impactMedium'); + +// AFTER +import * as Haptics from 'expo-haptics'; +await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); +``` + +### Linear Gradient + +```tsx +// BEFORE +import LinearGradient from 'react-native-linear-gradient'; + +// AFTER +import { LinearGradient } from 'expo-linear-gradient'; +// Props are identical +``` + +### Vector Icons + +```tsx +// BEFORE +import Icon from 'react-native-vector-icons/MaterialIcons'; + +// AFTER +import { MaterialIcons as Icon } from '@expo/vector-icons'; +// Usage is identical +``` + +### Localization + +```tsx +// BEFORE +import RNLocalize from 'react-native-localize'; +const locale = RNLocalize.getLocales()[0].languageCode; + +// AFTER +import * as Localization from 'expo-localization'; +const locale = Localization.getLocales()[0].languageCode; +``` + +### Device Info + +```tsx +// BEFORE +import DeviceInfo from 'react-native-device-info'; +const model = DeviceInfo.getModel(); +const version = DeviceInfo.getSystemVersion(); + +// AFTER +import * as Device from 'expo-device'; +import * as Application from 'expo-application'; +const model = Device.modelName; +const version = Device.osVersion; +``` + +--- + +# 5. βœ… Pre-Migration Checklist + +## Before Starting + +- [ ] All current tests pass (`npm run test`) +- [ ] Project builds successfully on Android and iOS +- [ ] Current state is committed and pushed to a branch +- [ ] Create migration branch: `git checkout -b migrate/expo-sdk54` +- [ ] Node.js β‰₯ 20 installed +- [ ] EAS CLI installed: `npm install -g eas-cli` +- [ ] Logged into Expo account: `eas login` +- [ ] Expo account has an active project (free tier works) + +## Team Coordination + +- [ ] Notify all contributors - builds will change +- [ ] Decide who manages EAS credentials (team owner) +- [ ] Set up the Expo organization account if using Team Builds +- [ ] Agree on which EAS build profile each person uses + +--- + +# 6. πŸ”§ Phase 0 - Preparation *(1 day)* + +```bash +# Create migration branch +git checkout -b migrate/expo-sdk54 + +# Establish test baseline +npm run test + +# Fix known issue: move detox to devDependencies +npm uninstall detox +npm install --save-dev detox@20.40.2 + +# Audit current package state +npm outdated + +# Commit clean state +git add -A && git commit -m "chore: pre-expo-migration baseline" +``` + +--- + +# 7. πŸ“¦ Phase 1 - Install Expo Core *(half day)* + +```bash +# Install Expo SDK 54 +npm install expo@54 + +# Install Expo modules core (required for all expo-* packages) +npx expo install expo-modules-core + +# Install the development client (required for custom native modules) +npx expo install expo-dev-client + +# Run Expo's doctor to check compatibility +npx expo-doctor +``` + +## Update index.js + +```jsx +// BEFORE +import {AppRegistry} from 'react-native'; +import App from './App'; +import {name as appName} from './app.json'; + +AppRegistry.registerComponent(appName, () => App); + +// AFTER +import 'expo-dev-client'; // ADD THIS LINE FIRST +import {AppRegistry} from 'react-native'; +import App from './App'; +import {name as appName} from './app.json'; + +AppRegistry.registerComponent(appName, () => App); +``` + +## Update babel.config.js + +```jsx +// BEFORE +module.exports = { + presets: ['module:@react-native/babel-preset'], + plugins: ['react-native-reanimated/plugin'], +}; + +// AFTER +module.exports = { + presets: ['babel-preset-expo'], + plugins: ['react-native-reanimated/plugin'], +}; +``` + +```bash +npm install --save-dev babel-preset-expo +``` + +--- + +# 8. βš™οΈ Phase 2 - Configure app.json & EAS *(half day)* + +## Create app.json + +Create `app.json` at the project root: + +```json +{ + "expo": { + "name": "Shroud Wallet", + "slug": "shroud-wallet", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./img/icon.png", + "userInterfaceStyle": "automatic", + "splash": { + "resizeMode": "contain", + "backgroundColor": "#000000" + }, + "ios": { + "supportsTabletMode": false, + "bundleIdentifier": "com.bitshala.shroudwallet", + "deploymentTarget": "16.0", + "infoPlist": { + "NSCameraUsageDescription": "Shroud Wallet uses the camera to scan QR codes", + "NSFaceIDUsageDescription": "Shroud Wallet uses Face ID to unlock your wallet", + "NSPhotoLibraryUsageDescription": "Shroud Wallet needs access to photos to import wallet backups" + } + }, + "android": { + "package": "com.bitshala.shroudwallet", + "adaptiveIcon": { + "foregroundImage": "./img/icon.png", + "backgroundColor": "#000000" + }, + "permissions": [ + "CAMERA", + "USE_BIOMETRIC", + "USE_FINGERPRINT", + "RECEIVE_BOOT_COMPLETED", + "VIBRATE" + ] + }, + "plugins": [ + "expo-dev-client", + [ + "@bugsnag/react-native", + { + "apiKey": "YOUR_BUGSNAG_API_KEY" + } + ], + [ + "expo-notifications", + { + "icon": "./img/notification-icon.png", + "color": "#000000" + } + ], + "expo-localization" + ], + "extra": { + "eas": { + "projectId": "YOUR_EAS_PROJECT_ID" + } + } + } +} +``` + +## Create eas.json + +```json +{ + "cli": { + "version": ">= 7.0.0" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal", + "android": { + "buildType": "apk", + "gradleCommand": ":app:assembleDebug" + }, + "ios": { + "simulator": true + } + }, + "preview": { + "distribution": "internal", + "android": { + "buildType": "apk" + }, + "ios": { + "simulator": false + } + }, + "production": { + "android": { + "buildType": "aab" + }, + "ios": { + "simulator": false + } + } + }, + "submit": { + "production": { + "android": { + "serviceAccountKeyPath": "./google-service-account.json", + "track": "internal" + }, + "ios": { + "appleId": "YOUR_APPLE_ID", + "ascAppId": "YOUR_APP_STORE_CONNECT_APP_ID" + } + } + } +} +``` + +## Initialise EAS Project + +```bash +eas init +eas build:configure +``` + +--- + +# 9. πŸ”„ Phase 3 - Replace Packages with Expo Equivalents *(3-5 days)* + +Work through each package replacement one by one. Do not replace multiple packages in a single commit - this makes debugging much easier. + +## Step 1 - Notifications + +```bash +npm uninstall react-native-push-notification @react-native-community/push-notification-ios +npx expo install expo-notifications +``` + +Search and replace all imports: + +```bash +# Find all files using the old packages +grep -r "react-native-push-notification" screen/ components/ blue_modules/ --include="*.ts" --include="*.tsx" --include="*.js" +``` + +Update each file using the import reference in Section 4. + +```bash +npm run unit && npm run integration +git commit -m "feat: migrate push notifications to expo-notifications" +``` + +## Step 2 - File System + +```bash +npm uninstall react-native-fs +npx expo install expo-file-system +``` + +```bash +grep -r "react-native-fs" screen/ components/ blue_modules/ class/ --include="*.ts" --include="*.tsx" --include="*.js" +``` + +Update imports using the reference in Section 4. Note: file paths differ - `RNFS.DocumentDirectoryPath` becomes `FileSystem.documentDirectory`. + +```bash +npm run unit && npm run integration +git commit -m "feat: migrate file system to expo-file-system" +``` + +## Step 3 - Image Picker, Clipboard, Document Picker + +```bash +npm uninstall react-native-image-picker @react-native-clipboard/clipboard @react-native-documents/picker +npx expo install expo-image-picker expo-clipboard expo-document-picker +``` + +Update each import per Section 4, test, commit separately. + +## Step 4 - UI Replacements + +```bash +npm uninstall react-native-haptic-feedback react-native-linear-gradient react-native-vector-icons react-native-localize +npx expo install expo-haptics expo-linear-gradient @expo/vector-icons expo-localization +``` + +> ⚠️ **Vector Icons Warning:** After switching to `@expo/vector-icons`, search the entire codebase for `react-native-vector-icons` imports. The import path changes from named default imports to named exports. +> + +## Step 5 - Device Info + +```bash +npm uninstall react-native-device-info +npx expo install expo-device expo-application +``` + +Note: `DeviceInfo.getModel()` β†’ `Device.modelName`, `DeviceInfo.getSystemVersion()` β†’ `Device.osVersion`. Not all DeviceInfo APIs have direct equivalents - audit each usage. + +--- + +# 10. πŸ”Œ Phase 4 - Handle Custom Native Modules *(1-2 weeks)* + +These packages stay but need to be verified in the Expo Development Client context. + +## The Development Client Build Process + +```bash +# Build development client for Android (APK) +eas build --profile development --platform android + +# Build development client for iOS +eas build --profile development --platform ios + +# Install on device, then start Metro: +npx expo start --dev-client +``` + +## Packages to Verify One by One + +### Realm (Database) + +Realm works with Expo via dev client but requires careful setup: + +```bash +# Verify realm is still working after migration +npm run unit # Runs realm-dependent unit tests +npm run integration +``` + +If Realm fails to link, add to `app.json` plugins: + +```json +"plugins": [ + ["realm", { "enableFlipperPlugin": false }] +] +``` + +### react-native-tcp-socket + electrum-client + +This is the most critical path - all wallet network functionality depends on it: + +```bash +# After building dev client, test connectivity to an Electrum server +# Run integration tests that hit the network layer +npm run integration +``` + +### react-native-blue-crypto + +Custom cryptographic native module. Key operations to test: + +1. Wallet creation (key derivation) +2. Transaction signing +3. Silent Payment address generation +4. Entropy generation + +### react-native-secure-key-store + +Test all wallet unlock / PIN entry flows after building dev client. + +### react-native-biometrics + react-native-keychain + +Test biometric unlock flows on a real device (simulators don’t support biometrics fully). + +--- + +# 11. ☁️ Phase 5 - EAS Build Setup *(1 day)* + +## Set Up Credentials + +```bash +# Android keystore (EAS manages this for you) +eas credentials --platform android + +# iOS provisioning (EAS manages this for you) +eas credentials --platform ios +``` + +## Build and Test Each Profile + +```bash +# Development build (contains dev client) +eas build --profile development --platform android +eas build --profile development --platform ios + +# Preview build (internal distribution, no dev client) +eas build --profile preview --platform android + +# Production build (App Store / Play Store) +eas build --profile production --platform android +eas build --profile production --platform ios +``` + +## Update CircleCI to Use EAS + +Replace your existing build steps with: + +```yaml +# .circleci/config.yml +-run: +name: Build Android (EAS) +command: eas build --profile preview --platform android --non-interactive + +-run: +name: Build iOS (EAS) +command: eas build --profile preview --platform ios --non-interactive +``` + +Install EAS CLI in CI: + +```yaml +-run: +name: Install EAS CLI +command: npm install -g eas-cli +-run: +name: EAS Login +command: eas login --token $EXPO_TOKEN +``` + +Set `EXPO_TOKEN` as a CircleCI environment variable from your Expo account settings. + +--- + +# 12. πŸ§ͺ Phase 6 - Testing & Validation *(3-5 days)* + +## Test Matrix + +| Test Type | Command | When | +| --- | --- | --- | +| Unit tests | `npm run unit` | After every package replacement | +| Integration tests | `npm run integration` | After every package replacement | +| TypeScript | `npm run tslint` | After every package replacement | +| Dev client build | `eas build --profile development` | After Phase 4 | +| Bitcoin operations | Manual | After native modules verified | +| Biometrics | Manual on device | After Phase 4 | +| Notifications | Manual on device | After Phase 3 Step 1 | +| E2E | `npm run e2e:debug` | End of Phase 6 | + +## Critical Bitcoin Functionality Checklist + +- [ ] Create a new wallet (key generation works) +- [ ] Restore wallet from mnemonic (BIP-39 derivation works) +- [ ] Receive a Bitcoin address (address derivation correct) +- [ ] Generate a Silent Payment address (@silent-pay/core works) +- [ ] Scan a QR code payment address (camera-kit / expo-camera works) +- [ ] Sign a transaction (react-native-blue-crypto works) +- [ ] Broadcast a transaction (electrum-client network works) +- [ ] Biometric unlock (react-native-biometrics works) +- [ ] Push notification received (expo-notifications works) +- [ ] Wallet data persists across app restarts (Realm works) +- [ ] File export/import (expo-file-system works) + +--- + +# 13. ⚠️ Known Pitfalls for This Project + +## Pitfall 1 - Metro Config Needs Update + +After adding Expo, update `metro.config.js`: + +```jsx +// BEFORE +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); + +// AFTER +const { getDefaultConfig } = require('expo/metro-config'); +const { mergeConfig } = require('@react-native/metro-config'); +``` + +The resolver for `stream`, `crypto`, `net`, `tls` must be kept: + +```jsx +const config = { + resolver: { + extraNodeModules: { + stream: require.resolve('stream-browserify'), + crypto: require.resolve('crypto-browserify'), + net: require.resolve('react-native-tcp-socket'), + tls: require.resolve('react-native-tcp-socket'), + }, + }, +}; + +module.exports = mergeConfig(getDefaultConfig(__dirname), config); +``` + +--- + +## Pitfall 2 - Realm + Expo Prebuild + +If you run `npx expo prebuild`, it regenerates `android/` and `ios/` from `app.json`. This will **overwrite** manual changes you’ve made to native files. + +**Solution:** Use Expo config plugins for any native modifications, and only run prebuild intentionally. + +--- + +## Pitfall 3 - react-native-blue-crypto in Expo Context + +This is a GitHub SHA-pinned custom native module from BlueWallet. It has no Expo plugin. It must be kept in the native directories manually. + +After any `npx expo prebuild --clean`, re-verify that the native module is still linked correctly: + +```bash +# Android: check settings.gradle and app/build.gradle still reference it +# iOS: check Podfile still references it +``` + +--- + +## Pitfall 4 - `@noble/secp256k1` v1 vs v2 in Expo Metro + +Expo’s Metro bundler should resolve this correctly, but if you see errors about secp256k1: + +```jsx +// In metro.config.js, add explicit resolution: +resolver: { + extraNodeModules: { + ... + // Force secp256k1 v1 (not v2 which has different API) + } +} +``` + +--- + +## Pitfall 5 - Bitcoin JS Polyfills Must Load First + +The `shim.js` file loads polyfills for `Buffer`, `crypto`, and `URL`. In Expo, ensure this still loads before any Bitcoin library. + +In `index.js`: + +```jsx +import 'expo-dev-client'; +import './shim'; // MUST be before any Bitcoin imports +import {AppRegistry} from 'react-native'; +import App from './App'; +... +``` + +--- + +## Pitfall 6 - iOS Simulator vs Real Device + +`react-native-blue-crypto` may behave differently on simulators due to architecture differences (x86_64 vs arm64). Always test cryptographic operations on a real device before releasing. + +--- + +## Pitfall 7 - EAS Build Cache + +EAS caches npm packages and native builds. After changing any SHA-pinned package, clear the EAS cache: + +```bash +eas build --profile development --platform android --clear-cache +``` + +--- + +# 14. 🏁 Post-Migration + +## Update .gitignore + +After migration, add Expo-specific entries: + +``` +# Expo +.expo/ +.expo-shared/ +dist/ + +# EAS +eas-build-on-simulator.log +``` + +Keep `android/` and `ios/` in version control (you are in bare workflow, not managed). + +## Update README.md + +Replace current build instructions with: + +```markdown +## Development Setup + +1.Install EAS CLI: `npm install -g eas-cli` +2.Login: `eas login` +3.Install dependencies: `npm install` +4.Build dev client: `eas build --profile development --platform android` +5.Install dev client APK on device/emulator +6.Start Metro: `npx expo start --dev-client` +``` + +## OTA Updates (Optional Post-Migration) + +Once stable, you can use EAS Update to push JS-only changes without a full app store release: + +```bash +eas update --branch production --message "Fix transaction display bug" +``` + +--- + +# 15. πŸ”— Reference Links + +## Expo Documentation + +- [Expo SDK 54 Changelog](https://expo.dev/changelog/sdk-54) +- [Expo Bare Workflow](https://docs.expo.dev/bare/overview/) +- [Development Client Setup](https://docs.expo.dev/develop/development-builds/create-a-build/) +- [EAS Build Documentation](https://docs.expo.dev/build/introduction/) +- [EAS Update (OTA)](https://docs.expo.dev/eas-update/introduction/) +- [app.json Configuration](https://docs.expo.dev/versions/latest/config/app/) +- [eas.json Configuration](https://docs.expo.dev/build/eas-json/) +- [Expo Config Plugins](https://docs.expo.dev/config-plugins/introduction/) + +## Package Migration References + +- [expo-notifications](https://docs.expo.dev/versions/latest/sdk/notifications/) +- [expo-file-system](https://docs.expo.dev/versions/latest/sdk/filesystem/) +- [expo-image-picker](https://docs.expo.dev/versions/latest/sdk/imagepicker/) +- [expo-device](https://docs.expo.dev/versions/latest/sdk/device/) +- [expo-localization](https://docs.expo.dev/versions/latest/sdk/localization/) +- [expo-haptics](https://docs.expo.dev/versions/latest/sdk/haptics/) +- [expo-linear-gradient](https://docs.expo.dev/versions/latest/sdk/linear-gradient/) +- [@expo/vector-icons](https://docs.expo.dev/guides/icons/) +- [expo-clipboard](https://docs.expo.dev/versions/latest/sdk/clipboard/) + +## This Project + +- [BlueWallet (upstream - reference for SHA-pinned packages)](https://github.com/BlueWallet/BlueWallet) +- [silent-pay core library](https://github.com/Bitshala-Incubator/silent-pay) +- [BIP-352: Silent Payments](https://github.com/bitcoin/bips/blob/master/bip-0352.mediawiki) +- [React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) + +--- + +*Update this document as you progress through each phase. Mark phases complete and note any deviations from the plan.* \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 57e7250c3..ff7a11d54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,6 @@ "crypto-browserify": "3.12.1", "crypto-js": "4.2.0", "dayjs": "1.11.18", - "detox": "20.40.2", "ecpair": "3.0.0", "electrum-client": "github:BlueWallet/rn-electrum-client#d9f511d", "electrum-mnemonic": "2.0.0", @@ -125,6 +124,7 @@ "@types/wif": "^2.0.5", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", + "detox": "^20.40.2", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", @@ -2312,18 +2312,20 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "dev": true, "license": "MIT", "dependencies": { - "colorspace": "1.1.x", + "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", "kuler": "^2.0.0" } @@ -2486,9 +2488,10 @@ } }, "node_modules/@flatten-js/interval-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.3.tgz", - "integrity": "sha512-xhFWUBoHJFF77cJO1D6REjdgJEMRf2Y2Z+eKEPav8evGKcLSnj1ud5pLXQSbGuxF3VSvT1rWhMfVpXEKJLTL+A==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.4.tgz", + "integrity": "sha512-o4emRDDvGdkwX18BSVSXH8q27qAL7Z2WDHSN75C8xyRSE4A8UOkig0mWSGoT5M5KaTHZxoLmalFwOTQmbRusUg==", + "dev": true, "license": "MIT" }, "node_modules/@hapi/hoek": { @@ -4892,6 +4895,67 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@so-ric/colorspace/node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@so-ric/colorspace/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/@so-ric/colorspace/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/@so-ric/colorspace/node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@testing-library/react-native": { "version": "13.2.0", "dev": true, @@ -5148,6 +5212,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "dev": true, "license": "MIT" }, "node_modules/@types/wif": { @@ -5375,9 +5440,10 @@ "license": "ISC" }, "node_modules/@wix-pilot/core": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@wix-pilot/core/-/core-3.4.1.tgz", - "integrity": "sha512-9WvI+FuDYQ1IJsyHRfZphehlbOXIOswlxowwJZ0FlUaebGhR78T61qY1e532HHlJfKyuIu1IwdSQ2tg5L+hUhg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@wix-pilot/core/-/core-3.4.2.tgz", + "integrity": "sha512-O8V2NLfPEKI2IviJXG4g/vNbMfsBZNBhzAKFUOOaOR9TTDUJYlZUttqjhjP/fPnaDky0/hrfGES15sO0N7zEkw==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -5397,6 +5463,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, "license": "MIT", "engines": { "node": ">=14.19.0" @@ -5406,6 +5473,7 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/@wix-pilot/detox/-/detox-1.0.13.tgz", "integrity": "sha512-/34lM25AfmHNMLOeEIhfKVnx2YZyn5VHC/R4Bs1uXQ2B+Yg0JbxAfvfXA3xqxBsdYqrYImILPO3Ih0c5UzoNxw==", + "dev": true, "peerDependencies": { "@wix-pilot/core": "^3.4.1", "detox": ">=20.33.0", @@ -5480,7 +5548,10 @@ } }, "node_modules/ajv": { - "version": "8.17.1", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -5766,6 +5837,7 @@ }, "node_modules/async": { "version": "3.2.6", + "dev": true, "license": "MIT" }, "node_modules/async-function": { @@ -6312,6 +6384,9 @@ }, "node_modules/bluebird": { "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, "license": "MIT" }, "node_modules/bn.js": { @@ -6324,6 +6399,7 @@ }, "node_modules/brace-expansion": { "version": "2.0.1", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -6347,6 +6423,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/browserify-aes": { @@ -6660,6 +6737,7 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.6.3.tgz", "integrity": "sha512-m1hAijFhu8pFiidsVc0XEDic46uxPK+mKNLqkb5mluNx0nTolNzx/DjwMqHChQWCgfOLMjKYJJ2uPTQLE6t4Ng==", + "dev": true, "license": "MIT", "dependencies": { "@flatten-js/interval-tree": "^1.1.2", @@ -6685,6 +6763,9 @@ }, "node_modules/bunyan": { "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "dev": true, "engines": [ "node >=0.10.0" ], @@ -6703,6 +6784,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/bunyan-debug-stream/-/bunyan-debug-stream-3.1.1.tgz", "integrity": "sha512-LfMcz4yKM6s9BP5dfT63Prb5B2hAjReLAfQzLbNQF7qBHtn3P1v+/yn0SZ6UAr4PC3VZRX/QzK7HYkkY0ytokQ==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2" @@ -6728,6 +6810,9 @@ }, "node_modules/caf": { "version": "15.0.1", + "resolved": "https://registry.npmjs.org/caf/-/caf-15.0.1.tgz", + "integrity": "sha512-Xp/IK6vMwujxWZXra7djdYzPdPnEQKa7Mudu2wZgDQ3TJry1I0TgtjEgwZHpoBcMp68j4fb0/FZ1SJyMEgJrXQ==", + "dev": true, "license": "MIT" }, "node_modules/call-bind": { @@ -7075,41 +7160,6 @@ "version": "1.4.0", "license": "MIT" }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/colorspace/node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/colorspace/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/colorspace/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, "node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -7656,6 +7706,9 @@ }, "node_modules/decamelize": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -7807,6 +7860,7 @@ "version": "20.40.2", "resolved": "https://registry.npmjs.org/detox/-/detox-20.40.2.tgz", "integrity": "sha512-gb9o8Gg5yVd2+xjVLDb5IbS4tg96r9nX/MNCgHqYMUxKcW49oOMlGcodp+f6w29x8HLEn1aKdwGYXEPl9xNZHw==", + "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -7864,7 +7918,10 @@ } }, "node_modules/detox/node_modules/fs-extra": { - "version": "11.3.0", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -7877,6 +7934,10 @@ }, "node_modules/detox/node_modules/glob": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -7893,7 +7954,10 @@ } }, "node_modules/detox/node_modules/jsonfile": { - "version": "6.1.0", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -7903,7 +7967,10 @@ } }, "node_modules/detox/node_modules/minimatch": { - "version": "5.1.6", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -7913,7 +7980,10 @@ } }, "node_modules/detox/node_modules/semver": { - "version": "7.7.1", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7924,6 +7994,9 @@ }, "node_modules/detox/node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -7934,6 +8007,9 @@ }, "node_modules/detox/node_modules/universalify": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -7941,6 +8017,9 @@ }, "node_modules/detox/node_modules/ws": { "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.3.0" @@ -8064,6 +8143,9 @@ }, "node_modules/dtrace-provider": { "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "dev": true, "hasInstallScript": true, "license": "BSD-2-Clause", "optional": true, @@ -8088,6 +8170,9 @@ }, "node_modules/duplexer2": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" @@ -8095,10 +8180,16 @@ }, "node_modules/duplexer2/node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, "license": "MIT" }, "node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -8112,10 +8203,16 @@ }, "node_modules/duplexer2/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, "license": "MIT" }, "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -8125,6 +8222,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -8280,6 +8378,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true, "license": "MIT" }, "node_modules/encodeurl": { @@ -9378,6 +9477,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true, "license": "Unlicense", "engines": { "node": ">=4.0.0" @@ -9461,6 +9561,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/exeunt/-/exeunt-1.1.0.tgz", "integrity": "sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw==", + "dev": true, "license": "MPL-2.0", "engines": { "node": ">=0.10" @@ -9631,7 +9732,10 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, "funding": [ { "type": "github", @@ -9678,6 +9782,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "dev": true, "license": "MIT" }, "node_modules/file-entry-cache": { @@ -9875,6 +9980,9 @@ }, "node_modules/flat": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, "license": "BSD-3-Clause", "bin": { "flat": "cli.js" @@ -9913,6 +10021,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "dev": true, "license": "MIT" }, "node_modules/for-each": { @@ -10023,6 +10132,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/funpermaproxy/-/funpermaproxy-1.1.0.tgz", "integrity": "sha512-2Sp1hWuO8m5fqeFDusyhKqYPT+7rGLw34N3qonDcdRP8+n7M7Gl/yKp/q7oCxnnJ6pWCectOmLFJpsMU/++KrQ==", + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8.3.0" @@ -11819,6 +11929,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.2.0.tgz", "integrity": "sha512-dSFBrRuIiWbHK2LSUA6CutXpMcNGjjuhvxFLF+TVz5tYFAAH0eesrZgrQ3UtOptajDYNt/fIGRqtlHqGq/bLbA==", + "dev": true, "license": "MIT", "dependencies": { "bunyamin": "^1.5.2", @@ -11862,6 +11973,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-2.0.5.tgz", "integrity": "sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA==", + "dev": true, "engines": [ "node >=0.10.0" ], @@ -11883,6 +11995,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -13326,6 +13439,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.6.0" @@ -13335,6 +13449,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", + "dev": true, "license": "MIT", "dependencies": { "easy-stack": "^1.0.1" @@ -13448,6 +13563,9 @@ }, "node_modules/json-cycle": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.5.0.tgz", + "integrity": "sha512-GOehvd5PO2FeZ5T4c+RxobeT5a1PiGpF4u9/3+UvrMU4bhnVqzJY7hm39wg8PDCqkU91fWGH8qjWR4bn+wgq9w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -13463,6 +13581,9 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -13527,6 +13648,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true, "license": "MIT" }, "node_modules/leven": { @@ -13615,6 +13737,7 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", + "dev": true, "license": "MIT" }, "node_modules/lodash.sortby": { @@ -13643,6 +13766,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "dev": true, "license": "MIT", "dependencies": { "@colors/colors": "1.6.0", @@ -14582,6 +14706,9 @@ }, "node_modules/mkdirp": { "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -14597,6 +14724,9 @@ }, "node_modules/moment": { "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "dev": true, "license": "MIT", "optional": true, "engines": { @@ -14611,10 +14741,14 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/multi-sort-stream/-/multi-sort-stream-1.0.4.tgz", "integrity": "sha512-hAZ8JOEQFbgdLe8HWZbb7gdZg0/yAIHF00Qfo3kd0rXFv96nXe+/bPTrKHZ2QMHugGX4FiAyET1Lt+jiB+7Qlg==", + "dev": true, "license": "bsd" }, "node_modules/multipipe": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-4.0.0.tgz", + "integrity": "sha512-jzcEAzFXoWwWwUbvHCNPwBlTz3WCWe/jPcXSmTfbo/VjRwRTfvLZ/bdvtiTdqCe8d4otCSsPCbhGYcX+eggpKQ==", + "dev": true, "license": "MIT", "dependencies": { "duplexer2": "^0.1.2", @@ -14623,6 +14757,9 @@ }, "node_modules/mv": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -14635,7 +14772,10 @@ } }, "node_modules/mv/node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -14645,6 +14785,10 @@ }, "node_modules/mv/node_modules/glob": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, "license": "ISC", "optional": true, "dependencies": { @@ -14659,7 +14803,10 @@ } }, "node_modules/mv/node_modules/minimatch": { - "version": "3.1.2", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, "license": "ISC", "optional": true, "dependencies": { @@ -14671,6 +14818,10 @@ }, "node_modules/mv/node_modules/rimraf": { "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, "license": "ISC", "optional": true, "dependencies": { @@ -14711,6 +14862,9 @@ }, "node_modules/ncp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "dev": true, "license": "MIT", "optional": true, "bin": { @@ -14804,6 +14958,7 @@ "version": "9.2.1", "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.2.1.tgz", "integrity": "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==", + "dev": true, "license": "MIT", "dependencies": { "event-pubsub": "4.3.0", @@ -15036,6 +15191,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, "license": "MIT", "dependencies": { "fn.name": "1.x.x" @@ -15574,6 +15730,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/promisify-child-process/-/promisify-child-process-4.1.2.tgz", "integrity": "sha512-APnkIgmaHNJpkAn7k+CrJSi9WMuff5ctYFbD0CO2XIPkM8yO7d/ShouU2clywbpHV/DUsyc4bpJCsNgddNtx4g==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -15605,6 +15762,9 @@ }, "node_modules/proper-lockfile": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-3.2.0.tgz", + "integrity": "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.1.11", @@ -16819,6 +16979,9 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -16893,6 +17056,9 @@ }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -16995,6 +17161,9 @@ }, "node_modules/safe-json-stringify": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "dev": true, "license": "MIT", "optional": true }, @@ -17032,13 +17201,17 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/sanitize-filename": { - "version": "1.6.3", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, "license": "WTFPL OR ISC", "dependencies": { "truncate-utf8-bytes": "^1.0.0" @@ -17154,6 +17327,9 @@ }, "node_modules/serialize-error": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.20.2" @@ -17167,6 +17343,9 @@ }, "node_modules/serialize-error/node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -17584,6 +17763,7 @@ "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, "license": "MIT", "engines": { "node": "*" @@ -17646,12 +17826,14 @@ "version": "2.2.5", "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/stream-json": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "stream-chain": "^2.2.5" @@ -17984,6 +18166,9 @@ }, "node_modules/telnet-client": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.2.8.tgz", + "integrity": "sha512-W+w4k3QAmULVNhBVT2Fei369kGZCh/TH25M7caJAXW+hLxwoQRuw0di3cX4l0S9fgH3Mvq7u+IFMoBDpEw/eIg==", + "dev": true, "license": "MIT", "dependencies": { "bluebird": "^3.5.4" @@ -18074,6 +18259,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true, "license": "MIT" }, "node_modules/text-table": { @@ -18157,6 +18343,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/trace-event-lib/-/trace-event-lib-1.4.1.tgz", "integrity": "sha512-TOgFolKG8JFY+9d5EohGWMvwvteRafcyfPWWNIqcuD1W/FUvxWcy2MSCZ/beYHM63oYPHYHCd3tkbgCctHVP7w==", + "dev": true, "license": "MIT", "dependencies": { "browser-process-hrtime": "^1.0.0" @@ -18169,6 +18356,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 14.0.0" @@ -18176,6 +18364,9 @@ }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, "license": "WTFPL", "dependencies": { "utf8-byte-length": "^1.0.1" @@ -18649,6 +18840,9 @@ }, "node_modules/utf8-byte-length": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, "license": "(WTFPL OR MIT)" }, "node_modules/util": { @@ -18779,6 +18973,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -18879,13 +19074,14 @@ } }, "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "dev": true, "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", + "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", @@ -18904,6 +19100,7 @@ "version": "4.9.0", "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "dev": true, "license": "MIT", "dependencies": { "logform": "^2.7.0", @@ -19033,6 +19230,9 @@ }, "node_modules/yargs-unparser": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, "license": "MIT", "dependencies": { "camelcase": "^6.0.0", @@ -19046,6 +19246,9 @@ }, "node_modules/yargs-unparser/node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/package.json b/package.json index 7b9aa8af7..dc083b2e0 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@types/wif": "^2.0.5", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", + "detox": "^20.40.2", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", @@ -124,7 +125,6 @@ "crypto-browserify": "3.12.1", "crypto-js": "4.2.0", "dayjs": "1.11.18", - "detox": "20.40.2", "ecpair": "3.0.0", "electrum-client": "github:BlueWallet/rn-electrum-client#d9f511d", "electrum-mnemonic": "2.0.0", From 5c1ca4ac393d05c5d5619fb014cd3766c1ca4306 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 5 May 2026 21:35:30 +0530 Subject: [PATCH 02/40] feat: install Expo SDK 55, update entry files and build toolchain --- babel.config.js | 2 +- index.js | 1 + metro.config.js | 3 +- package-lock.json | 6410 +++++++++++++++++++++++++++++++++++---------- package.json | 23 +- 5 files changed, 5050 insertions(+), 1389 deletions(-) diff --git a/babel.config.js b/babel.config.js index 3687ce3b7..1a6c89271 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,4 +1,4 @@ module.exports = { - presets: ['module:@react-native/babel-preset'], + presets: ['babel-preset-expo'], plugins: ['react-native-reanimated/plugin'], // required by react-native-reanimated v2 https://docs.swmansion.com/react-native-reanimated/docs/installation/ }; diff --git a/index.js b/index.js index 5fabd7290..cc7f33434 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,4 @@ +import 'expo-dev-client'; import './gesture-handler'; import 'react-native-get-random-values'; import './shim.js'; diff --git a/metro.config.js b/metro.config.js index 54550de6f..2bbba3625 100644 --- a/metro.config.js +++ b/metro.config.js @@ -1,5 +1,6 @@ const path = require('path'); -const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); +const { getDefaultConfig } = require('expo/metro-config'); +const { mergeConfig } = require('@react-native/metro-config'); /** * Metro configuration diff --git a/package-lock.json b/package-lock.json index ff7a11d54..1e04884c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,12 +56,14 @@ "electrum-client": "github:BlueWallet/rn-electrum-client#d9f511d", "electrum-mnemonic": "2.0.0", "events": "3.3.0", - "lottie-react-native": "7.2.4", + "expo": "^55.0.21", + "expo-dev-client": "~55.0.32", + "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", - "react": "19.0.0", + "react": "19.2.0", "react-localization": "github:BlueWallet/react-localization#ae7969a", - "react-native": "0.78.2", + "react-native": "0.83.6", "react-native-biometrics": "3.0.1", "react-native-blue-crypto": "github:BlueWallet/react-native-blue-crypto#3cb5442", "react-native-camera-kit": "15.0.1", @@ -70,7 +72,7 @@ "react-native-device-info": "14.0.4", "react-native-draglist": "github:BlueWallet/react-native-draglist#354c28e", "react-native-fs": "2.20.0", - "react-native-gesture-handler": "2.25.0", + "react-native-gesture-handler": "~2.30.0", "react-native-get-random-values": "1.11.0", "react-native-haptic-feedback": "2.3.3", "react-native-image-picker": "8.2.1", @@ -83,12 +85,12 @@ "react-native-qrcode-svg": "6.3.15", "react-native-quick-actions": "0.3.13", "react-native-rate": "1.2.12", - "react-native-reanimated": "3.18.0", - "react-native-safe-area-context": "5.5.2", - "react-native-screens": "4.11.1", + "react-native-reanimated": "4.2.1", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.23.0", "react-native-secure-key-store": "github:BlueWallet/react-native-secure-key-store#2076b4849e88aa0a78e08bfbb4ce3923e0925cbc", "react-native-share": "12.1.0", - "react-native-svg": "15.12.1", + "react-native-svg": "15.15.3", "react-native-tcp-socket": "6.3.0", "react-native-vector-icons": "10.2.0", "react-native-watch-connectivity": "1.1.0", @@ -118,12 +120,13 @@ "@types/create-hash": "^1.2.2", "@types/crypto-js": "^4.2.2", "@types/jest": "^29.5.13", - "@types/react": "^18.2.16", + "@types/react": "~19.2.10", "@types/react-native-push-notification": "^8.1.4", "@types/react-test-renderer": "^19.0.0", "@types/wif": "^2.0.5", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", + "babel-preset-expo": "^55.0.20", "detox": "^20.40.2", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", @@ -143,7 +146,7 @@ "node-fetch": "^2.6.7", "prettier": "^3.2.5", "ts-jest": "^29.1.1", - "typescript": "^5.1.6" + "typescript": "~5.9.2" }, "engines": { "node": ">=20" @@ -165,12 +168,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -233,15 +236,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -249,12 +252,12 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -277,17 +280,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.29.0", "semver": "^6.3.1" }, "engines": { @@ -339,27 +342,36 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -395,9 +407,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -421,14 +433,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -460,9 +472,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -503,12 +515,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", - "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -633,6 +645,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-proposal-export-default-from": { "version": "7.25.9", "license": "MIT", @@ -779,6 +808,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "license": "MIT", @@ -867,10 +911,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1093,7 +1139,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", @@ -1243,7 +1288,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1626,10 +1670,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1639,14 +1685,31 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1681,6 +1744,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", @@ -1797,6 +1876,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -2019,6 +2099,26 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/preset-typescript": { "version": "7.27.0", "license": "MIT", @@ -2090,32 +2190,32 @@ } }, "node_modules/@babel/template": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", - "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" @@ -2139,13 +2239,13 @@ } }, "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2487,646 +2587,934 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@flatten-js/interval-tree": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.4.tgz", - "integrity": "sha512-o4emRDDvGdkwX18BSVSXH8q27qAL7Z2WDHSN75C8xyRSE4A8UOkig0mWSGoT5M5KaTHZxoLmalFwOTQmbRusUg==", - "dev": true, - "license": "MIT" + "node_modules/@expo/cli": { + "version": "55.0.28", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-55.0.28.tgz", + "integrity": "sha512-N3ZdMc5h9BZE2jn9O8xR2umJij+C7h1BMhZATw37zuTbh/JIcqBdfY5xRbpnMGw0VvNdK15nh89NYc8SzLUtow==", + "license": "MIT", + "dependencies": { + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~55.0.15", + "@expo/config-plugins": "~55.0.8", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.1.1", + "@expo/image-utils": "^0.8.13", + "@expo/json-file": "^10.0.13", + "@expo/log-box": "55.0.11", + "@expo/metro": "~55.1.1", + "@expo/metro-config": "~55.0.19", + "@expo/osascript": "^2.4.2", + "@expo/package-manager": "^1.10.4", + "@expo/plist": "^0.5.2", + "@expo/prebuild-config": "^55.0.16", + "@expo/require-utils": "^55.0.4", + "@expo/router-server": "^55.0.15", + "@expo/schema-utils": "^55.0.3", + "@expo/spawn-async": "^1.7.2", + "@expo/ws-tunnel": "^1.0.1", + "@expo/xcpretty": "^4.4.0", + "@react-native/dev-middleware": "0.83.6", + "accepts": "^1.3.8", + "arg": "^5.0.2", + "better-opn": "~3.0.2", + "bplist-creator": "0.1.0", + "bplist-parser": "^0.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "debug": "^4.3.4", + "dnssd-advertise": "^1.1.4", + "expo-server": "^55.0.8", + "fetch-nodeshim": "^0.4.10", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "lan-network": "^0.2.1", + "multitars": "^1.0.0", + "node-forge": "^1.3.3", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "picomatch": "^4.0.3", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "send": "^0.19.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "terminal-link": "^2.1.1", + "toqr": "^0.1.1", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1", + "zod": "^3.25.76" + }, + "bin": { + "expo-internal": "build/bin/cli" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true + } + } }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause" + "node_modules/@expo/cli/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" + "node_modules/@expo/cli/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "dev": true, - "license": "Apache-2.0", + "node_modules/@expo/cli/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=10.10.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, + "node_modules/@expo/cli/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", + "node_modules/@expo/cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, + "color-name": "1.1.3" + } + }, + "node_modules/@expo/cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@expo/cli/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=0.8.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", + "node_modules/@expo/cli/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, "engines": { - "node": ">=12.22" + "node": "18 || 20 || >=22" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "license": "ISC", + "node_modules/@expo/cli/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "license": "ISC", + "node_modules/@expo/cli/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "chalk": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", + "node_modules/@expo/cli/node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/@expo/cli/node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/@expo/cli/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/cli/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", "dependencies": { - "p-try": "^2.0.0" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=6" + "node": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/@expo/cli/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "mimic-fn": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "node_modules/@expo/cli/node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@jest/console": { - "version": "27.5.1", - "dev": true, + "node_modules/@expo/cli/node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" + "color-convert": "^1.9.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=4" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/cli/node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=4" + } + }, + "node_modules/@expo/cli/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@jest/core/node_modules/@jest/console": { + "node_modules/@expo/cli/node_modules/pretty-format": { "version": "29.7.0", - "dev": true, + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/core/node_modules/@jest/reporters": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/cli/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "license": "MIT", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" + } + }, + "node_modules/@expo/cli/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/cli/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@expo/cli/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/cli/node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "node-notifier": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { "optional": true } } }, - "node_modules/@jest/core/node_modules/@jest/test-result": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", + "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node-forge": "^1.3.3" } }, - "node_modules/@jest/core/node_modules/@jest/transform": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/config": { + "version": "55.0.15", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-55.0.15.tgz", + "integrity": "sha512-lHc0ELIQ8126jYOMZpLv3WIuvordW98jFg5aT/J1/12n2ycuXu01XLZkJsdw0avO34cusUYb1It+MvY8JiMduA==", "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@expo/config-plugins": "~55.0.8", + "@expo/config-types": "^55.0.5", + "@expo/json-file": "^10.0.13", + "@expo/require-utils": "^55.0.4", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4" } }, - "node_modules/@jest/core/node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, + "node_modules/@expo/config-plugins": { + "version": "55.0.8", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-55.0.8.tgz", + "integrity": "sha512-8WfWTRntTCcowfOS+tHdB0z98gKetTwktg4G5TWkCkXVa8Jt1NUnvzaaU4UHk2vbR2U4N84RyZJFizSwfF6C9g==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@expo/config-types": "^55.0.5", + "@expo/json-file": "~10.0.13", + "@expo/plist": "^0.5.2", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" } }, - "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "17.0.33", - "dev": true, + "node_modules/@expo/config-plugins/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, + "node_modules/@expo/config-plugins/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "balanced-match": "^4.0.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/core/node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@expo/config-plugins/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=10" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/core/node_modules/jest-haste-map": { - "version": "29.7.0", - "dev": true, - "license": "MIT", + "node_modules/@expo/config-plugins/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "brace-expansion": "^5.0.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "18 || 20 || >=22" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/core/node_modules/jest-message-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/@jest/core/node_modules/jest-regex-util": { - "version": "29.6.3", - "dev": true, + "node_modules/@expo/config-types": { + "version": "55.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-55.0.5.tgz", + "integrity": "sha512-sCmSUZG4mZ/ySXvfyyBdhjivz8Q539X1NondwDdYG7s3SBsk+wsgPJzYsqgAG/P9+l0xWjUD2F+kQ1cAJ6NNLg==", + "license": "MIT" + }, + "node_modules/@expo/config/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/core/node_modules/jest-resolve": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/config/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "balanced-match": "^4.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/core/node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", + "node_modules/@expo/config/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/core/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", + "node_modules/@expo/config/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "brace-expansion": "^5.0.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/devcert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", + "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@expo/sudo-prompt": "^9.3.1", + "debug": "^3.1.0" + } + }, + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@expo/devtools": { + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-55.0.2.tgz", + "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-native": { + "optional": true + } } }, - "node_modules/@jest/core/node_modules/resolve.exports": { - "version": "2.0.3", - "dev": true, + "node_modules/@expo/dom-webview": { + "version": "55.0.5", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-55.0.5.tgz", + "integrity": "sha512-lt3uxYOCk3wmWvtOOvsC35CKGbDAOx5C2EaY8SH1JVSfBzqmF8Cs0Xp1MPxncDPMyxpMiWx5SvvV/iLF1rJU4A==", "license": "MIT", - "engines": { - "node": ">=10" + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, - "node_modules/@jest/core/node_modules/semver": { - "version": "7.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@expo/env": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.1.1.tgz", + "integrity": "sha512-rVvHC4I6xlPcg+mAO09ydUi2Wjv1ZytpLmHOSzvXzBAz9mMrJggqCe4s4dubjJvi/Ino/xQCLhbaLCnTtLpikg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "getenv": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=20.12.0" } }, - "node_modules/@jest/core/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, + "node_modules/@expo/fingerprint": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.16.6.tgz", + "integrity": "sha512-nRITNbnu3RKSHPvKVehrSU4KG2VY9V8nvULOHBw98ukHCAU4bGrU5APvcblOkX3JAap+xEHsg/mZvqlvkLInmQ==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@expo/env": "^2.0.11", + "@expo/spawn-async": "^1.7.2", + "arg": "^5.0.2", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "ignore": "^5.3.1", + "minimatch": "^10.2.2", + "resolve-from": "^5.0.0", + "semver": "^7.6.0" }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/fingerprint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, + "node_modules/@expo/fingerprint/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/core/node_modules/v8-to-istanbul": { - "version": "9.3.0", - "dev": true, - "license": "ISC", + "node_modules/@expo/fingerprint/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=10.12.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/core/node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "license": "ISC", + "node_modules/@expo/fingerprint/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "brace-expansion": "^5.0.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3" + "node_modules/@expo/fingerprint/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { - "version": "29.6.3", + "node_modules/@expo/image-utils": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.13.tgz", + "integrity": "sha512-1I//yBQeTY6p0u1ihqGNDAr35EbSG8uFEupFrIF0jd++h9EWH33521yZJU1yE+mwGlzCb61g3ehu78siMhXBlA==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@expo/require-utils": "^55.0.4", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "getenv": "^2.0.0", + "jimp-compact": "0.16.1", + "parse-png": "^2.1.0", + "semver": "^7.6.0" + } + }, + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/@jest/create-cache-key-function/node_modules/@types/yargs": { - "version": "17.0.33", + "node_modules/@expo/json-file": { + "version": "10.0.13", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.13.tgz", + "integrity": "sha512-pX/XjQn7tgNw6zuuV2ikmegmwe/S7uiwhrs2wXrANMkq7ozrA+JcZwgW9Q/8WZgciBzfAhNp5hnackHcrmapQA==", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", + "node_modules/@expo/local-build-cache-provider": { + "version": "55.0.11", + "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-55.0.11.tgz", + "integrity": "sha512-rJ4RTCrkeKaXaido/bVyhl90ZRtVTOEbj59F1PWVjIEIVgjdlfc1J3VD9v7hEsbf/+8Tbr/PgvWhT6Visi5sLQ==", "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@expo/config": "~55.0.15", + "chalk": "^4.1.2" } }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "29.6.3", + "node_modules/@expo/log-box": { + "version": "55.0.11", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-55.0.11.tgz", + "integrity": "sha512-JQHFLWkskIbJi6cxYMjErx8lQqfFJilDQLKmdTO3m3YkdmN9GE/CrzjOfVlCG0DGEGZJ90br0pGKvGPdXNsHKw==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@expo/dom-webview": "^55.0.5", + "anser": "^1.4.9", + "stacktrace-parser": "^0.1.10" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@expo/dom-webview": "^55.0.5", + "expo": "*", + "react": "*", + "react-native": "*" } }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "17.0.33", + "node_modules/@expo/metro": { + "version": "55.1.1", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-55.1.1.tgz", + "integrity": "sha512-/wfXo5hTuAVpVLG/4hzlmD9NBGJkzkmBEMm/4VICajYRbj7y8OmqqPWbbymzHiBiHB6tI9BnsyXpQM6zVZEECg==", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "metro": "0.83.7", + "metro-babel-transformer": "0.83.7", + "metro-cache": "0.83.7", + "metro-cache-key": "0.83.7", + "metro-config": "0.83.7", + "metro-core": "0.83.7", + "metro-file-map": "0.83.7", + "metro-minify-terser": "0.83.7", + "metro-resolver": "0.83.7", + "metro-runtime": "0.83.7", + "metro-source-map": "0.83.7", + "metro-symbolicate": "0.83.7", + "metro-transform-plugins": "0.83.7", + "metro-transform-worker": "0.83.7" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro-config": { + "version": "55.0.19", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-55.0.19.tgz", + "integrity": "sha512-tOeSR0w81F4wJxLm77Ee1FkaUUOfx7DuYgpoaOCBqODJOODX5fTydLjQPvezMQtFJubh2XWM9+4QoScqLTWbig==", "license": "MIT", "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~55.0.15", + "@expo/env": "~2.1.1", + "@expo/json-file": "~10.0.13", + "@expo/metro": "~55.1.1", + "@expo/spawn-async": "^1.7.2", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.32.0", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "picomatch": "^4.0.3", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-config/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro-config/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3" + "balanced-match": "^4.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "license": "MIT", + "node_modules/@expo/metro-config/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "node_modules/@expo/metro-config/node_modules/hermes-estree": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.1.tgz", + "integrity": "sha512-ne5hkuDxheNBAikDjqvCZCwihnz0vVu9YsBzAEO1puiyFR4F1+PAz/SiPHSsNTuOveCYGRMX8Xbx4LOubeC0Qg==", + "license": "MIT" + }, + "node_modules/@expo/metro-config/node_modules/hermes-parser": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.1.tgz", + "integrity": "sha512-175dz634X/W5AiwrpLdoMl/MOb17poLHyIqgyExlE8D9zQ1OPnoORnGMB5ltRKnpvQzBjMYvT2rN/sHeIfZW5Q==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.1" + } + }, + "node_modules/@expo/metro-config/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/metro-config/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@expo/metro/node_modules/@jest/types": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -3140,43 +3528,53 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "17.0.33", + "node_modules/@expo/metro/node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, - "node_modules/@jest/fake-timers/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/@expo/metro/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/@jest/fake-timers/node_modules/jest-message-util": { - "version": "29.7.0", + "node_modules/@expo/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" + }, + "node_modules/@expo/metro/node_modules/hermes-estree": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", + "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", + "license": "MIT" + }, + "node_modules/@expo/metro/node_modules/hermes-parser": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", + "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "hermes-estree": "0.35.0" } }, - "node_modules/@jest/fake-timers/node_modules/jest-util": { + "node_modules/@expo/metro/node_modules/jest-util": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -3190,312 +3588,363 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/pretty-format": { - "version": "29.7.0", + "node_modules/@expo/metro/node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/globals": { + "node_modules/@expo/metro/node_modules/jest-worker": { "version": "29.7.0", - "dev": true, + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/globals/node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, + "node_modules/@expo/metro/node_modules/metro": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.7.tgz", + "integrity": "sha512-SPaPEyvTsTmd0LpT7RaZciQyDw2i/JB7+iY9L5VfBo72+psescFxBqpI1TL9dnL+pmnfkU+l/J1mEEGLeF65EQ==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@babel/code-frame": "^7.29.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "accepts": "^2.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.35.0", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.83.7", + "metro-cache": "0.83.7", + "metro-cache-key": "0.83.7", + "metro-config": "0.83.7", + "metro-core": "0.83.7", + "metro-file-map": "0.83.7", + "metro-resolver": "0.83.7", + "metro-runtime": "0.83.7", + "metro-source-map": "0.83.7", + "metro-symbolicate": "0.83.7", + "metro-transform-plugins": "0.83.7", + "metro-transform-worker": "0.83.7", + "mime-types": "^3.0.1", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/globals/node_modules/@types/yargs": { - "version": "17.0.33", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-babel-transformer": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.7.tgz", + "integrity": "sha512-sBqBkt6kNut/88bv+Ucvm4yqdPetbvAEsHzi3MAgJEifOSYYzX5Z5Kgw3TFOrwf/mHJTOBG2ONlaMHoyfP15TA==", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@babel/core": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.35.0", + "metro-cache-key": "0.83.7", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-cache": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.7.tgz", + "integrity": "sha512-E9SRePXQ1Zvlj79VcOk57q7VC7rMHMFQ+jhmPHBiq+dJ0bJB5BL87lWZF6oh5X76Cci5tpDuQNaDwwuSCToEeg==", "license": "MIT", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "https-proxy-agent": "^7.0.5", + "metro-core": "0.83.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=20.19.4" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", + "node_modules/@expo/metro/node_modules/metro-cache-key": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.7.tgz", + "integrity": "sha512-W1c2Nmx8MiJTJt+eWhMO08z9VKi3kZOaz99IYGdqeqDgY9j+yZjXl62rUav4Di0heZfh4/n2s722PqRL1OODeg==", "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-config": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.7.tgz", + "integrity": "sha512-83mjWFbFOt2GeJ6pFIum5mSnc1uTsZJAtD8o4ej0s4NVsYsA7fB+pHvTfHhFrpeMONaobu2riKavkPei05Er/Q==", "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "connect": "^3.6.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.7.0", + "metro": "0.83.7", + "metro-cache": "0.83.7", + "metro-core": "0.83.7", + "metro-runtime": "0.83.7", + "yaml": "^2.6.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-core": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.7.tgz", + "integrity": "sha512-6yn3w1wnltT6RQl7p7YES2l95ArC+mWrOssEiH8p5/DDrJS65/szf9LsC9JrBv8c5DdvSY3V3f0GRYg0Ox7hCg==", "license": "MIT", "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.83.7" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-file-map": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.7.tgz", + "integrity": "sha512-+j0F1m+FQYVAQ6syf+mwhIPV5GoFQrkInX8bppuc50IzNsZbMrp8R5H/Sx/K2daQ3YEa9F/XwkeZT8gzJfgeCw==", "license": "MIT", "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "debug": "^4.4.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer/node_modules/@jest/console": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-minify-terser": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.7.tgz", + "integrity": "sha512-MfJar2IS4tBRuLb9svwb0Gu5l9BsH+pcRm8eGcEi/wy8MzZinfinh5dFLt2nWkocnulIgtGB5NkFDdbXqMXKhQ==", "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer/node_modules/@jest/test-result": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-resolver": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.7.tgz", + "integrity": "sha512-WSJIENlMcoSsuz66IfBHOkgfp3KJt2UW2TnEHPf1b8pIG2eEXNOVmo2+03A0H17WY2XGXWgxL0CG7FAopqgB1A==", "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer/node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-runtime": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.7.tgz", + "integrity": "sha512-9GKkJURaB2iyYoEExKnedzAHzxmKtSi+k0tsZUvMoU27tBZJElchYt7JH/Ai/XzYAI9lCAaV7u5HZSI8J5Z+wQ==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer/node_modules/@types/yargs": { - "version": "17.0.33", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-source-map": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.7.tgz", + "integrity": "sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw==", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.83.7", + "nullthrows": "^1.1.1", + "ob1": "0.83.7", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-symbolicate": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.7.tgz", + "integrity": "sha512-g4suyxw20WOHWI680c+Kq4wC/NF+Hx5pRH9afrMp+sMTxqLeKcPR1Xf4wMhsjlbvx7LbIREdke6q928jEjvJWw==", "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.83.7", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "vlq": "^1.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-transform-plugins": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.7.tgz", + "integrity": "sha512-Ss0FpBiZDjX2kwhukMDl5sNdYK8T/06IPqxNE4H6PTlRlfs9q11cef13c/xESY/Pm4VCkp1yJUZO3kXzvMxQFA==", "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "@babel/core": "^7.25.2", + "@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" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-message-util": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro/node_modules/metro-transform-worker": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.7.tgz", + "integrity": "sha512-UegCo7ygB2fT64mRK2nbAjQVJ1zSwIIHy8d96jJv2nKZFDaViYBiughEdu5HM/Ceq0WN3LZrZk3zhl9aoiLYFw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "@babel/core": "^7.25.2", + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "flow-enums-runtime": "^0.0.6", + "metro": "0.83.7", + "metro-babel-transformer": "0.83.7", + "metro-cache": "0.83.7", + "metro-cache-key": "0.83.7", + "metro-minify-terser": "0.83.7", + "metro-source-map": "0.83.7", + "metro-transform-plugins": "0.83.7", + "nullthrows": "^1.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-regex-util": { - "version": "29.6.3", - "dev": true, + "node_modules/@expo/metro/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-util": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.6" } }, - "node_modules/@jest/test-sequencer/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro/node_modules/ob1": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.7.tgz", + "integrity": "sha512-9M5kpuOLyTPogMtZiQUIxdAZxl7Dxs6tVBbJErSumsqGMuhVSoUbkfeZ3XNPpLpwBBtqY5QDUzGwggLHX3slQg==", "license": "MIT", "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.19.4" } }, - "node_modules/@jest/test-sequencer/node_modules/pretty-format": { - "version": "29.7.0", - "dev": true, + "node_modules/@expo/metro/node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/@jest/test-sequencer/node_modules/supports-color": { + "node_modules/@expo/metro/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@expo/metro/node_modules/supports-color": { "version": "8.1.1", - "dev": true, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -3507,357 +3956,1753 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "dev": true, + "node_modules/@expo/metro/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@jest/types": { - "version": "27.5.1", - "dev": true, + "node_modules/@expo/osascript": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.2.tgz", + "integrity": "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "@expo/spawn-async": "^1.7.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", + "node_modules/@expo/package-manager": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.4.tgz", + "integrity": "sha512-y9Mr4Kmpk4abAVZrNNPCdzOZr8nLLyi18p1SXr0RCVA8IfzqZX/eY4H+50a0HTmXqIsPZrQdcdb4I3ekMS9GvQ==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "@expo/json-file": "^10.0.13", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", + "node_modules/@expo/package-manager/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", + "node_modules/@expo/package-manager/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", + "node_modules/@expo/package-manager/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "color-name": "1.1.3" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", + "node_modules/@expo/package-manager/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", + "node_modules/@expo/package-manager/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@keystonehq/alias-sampling": { - "version": "0.1.2", - "license": "MIT" + "node_modules/@expo/package-manager/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "node_modules/@keystonehq/bc-ur-registry": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@keystonehq/bc-ur-registry/-/bc-ur-registry-0.7.1.tgz", - "integrity": "sha512-6eVIjNt/P+BmuwcYccbPYVS85473SFNplkqWF/Vb3ePCzLX00tn0WZBO1FGpS4X4nfXtceTfvUeNvQKoTGtXrw==", - "license": "Apache-2.0", + "node_modules/@expo/package-manager/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "license": "MIT", "dependencies": { - "@ngraveio/bc-ur": "^1.1.5", - "bs58check": "^2.1.2", - "tslib": "^2.3.0" + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@lodev09/react-native-true-sheet": { - "version": "2.0.0", - "resolved": "git+ssh://git@github.com/BlueWallet/react-native-true-sheet.git#5945184a2fea9fe5ba8f5cfcdb20e3fc5eed6e37", - "integrity": "sha512-Fphn9L0Qffjue7fUgW6A1srV6zdVXn68Uhq7WodwUJH8g9Lxys9JpwyxLrrYoQOiQhVYOye9+B7jPKZwd3slhQ==", + "node_modules/@expo/package-manager/node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", - "workspaces": [ - "example", - "docs" - ], - "peerDependencies": { - "react": "*", - "react-native": "*" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@ngraveio/bc-ur": { - "version": "1.1.13", + "node_modules/@expo/package-manager/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "license": "MIT", - "dependencies": { - "@keystonehq/alias-sampling": "^0.1.1", - "assert": "^2.0.0", - "bignumber.js": "^9.0.1", - "cbor-sync": "^1.0.4", - "crc": "^3.8.0", - "jsbi": "^3.1.5", - "sha.js": "^2.4.11" + "engines": { + "node": ">=4" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "dev": true, + "node_modules/@expo/package-manager/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "license": "MIT", "dependencies": { - "eslint-scope": "5.1.1" + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "node_modules/@expo/package-manager/node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "license": "MIT", - "engines": { - "node": ">= 16" + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=6" } }, - "node_modules/@noble/secp256k1": { - "version": "1.6.3", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "node_modules/@expo/package-manager/node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@expo/package-manager/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/@expo/package-manager/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/@pkgr/core": { - "version": "0.2.0", - "dev": true, + "node_modules/@expo/plist": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.5.2.tgz", + "integrity": "sha512-o4xdVdBpe4aTl3sPMZ2u3fJH4iG1I768EIRk1xRZP+GaFI93MaR3JvoFibYqxeTmLQ1p1kNEVqylfUjezxx45g==", "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + } + }, + "node_modules/@expo/prebuild-config": { + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.16.tgz", + "integrity": "sha512-o4EAVgDGk1lISirtMD8hciO2vyMp7cWlPdfTtjjd5AXSfODVYDIDhygXrfvVQHmJXAztVqPUTKJT+BYOsVkYGQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~55.0.15", + "@expo/config-plugins": "~55.0.8", + "@expo/config-types": "^55.0.5", + "@expo/image-utils": "^0.8.13", + "@expo/json-file": "^10.0.13", + "@react-native/normalize-colors": "0.83.6", + "debug": "^4.3.1", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" }, - "funding": { - "url": "https://opencollective.com/unts" + "peerDependencies": { + "expo": "*" } }, - "node_modules/@react-native-async-storage/async-storage": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz", - "integrity": "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==", + "node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/require-utils": { + "version": "55.0.4", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.4.tgz", + "integrity": "sha512-JAANvXqV7MOysWeVWgaiDzikoyDjJWOV/ulOW60Zb3kXJfrx2oZOtGtDXDFKD1mXuahQgoM5QOjuZhF7gFRNjA==", "license": "MIT", "dependencies": { - "merge-options": "^3.0.4" + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8" }, "peerDependencies": { - "react-native": "^0.0.0-0 || >=0.65 <1.0" + "typescript": "^5.0.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@react-native-clipboard/clipboard": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.16.3.tgz", - "integrity": "sha512-cMIcvoZKIrShzJHEaHbTAp458R9WOv0fB6UyC7Ek4Qk561Ow/DrzmmJmH/rAZg21Z6ixJ4YSdFDC14crqIBmCQ==", + "node_modules/@expo/router-server": { + "version": "55.0.15", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-55.0.15.tgz", + "integrity": "sha512-6LksYO4Pg13qroL138KfUebt/x/EO07zVhdyT/nTgcxnpn6CS4ecTl3DciSKhxbaH+0BVLdANkxYeGdp43TMwQ==", "license": "MIT", - "workspaces": [ - "example" - ], + "dependencies": { + "debug": "^4.3.4" + }, "peerDependencies": { - "react": ">= 16.9.0", - "react-native": ">= 0.61.5", - "react-native-macos": ">= 0.61.0", - "react-native-windows": ">= 0.61.0" + "@expo/metro-runtime": "^55.0.10", + "expo": "*", + "expo-constants": "^55.0.15", + "expo-font": "^55.0.6", + "expo-router": "*", + "expo-server": "^55.0.8", + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" }, "peerDependenciesMeta": { - "react-native-macos": { + "@expo/metro-runtime": { "optional": true }, - "react-native-windows": { + "expo-router": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-server-dom-webpack": { "optional": true } } }, - "node_modules/@react-native-community/cli": { - "version": "15.1.3", + "node_modules/@expo/schema-utils": { + "version": "55.0.3", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.3.tgz", + "integrity": "sha512-l9KHVjTo6MvoeyvwNr6AjckGJm8NIcqZ3QSAh51cWozXW9v2AUjyCyqYtFtyntLWRZ0x/ByYJishpQo4ZQq45Q==", + "license": "MIT" + }, + "node_modules/@expo/sdk-runtime-versions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", + "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", + "license": "MIT" + }, + "node_modules/@expo/spawn-async": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", + "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", "license": "MIT", "dependencies": { - "@react-native-community/cli-clean": "15.1.3", - "@react-native-community/cli-config": "15.1.3", - "@react-native-community/cli-debugger-ui": "15.1.3", - "@react-native-community/cli-doctor": "15.1.3", - "@react-native-community/cli-server-api": "15.1.3", - "@react-native-community/cli-tools": "15.1.3", - "@react-native-community/cli-types": "15.1.3", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "deepmerge": "^4.3.0", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.2", - "semver": "^7.5.2" - }, - "bin": { - "rnc-cli": "build/bin.js" + "cross-spawn": "^7.0.3" }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@react-native-community/cli-clean": { - "version": "15.1.3", + "node_modules/@expo/sudo-prompt": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", + "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", + "license": "MIT" + }, + "node_modules/@expo/vector-icons": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", + "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", "license": "MIT", - "dependencies": { - "@react-native-community/cli-tools": "15.1.3", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "peerDependencies": { + "expo-font": ">=14.0.4", + "react": "*", + "react-native": "*" } }, - "node_modules/@react-native-community/cli-config": { - "version": "15.1.3", - "license": "MIT", + "node_modules/@expo/ws-tunnel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", + "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", + "license": "MIT" + }, + "node_modules/@expo/xcpretty": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.3.tgz", + "integrity": "sha512-wC562eD3gS6vO2tWHToFhlFnmHKfKHgF1oyvojeSkLK/ZYop1bMU+7cOMiF9Sq70CzcsLy/EMRy/uRc76QmNRw==", + "license": "BSD-3-Clause", "dependencies": { - "@react-native-community/cli-tools": "15.1.3", - "chalk": "^4.1.2", - "cosmiconfig": "^9.0.0", - "deepmerge": "^4.3.0", - "fast-glob": "^3.3.2", - "joi": "^17.2.1" + "@babel/code-frame": "^7.20.0", + "chalk": "^4.1.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "excpretty": "build/cli.js" } }, - "node_modules/@react-native-community/cli-config-android": { - "version": "15.1.3", + "node_modules/@expo/xcpretty/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@expo/xcpretty/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { - "@react-native-community/cli-tools": "15.1.3", - "chalk": "^4.1.2", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.4.1" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@react-native-community/cli-config-apple": { - "version": "15.1.3", - "license": "MIT", + "node_modules/@flatten-js/interval-tree": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.4.tgz", + "integrity": "sha512-o4emRDDvGdkwX18BSVSXH8q27qAL7Z2WDHSN75C8xyRSE4A8UOkig0mWSGoT5M5KaTHZxoLmalFwOTQmbRusUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "license": "BSD-3-Clause", "dependencies": { - "@react-native-community/cli-tools": "15.1.3", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@react-native-community/cli-debugger-ui": { - "version": "15.1.3", - "license": "MIT", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "serve-static": "^1.13.1" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@react-native-community/cli-doctor": { - "version": "15.1.3", + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, "license": "MIT", "dependencies": { - "@react-native-community/cli-config": "15.1.3", - "@react-native-community/cli-platform-android": "15.1.3", - "@react-native-community/cli-platform-apple": "15.1.3", - "@react-native-community/cli-platform-ios": "15.1.3", - "@react-native-community/cli-tools": "15.1.3", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.13.0", - "execa": "^5.0.0", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/semver": { - "version": "7.7.1", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/@react-native-community/cli-platform-android": { - "version": "15.1.3", - "license": "MIT", - "dependencies": { + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/@jest/reporters": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/@types/yargs": { + "version": "17.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/resolve.exports": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/v8-to-istanbul": { + "version": "9.3.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@jest/core/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/@types/yargs": { + "version": "17.0.33", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "17.0.33", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "17.0.33", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/pretty-format": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@types/yargs": { + "version": "17.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@types/yargs": { + "version": "17.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-sequencer/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@keystonehq/alias-sampling": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/@keystonehq/bc-ur-registry": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@keystonehq/bc-ur-registry/-/bc-ur-registry-0.7.1.tgz", + "integrity": "sha512-6eVIjNt/P+BmuwcYccbPYVS85473SFNplkqWF/Vb3ePCzLX00tn0WZBO1FGpS4X4nfXtceTfvUeNvQKoTGtXrw==", + "license": "Apache-2.0", + "dependencies": { + "@ngraveio/bc-ur": "^1.1.5", + "bs58check": "^2.1.2", + "tslib": "^2.3.0" + } + }, + "node_modules/@lodev09/react-native-true-sheet": { + "version": "2.0.0", + "resolved": "git+ssh://git@github.com/BlueWallet/react-native-true-sheet.git#5945184a2fea9fe5ba8f5cfcdb20e3fc5eed6e37", + "integrity": "sha512-Fphn9L0Qffjue7fUgW6A1srV6zdVXn68Uhq7WodwUJH8g9Lxys9JpwyxLrrYoQOiQhVYOye9+B7jPKZwd3slhQ==", + "license": "MIT", + "workspaces": [ + "example", + "docs" + ], + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/@ngraveio/bc-ur": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "@keystonehq/alias-sampling": "^0.1.1", + "assert": "^2.0.0", + "bignumber.js": "^9.0.1", + "cbor-sync": "^1.0.4", + "crc": "^3.8.0", + "jsbi": "^3.1.5", + "sha.js": "^2.4.11" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "1.6.3", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@react-native-async-storage/async-storage": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz", + "integrity": "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==", + "license": "MIT", + "dependencies": { + "merge-options": "^3.0.4" + }, + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.65 <1.0" + } + }, + "node_modules/@react-native-clipboard/clipboard": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.16.3.tgz", + "integrity": "sha512-cMIcvoZKIrShzJHEaHbTAp458R9WOv0fB6UyC7Ek4Qk561Ow/DrzmmJmH/rAZg21Z6ixJ4YSdFDC14crqIBmCQ==", + "license": "MIT", + "workspaces": [ + "example" + ], + "peerDependencies": { + "react": ">= 16.9.0", + "react-native": ">= 0.61.5", + "react-native-macos": ">= 0.61.0", + "react-native-windows": ">= 0.61.0" + }, + "peerDependenciesMeta": { + "react-native-macos": { + "optional": true + }, + "react-native-windows": { + "optional": true + } + } + }, + "node_modules/@react-native-community/cli": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-clean": "15.1.3", + "@react-native-community/cli-config": "15.1.3", + "@react-native-community/cli-debugger-ui": "15.1.3", + "@react-native-community/cli-doctor": "15.1.3", + "@react-native-community/cli-server-api": "15.1.3", + "@react-native-community/cli-tools": "15.1.3", + "@react-native-community/cli-types": "15.1.3", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "deepmerge": "^4.3.0", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "prompts": "^2.4.2", + "semver": "^7.5.2" + }, + "bin": { + "rnc-cli": "build/bin.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native-community/cli-clean": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-tools": "15.1.3", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2" + } + }, + "node_modules/@react-native-community/cli-config": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-tools": "15.1.3", + "chalk": "^4.1.2", + "cosmiconfig": "^9.0.0", + "deepmerge": "^4.3.0", + "fast-glob": "^3.3.2", + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli-config-android": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-tools": "15.1.3", + "chalk": "^4.1.2", + "fast-glob": "^3.3.2", + "fast-xml-parser": "^4.4.1" + } + }, + "node_modules/@react-native-community/cli-config-apple": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-tools": "15.1.3", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-glob": "^3.3.2" + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-config": "15.1.3", + "@react-native-community/cli-platform-android": "15.1.3", + "@react-native-community/cli-platform-apple": "15.1.3", + "@react-native-community/cli-platform-ios": "15.1.3", + "@react-native-community/cli-tools": "15.1.3", + "chalk": "^4.1.2", + "command-exists": "^1.2.8", + "deepmerge": "^4.3.0", + "envinfo": "^7.13.0", + "execa": "^5.0.0", + "node-stream-zip": "^1.9.1", + "ora": "^5.4.1", + "semver": "^7.5.2", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1", + "yaml": "^2.2.1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/semver": { + "version": "7.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { "@react-native-community/cli-config-android": "15.1.3", "@react-native-community/cli-tools": "15.1.3", "chalk": "^4.1.2", @@ -3865,281 +5710,661 @@ "logkitty": "^0.7.1" } }, - "node_modules/@react-native-community/cli-platform-apple": { - "version": "15.1.3", + "node_modules/@react-native-community/cli-platform-apple": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-config-apple": "15.1.3", + "@react-native-community/cli-tools": "15.1.3", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-xml-parser": "^4.4.1" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-platform-apple": "15.1.3" + } + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-debugger-ui": "15.1.3", + "@react-native-community/cli-tools": "15.1.3", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^6.2.3" + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "open": "^6.2.0", + "ora": "^5.4.1", + "prompts": "^2.4.2", + "semver": "^7.5.2", + "shell-quote": "^1.7.3", + "sudo-prompt": "^9.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/semver": { + "version": "7.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-types": { + "version": "15.1.3", + "license": "MIT", + "dependencies": { + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli/node_modules/semver": { + "version": "7.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/push-notification-ios": { + "version": "1.11.0", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": ">=16.6.3", + "react-native": ">=0.58.4" + } + }, + "node_modules/@react-native-documents/picker": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/@react-native-documents/picker/-/picker-10.1.5.tgz", + "integrity": "sha512-ajn55rNyxUqbQbz5gmm9gYFI1ifHBmMLH4jVWViA7IFqk1EiEM+pJcpoHizWr5hetR6tzQsaoI4vzCNv/WyA7w==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/@react-native-menu/menu": { + "version": "1.2.4", + "resolved": "git+ssh://git@github.com/BlueWallet/menu.git#9933468ad6c85c62e455d29fbd079ae9c4a2ef2c", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.6.tgz", + "integrity": "sha512-iljb4ue1yWJ3EhySz7EjV6CzSVrI2uNtR8BI2jzP5+QS5E4Cl3fdIJRmVwDEx1pu8uE97PGEusGRHnoaZ9Q3jg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.78.2", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.78.2.tgz", + "integrity": "sha512-0MnQOhIaOdWbQ3Dx3dz0MBbG+1ggBiyUL+Y+xHAeSDSaiRATT8DIsrSloeJU0A+2p5TxF8ITJyJ6KEQkMyB/Zw==", "license": "MIT", "dependencies": { - "@react-native-community/cli-config-apple": "15.1.3", - "@react-native-community/cli-tools": "15.1.3", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.4.1" + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.78.2" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@react-native-community/cli-platform-ios": { - "version": "15.1.3", + "node_modules/@react-native/babel-preset": { + "version": "0.78.2", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.78.2.tgz", + "integrity": "sha512-VGOLhztQY/0vktMXrBr01HUN/iBSdkKBRiiZYfrLqx9fB2ql55gZb/6X9lzItjVyYoOc2jyHXSX8yoSfDcWDZg==", "license": "MIT", "dependencies": { - "@react-native-community/cli-platform-apple": "15.1.3" + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.78.2", + "babel-plugin-syntax-hermes-parser": "0.25.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" } }, - "node_modules/@react-native-community/cli-server-api": { - "version": "15.1.3", + "node_modules/@react-native/codegen": { + "version": "0.78.2", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.78.2.tgz", + "integrity": "sha512-4r3/W1h22/GAmAMuMRMJWsw/9JGUEDAnSbYNya7zID1XSvizLoA5Yn8Qv+phrRwwsl0eZLxOqONh/nzXJcvpyg==", "license": "MIT", "dependencies": { - "@react-native-community/cli-debugger-ui": "15.1.3", - "@react-native-community/cli-tools": "15.1.3", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^6.2.3" + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.25.1", + "invariant": "^2.2.4", + "jscodeshift": "^17.0.0", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" } }, - "node_modules/@react-native-community/cli-tools": { - "version": "15.1.3", + "node_modules/@react-native/community-cli-plugin": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.6.tgz", + "integrity": "sha512-Mko6mywoHYJmpBnjwAC95vQWaUUh//71knFadH0BrhHDq2m7i/IrpLwcQsPAy8855ucXflBs5zQyGTpNbPBAaw==", "license": "MIT", "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "open": "^6.2.0", - "ora": "^5.4.1", - "prompts": "^2.4.2", - "semver": "^7.5.2", - "shell-quote": "^1.7.3", - "sudo-prompt": "^9.0.0" + "@react-native/dev-middleware": "0.83.6", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "metro": "^0.83.6", + "metro-config": "^0.83.6", + "metro-core": "^0.83.6", + "semver": "^7.1.3" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@react-native-community/cli": "*", + "@react-native/metro-config": "*" + }, + "peerDependenciesMeta": { + "@react-native-community/cli": { + "optional": true + }, + "@react-native/metro-config": { + "optional": true + } } }, - "node_modules/@react-native-community/cli-tools/node_modules/semver": { - "version": "7.7.1", - "license": "ISC", + "node_modules/@react-native/community-cli-plugin/node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" + }, + "node_modules/@react-native/community-cli-plugin/node_modules/hermes-estree": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", + "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==", + "license": "MIT" + }, + "node_modules/@react-native/community-cli-plugin/node_modules/hermes-parser": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz", + "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.35.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/metro": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.7.tgz", + "integrity": "sha512-SPaPEyvTsTmd0LpT7RaZciQyDw2i/JB7+iY9L5VfBo72+psescFxBqpI1TL9dnL+pmnfkU+l/J1mEEGLeF65EQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "accepts": "^2.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.35.0", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.83.7", + "metro-cache": "0.83.7", + "metro-cache-key": "0.83.7", + "metro-config": "0.83.7", + "metro-core": "0.83.7", + "metro-file-map": "0.83.7", + "metro-resolver": "0.83.7", + "metro-runtime": "0.83.7", + "metro-source-map": "0.83.7", + "metro-symbolicate": "0.83.7", + "metro-transform-plugins": "0.83.7", + "metro-transform-worker": "0.83.7", + "mime-types": "^3.0.1", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, "bin": { - "semver": "bin/semver.js" + "metro": "src/cli.js" }, "engines": { - "node": ">=10" + "node": ">=20.19.4" } }, - "node_modules/@react-native-community/cli-types": { - "version": "15.1.3", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-babel-transformer": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.7.tgz", + "integrity": "sha512-sBqBkt6kNut/88bv+Ucvm4yqdPetbvAEsHzi3MAgJEifOSYYzX5Z5Kgw3TFOrwf/mHJTOBG2ONlaMHoyfP15TA==", "license": "MIT", "dependencies": { - "joi": "^17.2.1" + "@babel/core": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.35.0", + "metro-cache-key": "0.83.7", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@react-native-community/cli/node_modules/semver": { - "version": "7.7.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@react-native/community-cli-plugin/node_modules/metro-cache": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.7.tgz", + "integrity": "sha512-E9SRePXQ1Zvlj79VcOk57q7VC7rMHMFQ+jhmPHBiq+dJ0bJB5BL87lWZF6oh5X76Cci5tpDuQNaDwwuSCToEeg==", + "license": "MIT", + "dependencies": { + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "https-proxy-agent": "^7.0.5", + "metro-core": "0.83.7" }, "engines": { - "node": ">=10" + "node": ">=20.19.4" } }, - "node_modules/@react-native-community/push-notification-ios": { - "version": "1.11.0", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-cache-key": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.7.tgz", + "integrity": "sha512-W1c2Nmx8MiJTJt+eWhMO08z9VKi3kZOaz99IYGdqeqDgY9j+yZjXl62rUav4Di0heZfh4/n2s722PqRL1OODeg==", "license": "MIT", "dependencies": { - "invariant": "^2.2.4" + "flow-enums-runtime": "^0.0.6" }, - "peerDependencies": { - "react": ">=16.6.3", - "react-native": ">=0.58.4" + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@react-native-documents/picker": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@react-native-documents/picker/-/picker-10.1.5.tgz", - "integrity": "sha512-ajn55rNyxUqbQbz5gmm9gYFI1ifHBmMLH4jVWViA7IFqk1EiEM+pJcpoHizWr5hetR6tzQsaoI4vzCNv/WyA7w==", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-config": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.7.tgz", + "integrity": "sha512-83mjWFbFOt2GeJ6pFIum5mSnc1uTsZJAtD8o4ej0s4NVsYsA7fB+pHvTfHhFrpeMONaobu2riKavkPei05Er/Q==", "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" + "dependencies": { + "connect": "^3.6.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.7.0", + "metro": "0.83.7", + "metro-cache": "0.83.7", + "metro-core": "0.83.7", + "metro-runtime": "0.83.7", + "yaml": "^2.6.1" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@react-native-menu/menu": { - "version": "1.2.4", - "resolved": "git+ssh://git@github.com/BlueWallet/menu.git#9933468ad6c85c62e455d29fbd079ae9c4a2ef2c", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-core": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.7.tgz", + "integrity": "sha512-6yn3w1wnltT6RQl7p7YES2l95ArC+mWrOssEiH8p5/DDrJS65/szf9LsC9JrBv8c5DdvSY3V3f0GRYg0Ox7hCg==", "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.83.7" + }, + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@react-native/assets-registry": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.78.2.tgz", - "integrity": "sha512-VHqQqjj1rnh2KQeS3yx4IfFSxIIIDi1jR4yUeC438Q6srwxDohR4W0UkXuSIz0imhlems5eS7yZTjdgSpWHRUQ==", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-file-map": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.7.tgz", + "integrity": "sha512-+j0F1m+FQYVAQ6syf+mwhIPV5GoFQrkInX8bppuc50IzNsZbMrp8R5H/Sx/K2daQ3YEa9F/XwkeZT8gzJfgeCw==", "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, "engines": { - "node": ">=18" + "node": ">=20.19.4" } }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.78.2.tgz", - "integrity": "sha512-0MnQOhIaOdWbQ3Dx3dz0MBbG+1ggBiyUL+Y+xHAeSDSaiRATT8DIsrSloeJU0A+2p5TxF8ITJyJ6KEQkMyB/Zw==", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-minify-terser": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.7.tgz", + "integrity": "sha512-MfJar2IS4tBRuLb9svwb0Gu5l9BsH+pcRm8eGcEi/wy8MzZinfinh5dFLt2nWkocnulIgtGB5NkFDdbXqMXKhQ==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.78.2" + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" }, "engines": { - "node": ">=18" + "node": ">=20.19.4" } }, - "node_modules/@react-native/babel-preset": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.78.2.tgz", - "integrity": "sha512-VGOLhztQY/0vktMXrBr01HUN/iBSdkKBRiiZYfrLqx9fB2ql55gZb/6X9lzItjVyYoOc2jyHXSX8yoSfDcWDZg==", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-resolver": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.7.tgz", + "integrity": "sha512-WSJIENlMcoSsuz66IfBHOkgfp3KJt2UW2TnEHPf1b8pIG2eEXNOVmo2+03A0H17WY2XGXWgxL0CG7FAopqgB1A==", "license": "MIT", "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.78.2", - "babel-plugin-syntax-hermes-parser": "0.25.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" + "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/metro-runtime": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.7.tgz", + "integrity": "sha512-9GKkJURaB2iyYoEExKnedzAHzxmKtSi+k0tsZUvMoU27tBZJElchYt7JH/Ai/XzYAI9lCAaV7u5HZSI8J5Z+wQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" }, - "peerDependencies": { - "@babel/core": "*" + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@react-native/codegen": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.78.2.tgz", - "integrity": "sha512-4r3/W1h22/GAmAMuMRMJWsw/9JGUEDAnSbYNya7zID1XSvizLoA5Yn8Qv+phrRwwsl0eZLxOqONh/nzXJcvpyg==", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-source-map": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.7.tgz", + "integrity": "sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.25.1", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "jscodeshift": "^17.0.0", + "metro-symbolicate": "0.83.7", "nullthrows": "^1.1.1", - "yargs": "^17.6.2" + "ob1": "0.83.7", + "source-map": "^0.5.6", + "vlq": "^1.0.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" + "node": ">=20.19.4" } }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.78.2.tgz", - "integrity": "sha512-xqEnpqxvBlm02mRY58L0NBjF25MTHmbaeA2qBx5VtheH/pXL6MHUbtwB1Q2dJrg9XcK0Np1i9h7N5h9gFwA2Mg==", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-symbolicate": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.7.tgz", + "integrity": "sha512-g4suyxw20WOHWI680c+Kq4wC/NF+Hx5pRH9afrMp+sMTxqLeKcPR1Xf4wMhsjlbvx7LbIREdke6q928jEjvJWw==", "license": "MIT", "dependencies": { - "@react-native/dev-middleware": "0.78.2", - "@react-native/metro-babel-transformer": "0.78.2", - "chalk": "^4.0.0", - "debug": "^2.2.0", + "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro": "^0.81.3", - "metro-config": "^0.81.3", - "metro-core": "^0.81.3", - "readline": "^1.3.0", - "semver": "^7.1.3" + "metro-source-map": "0.83.7", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "vlq": "^1.0.0" }, - "engines": { - "node": ">=18" + "bin": { + "metro-symbolicate": "src/index.js" }, - "peerDependencies": { - "@react-native-community/cli": "*" + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/metro-transform-plugins": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.7.tgz", + "integrity": "sha512-Ss0FpBiZDjX2kwhukMDl5sNdYK8T/06IPqxNE4H6PTlRlfs9q11cef13c/xESY/Pm4VCkp1yJUZO3kXzvMxQFA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@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" }, - "peerDependenciesMeta": { - "@react-native-community/cli": { - "optional": true - } + "engines": { + "node": ">=20.19.4" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/metro-babel-transformer": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.78.2.tgz", - "integrity": "sha512-H4614LjcbrG+lUtg+ysMX5RnovY8AwrWj4rH8re6ErfhPFwLQXV0LIrl/fgFpq07Vjc5e3ZXzuKuMJF6l7eeTQ==", + "node_modules/@react-native/community-cli-plugin/node_modules/metro-transform-worker": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.7.tgz", + "integrity": "sha512-UegCo7ygB2fT64mRK2nbAjQVJ1zSwIIHy8d96jJv2nKZFDaViYBiughEdu5HM/Ceq0WN3LZrZk3zhl9aoiLYFw==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.78.2", - "hermes-parser": "0.25.1", + "@babel/generator": "^7.29.1", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "flow-enums-runtime": "^0.0.6", + "metro": "0.83.7", + "metro-babel-transformer": "0.83.7", + "metro-cache": "0.83.7", + "metro-cache-key": "0.83.7", + "metro-minify-terser": "0.83.7", + "metro-source-map": "0.83.7", + "metro-transform-plugins": "0.83.7", "nullthrows": "^1.1.1" }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, "engines": { "node": ">=18" }, - "peerDependencies": { - "@babel/core": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@react-native/community-cli-plugin/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "node_modules/@react-native/community-cli-plugin/node_modules/ob1": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.7.tgz", + "integrity": "sha512-9M5kpuOLyTPogMtZiQUIxdAZxl7Dxs6tVBbJErSumsqGMuhVSoUbkfeZ3XNPpLpwBBtqY5QDUzGwggLHX3slQg==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } }, "node_modules/@react-native/community-cli-plugin/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4148,45 +6373,103 @@ "node": ">=10" } }, + "node_modules/@react-native/community-cli-plugin/node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@react-native/debugger-frontend": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.78.2.tgz", - "integrity": "sha512-qNJT679OU/cdAKmZxfBFjqTG+ZC5i/4sLyvbcQjFFypunGSOaWl3mMQFQQdCBIQN+DFDPVSUXTPZQK1uI2j/ow==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.6.tgz", + "integrity": "sha512-TyWXEpAjVundrc87fPWg91piOUg75+X9iutcfDe7cO3NrAEYCsl7Z09rKHuiAGkxfG9/rFD13dPsYIixUFkSFA==", "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/debugger-shell": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.6.tgz", + "integrity": "sha512-684TJMBCU0l0ZjJWzrnK0HH+ERaM9KLyxyArE1k7BrP+gVl4X9GO0Pi94RoInOxvW/nyV65sOU6Ip1F3ygS0cg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "fb-dotslash": "0.5.8" + }, + "engines": { + "node": ">= 20.19.4" } }, "node_modules/@react-native/dev-middleware": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.78.2.tgz", - "integrity": "sha512-/u0pGiWVgvx09cYNO4/Okj8v1ZNt4K941pQJPhdwg5AHYuggVHNJjROukXJzZiElYFcJhMfOuxwksiIyx/GAkA==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.6.tgz", + "integrity": "sha512-22xoddLTelpcVnF385SNH2hdP7X2av5pu7yRl/WnM5jBznbcl0+M9Ce94cj+WVeomsoUF/vlfuB0Ooy+RMlRiA==", "license": "MIT", "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.78.2", + "@react-native/debugger-frontend": "0.83.6", + "@react-native/debugger-shell": "0.83.6", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", - "debug": "^2.2.0", + "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", - "selfsigned": "^2.4.1", "serve-static": "^1.16.2", - "ws": "^6.2.3" + "ws": "^7.5.10" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "node": ">= 20.19.4" } }, "node_modules/@react-native/dev-middleware/node_modules/is-wsl": { @@ -4201,12 +6484,6 @@ "node": ">=8" } }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/@react-native/dev-middleware/node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -4223,6 +6500,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@react-native/eslint-config": { "version": "0.78.3", "resolved": "https://registry.npmjs.org/@react-native/eslint-config/-/eslint-config-0.78.3.tgz", @@ -4584,9 +6882,9 @@ } }, "node_modules/@react-native/normalize-colors": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.78.2.tgz", - "integrity": "sha512-CA/3ynRO6/g1LDbqU8ewrv0js/1lU4+j04L7qz6btXbLTDk1UkF+AfpGRJGbIVY9UmFBJ7l1AOmzwutrWb3Txw==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.6.tgz", + "integrity": "sha512-bTM24b5v4qN3h52oflnv+OujFORn/kVi06WaWhnQQw14/ycilPqIsqsa+DpIBqdBrXxvLa9fXtCRrQtGATZCEw==", "license": "MIT" }, "node_modules/@react-native/typescript-config": { @@ -4597,19 +6895,19 @@ "license": "MIT" }, "node_modules/@react-native/virtualized-lists": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.78.2.tgz", - "integrity": "sha512-y/wVRUz1ImR2hKKUXFroTdSBiL0Dd+oudzqcGKp/M8Ybrw9MQ0m2QCXxtyONtDn8qkEGceqllwTCKq5WQwJcew==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.6.tgz", + "integrity": "sha512-gNSFXeb4P7qHtauLvl+zESroULIyX6Ltpvau3dhwy/QmfanBv0KUcrIU/7aVXxtWcXgp+54oWJyu2LIrsZ9+LQ==", "license": "MIT", "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">= 20.19.4" }, "peerDependencies": { - "@types/react": "^19.0.0", + "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, @@ -5146,29 +7444,17 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/node-forge": { - "version": "1.3.13", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.13.tgz", - "integrity": "sha512-zePQJSW5QkwSHKRApqWCVKeKoSOt4xvEnLENZPjyvm9Ezdf/EyDeJM7jqLzOwjVICQQzvLZ63T55MKdJB5H6ww==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "license": "MIT" }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.20", + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-native": { @@ -5436,7 +7722,6 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", - "dev": true, "license": "ISC" }, "node_modules/@wix-pilot/core": { @@ -5480,6 +7765,15 @@ "expect": "29.x.x || 28.x.x || ^27.2.5" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/abort-controller": { "version": "3.0.0", "license": "MIT", @@ -5547,6 +7841,15 @@ "scryptsy": "^2.1.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", @@ -5570,7 +7873,6 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.21.3" @@ -5626,6 +7928,12 @@ "version": "1.2.7", "license": "MIT" }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, "node_modules/argparse": { "version": "1.0.10", "license": "MIT", @@ -6076,6 +8384,21 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/babel-plugin-react-native-web": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", + "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", + "license": "MIT" + }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.25.1", "license": "MIT", @@ -6114,6 +8437,195 @@ "@babel/core": "^7.0.0" } }, + "node_modules/babel-preset-expo": { + "version": "55.0.20", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.20.tgz", + "integrity": "sha512-wMSaNtpPrH7+QNBF7HOCfO6WgmdXO84JEdqMhFxWc1CvwcWTvWwgc4yQustW1q1kG5ZE/dHgHkmHPlvVY5apMQ==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.20.5", + "@babel/helper-module-imports": "^7.25.9", + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "0.83.6", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.32.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "expo-widgets": "^55.0.16", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + }, + "expo-widgets": { + "optional": true + } + } + }, + "node_modules/babel-preset-expo/node_modules/@react-native/babel-plugin-codegen": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.83.6.tgz", + "integrity": "sha512-qfRXsHGeucT5c6mK+8Q7v4Ly3zmygfVmFlEtkiq7q07W1OTreld6nib4rJ/DBEeNiKBoBTuHjWliYGNuDjLFQA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.83.6" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/babel-preset-expo/node_modules/@react-native/babel-preset": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.83.6.tgz", + "integrity": "sha512-4/fXFDUvGOObETZq4+SUFkafld6OGgQWut5cQiqVghlhCB5z/p2lVhPgEUr/aTxTzeS3AmN+ztC+GpYPQ7tsTw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.83.6", + "babel-plugin-syntax-hermes-parser": "0.32.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/babel-preset-expo/node_modules/@react-native/babel-preset/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.32.0" + } + }, + "node_modules/babel-preset-expo/node_modules/@react-native/codegen": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.6.tgz", + "integrity": "sha512-doB/Pq6Cf6IjF3wlQXTIiZOnsX9X8mEEk+CdGfyuCwZjWrf7IB8KaZEXXckJmfUcIwvJ9u/a72ZoTTCIoxAc9A==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.32.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/babel-preset-expo/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.1.tgz", + "integrity": "sha512-HgErPZTghW76Rkq9uqn5ESeiD97FbqpZ1V170T1RG2RDp+7pJVQV2pQJs7y5YzN0/gcT6GM5ci9apRnIwuyPdQ==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.32.1" + } + }, + "node_modules/babel-preset-expo/node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-estree": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.1.tgz", + "integrity": "sha512-ne5hkuDxheNBAikDjqvCZCwihnz0vVu9YsBzAEO1puiyFR4F1+PAz/SiPHSsNTuOveCYGRMX8Xbx4LOubeC0Qg==", + "license": "MIT" + }, + "node_modules/babel-preset-expo/node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-parser": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.1.tgz", + "integrity": "sha512-175dz634X/W5AiwrpLdoMl/MOb17poLHyIqgyExlE8D9zQ1OPnoORnGMB5ltRKnpvQzBjMYvT2rN/sHeIfZW5Q==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.1" + } + }, + "node_modules/babel-preset-expo/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/babel-preset-expo/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, "node_modules/babel-preset-jest": { "version": "29.6.3", "license": "MIT", @@ -6157,6 +8669,18 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/bc-bech32": { "resolved": "modules/bc-bech32", "link": true @@ -6165,6 +8689,56 @@ "version": "2.0.0", "license": "MIT" }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "license": "MIT", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/better-opn/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/better-opn/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, "node_modules/bigi": { "version": "1.4.2" }, @@ -6393,9 +8967,30 @@ "version": "4.12.1", "license": "MIT" }, - "node_modules/boolbase": { - "version": "1.0.0", - "license": "ISC" + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "license": "MIT", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } }, "node_modules/brace-expansion": { "version": "2.0.1", @@ -6564,7 +9159,9 @@ "license": "MIT" }, "node_modules/browserslist": { - "version": "4.24.4", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "funding": [ { "type": "opencollective", @@ -6581,10 +9178,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -6898,7 +9496,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001712", + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", "funding": [ { "type": "opencollective", @@ -7553,6 +10153,35 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/crypto-browserify": { "version": "3.12.1", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", @@ -7632,7 +10261,9 @@ } }, "node_modules/csstype": { - "version": "3.1.3", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/data-view-buffer": { @@ -7794,6 +10425,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/define-properties": { "version": "1.2.1", "license": "MIT", @@ -8071,6 +10711,12 @@ "node": ">=8" } }, + "node_modules/dnssd-advertise": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.4.tgz", + "integrity": "sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA==", + "license": "MIT" + }, "node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -8326,7 +10972,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.132", + "version": "1.5.349", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.349.tgz", + "integrity": "sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==", "license": "ISC" }, "node_modules/electrum-client": { @@ -9274,19 +11922,6 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", "dev": true, @@ -9376,20 +12011,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/espree": { "version": "9.6.1", "dev": true, @@ -9532,31 +12153,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/execa/node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/exeunt": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/exeunt/-/exeunt-1.1.0.tgz", @@ -9679,6 +12275,278 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/expo": { + "version": "55.0.21", + "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.21.tgz", + "integrity": "sha512-FgZuKoUUwCKzHeugYefaYyZG3w/q4B7TwvfJUX4v9/k3kNChlgMXvKcd3hpGdCryx75YGVxhYxDnGN5oU5fddw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/cli": "55.0.28", + "@expo/config": "~55.0.15", + "@expo/config-plugins": "~55.0.8", + "@expo/devtools": "55.0.2", + "@expo/fingerprint": "0.16.6", + "@expo/local-build-cache-provider": "55.0.11", + "@expo/log-box": "55.0.11", + "@expo/metro": "~55.1.1", + "@expo/metro-config": "55.0.19", + "@expo/vector-icons": "^15.0.2", + "@ungap/structured-clone": "^1.3.0", + "babel-preset-expo": "~55.0.20", + "expo-asset": "~55.0.16", + "expo-constants": "~55.0.15", + "expo-file-system": "~55.0.17", + "expo-font": "~55.0.6", + "expo-keep-awake": "~55.0.7", + "expo-modules-autolinking": "55.0.20", + "expo-modules-core": "55.0.24", + "pretty-format": "^29.7.0", + "react-refresh": "^0.14.2", + "whatwg-url-minimum": "^0.1.1" + }, + "bin": { + "expo": "bin/cli", + "expo-modules-autolinking": "bin/autolinking", + "fingerprint": "bin/fingerprint" + }, + "peerDependencies": { + "@expo/dom-webview": "*", + "@expo/metro-runtime": "*", + "react": "*", + "react-native": "*", + "react-native-webview": "*" + }, + "peerDependenciesMeta": { + "@expo/dom-webview": { + "optional": true + }, + "@expo/metro-runtime": { + "optional": true + }, + "react-native-webview": { + "optional": true + } + } + }, + "node_modules/expo-asset": { + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.16.tgz", + "integrity": "sha512-5IJyfJtYqvKGg04NKGQWiCIoK/fULDL9m15mXPPyfabD1jsToVj2hnWmo1r2SWNNmMwtQxi6jTpcGwVo2nLDxg==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.13", + "expo-constants": "~55.0.15" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-constants": { + "version": "55.0.15", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.15.tgz", + "integrity": "sha512-w394fcZLJjeKN+9ZnJzL/HiarE1nwZFDa+3S9frevh6Ur+MAAs9QDrcXhDrV8T3xqRzzYaqsP6Z8TFZ4efWN1A==", + "license": "MIT", + "dependencies": { + "@expo/env": "~2.1.1" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-dev-client": { + "version": "55.0.32", + "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-55.0.32.tgz", + "integrity": "sha512-rfZ0Xpgbw3RPymkivvLSQ2Koqefj+oVOReqNLN3JXDlqdC2jOr3MCqfTaJs5VFNzFKk7pOPyE60jh03UdvsHCQ==", + "license": "MIT", + "dependencies": { + "expo-dev-launcher": "55.0.33", + "expo-dev-menu": "55.0.27", + "expo-dev-menu-interface": "55.0.2", + "expo-manifests": "~55.0.16", + "expo-updates-interface": "~55.1.6" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-launcher": { + "version": "55.0.33", + "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-55.0.33.tgz", + "integrity": "sha512-WZsTtyEVgCBMj3vlgbDSKbYbUbAwijNhJY9jBqqlmbPLHtLE+Wc6nCTafb0dWY6+Si+afF98lvPyz6WSAu59uA==", + "license": "MIT", + "dependencies": { + "@expo/schema-utils": "^55.0.3", + "expo-dev-menu": "55.0.27", + "expo-manifests": "~55.0.16" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-menu": { + "version": "55.0.27", + "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-55.0.27.tgz", + "integrity": "sha512-Il+kkIXlPDfZ/Z3ZquV1r5niECEByJObUMkB24c0B4N4693f0SDoKyyaRqcGRsRCVXW9r0eAoTeEnXl1revQdA==", + "license": "MIT", + "dependencies": { + "expo-dev-menu-interface": "55.0.2" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-menu-interface": { + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-55.0.2.tgz", + "integrity": "sha512-DomUNvGzY/xliwnMdbAYY780sCv19N7zIbifc0ClcoCzJZpNSCkvJ2qGIFRPyM/7DmqmlHGCKi8di7kYYLKNEg==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-file-system": { + "version": "55.0.17", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.17.tgz", + "integrity": "sha512-d27K1cagUOt2BwxwPka9KW8Znu5kN1tnairozCzzCRZviZFtWnBxwFuJ3KU6MAbav/9UhSMkp5Ve/oZ+SR0UgQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-font": { + "version": "55.0.6", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-55.0.6.tgz", + "integrity": "sha512-x9czUA3UQWjIwa0ZUEs/eWJNqB4mAue/m4ltESlNPLZhHL0nWWqIfsyHmklTLFH7mVfcHSJvew6k+pR2FE1zVw==", + "license": "MIT", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-json-utils": { + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-55.0.2.tgz", + "integrity": "sha512-QJMOZOPOG7CTnKcrdVaiummn2va1MCO56z++eyWkDv3GBRODldM6MFMDf/jTREWthFc2Nxo6TuyWRrEV9S6n/Q==", + "license": "MIT" + }, + "node_modules/expo-keep-awake": { + "version": "55.0.7", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.7.tgz", + "integrity": "sha512-QBWOEu8FkPBGYc0h0rsCkSTMJNBEKgzVsmLuQpO7V79V9sPR052k3Iiu/G8Kzmny2enyHYYed8RY+CUsip/SeQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-manifests": { + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-55.0.16.tgz", + "integrity": "sha512-BR9BPcNsSnCKlQ/d7ECywr+2T54+bTSr26HjRjSua949o4mO/iPIrLjK0lOAa1oIczju6a6oUFckZD2OljxP0g==", + "license": "MIT", + "dependencies": { + "expo-json-utils": "~55.0.2" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-modules-autolinking": { + "version": "55.0.20", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-55.0.20.tgz", + "integrity": "sha512-gg9eQJpa5yuyxnxubm3yBN9xKfieGgoBmYXGWI7kW0rWqk7OU440tRsZ1IOQunndhHeB/ZbRy7WpkyEBbaOR3Q==", + "license": "MIT", + "dependencies": { + "@expo/require-utils": "^55.0.4", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.1.0", + "commander": "^7.2.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo-modules-autolinking/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/expo-modules-core": { + "version": "55.0.24", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-55.0.24.tgz", + "integrity": "sha512-1FztZjelwf3xQZpD6+LFo6IKjnGF/PMVXYkv9aC3EybMl/ZbXji35cfhy9W5uR/bwQ7L+SVqvd5A00XOoIiO8Q==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-worklets": "^0.7.4 || ^0.8.0" + }, + "peerDependenciesMeta": { + "react-native-worklets": { + "optional": true + } + } + }, + "node_modules/expo-server": { + "version": "55.0.8", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-55.0.8.tgz", + "integrity": "sha512-AoV5TKuO4biSzrhe/OVLyInfTT0pV9/OOc/g/oVq5vmCjL8SaSYTkES8PLt+67Tm7VqX+Dn0+kSx1nQcjEKaPw==", + "license": "MIT", + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/expo-updates-interface": { + "version": "55.1.6", + "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-55.1.6.tgz", + "integrity": "sha512-evxNpagCkjT3lE6bGV570TFzRtKuIuLY8I37RYHoriXCJ+ZKCN1hbmklK29uAixya+BxGpeTI2K4FqYeJLvfrw==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expo/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/exponential-backoff": { "version": "3.1.2", "license": "Apache-2.0" @@ -9771,6 +12639,18 @@ "reusify": "^1.0.4" } }, + "node_modules/fb-dotslash": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", + "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", + "license": "(MIT OR Apache-2.0)", + "bin": { + "dotslash": "bin/dotslash" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "license": "Apache-2.0", @@ -9785,6 +12665,12 @@ "dev": true, "license": "MIT" }, + "node_modules/fetch-nodeshim": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.10.tgz", + "integrity": "sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==", + "license": "MIT" + }, "node_modules/file-entry-cache": { "version": "6.0.1", "dev": true, @@ -10024,6 +12910,12 @@ "dev": true, "license": "MIT" }, + "node_modules/fontfaceobserver": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", + "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", + "license": "BSD-2-Clause" + }, "node_modules/for-each": { "version": "0.3.5", "license": "MIT", @@ -10229,6 +13121,15 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/github-from-package": { "version": "0.0.0", "license": "MIT" @@ -10435,6 +13336,12 @@ "node": ">= 0.4" } }, + "node_modules/hermes-compiler": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.1.tgz", + "integrity": "sha512-+RPPQlayoZ9n6/KXKt5SFILWXCGJ/LV5d24L5smXrvTDrPS4L6dSctPczXauuvzFP3QEJbD1YO7Z3Ra4a+4IhA==", + "license": "MIT" + }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", @@ -10500,6 +13407,19 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/human-signals": { "version": "2.1.0", "license": "Apache-2.0", @@ -10527,7 +13447,6 @@ }, "node_modules/ignore": { "version": "5.3.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -13424,6 +16343,12 @@ "@types/yargs-parser": "*" } }, + "node_modules/jimp-compact": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", + "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", + "license": "MIT" + }, "node_modules/joi": { "version": "17.13.3", "license": "BSD-3-Clause", @@ -13651,6 +16576,15 @@ "dev": true, "license": "MIT" }, + "node_modules/lan-network": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.2.1.tgz", + "integrity": "sha512-ONPnazC96VKDntab9j9JKwIWhZ4ZUceB4A9Epu4Ssg0hYFmtHZSeQ+n15nIwTFmcBUKtExOer8WTJ4GF9MO64A==", + "license": "MIT", + "bin": { + "lan-network": "dist/lan-network-cli.js" + } + }, "node_modules/leven": { "version": "3.1.0", "license": "MIT", @@ -13695,6 +16629,255 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "license": "MIT" @@ -13920,12 +17103,12 @@ } }, "node_modules/lottie-react-native": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/lottie-react-native/-/lottie-react-native-7.2.4.tgz", - "integrity": "sha512-o1bJ4wiG5bfuaY4YhWNkAfAmL0loPfMtmU/0XyMQoVkEIf0O2CwnO8yi6thldCPkYm6U7ENEhnm9FW3jscBE6w==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/lottie-react-native/-/lottie-react-native-7.3.6.tgz", + "integrity": "sha512-TevFHRvFURh6GlaqLKrSNXuKAxvBvFCiXfS7FXQI1K/ikOStgAwWLFPGjW0i1qB2/VzPACKmRs+535VjHUZZZQ==", "license": "Apache-2.0", "peerDependencies": { - "@lottiefiles/dotlottie-react": "^0.6.5", + "@lottiefiles/dotlottie-react": "^0.13.5", "react": "*", "react-native": ">=0.46", "react-native-windows": ">=0.63.x" @@ -14704,6 +17887,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -14755,6 +17947,12 @@ "object-assign": "^4.1.0" } }, + "node_modules/multitars": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/multitars/-/multitars-1.0.0.tgz", + "integrity": "sha512-H/J4fMLedtudftaYMOg7ajzLYgT3/rwbWVJbqr/iUgB8DQztn38ys5HOqI1CzSxx8QhXXwOOnnBvd4v3jG5+Mg==", + "license": "MIT" + }, "node_modules/mv": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", @@ -14933,9 +18131,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" @@ -14974,7 +18172,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", "license": "MIT" }, "node_modules/node-stream-zip": { @@ -15012,6 +18212,51 @@ "node": ">=0.10.0" } }, + "node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "license": "MIT", @@ -15372,6 +18617,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-png": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", + "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", + "license": "MIT", + "dependencies": { + "pngjs": "^3.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parse-png/node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/parseurl": { "version": "1.3.3", "license": "MIT", @@ -15408,6 +18674,31 @@ "version": "1.0.7", "license": "MIT" }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/path-type": { "version": "4.0.0", "dev": true, @@ -15600,24 +18891,75 @@ "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", + "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.9.10", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/plist/node_modules/@xmldom/xmldom": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", + "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", + "license": "MIT", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/pngjs": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" + "node": "^10 || ^12 || >=14" } }, "node_modules/prebuild-install": { @@ -15715,10 +19057,28 @@ "version": "17.0.2", "license": "MIT" }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "license": "MIT" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/promise": { "version": "8.3.0", "license": "MIT", @@ -16051,18 +19411,18 @@ } }, "node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-devtools-core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.1.tgz", - "integrity": "sha512-TFo1MEnkqE6hzAbaztnyR5uLTMoz6wnEWwWBsCUzNt+sVXJycuRJdDqvL078M4/h65BI/YO5XWTaxZDWVsW0fw==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", + "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", "license": "MIT", "dependencies": { "shell-quote": "^1.6.1", @@ -16116,57 +19476,56 @@ } }, "node_modules/react-native": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.78.2.tgz", - "integrity": "sha512-UilZ8sP9amHCz7TTMWMJ71JeYcMzEdgCJaqTfoB1hC/nYMXq6xqSFxKWCDhf7sR7nz3FKxS4t338t42AMDDkww==", - "license": "MIT", - "dependencies": { - "@jest/create-cache-key-function": "^29.6.3", - "@react-native/assets-registry": "0.78.2", - "@react-native/codegen": "0.78.2", - "@react-native/community-cli-plugin": "0.78.2", - "@react-native/gradle-plugin": "0.78.2", - "@react-native/js-polyfills": "0.78.2", - "@react-native/normalize-colors": "0.78.2", - "@react-native/virtualized-lists": "0.78.2", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.83.6.tgz", + "integrity": "sha512-H513+8VzviNFXOdPnStRzX9S3/jiJGg++QZ1zd+ROyAvBEKqFqKUPHH0d82y3QyRPct5qKjdOa7J6vNehCvXYA==", + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^29.7.0", + "@react-native/assets-registry": "0.83.6", + "@react-native/codegen": "0.83.6", + "@react-native/community-cli-plugin": "0.83.6", + "@react-native/gradle-plugin": "0.83.6", + "@react-native/js-polyfills": "0.83.6", + "@react-native/normalize-colors": "0.83.6", + "@react-native/virtualized-lists": "0.83.6", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.25.1", + "babel-plugin-syntax-hermes-parser": "0.32.0", "base64-js": "^1.5.1", - "chalk": "^4.0.0", "commander": "^12.0.0", - "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", + "hermes-compiler": "0.14.1", "invariant": "^2.2.4", - "jest-environment-node": "^29.6.3", + "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.81.3", - "metro-source-map": "^0.81.3", + "metro-runtime": "^0.83.6", + "metro-source-map": "^0.83.6", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", - "react-devtools-core": "^6.0.1", + "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.25.0", + "scheduler": "0.27.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", + "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { "react-native": "cli.js" }, "engines": { - "node": ">=18" + "node": ">= 20.19.4" }, "peerDependencies": { - "@types/react": "^19.0.0", - "react": "^19.0.0" + "@types/react": "^19.1.1", + "react": "^19.2.0" }, "peerDependenciesMeta": { "@types/react": { @@ -16271,7 +19630,9 @@ } }, "node_modules/react-native-gesture-handler": { - "version": "2.25.0", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.30.1.tgz", + "integrity": "sha512-xIUBDo5ktmJs++0fZlavQNvDEE4PsihWhSeJsJtoz4Q6p0MiTM9TgrTgfEgzRR36qGPytFoeq+ShLrVwGdpUdA==", "license": "MIT", "dependencies": { "@egjs/hammerjs": "^2.0.17", @@ -16316,7 +19677,9 @@ } }, "node_modules/react-native-is-edge-to-edge": { - "version": "1.1.7", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz", + "integrity": "sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==", "license": "MIT", "peerDependencies": { "react": "*", @@ -16428,34 +19791,36 @@ } }, "node_modules/react-native-reanimated": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.18.0.tgz", - "integrity": "sha512-eVcNcqeOkMW+BUWAHdtvN3FKgC8J8wiEJkX6bNGGQaLS7m7e4amTfjIcqf/Ta+lerZLurmDaQ0lICI1CKPrb1Q==", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-arrow-functions": "^7.0.0-0", - "@babel/plugin-transform-class-properties": "^7.0.0-0", - "@babel/plugin-transform-classes": "^7.0.0-0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", - "@babel/plugin-transform-optional-chaining": "^7.0.0-0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", - "@babel/plugin-transform-template-literals": "^7.0.0-0", - "@babel/plugin-transform-unicode-regex": "^7.0.0-0", - "@babel/preset-typescript": "^7.16.7", - "convert-source-map": "^2.0.0", - "invariant": "^2.2.4", - "react-native-is-edge-to-edge": "1.1.7" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.2.1.tgz", + "integrity": "sha512-/NcHnZMyOvsD/wYXug/YqSKw90P9edN0kEPL5lP4PFf1aQ4F1V7MKe/E0tvfkXKIajy3Qocp5EiEnlcrK/+BZg==", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "1.2.1", + "semver": "7.7.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0", "react": "*", - "react-native": "*" + "react-native": "*", + "react-native-worklets": ">=0.7.0" + } + }, + "node_modules/react-native-reanimated/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/react-native-safe-area-context": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.5.2.tgz", - "integrity": "sha512-t4YVbHa9uAGf+pHMabGrb0uHrD5ogAusSu842oikJ3YKXcYp6iB4PTGl0EZNkUIR3pCnw/CXKn42OCfhsS0JIw==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz", + "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==", "license": "MIT", "peerDependencies": { "react": "*", @@ -16463,13 +19828,12 @@ } }, "node_modules/react-native-screens": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.11.1.tgz", - "integrity": "sha512-F0zOzRVa3ptZfLpD0J8ROdo+y1fEPw+VBFq1MTY/iyDu08al7qFUO5hLMd+EYMda5VXGaTFCa8q7bOppUszhJw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.23.0.tgz", + "integrity": "sha512-XhO3aK0UeLpBn4kLecd+J+EDeRRJlI/Ro9Fze06vo1q163VeYtzfU9QS09/VyDFMWR1qxDC1iazCArTPSFFiPw==", "license": "MIT", "dependencies": { "react-freeze": "^1.0.0", - "react-native-is-edge-to-edge": "^1.1.7", "warn-once": "^0.1.0" }, "peerDependencies": { @@ -16500,9 +19864,9 @@ } }, "node_modules/react-native-svg": { - "version": "15.12.1", - "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.12.1.tgz", - "integrity": "sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g==", + "version": "15.15.3", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.15.3.tgz", + "integrity": "sha512-/k4KYwPBLGcx2f5d4FjE+vCScK7QOX14cl2lIASJ28u4slHHtIhL0SZKU7u9qmRBHxTCKPoPBtN6haT1NENJNA==", "license": "MIT", "dependencies": { "css-select": "^5.1.0", @@ -16632,13 +19996,43 @@ "react-native": ">=0.40" } }, + "node_modules/react-native/node_modules/@react-native/codegen": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.6.tgz", + "integrity": "sha512-doB/Pq6Cf6IjF3wlQXTIiZOnsX9X8mEEk+CdGfyuCwZjWrf7IB8KaZEXXckJmfUcIwvJ9u/a72ZoTTCIoxAc9A==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.32.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/react-native/node_modules/@react-native/gradle-plugin": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.6.tgz", + "integrity": "sha512-5prXv7WWR1RgZ/kWGZP+mi7/y/IE2ymfOHIZO5Pv14tMOmRAcQSgSYogcRmOiWw5mJs2K0UFeMiQD49ZO9oCug==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, "node_modules/react-native/node_modules/@react-native/js-polyfills": { - "version": "0.78.2", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.78.2.tgz", - "integrity": "sha512-b7eCPAs3uogdDeTvOTrU6i8DTTsHyjyp48R5pVakJIREhEx+SkUnlVk11PYjbCKGYjYgN939Tb5b1QWNtdrPIQ==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.6.tgz", + "integrity": "sha512-VSev0LV2i5X0ibduHBSLqKj0YU2F+waCgjl2uvaGHMGCSV1ZRKNFX/vJFqvLwjvdzLbkAZoFT1Rg7k7jDv44UA==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 20.19.4" } }, "node_modules/react-native/node_modules/ansi-styles": { @@ -16651,6 +20045,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.32.0" + } + }, "node_modules/react-native/node_modules/commander": { "version": "12.1.0", "license": "MIT", @@ -16658,6 +20061,86 @@ "node": ">=18" } }, + "node_modules/react-native/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/react-native/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/react-native/node_modules/metro-runtime": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.7.tgz", + "integrity": "sha512-9GKkJURaB2iyYoEExKnedzAHzxmKtSi+k0tsZUvMoU27tBZJElchYt7JH/Ai/XzYAI9lCAaV7u5HZSI8J5Z+wQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/react-native/node_modules/metro-source-map": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.7.tgz", + "integrity": "sha512-JgA1h7oc1a1jydBe1GhVFsUoMYo3wLPk7oRA32rjlDsq+sP2JLt9x2p2lWbNSxTm/u8NV4VRid3hvEJgcX8tKw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.83.7", + "nullthrows": "^1.1.1", + "ob1": "0.83.7", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/react-native/node_modules/metro-symbolicate": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.7.tgz", + "integrity": "sha512-g4suyxw20WOHWI680c+Kq4wC/NF+Hx5pRH9afrMp+sMTxqLeKcPR1Xf4wMhsjlbvx7LbIREdke6q928jEjvJWw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.83.7", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/react-native/node_modules/ob1": { + "version": "0.83.7", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.7.tgz", + "integrity": "sha512-9M5kpuOLyTPogMtZiQUIxdAZxl7Dxs6tVBbJErSumsqGMuhVSoUbkfeZ3XNPpLpwBBtqY5QDUzGwggLHX3slQg==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, "node_modules/react-native/node_modules/pretty-format": { "version": "29.7.0", "license": "MIT", @@ -16674,6 +20157,12 @@ "version": "0.13.11", "license": "MIT" }, + "node_modules/react-native/node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, "node_modules/react-native/node_modules/semver": { "version": "7.7.1", "license": "ISC", @@ -16684,6 +20173,36 @@ "node": ">=10" } }, + "node_modules/react-native/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.14.2", "license": "MIT", @@ -16808,12 +20327,6 @@ "node": ">= 6" } }, - "node_modules/readline": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", - "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "license": "BSD" - }, "node_modules/realm": { "version": "20.1.0", "hasInstallScript": true, @@ -17035,6 +20548,12 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/resolve-workspace-root": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz", + "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", + "license": "MIT" + }, "node_modules/resolve.exports": { "version": "1.1.1", "dev": true, @@ -17217,6 +20736,15 @@ "truncate-utf8-bytes": "^1.0.0" } }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/scheduler": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", @@ -17245,19 +20773,6 @@ "node": ">=4.0.0" } }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { "version": "6.3.1", "license": "ISC", @@ -17641,6 +21156,29 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "license": "MIT", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "license": "MIT", @@ -17701,6 +21239,15 @@ "resolved": "git+ssh://git@github.com/BlueWallet/slip39-js.git#d316ee6a929ab645fe5462ef1c91720eb66889c8", "license": "MIT" }, + "node_modules/slugify": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", + "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "license": "BSD-3-Clause", @@ -17708,6 +21255,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.13", "dev": true, @@ -17822,6 +21378,15 @@ "readable-stream": "^3.5.0" } }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/stream-chain": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", @@ -18062,6 +21627,12 @@ ], "license": "MIT" }, + "node_modules/structured-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", + "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", + "license": "MIT" + }, "node_modules/sudo-prompt": { "version": "9.2.1", "license": "MIT" @@ -18078,7 +21649,6 @@ }, "node_modules/supports-hyperlinks": { "version": "2.3.0", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0", @@ -18180,7 +21750,6 @@ }, "node_modules/terminal-link": { "version": "2.1.1", - "dev": true, "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", @@ -18334,6 +21903,12 @@ "node": ">=0.6" } }, + "node_modules/toqr": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz", + "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==", + "license": "MIT" + }, "node_modules/tr46": { "version": "0.0.3", "dev": true, @@ -18576,7 +22151,6 @@ }, "node_modules/type-fest": { "version": "0.21.3", - "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -18671,7 +22245,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.8.3", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -18766,7 +22342,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -18867,6 +22445,16 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "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).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-to-istanbul": { "version": "8.1.1", "dev": true, @@ -18915,6 +22503,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/varuint-bitcoin": { "version": "1.1.2", "license": "MIT", @@ -18969,6 +22566,12 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/whatwg-url-minimum": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.1.tgz", + "integrity": "sha512-u2FNVjFVFZhdjb502KzXy1gKn1mEisQRJssmSJT8CPhZdZa0AP6VCbWlXERKyGu0l09t0k50FiDiralpGhBxgA==", + "license": "MIT" + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -19184,6 +22787,50 @@ "async-limiter": "~1.0.0" } }, + "node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "license": "Apache-2.0", + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xml2js": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", + "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "license": "ISC", @@ -19266,6 +22913,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index dc083b2e0..dad1b342d 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,13 @@ "@types/create-hash": "^1.2.2", "@types/crypto-js": "^4.2.2", "@types/jest": "^29.5.13", - "@types/react": "^18.2.16", + "@types/react": "~19.2.10", "@types/react-native-push-notification": "^8.1.4", "@types/react-test-renderer": "^19.0.0", "@types/wif": "^2.0.5", "@typescript-eslint/eslint-plugin": "^7.15.0", "@typescript-eslint/parser": "^7.15.0", + "babel-preset-expo": "^55.0.20", "detox": "^20.40.2", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", @@ -47,7 +48,7 @@ "node-fetch": "^2.6.7", "prettier": "^3.2.5", "ts-jest": "^29.1.1", - "typescript": "^5.1.6" + "typescript": "~5.9.2" }, "engines": { "node": ">=20" @@ -129,12 +130,14 @@ "electrum-client": "github:BlueWallet/rn-electrum-client#d9f511d", "electrum-mnemonic": "2.0.0", "events": "3.3.0", - "lottie-react-native": "7.2.4", + "expo": "^55.0.21", + "expo-dev-client": "~55.0.32", + "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", - "react": "19.0.0", + "react": "19.2.0", "react-localization": "github:BlueWallet/react-localization#ae7969a", - "react-native": "0.78.2", + "react-native": "0.83.6", "react-native-biometrics": "3.0.1", "react-native-blue-crypto": "github:BlueWallet/react-native-blue-crypto#3cb5442", "react-native-camera-kit": "15.0.1", @@ -143,7 +146,7 @@ "react-native-device-info": "14.0.4", "react-native-draglist": "github:BlueWallet/react-native-draglist#354c28e", "react-native-fs": "2.20.0", - "react-native-gesture-handler": "2.25.0", + "react-native-gesture-handler": "~2.30.0", "react-native-get-random-values": "1.11.0", "react-native-haptic-feedback": "2.3.3", "react-native-image-picker": "8.2.1", @@ -156,12 +159,12 @@ "react-native-qrcode-svg": "6.3.15", "react-native-quick-actions": "0.3.13", "react-native-rate": "1.2.12", - "react-native-reanimated": "3.18.0", - "react-native-safe-area-context": "5.5.2", - "react-native-screens": "4.11.1", + "react-native-reanimated": "4.2.1", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.23.0", "react-native-secure-key-store": "github:BlueWallet/react-native-secure-key-store#2076b4849e88aa0a78e08bfbb4ce3923e0925cbc", "react-native-share": "12.1.0", - "react-native-svg": "15.12.1", + "react-native-svg": "15.15.3", "react-native-tcp-socket": "6.3.0", "react-native-vector-icons": "10.2.0", "react-native-watch-connectivity": "1.1.0", From 7eece8d3c5dd6efc2b0a9986409bc285fa9a80b0 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 5 May 2026 21:36:19 +0530 Subject: [PATCH 03/40] feat: add app.json, eas.json, and update .gitignore for Expo --- .gitignore | 6 ++++++ app.json | 46 ++++++++++++++++++++++++++++++++++++++++++++++ eas.json | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 app.json create mode 100644 eas.json diff --git a/.gitignore b/.gitignore index 25f7dc9b4..b873e3b90 100644 --- a/.gitignore +++ b/.gitignore @@ -99,3 +99,9 @@ android/app/src/main/jniLibs # rust rust_jsi_bridge/target/ + +# Expo +.expo/ +.expo-shared/ +dist/ +eas-build-on-simulator.log diff --git a/app.json b/app.json new file mode 100644 index 000000000..bad8aea8c --- /dev/null +++ b/app.json @@ -0,0 +1,46 @@ +{ + "expo": { + "name": "Shroud Wallet", + "slug": "shroud-wallet", + "version": "0.0.1", + "orientation": "portrait", + "icon": "./img/icon.png", + "userInterfaceStyle": "automatic", + "splash": { + "resizeMode": "contain", + "backgroundColor": "#000000" + }, + "ios": { + "supportsTablet": false, + "bundleIdentifier": "org.bitshala.shroud", + "deploymentTarget": "16.0", + "infoPlist": { + "NSCameraUsageDescription": "Shroud Wallet uses the camera to scan QR codes", + "NSFaceIDUsageDescription": "Shroud Wallet uses Face ID to unlock your wallet", + "NSPhotoLibraryUsageDescription": "Shroud Wallet needs access to photos to import wallet backups" + } + }, + "android": { + "package": "org.bitshala.shroud", + "adaptiveIcon": { + "foregroundImage": "./img/icon.png", + "backgroundColor": "#000000" + }, + "permissions": [ + "CAMERA", + "USE_BIOMETRIC", + "USE_FINGERPRINT", + "RECEIVE_BOOT_COMPLETED", + "VIBRATE" + ] + }, + "plugins": [ + "expo-dev-client" + ], + "extra": { + "eas": { + "projectId": "YOUR_EAS_PROJECT_ID" + } + } + } +} diff --git a/eas.json b/eas.json new file mode 100644 index 000000000..297c25bfd --- /dev/null +++ b/eas.json @@ -0,0 +1,47 @@ +{ + "cli": { + "version": ">= 7.0.0" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal", + "android": { + "buildType": "apk", + "gradleCommand": ":app:assembleDebug" + }, + "ios": { + "simulator": true + } + }, + "preview": { + "distribution": "internal", + "android": { + "buildType": "apk" + }, + "ios": { + "simulator": false + } + }, + "production": { + "android": { + "buildType": "aab" + }, + "ios": { + "simulator": false + } + } + }, + "submit": { + "production": { + "android": { + "serviceAccountKeyPath": "./google-service-account.json", + "track": "internal" + }, + "ios": { + "appleId": "YOUR_APPLE_ID", + "ascAppId": "YOUR_APP_STORE_CONNECT_APP_ID" + } + } + } +} From 2575e2968c49f5a47b4925d7cdf67450f6ab3b35 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 5 May 2026 21:38:13 +0530 Subject: [PATCH 04/40] feat: migrate haptic-feedback, device-info to expo-haptics, expo-device, expo-application --- modules/analytics.ts | 15 ++++++-- modules/environment.ts | 8 ++-- modules/hapticFeedback.ts | 31 +++++++++++----- package-lock.json | 78 +++++++++++++++++++++++++++++---------- package.json | 5 ++- tests/setup.js | 36 +++++++++++------- 6 files changed, 123 insertions(+), 50 deletions(-) diff --git a/modules/analytics.ts b/modules/analytics.ts index 012cd6f46..486ec133b 100644 --- a/modules/analytics.ts +++ b/modules/analytics.ts @@ -1,5 +1,6 @@ import Bugsnag from '@bugsnag/react-native'; -import { getUniqueId } from 'react-native-device-info'; +import * as Application from 'expo-application'; +import { Platform } from 'react-native'; import { ShroudApp } from '../class'; @@ -15,7 +16,13 @@ let userHasOptedOut: boolean = false; (async () => { // Don't try to start Bugsnag again as it's already initialized in native code // Just configure the existing instance if tracking is allowed - const uniqueID = await getUniqueId(); + let uniqueID: string | null = null; + if (Platform.OS === 'ios') { + uniqueID = await Application.getIosIdForVendorAsync(); + } else if (Platform.OS === 'android') { + uniqueID = Application.getAndroidId(); + } + const doNotTrack = await shroudApp.isDoNotTrackEnabled(); if (doNotTrack) { @@ -24,7 +31,9 @@ let userHasOptedOut: boolean = false; } // Configure the existing Bugsnag instance instead of starting a new one - Bugsnag.setUser(uniqueID); + if (uniqueID) { + Bugsnag.setUser(uniqueID); + } // Add additional configuration if needed Bugsnag.addOnError(function (event) { diff --git a/modules/environment.ts b/modules/environment.ts index b9301c701..a31817b49 100644 --- a/modules/environment.ts +++ b/modules/environment.ts @@ -1,7 +1,7 @@ -import { getDeviceType, isTablet as checkIsTablet } from 'react-native-device-info'; +import * as Device from 'expo-device'; -const isTablet: boolean = checkIsTablet(); -const isDesktop: boolean = getDeviceType() === 'Desktop'; -const isHandset: boolean = getDeviceType() === 'Handset'; +const isTablet: boolean = Device.deviceType === Device.DeviceType.TABLET; +const isDesktop: boolean = Device.deviceType === Device.DeviceType.DESKTOP; +const isHandset: boolean = Device.deviceType === Device.DeviceType.PHONE; export { isDesktop, isHandset, isTablet }; diff --git a/modules/hapticFeedback.ts b/modules/hapticFeedback.ts index 4d9bfd280..83e0ce6c5 100644 --- a/modules/hapticFeedback.ts +++ b/modules/hapticFeedback.ts @@ -1,5 +1,4 @@ -import DeviceInfo, { PowerState } from 'react-native-device-info'; -import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; +import * as Haptics from 'expo-haptics'; import { isDesktop } from './environment'; // Define a const enum for HapticFeedbackTypes @@ -13,15 +12,29 @@ export const enum HapticFeedbackTypes { NotificationError = 'notificationError', } +// Maps our enum values to expo-haptics equivalents +const impactStyleMap: Record = { + [HapticFeedbackTypes.ImpactLight]: Haptics.ImpactFeedbackStyle.Light, + [HapticFeedbackTypes.ImpactMedium]: Haptics.ImpactFeedbackStyle.Medium, + [HapticFeedbackTypes.ImpactHeavy]: Haptics.ImpactFeedbackStyle.Heavy, +}; + +const notificationTypeMap: Record = { + [HapticFeedbackTypes.NotificationSuccess]: Haptics.NotificationFeedbackType.Success, + [HapticFeedbackTypes.NotificationWarning]: Haptics.NotificationFeedbackType.Warning, + [HapticFeedbackTypes.NotificationError]: Haptics.NotificationFeedbackType.Error, +}; + const triggerHapticFeedback = (type: HapticFeedbackTypes) => { if (isDesktop) return; - DeviceInfo.getPowerState().then((state: Partial) => { - if (!state.lowPowerMode) { - ReactNativeHapticFeedback.trigger(type, { ignoreAndroidSystemSettings: false, enableVibrateFallback: true }); - } else { - console.log('Haptic feedback not triggered due to low power mode.'); - } - }); + + if (type === HapticFeedbackTypes.Selection) { + Haptics.selectionAsync(); + } else if (impactStyleMap[type]) { + Haptics.impactAsync(impactStyleMap[type]); + } else if (notificationTypeMap[type]) { + Haptics.notificationAsync(notificationTypeMap[type]); + } }; export const triggerSuccessHapticFeedback = () => { diff --git a/package-lock.json b/package-lock.json index 1e04884c5..f96c2f2d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,10 @@ "electrum-mnemonic": "2.0.0", "events": "3.3.0", "expo": "^55.0.21", + "expo-application": "~55.0.14", "expo-dev-client": "~55.0.32", + "expo-device": "~55.0.15", + "expo-haptics": "~55.0.14", "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", @@ -69,12 +72,10 @@ "react-native-camera-kit": "15.0.1", "react-native-capture-protection": "github:BlueWallet/react-native-capture-protection#54d900", "react-native-default-preference": "https://github.com/BlueWallet/react-native-default-preference.git#6338a1f1235e4130b8cfc2dd3b53015eeff2870c", - "react-native-device-info": "14.0.4", "react-native-draglist": "github:BlueWallet/react-native-draglist#354c28e", "react-native-fs": "2.20.0", "react-native-gesture-handler": "~2.30.0", "react-native-get-random-values": "1.11.0", - "react-native-haptic-feedback": "2.3.3", "react-native-image-picker": "8.2.1", "react-native-keychain": "9.1.0", "react-native-linear-gradient": "2.8.3", @@ -12329,6 +12330,15 @@ } } }, + "node_modules/expo-application": { + "version": "55.0.14", + "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-55.0.14.tgz", + "integrity": "sha512-NgqDIt3eCf4aVLp1L6AcEanCYoyJeuBsGrgGSzOIvxAsOvp5X3SYKW3ROgpKUnLQEKMWlzwETpjsUGszcqkk8g==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-asset": { "version": "55.0.16", "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.16.tgz", @@ -12408,6 +12418,18 @@ "expo": "*" } }, + "node_modules/expo-device": { + "version": "55.0.15", + "resolved": "https://registry.npmjs.org/expo-device/-/expo-device-55.0.15.tgz", + "integrity": "sha512-vXy4U/IeYI+zHGG45Ap6J7EuyQmkstyo8I+/5YGr5q2zmqLBo6SWE62wii8i9hLHheHn6AtF9UPrSWAREJrE8A==", + "license": "MIT", + "dependencies": { + "ua-parser-js": "^0.7.33" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-file-system": { "version": "55.0.17", "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.17.tgz", @@ -12432,6 +12454,15 @@ "react-native": "*" } }, + "node_modules/expo-haptics": { + "version": "55.0.14", + "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-55.0.14.tgz", + "integrity": "sha512-KjDItBsA9mi1f5nRwf8g1wOdfEcLHwvEdt5Jl1sMCDETR/homcGOl+F3QIiPOl/PRlbGVieQsjTtF4DGtHOj6g==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-json-utils": { "version": "55.0.2", "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-55.0.2.tgz", @@ -19583,13 +19614,6 @@ "react-native": ">=0.47.0" } }, - "node_modules/react-native-device-info": { - "version": "14.0.4", - "license": "MIT", - "peerDependencies": { - "react-native": "*" - } - }, "node_modules/react-native-draglist": { "version": "3.9.6", "resolved": "git+ssh://git@github.com/BlueWallet/react-native-draglist.git#354c28eed04ec651831bd08651d5e962e7dd3b57", @@ -19656,16 +19680,6 @@ "react-native": ">=0.56" } }, - "node_modules/react-native-haptic-feedback": { - "version": "2.3.3", - "license": "MIT", - "workspaces": [ - "example" - ], - "peerDependencies": { - "react-native": ">=0.60.0" - } - }, "node_modules/react-native-image-picker": { "version": "8.2.1", "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-8.2.1.tgz", @@ -22265,6 +22279,32 @@ "node": ">=8" } }, + "node_modules/ua-parser-js": { + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/uint8array-tools": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/uint8array-tools/-/uint8array-tools-0.0.9.tgz", diff --git a/package.json b/package.json index dad1b342d..fc30fac50 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,10 @@ "electrum-mnemonic": "2.0.0", "events": "3.3.0", "expo": "^55.0.21", + "expo-application": "~55.0.14", "expo-dev-client": "~55.0.32", + "expo-device": "~55.0.15", + "expo-haptics": "~55.0.14", "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", @@ -143,12 +146,10 @@ "react-native-camera-kit": "15.0.1", "react-native-capture-protection": "github:BlueWallet/react-native-capture-protection#54d900", "react-native-default-preference": "https://github.com/BlueWallet/react-native-default-preference.git#6338a1f1235e4130b8cfc2dd3b53015eeff2870c", - "react-native-device-info": "14.0.4", "react-native-draglist": "github:BlueWallet/react-native-draglist#354c28e", "react-native-fs": "2.20.0", "react-native-gesture-handler": "~2.30.0", "react-native-get-random-values": "1.11.0", - "react-native-haptic-feedback": "2.3.3", "react-native-image-picker": "8.2.1", "react-native-keychain": "9.1.0", "react-native-linear-gradient": "2.8.3", diff --git a/tests/setup.js b/tests/setup.js index 096c26373..86a76bb7e 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -53,14 +53,22 @@ jest.mock('@react-native-community/push-notification-ios', () => { jest.mock('react-native-permissions', () => require('react-native-permissions/mock')); -jest.mock('react-native-device-info', () => { +jest.mock('expo-device', () => { return { - getUniqueId: jest.fn().mockReturnValue('uniqueId'), - getSystemName: jest.fn(), - getDeviceType: jest.fn().mockReturnValue(false), - hasGmsSync: jest.fn().mockReturnValue(true), - hasHmsSync: jest.fn().mockReturnValue(false), - isTablet: jest.fn().mockReturnValue(false), + DeviceType: { PHONE: 1, TABLET: 2, DESKTOP: 3, TV: 4 }, + deviceType: 1, + modelName: 'mock-model', + osVersion: '16.0', + }; +}); + +jest.mock('expo-application', () => { + return { + getIosIdForVendorAsync: jest.fn().mockResolvedValue('mock-unique-id'), + getAndroidId: jest.fn().mockReturnValue('mock-unique-id'), + applicationName: 'Shroud', + nativeApplicationVersion: '0.0.1', + nativeBuildVersion: '1', }; }); @@ -199,7 +207,13 @@ jest.mock('react-native-fs', () => { jest.mock('@react-native-documents/picker', () => ({})); -jest.mock('react-native-haptic-feedback', () => ({})); +jest.mock('expo-haptics', () => ({ + impactAsync: jest.fn(), + notificationAsync: jest.fn(), + selectionAsync: jest.fn(), + ImpactFeedbackStyle: { Light: 'light', Medium: 'medium', Heavy: 'heavy' }, + NotificationFeedbackType: { Success: 'success', Warning: 'warning', Error: 'error' }, +})); const realmInstanceMock = { create: function () {}, @@ -239,11 +253,7 @@ jest.mock('rn-qr-generator', () => ({ }), })); -jest.mock('react-native-haptic-feedback', () => { - return { - trigger: jest.fn(), - }; -}); + jest.mock('../modules/analytics', () => { const ret = jest.fn(); From 7397c48cc54e451d06c2764f8edc8821b411da27 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 5 May 2026 21:39:01 +0530 Subject: [PATCH 05/40] feat: migrate linear-gradient, vector-icons to expo-linear-gradient, @expo/vector-icons --- components/TransactionsNavigationHeader.tsx | 2 +- components/WalletsCarousel.tsx | 2 +- package-lock.json | 89 +++------------------ package.json | 4 +- screen/settings/IsItMyAddress.tsx | 2 +- 5 files changed, 18 insertions(+), 81 deletions(-) diff --git a/components/TransactionsNavigationHeader.tsx b/components/TransactionsNavigationHeader.tsx index 3c3ec2b2c..28c19e312 100644 --- a/components/TransactionsNavigationHeader.tsx +++ b/components/TransactionsNavigationHeader.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useMemo } from 'react'; import Clipboard from '@react-native-clipboard/clipboard'; import { ImageBackground, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; -import LinearGradient from 'react-native-linear-gradient'; +import { LinearGradient } from 'expo-linear-gradient'; import WalletGradient from '../class/wallet-gradient'; import { TWallet } from '../class/wallets/types'; import loc, { formatBalance, formatBalanceWithoutSuffix } from '../loc'; diff --git a/components/WalletsCarousel.tsx b/components/WalletsCarousel.tsx index 35915084e..d00dc9f86 100644 --- a/components/WalletsCarousel.tsx +++ b/components/WalletsCarousel.tsx @@ -11,7 +11,7 @@ import { ViewStyle, UIManager, } from 'react-native'; -import LinearGradient from 'react-native-linear-gradient'; +import { LinearGradient } from 'expo-linear-gradient'; import WalletGradient from '../class/wallet-gradient'; import { useSizeClass, SizeClass } from '../modules/sizeClass'; import loc, { formatBalance, transactionTimeToReadable } from '../loc'; diff --git a/package-lock.json b/package-lock.json index f96c2f2d4..7b9e3fa52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@babel/preset-env": "7.27.2", "@bugsnag/react-native": "8.4.0", "@bugsnag/source-maps": "2.3.3", + "@expo/vector-icons": "^15.0.2", "@keystonehq/bc-ur-registry": "0.7.1", "@lodev09/react-native-true-sheet": "github:BlueWallet/react-native-true-sheet#5945184a2fea9fe5ba8f5cfcdb20e3fc5eed6e37", "@ngraveio/bc-ur": "1.1.13", @@ -61,6 +62,7 @@ "expo-dev-client": "~55.0.32", "expo-device": "~55.0.15", "expo-haptics": "~55.0.14", + "expo-linear-gradient": "~55.0.13", "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", @@ -78,7 +80,6 @@ "react-native-get-random-values": "1.11.0", "react-native-image-picker": "8.2.1", "react-native-keychain": "9.1.0", - "react-native-linear-gradient": "2.8.3", "react-native-localize": "3.5.2", "react-native-permissions": "5.4.2", "react-native-prompt-android": "github:BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376", @@ -93,7 +94,6 @@ "react-native-share": "12.1.0", "react-native-svg": "15.15.3", "react-native-tcp-socket": "6.3.0", - "react-native-vector-icons": "10.2.0", "react-native-watch-connectivity": "1.1.0", "react-test-renderer": "19.0.0", "readable-stream": "3.6.2", @@ -12479,6 +12479,17 @@ "react": "*" } }, + "node_modules/expo-linear-gradient": { + "version": "55.0.13", + "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-55.0.13.tgz", + "integrity": "sha512-Qz2T4jpkA15RIk29DBqI1TwW+8O9AN8MyC4TJPbh/5UnihH0yNNz3waplUO8Szh5OZ3czTGvtPQU4ysF3RDxwQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/expo-manifests": { "version": "55.0.16", "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-55.0.16.tgz", @@ -19711,14 +19722,6 @@ "node": ">=18" } }, - "node_modules/react-native-linear-gradient": { - "version": "2.8.3", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/react-native-localize": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-3.5.2.tgz", @@ -19933,72 +19936,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/react-native-vector-icons": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.2.0.tgz", - "integrity": "sha512-n5HGcxUuVaTf9QJPs/W22xQpC2Z9u0nb0KgLPnVltP8vdUvOp6+R26gF55kilP/fV4eL4vsAHUqUjewppJMBOQ==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.7.2", - "yargs": "^16.1.1" - }, - "bin": { - "fa-upgrade.sh": "bin/fa-upgrade.sh", - "fa5-upgrade": "bin/fa5-upgrade.sh", - "fa6-upgrade": "bin/fa6-upgrade.sh", - "generate-icon": "bin/generate-icon.js" - } - }, - "node_modules/react-native-vector-icons/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/react-native-vector-icons/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native-vector-icons/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native-vector-icons/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/react-native-watch-connectivity": { "version": "1.1.0", "license": "MIT", diff --git a/package.json b/package.json index fc30fac50..5bb604f59 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "@babel/preset-env": "7.27.2", "@bugsnag/react-native": "8.4.0", "@bugsnag/source-maps": "2.3.3", + "@expo/vector-icons": "^15.0.2", "@keystonehq/bc-ur-registry": "0.7.1", "@lodev09/react-native-true-sheet": "github:BlueWallet/react-native-true-sheet#5945184a2fea9fe5ba8f5cfcdb20e3fc5eed6e37", "@ngraveio/bc-ur": "1.1.13", @@ -135,6 +136,7 @@ "expo-dev-client": "~55.0.32", "expo-device": "~55.0.15", "expo-haptics": "~55.0.14", + "expo-linear-gradient": "~55.0.13", "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", @@ -152,7 +154,6 @@ "react-native-get-random-values": "1.11.0", "react-native-image-picker": "8.2.1", "react-native-keychain": "9.1.0", - "react-native-linear-gradient": "2.8.3", "react-native-localize": "3.5.2", "react-native-permissions": "5.4.2", "react-native-prompt-android": "github:BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376", @@ -167,7 +168,6 @@ "react-native-share": "12.1.0", "react-native-svg": "15.15.3", "react-native-tcp-socket": "6.3.0", - "react-native-vector-icons": "10.2.0", "react-native-watch-connectivity": "1.1.0", "react-test-renderer": "19.0.0", "readable-stream": "3.6.2", diff --git a/screen/settings/IsItMyAddress.tsx b/screen/settings/IsItMyAddress.tsx index aebd6f38e..43ff19d31 100644 --- a/screen/settings/IsItMyAddress.tsx +++ b/screen/settings/IsItMyAddress.tsx @@ -7,7 +7,7 @@ import loc from '../../loc'; import { useStorage } from '../../hooks/context/useStorage'; import { TWallet } from '../../class/wallets/types'; import { WalletCarouselItem } from '../../components/WalletsCarousel'; -import Icon from 'react-native-vector-icons/MaterialIcons'; +import { MaterialIcons as Icon } from '@expo/vector-icons'; import { Divider } from '@rneui/themed'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; import presentAlert from '../../components/Alert'; From f921bb4fd4b324a3153fed5b66bb8482a80fcf61 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 5 May 2026 21:42:16 +0530 Subject: [PATCH 06/40] feat: migrate clipboard to expo-clipboard across all files --- components/AddressInputScanButton.tsx | 4 +-- components/CopyTextToClipboard.tsx | 4 +-- components/CopyToClipboardButton.tsx | 4 +-- components/DevMenu.tsx | 10 +++--- .../DoneAndDismissKeyboardInputAccessory.tsx | 4 +-- components/QRCodeComponent.tsx | 2 +- components/TransactionListItem.tsx | 10 +++--- components/TransactionsNavigationHeader.tsx | 4 +-- components/addresses/AddressItem.tsx | 6 ++-- modules/clipboard.ts | 6 ++-- package-lock.json | 36 +++++++------------ package.json | 2 +- screen/send/create.js | 4 +-- screen/send/psbtWithHardwareWallet.js | 4 +-- screen/transactions/CPFP.js | 4 +-- screen/transactions/TransactionDetails.tsx | 4 +-- screen/wallets/ImportWallet.tsx | 6 ++-- screen/wallets/WalletExport.tsx | 4 +-- tests/setup.js | 8 +++-- 19 files changed, 59 insertions(+), 67 deletions(-) diff --git a/components/AddressInputScanButton.tsx b/components/AddressInputScanButton.tsx index 26871b65e..67a7adf8a 100644 --- a/components/AddressInputScanButton.tsx +++ b/components/AddressInputScanButton.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useMemo } from 'react'; import { Image, Keyboard, Platform, StyleSheet, Text } from 'react-native'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import ToolTipMenu from './TooltipMenu'; import loc from '../loc'; import { showFilePickerAndReadFile, showImagePickerAndReadImage } from '../modules/fs'; @@ -92,7 +92,7 @@ export const AddressInputScanButton = ({ presentAlert({ message: (error as Error).message }); } } else { - const clipboardText = await Clipboard.getString(); + const clipboardText = await Clipboard.getStringAsync(); onChangeText(clipboardText); } } catch (error) { diff --git a/components/CopyTextToClipboard.tsx b/components/CopyTextToClipboard.tsx index 093a8070b..2ddbc0602 100644 --- a/components/CopyTextToClipboard.tsx +++ b/components/CopyTextToClipboard.tsx @@ -1,4 +1,4 @@ -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import React, { forwardRef, useEffect, useState } from 'react'; import { Animated, StyleSheet, TouchableOpacity, View } from 'react-native'; @@ -31,7 +31,7 @@ const CopyTextToClipboard = forwardRef const copyToClipboard = () => { setHasTappedText(true); - Clipboard.setString(text); + Clipboard.setStringAsync(text); triggerHapticFeedback(HapticFeedbackTypes.Selection); setAddress(loc.wallets.xpub_copiedToClipboard); // Adjust according to your localization logic setTimeout(() => { diff --git a/components/CopyToClipboardButton.tsx b/components/CopyToClipboardButton.tsx index fe7d507e3..624fd9721 100644 --- a/components/CopyToClipboardButton.tsx +++ b/components/CopyToClipboardButton.tsx @@ -1,4 +1,4 @@ -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import React from 'react'; import { StyleSheet, Text, TouchableOpacity } from 'react-native'; @@ -12,7 +12,7 @@ type CopyToClipboardButtonProps = { export const CopyToClipboardButton: React.FC = ({ stringToCopy, displayText }) => { const onPress = () => { - Clipboard.setString(stringToCopy); + Clipboard.setStringAsync(stringToCopy); triggerHapticFeedback(HapticFeedbackTypes.Selection); }; diff --git a/components/DevMenu.tsx b/components/DevMenu.tsx index 8ad6f964b..7ec580888 100644 --- a/components/DevMenu.tsx +++ b/components/DevMenu.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { DevSettings, Alert, Platform, AlertButton } from 'react-native'; import { useStorage } from '../hooks/context/useStorage'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import { TWallet } from '../class/wallets/types'; import { HDSilentPaymentsWallet } from '../class/wallets/hd-bip352-wallet'; @@ -88,7 +88,7 @@ const DevMenu: React.FC = () => { return; } - Clipboard.setString(wallet.getSecret()); + Clipboard.setStringAsync(wallet.getSecret()); Alert.alert('New Wallet created!', `Wallet secret copied to clipboard.\nLabel: ${label}`); }); @@ -99,7 +99,7 @@ const DevMenu: React.FC = () => { } showAlertWithWalletOptions(wallets, 'Copy Wallet Secret', 'Select the wallet to copy the secret', wallet => { - Clipboard.setString(wallet.getSecret()); + Clipboard.setStringAsync(wallet.getSecret()); Alert.alert('Wallet Secret copied to clipboard!'); }); }); @@ -111,7 +111,7 @@ const DevMenu: React.FC = () => { } showAlertWithWalletOptions(wallets, 'Copy Wallet ID', 'Select the wallet to copy the ID', wallet => { - Clipboard.setString(wallet.getID()); + Clipboard.setStringAsync(wallet.getID()); Alert.alert('Wallet ID copied to clipboard!'); }); }); @@ -129,7 +129,7 @@ const DevMenu: React.FC = () => { wallet => { const xpub = wallet.getXpub(); if (xpub) { - Clipboard.setString(xpub); + Clipboard.setStringAsync(xpub); Alert.alert('Wallet Xpub copied to clipboard!'); } else { Alert.alert('This wallet does not have an Xpub.'); diff --git a/components/DoneAndDismissKeyboardInputAccessory.tsx b/components/DoneAndDismissKeyboardInputAccessory.tsx index 09f82b1a7..ca96831b0 100644 --- a/components/DoneAndDismissKeyboardInputAccessory.tsx +++ b/components/DoneAndDismissKeyboardInputAccessory.tsx @@ -3,7 +3,7 @@ import { InputAccessoryView, Keyboard, Platform, StyleSheet, View } from 'react- import { ShroudButtonLink } from '../ShroudComponents'; import loc from '../loc'; import { useTheme } from './themes'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; interface DoneAndDismissKeyboardInputAccessoryProps { onPasteTapped: (clipboard: string) => void; @@ -20,7 +20,7 @@ export const DoneAndDismissKeyboardInputAccessory: React.FC { - const clipboard = await Clipboard.getString(); + const clipboard = await Clipboard.getStringAsync(); props.onPasteTapped(clipboard); }; diff --git a/components/QRCodeComponent.tsx b/components/QRCodeComponent.tsx index dcd951712..616db7b5a 100644 --- a/components/QRCodeComponent.tsx +++ b/components/QRCodeComponent.tsx @@ -1,4 +1,4 @@ -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import React, { useCallback, useRef } from 'react'; import { Platform, StyleSheet, View } from 'react-native'; import QRCode from 'react-native-qrcode-svg'; diff --git a/components/TransactionListItem.tsx b/components/TransactionListItem.tsx index e064f1abc..638825fba 100644 --- a/components/TransactionListItem.tsx +++ b/components/TransactionListItem.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useMemo, useRef, useState, memo } from 'react'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import { Linking, View, ViewStyle, StyleSheet, Text } from 'react-native'; import { Transaction } from '../class/wallets/types'; import loc, { formatBalanceWithoutSuffix, transactionTimeToReadable } from '../loc'; @@ -182,9 +182,9 @@ export const TransactionListItem: React.FC = memo( } }, [item, navigate, walletID]); - const handleOnCopyAmountTap = useCallback(() => Clipboard.setString(rowTitle.replace(/[\s\\-]/g, '')), [rowTitle]); - const handleOnCopyTransactionID = useCallback(() => Clipboard.setString(item.hash), [item.hash]); - const handleOnCopyNote = useCallback(() => Clipboard.setString(subtitle ?? ''), [subtitle]); + const handleOnCopyAmountTap = useCallback(() => Clipboard.setStringAsync(rowTitle.replace(/[\s\\-]/g, '')), [rowTitle]); + const handleOnCopyTransactionID = useCallback(() => Clipboard.setStringAsync(item.hash), [item.hash]); + const handleOnCopyNote = useCallback(() => Clipboard.setStringAsync(subtitle ?? ''), [subtitle]); const handleOnViewOnBlockExplorer = useCallback(() => { const url = `${selectedBlockExplorer.url}/tx/${item.hash}`; Linking.canOpenURL(url).then(supported => { @@ -194,7 +194,7 @@ export const TransactionListItem: React.FC = memo( }); }, [item.hash, selectedBlockExplorer]); const handleCopyOpenInBlockExplorerPress = useCallback(() => { - Clipboard.setString(`${selectedBlockExplorer.url}/tx/${item.hash}`); + Clipboard.setStringAsync(`${selectedBlockExplorer.url}/tx/${item.hash}`); }, [item.hash, selectedBlockExplorer]); const onToolTipPress = useCallback( diff --git a/components/TransactionsNavigationHeader.tsx b/components/TransactionsNavigationHeader.tsx index 28c19e312..f82b40b62 100644 --- a/components/TransactionsNavigationHeader.tsx +++ b/components/TransactionsNavigationHeader.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useMemo } from 'react'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import { ImageBackground, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import { LinearGradient } from 'expo-linear-gradient'; import WalletGradient from '../class/wallet-gradient'; @@ -33,7 +33,7 @@ const TransactionsNavigationHeader: React.FC const handleCopyPress = useCallback(() => { const value = formatBalance(wallet.getBalance(), unit); if (value) { - Clipboard.setString(value); + Clipboard.setStringAsync(value); } }, [unit, wallet]); diff --git a/components/addresses/AddressItem.tsx b/components/addresses/AddressItem.tsx index 9f77d7e3a..ae151c5b5 100644 --- a/components/addresses/AddressItem.tsx +++ b/components/addresses/AddressItem.tsx @@ -1,5 +1,5 @@ import React, { useMemo, useCallback } from 'react'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import { StyleSheet, Text, View } from 'react-native'; import { ListItem } from '@rneui/themed'; import Share from 'react-native-share'; @@ -106,7 +106,7 @@ const AddressItem = ({ const balance = formatBalance(item.balance, balanceUnit, true); const handleCopyPress = useCallback(() => { - Clipboard.setString(item.address); + Clipboard.setStringAsync(item.address); }, [item.address]); const handleSharePress = useCallback(() => { @@ -127,7 +127,7 @@ const AddressItem = ({ return; } triggerHapticFeedback(HapticFeedbackTypes.Selection); - Clipboard.setString(wif); + Clipboard.setStringAsync(wif); } catch (error: any) { presentAlert({ message: error.message }); } diff --git a/modules/clipboard.ts b/modules/clipboard.ts index e26409d7c..9cf0a027f 100644 --- a/modules/clipboard.ts +++ b/modules/clipboard.ts @@ -1,5 +1,5 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; const STORAGE_KEY: string = 'ClipboardReadAllowed'; @@ -31,8 +31,8 @@ export const getClipboardContent = async (): Promise => { const isAllowed = await isReadClipboardAllowed(); if (!isAllowed) return undefined; - const hasString = await Clipboard.hasString(); - return hasString ? await Clipboard.getString() : undefined; + const hasString = await Clipboard.hasStringAsync(); + return hasString ? await Clipboard.getStringAsync() : undefined; } catch (error) { console.error('Error accessing clipboard:', error); return undefined; diff --git a/package-lock.json b/package-lock.json index 7b9e3fa52..a26fbabad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,6 @@ "@noble/hashes": "1.3.3", "@noble/secp256k1": "1.6.3", "@react-native-async-storage/async-storage": "2.2.0", - "@react-native-clipboard/clipboard": "1.16.3", "@react-native-community/cli": "15.1.3", "@react-native-community/cli-platform-android": "15.1.3", "@react-native-community/cli-platform-ios": "15.1.3", @@ -59,6 +58,7 @@ "events": "3.3.0", "expo": "^55.0.21", "expo-application": "~55.0.14", + "expo-clipboard": "~55.0.13", "expo-dev-client": "~55.0.32", "expo-device": "~55.0.15", "expo-haptics": "~55.0.14", @@ -5568,29 +5568,6 @@ "react-native": "^0.0.0-0 || >=0.65 <1.0" } }, - "node_modules/@react-native-clipboard/clipboard": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.16.3.tgz", - "integrity": "sha512-cMIcvoZKIrShzJHEaHbTAp458R9WOv0fB6UyC7Ek4Qk561Ow/DrzmmJmH/rAZg21Z6ixJ4YSdFDC14crqIBmCQ==", - "license": "MIT", - "workspaces": [ - "example" - ], - "peerDependencies": { - "react": ">= 16.9.0", - "react-native": ">= 0.61.5", - "react-native-macos": ">= 0.61.0", - "react-native-windows": ">= 0.61.0" - }, - "peerDependenciesMeta": { - "react-native-macos": { - "optional": true - }, - "react-native-windows": { - "optional": true - } - } - }, "node_modules/@react-native-community/cli": { "version": "15.1.3", "license": "MIT", @@ -12354,6 +12331,17 @@ "react-native": "*" } }, + "node_modules/expo-clipboard": { + "version": "55.0.13", + "resolved": "https://registry.npmjs.org/expo-clipboard/-/expo-clipboard-55.0.13.tgz", + "integrity": "sha512-PrOmmuVsGW4bAkNQmGKtxMXj3invsfN+jfIKmQxHwE/dn7ODqwFWviUTa+PMUjP3XZmYCDLyu/i0GLeu7HF9Ew==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/expo-constants": { "version": "55.0.15", "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.15.tgz", diff --git a/package.json b/package.json index 5bb604f59..f814c67a3 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,6 @@ "@noble/hashes": "1.3.3", "@noble/secp256k1": "1.6.3", "@react-native-async-storage/async-storage": "2.2.0", - "@react-native-clipboard/clipboard": "1.16.3", "@react-native-community/cli": "15.1.3", "@react-native-community/cli-platform-android": "15.1.3", "@react-native-community/cli-platform-ios": "15.1.3", @@ -133,6 +132,7 @@ "events": "3.3.0", "expo": "^55.0.21", "expo-application": "~55.0.14", + "expo-clipboard": "~55.0.13", "expo-dev-client": "~55.0.32", "expo-device": "~55.0.15", "expo-haptics": "~55.0.14", diff --git a/screen/send/create.js b/screen/send/create.js index fa6214713..213651ba6 100644 --- a/screen/send/create.js +++ b/screen/send/create.js @@ -1,4 +1,4 @@ -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import { useNavigation, useRoute } from '@react-navigation/native'; import BigNumber from 'bignumber.js'; import * as bitcoin from 'bitcoinjs-lib'; @@ -154,7 +154,7 @@ const SendCreate = () => { {loc.send.create_this_is_hex} - Clipboard.setString(tx)}> + Clipboard.setStringAsync(tx)}> {loc.send.create_copy} { }; const copyHexToClipboard = () => { - Clipboard.setString(txHex); + Clipboard.setStringAsync(txHex); }; const _renderBroadcastHex = () => { diff --git a/screen/transactions/CPFP.js b/screen/transactions/CPFP.js index 5f9fda36b..86dee66e2 100644 --- a/screen/transactions/CPFP.js +++ b/screen/transactions/CPFP.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import { ActivityIndicator, Linking, ScrollView, StyleSheet, TextInput, TouchableOpacity, View } from 'react-native'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import PropTypes from 'prop-types'; import { Text } from '@rneui/themed'; import * as Electrum from '../../modules/Electrum'; @@ -175,7 +175,7 @@ export default class CPFP extends Component { {loc.send.create_this_is_hex} - Clipboard.setString(this.state.txhex)}> + Clipboard.setStringAsync(this.state.txhex)}> {loc.send.create_copy} { }; const handleCopyPress = (stringToCopy: string) => { - Clipboard.setString(stringToCopy !== actionKeys.CopyToClipboard ? stringToCopy : `${selectedBlockExplorer.url}/tx/${tx?.hash}`); + Clipboard.setStringAsync(stringToCopy !== actionKeys.CopyToClipboard ? stringToCopy : `${selectedBlockExplorer.url}/tx/${tx?.hash}`); }; if (isLoading || !tx) { diff --git a/screen/wallets/ImportWallet.tsx b/screen/wallets/ImportWallet.tsx index a4021c602..1a8cfb713 100644 --- a/screen/wallets/ImportWallet.tsx +++ b/screen/wallets/ImportWallet.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useState } from 'react'; import { RouteProp, useRoute } from '@react-navigation/native'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import { ActivityIndicator, Keyboard, Platform, StyleSheet, TouchableWithoutFeedback, View, TouchableOpacity, Image } from 'react-native'; import { ShroudFormLabel, ShroudFormMultiInput } from '../../ShroudComponents'; import Button from '../../components/Button'; @@ -108,8 +108,8 @@ const ImportWallet = () => { } try { - if (await Clipboard.hasString()) { - Clipboard.setString(''); + if (await Clipboard.hasStringAsync()) { + Clipboard.setStringAsync(''); } } catch (error) { console.error('Failed to clear clipboard:', error); diff --git a/screen/wallets/WalletExport.tsx b/screen/wallets/WalletExport.tsx index 267be9402..010daa3bc 100644 --- a/screen/wallets/WalletExport.tsx +++ b/screen/wallets/WalletExport.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import { RouteProp, useNavigation, useRoute } from '@react-navigation/native'; import { Icon } from '@rneui/themed'; import { LayoutChangeEvent, ScrollView, StyleSheet, Pressable, View } from 'react-native'; @@ -114,7 +114,7 @@ const WalletExport: React.FC = () => { }, []); const handleCopy = useCallback(() => { - Clipboard.setString(wallet.getSecret()); + Clipboard.setStringAsync(wallet.getSecret()); triggerHapticFeedback(HapticFeedbackTypes.Selection); }, [wallet]); diff --git a/tests/setup.js b/tests/setup.js index 86a76bb7e..2ff42a2b4 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -1,6 +1,6 @@ /* global jest */ -import mockClipboard from '@react-native-clipboard/clipboard/jest/clipboard-mock.js'; + const consoleWarnOrig = console.warn; console.warn = (...args) => { @@ -33,7 +33,11 @@ global.net = require('net'); // needed by Electrum client. For RN it is proviced global.tls = require('tls'); // needed by Electrum client. For RN it is proviced in shim.js global.fetch = require('node-fetch'); -jest.mock('@react-native-clipboard/clipboard', () => mockClipboard); +jest.mock('expo-clipboard', () => ({ + setStringAsync: jest.fn(), + getStringAsync: jest.fn().mockResolvedValue(''), + hasStringAsync: jest.fn().mockResolvedValue(false), +})); jest.mock('react-native-watch-connectivity', () => { return { From 35d93cd7aeb6700586ec0a33553b49677ee4a621 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 5 May 2026 21:44:25 +0530 Subject: [PATCH 07/40] feat: migrate react-native-localize to expo-localization --- ...ative-localize.ts => expo-localization.ts} | 9 ++-- app.json | 3 +- loc/index.ts | 4 +- modules/currency.ts | 8 ++-- package-lock.json | 41 +++++++++---------- package.json | 2 +- screen/send/CoinControl.tsx | 4 +- 7 files changed, 35 insertions(+), 36 deletions(-) rename __mocks__/{react-native-localize.ts => expo-localization.ts} (52%) diff --git a/__mocks__/react-native-localize.ts b/__mocks__/expo-localization.ts similarity index 52% rename from __mocks__/react-native-localize.ts rename to __mocks__/expo-localization.ts index ab533d4fa..92af7df6d 100644 --- a/__mocks__/react-native-localize.ts +++ b/__mocks__/expo-localization.ts @@ -1,8 +1,7 @@ -const getLocales = () => [ +export const getLocales = () => [ // you can choose / add the locales you want - { countryCode: 'US', languageTag: 'en-US', languageCode: 'en', isRTL: false }, - { countryCode: 'FR', languageTag: 'fr-FR', languageCode: 'fr', isRTL: false }, + { countryCode: 'US', languageTag: 'en-US', languageCode: 'en', isRTL: false, currencyCode: 'USD' }, + { countryCode: 'FR', languageTag: 'fr-FR', languageCode: 'fr', isRTL: false, currencyCode: 'EUR' }, ]; -const getCurrencies = () => ['USD', 'EUR']; // can be empty array -export { getLocales, getCurrencies }; +export const getCalendars = () => ['gregorian']; diff --git a/app.json b/app.json index bad8aea8c..7aa9e0c4f 100644 --- a/app.json +++ b/app.json @@ -35,7 +35,8 @@ ] }, "plugins": [ - "expo-dev-client" + "expo-dev-client", + "expo-localization" ], "extra": { "eas": { diff --git a/loc/index.ts b/loc/index.ts index 43f6778d3..e94d261b8 100644 --- a/loc/index.ts +++ b/loc/index.ts @@ -5,7 +5,7 @@ import localizedFormat from 'dayjs/plugin/localizedFormat'; import relativeTime from 'dayjs/plugin/relativeTime'; import Localization, { LocalizedStrings } from 'react-localization'; import { I18nManager } from 'react-native'; -import * as RNLocalize from 'react-native-localize'; +import * as ExpoLocalization from 'expo-localization'; import { satoshiToLocalCurrency } from '../modules/currency'; import { BitcoinUnit } from '../models/bitcoinUnits'; @@ -193,7 +193,7 @@ const init = async () => { } await setDateTimeLocale(); } else { - const locales = RNLocalize.getLocales(); + const locales = ExpoLocalization.getLocales(); if (Object.values(AvailableLanguages).some(language => language.value === locales[0].languageCode)) { await saveLanguage(locales[0].languageCode); await loc.setLanguage(locales[0].languageCode); diff --git a/modules/currency.ts b/modules/currency.ts index d2aed0861..beb7b6ed2 100644 --- a/modules/currency.ts +++ b/modules/currency.ts @@ -1,6 +1,6 @@ import BigNumber from 'bignumber.js'; import DefaultPreference from 'react-native-default-preference'; -import * as RNLocalize from 'react-native-localize'; +import * as Localization from 'expo-localization'; import { FiatUnit, FiatUnitType, getFiatRate } from '../models/fiatUnit'; @@ -143,7 +143,7 @@ async function getPreferredCurrency(): Promise { } if (!preferredFiatCurrency) { - const deviceCurrencies = RNLocalize.getCurrencies(); + const deviceCurrencies = [Localization.getLocales()[0]?.currencyCode].filter(Boolean) as string[]; if (deviceCurrencies[0] && FiatUnit[deviceCurrencies[0]]) { preferredFiatCurrency = FiatUnit[deviceCurrencies[0]]; } else { @@ -206,7 +206,7 @@ async function _restoreSavedPreferredFiatCurrencyFromStorage(): Promise { } catch (error) { await DefaultPreference.clear(PREFERRED_CURRENCY_STORAGE_KEY); - const deviceCurrencies = RNLocalize.getCurrencies(); + const deviceCurrencies = [Localization.getLocales()[0]?.currencyCode].filter(Boolean) as string[]; if (deviceCurrencies[0] && FiatUnit[deviceCurrencies[0]]) { preferredFiatCurrency = FiatUnit[deviceCurrencies[0]]; } else { @@ -214,7 +214,7 @@ async function _restoreSavedPreferredFiatCurrencyFromStorage(): Promise { } } } catch (error) { - const deviceCurrencies = RNLocalize.getCurrencies(); + const deviceCurrencies = [Localization.getLocales()[0]?.currencyCode].filter(Boolean) as string[]; if (deviceCurrencies[0] && FiatUnit[deviceCurrencies[0]]) { preferredFiatCurrency = FiatUnit[deviceCurrencies[0]]; } else { diff --git a/package-lock.json b/package-lock.json index a26fbabad..9e42e0a43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,6 +63,7 @@ "expo-device": "~55.0.15", "expo-haptics": "~55.0.14", "expo-linear-gradient": "~55.0.13", + "expo-localization": "~55.0.13", "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", @@ -80,7 +81,6 @@ "react-native-get-random-values": "1.11.0", "react-native-image-picker": "8.2.1", "react-native-keychain": "9.1.0", - "react-native-localize": "3.5.2", "react-native-permissions": "5.4.2", "react-native-prompt-android": "github:BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376", "react-native-push-notification": "8.1.1", @@ -12478,6 +12478,19 @@ "react-native": "*" } }, + "node_modules/expo-localization": { + "version": "55.0.13", + "resolved": "https://registry.npmjs.org/expo-localization/-/expo-localization-55.0.13.tgz", + "integrity": "sha512-fXiEUUihIrXmAEzoneaTOFcQ7TKmr25RR/ymrB/MvYTVnmevFA1zY2KI0VSiXY+NKKjZ8mG65YSn1wh4gEYKxA==", + "license": "MIT", + "dependencies": { + "rtl-detect": "^1.0.2" + }, + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, "node_modules/expo-manifests": { "version": "55.0.16", "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-55.0.16.tgz", @@ -19710,26 +19723,6 @@ "node": ">=18" } }, - "node_modules/react-native-localize": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/react-native-localize/-/react-native-localize-3.5.2.tgz", - "integrity": "sha512-HfQdwv5sRjh4AQ8a97OTjXYcxPNRlBxiQb861c7Ob6mRuNYCPtaJ45QTcZxZr31vAM3THvtOBp1soqWlQFxjnA==", - "license": "MIT", - "peerDependencies": { - "@expo/config-plugins": "^9.0.0 || ^10.0.0", - "react": "*", - "react-native": "*", - "react-native-macos": "*" - }, - "peerDependenciesMeta": { - "@expo/config-plugins": { - "optional": true - }, - "react-native-macos": { - "optional": true - } - } - }, "node_modules/react-native-permissions": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-5.4.2.tgz", @@ -20560,6 +20553,12 @@ "react-native": ">=0.55" } }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==", + "license": "BSD-3-Clause" + }, "node_modules/run-parallel": { "version": "1.2.0", "funding": [ diff --git a/package.json b/package.json index f814c67a3..e17a77d95 100644 --- a/package.json +++ b/package.json @@ -137,6 +137,7 @@ "expo-device": "~55.0.15", "expo-haptics": "~55.0.14", "expo-linear-gradient": "~55.0.13", + "expo-localization": "~55.0.13", "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", @@ -154,7 +155,6 @@ "react-native-get-random-values": "1.11.0", "react-native-image-picker": "8.2.1", "react-native-keychain": "9.1.0", - "react-native-localize": "3.5.2", "react-native-permissions": "5.4.2", "react-native-prompt-android": "github:BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376", "react-native-push-notification": "8.1.1", diff --git a/screen/send/CoinControl.tsx b/screen/send/CoinControl.tsx index 79a9d1e48..c6d201826 100644 --- a/screen/send/CoinControl.tsx +++ b/screen/send/CoinControl.tsx @@ -15,7 +15,7 @@ import { useWindowDimensions, View, } from 'react-native'; -import * as RNLocalize from 'react-native-localize'; +import * as Localization from 'expo-localization'; import debounce from '../../modules/debounce'; import { TWallet, Utxo } from '../../class/wallets/types'; import BottomModal, { BottomModalHandle } from '../../components/BottomModal'; @@ -154,7 +154,7 @@ const OutputModal: React.FC = ({ tranText: { fontWeight: 'normal', fontSize: 13, color: colors.alternativeTextColor }, memo: { fontSize: 13, marginTop: 3, color: colors.alternativeTextColor }, }); - const confirmationsFormatted = new Intl.NumberFormat(RNLocalize.getLocales()[0].languageCode, { maximumSignificantDigits: 3 }).format( + const confirmationsFormatted = new Intl.NumberFormat(Localization.getLocales()[0].languageCode, { maximumSignificantDigits: 3 }).format( confirmations, ); From c0e0f9e3f5ce31fd91c0ff370be0868e9dbb798a Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 5 May 2026 21:46:58 +0530 Subject: [PATCH 08/40] feat: migrate react-native-fs, react-native-image-picker, @react-native-documents/picker to expo variants --- class/shroud-app.ts | 36 +++++++------ modules/Electrum.ts | 4 +- modules/fs.ts | 120 +++++++++++++++++++++--------------------- package-lock.json | 86 +++++++++++++----------------- package.json | 6 +-- screen/send/create.js | 12 ++--- tests/setup.js | 63 +++++++--------------- 7 files changed, 147 insertions(+), 180 deletions(-) diff --git a/class/shroud-app.ts b/class/shroud-app.ts index 8d2e01046..09cee156b 100644 --- a/class/shroud-app.ts +++ b/class/shroud-app.ts @@ -1,7 +1,7 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import { sha256 } from '@noble/hashes/sha256'; import DefaultPreference from 'react-native-default-preference'; -import RNFS from 'react-native-fs'; +import * as FileSystem from 'expo-file-system'; import Keychain from 'react-native-keychain'; import RNSecureKeyStore, { ACCESSIBLE } from 'react-native-secure-key-store'; import Realm from 'realm'; @@ -224,7 +224,7 @@ export class ShroudApp { * Database file is deterministically derived from encryption key. */ async getRealmForTransactions() { - const cacheFolderPath = RNFS.CachesDirectoryPath; // Path to cache folder + const cacheFolderPath = FileSystem.cacheDirectory; // Path to cache folder const password = this.hashIt(this.cachedPassword || 'fyegjitkyf[eqjnc.lf'); const buf = Buffer.from(this.hashIt(password) + this.hashIt(password), 'hex'); const encryptionKey = Int8Array.from(buf); @@ -259,7 +259,7 @@ export class ShroudApp { * @returns {Promise} */ async openRealmKeyValue(): Promise { - const cacheFolderPath = RNFS.CachesDirectoryPath; // Path to cache folder + const cacheFolderPath = FileSystem.cacheDirectory; // Path to cache folder const service = 'realm_encryption_key'; let password; const credentials = await Keychain.getGenericPassword({ service }); @@ -767,28 +767,30 @@ export class ShroudApp { } async moveRealmFilesToCacheDirectory() { - const documentPath = RNFS.DocumentDirectoryPath; // Path to documentPath folder - const cachePath = RNFS.CachesDirectoryPath; // Path to cachePath folder + const documentPath = FileSystem.documentDirectory; // Path to documentPath folder + const cachePath = FileSystem.cacheDirectory; // Path to cachePath folder try { - if (!(await RNFS.exists(documentPath))) return; // If the documentPath directory does not exist, return (nothing to move) - const files = await RNFS.readDir(documentPath); // Read all files in documentPath directory + if (!documentPath) return; + const dirInfo = await FileSystem.getInfoAsync(documentPath); + if (!dirInfo.exists) return; // If the documentPath directory does not exist, return (nothing to move) + const files = await FileSystem.readDirectoryAsync(documentPath); // Read all files in documentPath directory if (Array.isArray(files) && files.length === 0) return; // If there are no files, return (nothing to move) const appRealmFiles = files.filter( - file => file.name.endsWith('.realm') || file.name.endsWith('.realm.lock') || file.name.includes('.realm.management'), + file => file.endsWith('.realm') || file.endsWith('.realm.lock') || file.includes('.realm.management'), ); for (const file of appRealmFiles) { - const filePath = `${documentPath}/${file.name}`; - const newFilePath = `${cachePath}/${file.name}`; - const fileExists = await RNFS.exists(filePath); // Check if the file exists - const cacheFileExists = await RNFS.exists(newFilePath); // Check if the file already exists in the cache directory - - if (fileExists) { - if (cacheFileExists) { - await RNFS.unlink(newFilePath); // Delete the file in the cache directory if it exists + const filePath = `${documentPath}${file}`; + const newFilePath = `${cachePath}${file}`; + const fileInfo = await FileSystem.getInfoAsync(filePath); // Check if the file exists + const cacheFileInfo = await FileSystem.getInfoAsync(newFilePath); // Check if the file already exists in the cache directory + + if (fileInfo.exists) { + if (cacheFileInfo.exists) { + await FileSystem.deleteAsync(newFilePath); // Delete the file in the cache directory if it exists console.log(`Existing file removed from cache: ${newFilePath}`); } - await RNFS.moveFile(filePath, newFilePath); // Move the file + await FileSystem.moveAsync({ from: filePath, to: newFilePath }); // Move the file console.log(`Moved Realm file: ${filePath} to ${newFilePath}`); } else { console.log(`File does not exist: ${filePath}`); diff --git a/modules/Electrum.ts b/modules/Electrum.ts index bfd8c70b8..b3ed2995a 100644 --- a/modules/Electrum.ts +++ b/modules/Electrum.ts @@ -2,7 +2,7 @@ import BigNumber from 'bignumber.js'; import * as bitcoin from 'bitcoinjs-lib'; import { bech32, bech32m } from 'bech32'; import DefaultPreference from 'react-native-default-preference'; -import RNFS from 'react-native-fs'; +import * as FileSystem from 'expo-file-system'; import Realm from 'realm'; import { sha256 as _sha256 } from '@noble/hashes/sha256'; @@ -139,7 +139,7 @@ function bitcoinjs_crypto_sha256(buffer: Uint8Array): Buffer { async function _getRealm() { if (_realm) return _realm; - const cacheFolderPath = RNFS.CachesDirectoryPath; // Path to cache folder + const cacheFolderPath = FileSystem.cacheDirectory; // Path to cache folder const password = uint8ArrayToHex(bitcoinjs_crypto_sha256(Buffer.from('fyegjitkyf[eqjnc.lf'))); const buf = Buffer.from(password + password, 'hex'); const encryptionKey = Int8Array.from(buf); diff --git a/modules/fs.ts b/modules/fs.ts index e921fe10b..caae90d88 100644 --- a/modules/fs.ts +++ b/modules/fs.ts @@ -1,7 +1,7 @@ import { Platform } from 'react-native'; -import { pick, types, keepLocalCopy, errorCodes } from '@react-native-documents/picker'; -import RNFS from 'react-native-fs'; -import { launchImageLibrary, ImagePickerResponse } from 'react-native-image-picker'; +import * as DocumentPicker from 'expo-document-picker'; +import * as FileSystem from 'expo-file-system'; +import * as ImagePicker from 'expo-image-picker'; import Share from 'react-native-share'; import presentAlert from '../components/Alert'; import loc from '../loc'; @@ -15,7 +15,7 @@ const _sanitizeFileName = (fileName: string) => { }; export const isCancel = (err: any): boolean => { - return err.code && err.code === errorCodes.OPERATION_CANCELED; + return err.code === 'OPERATION_CANCELED' || err.message === 'OPERATION_CANCELED'; }; const _shareOpen = async (filePath: string, showShareDialog: boolean = false) => { @@ -34,7 +34,9 @@ const _shareOpen = async (filePath: string, showShareDialog: boolean = false) => presentAlert({ message: error.message }); } } finally { - await RNFS.unlink(filePath); + try { + await FileSystem.deleteAsync(filePath, { idempotent: true }); + } catch (e) {} } }; @@ -47,13 +49,13 @@ export const writeFileAndExport = async function (fileName: string, contents: st const sanitizedFileName = _sanitizeFileName(fileName); try { if (Platform.OS === 'ios') { - const filePath = `${RNFS.TemporaryDirectoryPath}/${sanitizedFileName}`; - await RNFS.writeFile(filePath, contents); + const filePath = `${FileSystem.cacheDirectory}${sanitizedFileName}`; + await FileSystem.writeAsStringAsync(filePath, contents); await _shareOpen(filePath, showShareDialog); } else if (Platform.OS === 'android') { - const filePath = `${RNFS.DownloadDirectoryPath}/${sanitizedFileName}`; + const filePath = `${FileSystem.documentDirectory}${sanitizedFileName}`; try { - await RNFS.writeFile(filePath, contents); + await FileSystem.writeAsStringAsync(filePath, contents); if (showShareDialog) { await _shareOpen(filePath); } else { @@ -75,12 +77,17 @@ export const writeFileAndExport = async function (fileName: string, contents: st */ export const openSignedTransaction = async function (): Promise { try { - const [res] = await pick({ - type: Platform.OS === 'ios' ? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn', types.json] : [types.allFiles], + const result = await DocumentPicker.getDocumentAsync({ + type: Platform.OS === 'ios' ? ['application/json', '*/*'] : '*/*', + copyToCacheDirectory: true, }); - return await _readPsbtFileIntoBase64(res.uri); - } catch (err) { + if (result.canceled || !result.assets || result.assets.length === 0) { + throw { code: 'OPERATION_CANCELED' }; + } + + return await _readPsbtFileIntoBase64(result.assets[0].uri); + } catch (err: any) { if (!isCancel(err)) { presentAlert({ message: loc.send.details_no_signed_tx }); } @@ -90,7 +97,7 @@ export const openSignedTransaction = async function (): Promise }; const _readPsbtFileIntoBase64 = async function (uri: string): Promise { - const base64 = await RNFS.readFile(uri, 'base64'); + const base64 = await FileSystem.readAsStringAsync(uri, { encoding: FileSystem.EncodingType.Base64 }); const stringData = Buffer.from(base64, 'base64').toString(); // decode from base64 if (stringData.startsWith('psbt')) { // file was binary, but outer code expects base64 psbt, so we return base64 we got from rn-fs; @@ -106,24 +113,20 @@ const _readPsbtFileIntoBase64 = async function (uri: string): Promise { export const showImagePickerAndReadImage = async (): Promise => { try { - const response: ImagePickerResponse = await launchImageLibrary({ - mediaType: 'photo', - maxHeight: 800, - maxWidth: 600, - selectionLimit: 1, + const response = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ['images'], + allowsMultipleSelection: false, }); - if (response.didCancel) { + if (response.canceled) { return undefined; - } else if (response.errorCode) { - throw new Error(response.errorMessage); - } else if (response.assets) { + } else if (response.assets && response.assets.length > 0) { try { const uri = response.assets[0].uri; if (uri) { - const result = await RNQRGenerator.detect({ uri: decodeURI(uri.toString()) }); - if (result?.values.length > 0) { - return result?.values[0]; + const result = await RNQRGenerator.detect({ uri: decodeURI(uri) }); + if (result?.values && result.values.length > 0) { + return result.values[0]; } } throw new Error(loc.send.qr_error_no_qrcode); @@ -142,42 +145,30 @@ export const showImagePickerAndReadImage = async (): Promise export const showFilePickerAndReadFile = async function (): Promise<{ data: string | false; uri: string | false }> { try { - const [pickedFile] = await pick({ - type: - Platform.OS === 'ios' - ? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn', 'io.bluewallet.backup', types.plainText, types.json, types.images] - : [types.allFiles], + const result = await DocumentPicker.getDocumentAsync({ + type: '*/*', + copyToCacheDirectory: true, }); - const [localCopy] = await keepLocalCopy({ - files: [ - { - uri: pickedFile.uri, - fileName: pickedFile.name ?? 'unnamed', - }, - ], - destination: 'cachesDirectory', - }); - - if (localCopy.status !== 'success') { - // to make ts happy, should not need this check here - presentAlert({ message: 'Picking and caching a file failed: ' + localCopy.copyError }); - return { data: false, uri: false }; + if (result.canceled || !result.assets || result.assets.length === 0) { + throw { code: 'OPERATION_CANCELED' }; } - const fileCopyUri = decodeURI(localCopy.localUri); + const pickedFile = result.assets[0]; + const fileCopyUri = pickedFile.uri; + const lowerName = (pickedFile.name || fileCopyUri).toLowerCase(); - if (localCopy.localUri.toLowerCase().endsWith('.psbt')) { + if (lowerName.endsWith('.psbt')) { // this is either binary file from ElectrumDesktop OR string file with base64 string in there const file = await _readPsbtFileIntoBase64(fileCopyUri); return { data: file, uri: fileCopyUri }; } - if (localCopy.localUri.endsWith('.png') || localCopy.localUri.endsWith('.jpg') || localCopy.localUri.endsWith('.jpeg')) { + if (lowerName.endsWith('.png') || lowerName.endsWith('.jpg') || lowerName.endsWith('.jpeg')) { return await handleImageFile(fileCopyUri); } - const file = await RNFS.readFile(fileCopyUri); + const file = await FileSystem.readAsStringAsync(fileCopyUri, { encoding: FileSystem.EncodingType.UTF8 }); return { data: file, uri: fileCopyUri }; } catch (err: any) { if (!isCancel(err)) { @@ -189,8 +180,8 @@ export const showFilePickerAndReadFile = async function (): Promise<{ data: stri const handleImageFile = async (fileCopyUri: string): Promise<{ data: string | false; uri: string | false }> => { try { - const exists = await RNFS.exists(fileCopyUri); - if (!exists) { + const info = await FileSystem.getInfoAsync(fileCopyUri); + if (!info.exists) { presentAlert({ message: 'File does not exist' }); return { data: false, uri: false }; } @@ -218,7 +209,7 @@ export const readFileOutsideSandbox = (filePath: string) => { if (Platform.OS === 'ios') { return readFile(filePath); } else if (Platform.OS === 'android') { - return RNFS.readFile(filePath); + return FileSystem.readAsStringAsync(filePath, { encoding: FileSystem.EncodingType.UTF8 }); } else { presentAlert({ message: 'Not implemented for this platform' }); throw new Error('Not implemented for this platform'); @@ -227,16 +218,22 @@ export const readFileOutsideSandbox = (filePath: string) => { export const openSignedTransactionRaw: () => Promise = async () => { try { - const [res] = await pick({ - type: Platform.OS === 'ios' ? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn', types.json] : [types.allFiles], + const result = await DocumentPicker.getDocumentAsync({ + type: '*/*', + copyToCacheDirectory: true, }); - const file = await RNFS.readFile(res.uri); + + if (result.canceled || !result.assets || result.assets.length === 0) { + throw { code: 'OPERATION_CANCELED' }; + } + + const file = await FileSystem.readAsStringAsync(result.assets[0].uri, { encoding: FileSystem.EncodingType.UTF8 }); if (file) { return file; } else { throw new Error('Could not read file'); } - } catch (err) { + } catch (err: any) { if (!isCancel(err)) { presentAlert({ message: loc.send.details_no_signed_tx }); } @@ -246,9 +243,14 @@ export const openSignedTransactionRaw: () => Promise = async () => { }; export const pickTransaction = async () => { - const [res] = await pick({ - type: Platform.OS === 'ios' ? ['io.bluewallet.psbt', 'io.bluewallet.psbt.txn', types.plainText, types.json] : [types.allFiles], + const result = await DocumentPicker.getDocumentAsync({ + type: '*/*', + copyToCacheDirectory: true, }); - return res; + if (result.canceled || !result.assets || result.assets.length === 0) { + return null; + } + + return result.assets[0]; }; diff --git a/package-lock.json b/package-lock.json index 9e42e0a43..9dd96b93d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,6 @@ "@react-native-community/cli-platform-android": "15.1.3", "@react-native-community/cli-platform-ios": "15.1.3", "@react-native-community/push-notification-ios": "1.11.0", - "@react-native-documents/picker": "10.1.5", "@react-native-menu/menu": "github:BlueWallet/menu#9933468", "@react-native/gradle-plugin": "0.78.2", "@react-native/metro-config": "0.78.2", @@ -61,7 +60,10 @@ "expo-clipboard": "~55.0.13", "expo-dev-client": "~55.0.32", "expo-device": "~55.0.15", + "expo-document-picker": "~55.0.13", + "expo-file-system": "~55.0.19", "expo-haptics": "~55.0.14", + "expo-image-picker": "~55.0.20", "expo-linear-gradient": "~55.0.13", "expo-localization": "~55.0.13", "lottie-react-native": "~7.3.4", @@ -76,10 +78,8 @@ "react-native-capture-protection": "github:BlueWallet/react-native-capture-protection#54d900", "react-native-default-preference": "https://github.com/BlueWallet/react-native-default-preference.git#6338a1f1235e4130b8cfc2dd3b53015eeff2870c", "react-native-draglist": "github:BlueWallet/react-native-draglist#354c28e", - "react-native-fs": "2.20.0", "react-native-gesture-handler": "~2.30.0", "react-native-get-random-values": "1.11.0", - "react-native-image-picker": "8.2.1", "react-native-keychain": "9.1.0", "react-native-permissions": "5.4.2", "react-native-prompt-android": "github:BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376", @@ -5776,16 +5776,6 @@ "react-native": ">=0.58.4" } }, - "node_modules/@react-native-documents/picker": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@react-native-documents/picker/-/picker-10.1.5.tgz", - "integrity": "sha512-ajn55rNyxUqbQbz5gmm9gYFI1ifHBmMLH4jVWViA7IFqk1EiEM+pJcpoHizWr5hetR6tzQsaoI4vzCNv/WyA7w==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/@react-native-menu/menu": { "version": "1.2.4", "resolved": "git+ssh://git@github.com/BlueWallet/menu.git#9933468ad6c85c62e455d29fbd079ae9c4a2ef2c", @@ -8622,9 +8612,6 @@ "version": "1.0.2", "license": "MIT" }, - "node_modules/base-64": { - "version": "0.1.0" - }, "node_modules/base-x": { "version": "4.0.1", "license": "MIT" @@ -12418,10 +12405,19 @@ "expo": "*" } }, + "node_modules/expo-document-picker": { + "version": "55.0.13", + "resolved": "https://registry.npmjs.org/expo-document-picker/-/expo-document-picker-55.0.13.tgz", + "integrity": "sha512-IhswJElhdzs3fKDEKW8KXYRoFkWGEsXRMYAZT46Yo56zqqy8yQXrczo33RSwD2hFzNQBdLT97SJL9N311UyS3g==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-file-system": { - "version": "55.0.17", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.17.tgz", - "integrity": "sha512-d27K1cagUOt2BwxwPka9KW8Znu5kN1tnairozCzzCRZviZFtWnBxwFuJ3KU6MAbav/9UhSMkp5Ve/oZ+SR0UgQ==", + "version": "55.0.19", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.19.tgz", + "integrity": "sha512-c4smCbMqELLI3YQrGpw21MwZIREXM2e53vQD/+KWQcae1q+hgw8J2TroEqcQ/jVOtFpZYVvyVfgu4HDKNEKmNw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -12451,6 +12447,27 @@ "expo": "*" } }, + "node_modules/expo-image-loader": { + "version": "55.0.0", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-55.0.0.tgz", + "integrity": "sha512-NOjp56wDrfuA5aiNAybBIjqIn1IxKeGJ8CECWZncQ/GzjZfyTYAHTCyeApYkdKkMBLHINzI4BbTGSlbCa0fXXQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-picker": { + "version": "55.0.20", + "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-55.0.20.tgz", + "integrity": "sha512-lfWt/0rPWdKz8AdDEGmGHZIJSNlVc720Dlx5bfou10FU16ZV5wAbTU63nm2jkXd8hbXke4a/2Ha1dzxCVA+LQQ==", + "license": "MIT", + "dependencies": { + "expo-image-loader": "~55.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-json-utils": { "version": "55.0.2", "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-55.0.2.tgz", @@ -19648,23 +19665,6 @@ "react-native-reanimated": ">= 2.0.0" } }, - "node_modules/react-native-fs": { - "version": "2.20.0", - "license": "MIT", - "dependencies": { - "base-64": "^0.1.0", - "utf8": "^3.0.0" - }, - "peerDependencies": { - "react-native": "*", - "react-native-windows": "*" - }, - "peerDependenciesMeta": { - "react-native-windows": { - "optional": true - } - } - }, "node_modules/react-native-gesture-handler": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.30.1.tgz", @@ -19692,16 +19692,6 @@ "react-native": ">=0.56" } }, - "node_modules/react-native-image-picker": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-8.2.1.tgz", - "integrity": "sha512-FBeGYJGFDjMdGCcyubDJgBAPCQ4L1D3hwLXyUU91jY9ahOZMTbluceVvRmrEKqnDPFJ0gF1NVhJ0nr1nROFLdg==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/react-native-is-edge-to-edge": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz", @@ -22376,10 +22366,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/utf8": { - "version": "3.0.0", - "license": "MIT" - }, "node_modules/utf8-byte-length": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", diff --git a/package.json b/package.json index e17a77d95..e9d866b9c 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,6 @@ "@react-native-community/cli-platform-android": "15.1.3", "@react-native-community/cli-platform-ios": "15.1.3", "@react-native-community/push-notification-ios": "1.11.0", - "@react-native-documents/picker": "10.1.5", "@react-native-menu/menu": "github:BlueWallet/menu#9933468", "@react-native/gradle-plugin": "0.78.2", "@react-native/metro-config": "0.78.2", @@ -135,7 +134,10 @@ "expo-clipboard": "~55.0.13", "expo-dev-client": "~55.0.32", "expo-device": "~55.0.15", + "expo-document-picker": "~55.0.13", + "expo-file-system": "~55.0.19", "expo-haptics": "~55.0.14", + "expo-image-picker": "~55.0.20", "expo-linear-gradient": "~55.0.13", "expo-localization": "~55.0.13", "lottie-react-native": "~7.3.4", @@ -150,10 +152,8 @@ "react-native-capture-protection": "github:BlueWallet/react-native-capture-protection#54d900", "react-native-default-preference": "https://github.com/BlueWallet/react-native-default-preference.git#6338a1f1235e4130b8cfc2dd3b53015eeff2870c", "react-native-draglist": "github:BlueWallet/react-native-draglist#354c28e", - "react-native-fs": "2.20.0", "react-native-gesture-handler": "~2.30.0", "react-native-get-random-values": "1.11.0", - "react-native-image-picker": "8.2.1", "react-native-keychain": "9.1.0", "react-native-permissions": "5.4.2", "react-native-prompt-android": "github:BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376", diff --git a/screen/send/create.js b/screen/send/create.js index 213651ba6..315c6368b 100644 --- a/screen/send/create.js +++ b/screen/send/create.js @@ -6,7 +6,7 @@ import PropTypes from 'prop-types'; import React, { useCallback, useEffect } from 'react'; import { Alert, FlatList, Linking, Platform, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native'; import { Icon } from '@rneui/themed'; -import RNFS from 'react-native-fs'; +import * as FileSystem from 'expo-file-system'; import { PERMISSIONS, request, RESULTS } from 'react-native-permissions'; import Share from 'react-native-share'; import { satoshiToBTC } from '../../modules/currency'; @@ -62,8 +62,8 @@ const SendCreate = () => { const exportTXN = useCallback(async () => { const fileName = `${Date.now()}.txn`; if (Platform.OS === 'ios') { - const filePath = RNFS.TemporaryDirectoryPath + `/${fileName}`; - await RNFS.writeFile(filePath, tx); + const filePath = FileSystem.cacheDirectory + fileName; + await FileSystem.writeAsStringAsync(filePath, tx); Share.open({ url: 'file://' + filePath, saveToFiles: isDesktop, @@ -72,15 +72,15 @@ const SendCreate = () => { console.log(error); }) .finally(() => { - RNFS.unlink(filePath); + FileSystem.deleteAsync(filePath).catch(() => {}); }); } else if (Platform.OS === 'android') { const granted = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); if (granted === RESULTS.GRANTED) { console.log('Storage Permission: Granted'); - const filePath = RNFS.DownloadDirectoryPath + `/${fileName}`; + const filePath = FileSystem.documentDirectory + fileName; try { - await RNFS.writeFile(filePath, tx); + await FileSystem.writeAsStringAsync(filePath, tx); presentAlert({ message: loc.formatString(loc.send.txSaved, { filePath }) }); } catch (e) { console.log(e); diff --git a/tests/setup.js b/tests/setup.js index 2ff42a2b4..53a65ae12 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -163,53 +163,30 @@ jest.mock('react-native-default-preference', () => { }; }); -jest.mock('react-native-fs', () => { +jest.mock('expo-file-system', () => { return { - mkdir: jest.fn(), - moveFile: jest.fn(), - copyFile: jest.fn(), - pathForBundle: jest.fn(), - pathForGroup: jest.fn(), - getFSInfo: jest.fn(), - getAllExternalFilesDirs: jest.fn(), - unlink: jest.fn(), - exists: jest.fn(), - stopDownload: jest.fn(), - resumeDownload: jest.fn(), - isResumable: jest.fn(), - stopUpload: jest.fn(), - completeHandlerIOS: jest.fn(), - readDir: jest.fn(), - readDirAssets: jest.fn(), - existsAssets: jest.fn(), - readdir: jest.fn(), - setReadable: jest.fn(), - stat: jest.fn(), - readFile: jest.fn(), - read: jest.fn(), - readFileAssets: jest.fn(), - hash: jest.fn(), - copyFileAssets: jest.fn(), - copyFileAssetsIOS: jest.fn(), - copyAssetsVideoIOS: jest.fn(), - writeFile: jest.fn(), - appendFile: jest.fn(), - write: jest.fn(), - downloadFile: jest.fn(), - uploadFiles: jest.fn(), - touch: jest.fn(), - MainBundlePath: jest.fn(), - CachesDirectoryPath: jest.fn(), - DocumentDirectoryPath: jest.fn(), - ExternalDirectoryPath: jest.fn(), - ExternalStorageDirectoryPath: jest.fn(), - TemporaryDirectoryPath: jest.fn(), - LibraryDirectoryPath: jest.fn(), - PicturesDirectoryPath: jest.fn(), + documentDirectory: 'file:///mock/document/directory/', + cacheDirectory: 'file:///mock/cache/directory/', + readAsStringAsync: jest.fn(), + writeAsStringAsync: jest.fn(), + deleteAsync: jest.fn(), + getInfoAsync: jest.fn().mockResolvedValue({ exists: true }), + readDirectoryAsync: jest.fn().mockResolvedValue([]), + moveAsync: jest.fn(), + EncodingType: { + UTF8: 'utf8', + Base64: 'base64', + }, }; }); -jest.mock('@react-native-documents/picker', () => ({})); +jest.mock('expo-document-picker', () => ({ + getDocumentAsync: jest.fn().mockResolvedValue({ canceled: true }), +})); + +jest.mock('expo-image-picker', () => ({ + launchImageLibraryAsync: jest.fn().mockResolvedValue({ canceled: true }), +})); jest.mock('expo-haptics', () => ({ impactAsync: jest.fn(), From 2d137847952485057dc2612bddbcc6a5036153de Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 5 May 2026 21:54:04 +0530 Subject: [PATCH 09/40] feat: migrate react-native-push-notification and react-native-permissions to expo-notifications and expo-camera --- helpers/scan-qr.ts | 14 +- modules/notifications.ts | 422 +++++++---------------- package-lock.json | 145 +++++--- package.json | 6 +- screen/send/CoinControl.tsx | 3 +- screen/send/create.js | 32 +- screen/settings/NotificationSettings.tsx | 8 +- screen/settings/SettingsPrivacy.tsx | 4 +- tests/setup.js | 16 +- 9 files changed, 257 insertions(+), 393 deletions(-) diff --git a/helpers/scan-qr.ts b/helpers/scan-qr.ts index 72fbe8610..c1e2fe6d8 100644 --- a/helpers/scan-qr.ts +++ b/helpers/scan-qr.ts @@ -1,14 +1,14 @@ -import { Platform } from 'react-native'; -import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions'; -import { navigationRef } from '../NavigationService.ts'; +import { Camera } from 'expo-camera'; +import { navigationRef } from '../NavigationService'; const isCameraAuthorizationStatusGranted = async () => { - const status = await check(Platform.OS === 'android' ? PERMISSIONS.ANDROID.CAMERA : PERMISSIONS.IOS.CAMERA); - return status === RESULTS.GRANTED; + const { status } = await Camera.getCameraPermissionsAsync(); + return status === 'granted'; }; -const requestCameraAuthorization = () => { - return request(Platform.OS === 'android' ? PERMISSIONS.ANDROID.CAMERA : PERMISSIONS.IOS.CAMERA); +const requestCameraAuthorization = async () => { + const { status } = await Camera.requestCameraPermissionsAsync(); + return status === 'granted'; }; const scanQrHelper = async (): Promise => { diff --git a/modules/notifications.ts b/modules/notifications.ts index 23e9a8a5d..537a2f199 100644 --- a/modules/notifications.ts +++ b/modules/notifications.ts @@ -1,9 +1,8 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; -import PushNotificationIOS from '@react-native-community/push-notification-ios'; +import * as Notifications from 'expo-notifications'; import { AppState, AppStateStatus, Platform } from 'react-native'; -import { getApplicationName, getSystemName, getSystemVersion, getVersion, hasGmsSync, hasHmsSync } from 'react-native-device-info'; -import { checkNotifications, requestNotifications, RESULTS } from 'react-native-permissions'; -import PushNotification, { ReceivedNotification } from 'react-native-push-notification'; +import * as Application from 'expo-application'; +import * as Device from 'expo-device'; import loc from '../loc'; import { groundControlUri } from './constants'; import { fetch } from '../util/fetch'; @@ -17,21 +16,18 @@ let baseURI = groundControlUri; type TPushToken = { token: string; - os: string; // its actually ('ios' | 'android'), but types for the lib are a bit more generic... + os: string; }; -// thats unwrapped `ReceivedNotification`, withall `data` fields inline type TPayload = { - // inherited from `ReceivedNotification`: subText?: string; message?: string | object; foreground: boolean; userInteraction: boolean; - // hopefully stuffed in `data` and uwrapped when received: - address: string; - txid: string; - type: number; - hash: string; + address?: string; + txid?: string; + type?: number; + hash?: string; }; function deepClone(obj: T): T { @@ -40,9 +36,8 @@ function deepClone(obj: T): T { const checkAndroidNotificationPermission = async () => { try { - const { status } = await checkNotifications(); - console.debug('Notification permission check:', status); - return status === RESULTS.GRANTED; + const { status } = await Notifications.getPermissionsAsync(); + return status === 'granted'; } catch (err) { console.error('Failed to check notification permission:', err); return false; @@ -51,15 +46,14 @@ const checkAndroidNotificationPermission = async () => { export const checkNotificationPermissionStatus = async () => { try { - const { status } = await checkNotifications(); + const { status } = await Notifications.getPermissionsAsync(); return status; } catch (error) { console.error('Failed to check notification permissions:', error); - return 'unavailable'; // Return 'unavailable' if the status cannot be retrieved + return 'unavailable'; } }; -// Listener to monitor notification permission status changes while app is running let currentPermissionStatus = 'unavailable'; const handleAppStateChange = async (nextAppState: AppStateStatus) => { if (nextAppState === 'active') { @@ -82,83 +76,38 @@ export const cleanUserOptOutFlag = async () => { return AsyncStorage.removeItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG); }; -/** - * Should be called when user is most interested in receiving push notifications. - * If we dont have a token it will show alert asking whether - * user wants to receive notifications, and if yes - will configure push notifications. - * FYI, on Android permissions are acquired when app is installed, so basically we dont need to ask, - * we can just call `configure`. On iOS its different, and calling `configure` triggers system's dialog box. - * - * @returns {Promise} TRUE if permissions were obtained, FALSE otherwise - */ -/** - * Attempts to obtain permissions and configure notifications. - * Shows a rationale on Android if permissions are needed. - * - * @returns {Promise} - */ export const tryToObtainPermissions = async () => { - console.debug('tryToObtainPermissions: Starting user-triggered permission request'); - - if (!isNotificationsCapable) { - console.debug('tryToObtainPermissions: Device not capable'); - return false; - } + if (!isNotificationsCapable) return false; try { - const rationale = { - title: loc.settings.notifications, - message: loc.notifications.would_you_like_to_receive_notifications, - buttonPositive: loc._.ok, - buttonNegative: loc.notifications.no_and_dont_ask, - }; - - const { status } = await requestNotifications( - ['alert', 'sound', 'badge'], - Platform.OS === 'android' && Platform.Version < 33 ? rationale : undefined, - ); - if (status !== RESULTS.GRANTED) { - console.debug('tryToObtainPermissions: Permission denied'); - return false; - } + const { status } = await Notifications.requestPermissionsAsync({ + ios: { + allowAlert: true, + allowBadge: true, + allowSound: true, + }, + }); + + if (status !== 'granted') return false; + return configureNotifications(); } catch (error) { console.error('Error requesting notification permissions:', error); return false; } }; -/** - * Submits onchain bitcoin addresses and ln invoice preimage hashes to GroundControl server, so later we could - * be notified if they were paid - * - * @param addresses {string[]} - * @param hashes {string[]} - * @param txids {string[]} - * @returns {Promise} Response object from API rest call - */ -export const majorTomToGroundControl = async (addresses: string[], hashes: string[], txids: string[]) => { - console.debug('majorTomToGroundControl: Starting notification registration', { - addressCount: addresses?.length, - hashCount: hashes?.length, - txidCount: txids?.length, - }); +export const majorTomToGroundControl = async (addresses: string[], hashes: string[], txids: string[]) => { try { const noAndDontAskFlag = await AsyncStorage.getItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG); - if (noAndDontAskFlag === 'true') { - console.warn('User has opted out of notifications.'); - return; - } + if (noAndDontAskFlag === 'true') return; if (!Array.isArray(addresses) || !Array.isArray(hashes) || !Array.isArray(txids)) { throw new Error('No addresses, hashes, or txids provided'); } const pushToken = await getPushToken(); - console.debug('majorTomToGroundControl: Retrieved push token:', !!pushToken); - if (!pushToken || !pushToken.token || !pushToken.os) { - return; - } + if (!pushToken || !pushToken.token || !pushToken.os) return; const requestBody = JSON.stringify({ addresses, @@ -168,18 +117,11 @@ export const majorTomToGroundControl = async (addresses: string[], hashes: strin os: pushToken.os, }); - let response; - try { - console.debug('majorTomToGroundControl: Sending request to:', `${baseURI}/majorTomToGroundControl`); - response = await fetch(`${baseURI}/majorTomToGroundControl`, { - method: 'POST', - headers: _getHeaders(), - body: requestBody, - }); - } catch (networkError) { - console.error('Network request failed:', networkError); - throw networkError; - } + const response = await fetch(`${baseURI}/majorTomToGroundControl`, { + method: 'POST', + headers: _getHeaders(), + body: requestBody, + }); if (!response.ok) { throw new Error(`Ground Control request failed with status ${response.status}: ${response.statusText}`); @@ -187,48 +129,20 @@ export const majorTomToGroundControl = async (addresses: string[], hashes: strin const responseText = await response.text(); if (responseText) { - try { - return JSON.parse(responseText); - } catch (jsonError) { - console.error('Error parsing response JSON:', jsonError); - throw jsonError; - } - } else { - return {}; // Return an empty object if there is no response body + return JSON.parse(responseText); } + return {}; } catch (error) { console.error('Error in majorTomToGroundControl:', error); throw error; } }; -/** - * Returns a permissions object: - * alert: boolean - * badge: boolean - * sound: boolean - * - * @returns {Promise} - */ export const checkPermissions = async () => { - try { - return new Promise(function (resolve) { - PushNotification.checkPermissions((result: any) => { - resolve(result); - }); - }); - } catch (error) { - console.error('Error checking permissions:', error); - throw error; - } + const { status } = await Notifications.getPermissionsAsync(); + return status === 'granted'; }; -/** - * Posts to groundcontrol info whether we want to opt in or out of specific notifications level - * - * @param levelAll {Boolean} - * @returns {Promise<*>} - */ export const setLevels = async (levelAll: boolean) => { const pushToken = await getPushToken(); if (!pushToken || !pushToken.token || !pushToken.os) return; @@ -236,9 +150,7 @@ export const setLevels = async (levelAll: boolean) => { try { const response = await fetch(`${baseURI}/setTokenConfiguration`, { method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: _getHeaders(), body: JSON.stringify({ level_all: !!levelAll, token: pushToken.token, @@ -251,14 +163,11 @@ export const setLevels = async (levelAll: boolean) => { } if (!levelAll) { - console.debug('Disabling notifications as user opted out...'); - PushNotification.removeAllDeliveredNotifications(); - PushNotification.setApplicationIconBadgeNumber(0); - PushNotification.cancelAllLocalNotifications(); + await Notifications.dismissAllNotificationsAsync(); + await Notifications.setBadgeCountAsync(0); await AsyncStorage.setItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG, 'true'); - console.debug('Notifications disabled successfully'); } else { - await AsyncStorage.removeItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG); // Clear flag when enabling + await AsyncStorage.removeItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG); } } catch (error) { console.error('Error setting notification levels:', error); @@ -266,14 +175,11 @@ export const setLevels = async (levelAll: boolean) => { }; export const addNotification = async (notification: TPayload) => { - let notifications = []; + let notifications: TPayload[] = []; try { const stringified = await AsyncStorage.getItem(NOTIFICATIONS_STORAGE); - notifications = JSON.parse(String(stringified)); - if (!Array.isArray(notifications)) notifications = []; + if (stringified) notifications = JSON.parse(stringified); } catch (e) { - console.error(e); - // Start fresh with just the new notification notifications = []; } @@ -282,19 +188,12 @@ export const addNotification = async (notification: TPayload) => { }; const postTokenConfig = async () => { - console.debug('postTokenConfig: Starting token configuration'); const pushToken = await getPushToken(); - console.debug('postTokenConfig: Retrieved push token:', !!pushToken); - - if (!pushToken || !pushToken.token || !pushToken.os) { - console.debug('postTokenConfig: Invalid token or missing OS info'); - return; - } + if (!pushToken || !pushToken.token || !pushToken.os) return; try { const lang = (await AsyncStorage.getItem('lang')) || 'en'; - const appVersion = getSystemName() + ' ' + getSystemVersion() + ';' + getApplicationName() + ' ' + getVersion(); - console.debug('postTokenConfig: Posting configuration', { lang, appVersion }); + const appVersion = Device.osName + ' ' + Device.osVersion + ';' + Application.applicationName + ' ' + Application.nativeApplicationVersion; await fetch(`${baseURI}/setTokenConfiguration`, { method: 'POST', @@ -307,113 +206,80 @@ const postTokenConfig = async () => { }), }); } catch (e) { - console.error(e); await AsyncStorage.setItem('lang', 'en'); throw e; } }; const _setPushToken = async (token: TPushToken) => { - try { - return await AsyncStorage.setItem(PUSH_TOKEN, JSON.stringify(token)); - } catch (error) { - console.error('Error setting push token:', error); - throw error; - } + await AsyncStorage.setItem(PUSH_TOKEN, JSON.stringify(token)); }; -/** - * Configures notifications. For Android, it will show a native rationale prompt if necessary. - * - * @returns {Promise} - */ -export const configureNotifications = async (onProcessNotifications?: () => void) => { - if (alreadyConfigured) { - console.debug('configureNotifications: Already configured, skipping'); - return true; - } +Notifications.setNotificationHandler({ + handleNotification: async () => ({ + shouldShowAlert: true, + shouldPlaySound: true, + shouldSetBadge: true, + shouldShowBanner: true, + shouldShowList: true, + }), +}); - return new Promise(resolve => { - const handleRegistration = async (token: TPushToken) => { - if (__DEV__) { - console.debug('configureNotifications: Token received:', token); - } - alreadyConfigured = true; - await _setPushToken(token); - resolve(true); - }; - - // const handleNotification = async (notification: TPushNotification & { data: any }) => { - const handleNotification = async (notification: Omit) => { - // Deep clone to avoid modifying the original object - // @ts-ignore some missing properties hopefully will be unwrapped from `.data` - const payload: TPayload = deepClone({ - ...notification, - ...notification.data, - }); - - if (notification.data?.data) { - const validData = Object.fromEntries(Object.entries(notification.data.data).filter(([_, value]) => value != null)); - Object.assign(payload, validData); - } - - // @ts-ignore stfu ts, its cleanup - payload.data = undefined; +export const configureNotifications = async (onProcessNotifications?: () => void) => { + if (alreadyConfigured) return true; - if (!payload.subText && !payload.message) { - console.warn('Notification missing required fields:', payload); - return; - } + try { + const { status } = await Notifications.getPermissionsAsync(); + if (status !== 'granted') return false; + + const expoToken = await Notifications.getDevicePushTokenAsync(); + const tokenStr = expoToken.data; + const pushToken: TPushToken = { token: tokenStr, os: Platform.OS }; + + await _setPushToken(pushToken); + alreadyConfigured = true; + + Notifications.addNotificationReceivedListener(async (notification) => { + const data = notification.request.content.data; + const payload: TPayload = { + subText: notification.request.content.subtitle || undefined, + message: notification.request.content.body || undefined, + foreground: AppState.currentState === 'active', + userInteraction: false, + ...data, + }; await addNotification(payload); - notification.finish(PushNotificationIOS.FetchResult.NoData); if (payload.foreground && onProcessNotifications) { - await onProcessNotifications(); + onProcessNotifications(); } - }; - - const configure = async () => { - try { - const { status } = await checkNotifications(); - if (status !== RESULTS.GRANTED) { - console.debug('configureNotifications: Permissions not granted'); - return resolve(false); - } + }); - const existingToken = await getPushToken(); - if (existingToken) { - alreadyConfigured = true; - console.debug('Notifications already configured with existing token'); - return resolve(true); - } + Notifications.addNotificationResponseReceivedListener(async (response) => { + const data = response.notification.request.content.data; + const payload: TPayload = { + subText: response.notification.request.content.subtitle || undefined, + message: response.notification.request.content.body || undefined, + foreground: false, + userInteraction: true, + ...data, + }; - PushNotification.configure({ - onRegister: handleRegistration, - onNotification: handleNotification, - onRegistrationError: (error: any) => { - console.error('Registration error:', error); - resolve(false); - }, - permissions: { alert: true, badge: true, sound: true }, - popInitialNotification: true, - }); - } catch (error) { - console.error('Error in configure:', error); - resolve(false); + await addNotification(payload); + + if (onProcessNotifications) { + onProcessNotifications(); } - }; + }); - configure(); - }); + return true; + } catch (error) { + console.error('Error configuring notifications:', error); + return false; + } }; -/** - * Validates whether the provided GroundControl URI is valid by pinging it. - * - * @param uri {string} - * @returns {Promise} TRUE if valid, FALSE otherwise - */ export const isGroundControlUriValid = async (uri: string) => { try { const response = await fetch(`${uri}/ping`, { headers: _getHeaders() }); @@ -424,27 +290,21 @@ export const isGroundControlUriValid = async (uri: string) => { } }; -export const isNotificationsCapable = hasGmsSync() || hasHmsSync() || Platform.OS !== 'android'; +export const isNotificationsCapable = true; -export const getPushToken = async (): Promise => { +export const getPushToken = async (): Promise => { try { const token = await AsyncStorage.getItem(PUSH_TOKEN); - return JSON.parse(String(token)) as TPushToken; + return token ? (JSON.parse(token) as TPushToken) : null; } catch (e) { - console.error(e); - AsyncStorage.removeItem(PUSH_TOKEN); + await AsyncStorage.removeItem(PUSH_TOKEN); throw e; } }; -/** - * Queries groundcontrol for token configuration, which contains subscriptions to notification levels - * - * @returns {Promise<{}|*>} - */ const getLevels = async () => { const pushToken = await getPushToken(); - if (!pushToken || !pushToken.token || !pushToken.os) return; + if (!pushToken || !pushToken.token || !pushToken.os) return {}; try { const response = await fetch(`${baseURI}/getTokenConfiguration`, { @@ -463,24 +323,13 @@ const getLevels = async () => { } }; -/** - * The opposite of `majorTomToGroundControl` call. - * - * @param addresses {string[]} - * @param hashes {string[]} - * @param txids {string[]} - * @returns {Promise} Response object from API rest call - */ export const unsubscribe = async (addresses: string[], hashes: string[], txids: string[]) => { if (!Array.isArray(addresses) || !Array.isArray(hashes) || !Array.isArray(txids)) { throw new Error('No addresses, hashes, or txids provided'); } const token = await getPushToken(); - if (!token?.token || !token?.os) { - console.error('No push token or OS found'); - return; - } + if (!token?.token || !token?.os) return; const body = JSON.stringify({ addresses, @@ -522,27 +371,22 @@ export const clearStoredNotifications = async () => { } catch (_) {} }; -export const getDeliveredNotifications: () => Promise[]> = () => { - try { - return new Promise(resolve => { - PushNotification.getDeliveredNotifications((notifications: Record[]) => resolve(notifications)); - }); - } catch (error) { - console.error('Error getting delivered notifications:', error); - throw error; - } +export const getDeliveredNotifications = async () => { + return Notifications.getPresentedNotificationsAsync(); }; -export const removeDeliveredNotifications = (identifiers = []) => { - PushNotification.removeDeliveredNotifications(identifiers); +export const removeDeliveredNotifications = async (identifiers: string[] = []) => { + for (const id of identifiers) { + await Notifications.dismissNotificationAsync(id); + } }; -export const setApplicationIconBadgeNumber = (badges: number) => { - PushNotification.setApplicationIconBadgeNumber(badges); +export const setApplicationIconBadgeNumber = async (badges: number) => { + await Notifications.setBadgeCountAsync(badges); }; -export const removeAllDeliveredNotifications = () => { - PushNotification.removeAllDeliveredNotifications(); +export const removeAllDeliveredNotifications = async () => { + await Notifications.dismissAllNotificationsAsync(); }; export const getDefaultUri = () => { @@ -567,12 +411,7 @@ export const getSavedUri = async () => { } return baseUriStored; } catch (e) { - console.error(e); - try { - await AsyncStorage.setItem(GROUNDCONTROL_BASE_URI, groundControlUri); - } catch (storageError) { - console.error('Failed to reset URI:', storageError); - } + await AsyncStorage.setItem(GROUNDCONTROL_BASE_URI, groundControlUri); throw e; } }; @@ -583,29 +422,24 @@ export const isNotificationsEnabled = async () => { const token = await getPushToken(); const isDisabledByUser = (await AsyncStorage.getItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG)) === 'true'; - // Return true only if we have all requirements and user hasn't opted out return !isDisabledByUser && !!token && !!levels.level_all; } catch (error) { - console.log('Error checking notification levels:', error); - if (error instanceof SyntaxError) { - throw error; - } + if (error instanceof SyntaxError) throw error; return false; } }; export const getStoredNotifications = async (): Promise => { - let notifications = []; + let notifications: TPayload[] = []; try { - notifications = JSON.parse(String(await AsyncStorage.getItem(NOTIFICATIONS_STORAGE))); + const stringified = await AsyncStorage.getItem(NOTIFICATIONS_STORAGE); + if (stringified) notifications = JSON.parse(stringified); if (!Array.isArray(notifications)) notifications = []; } catch (e) { if (e instanceof SyntaxError) { - console.error('Invalid notifications format:', e); notifications = []; await AsyncStorage.setItem(NOTIFICATIONS_STORAGE, '[]'); } else { - console.error('Error accessing notifications:', e); throw e; } } @@ -613,52 +447,36 @@ export const getStoredNotifications = async (): Promise => { return notifications; }; -// on app launch (load module): export const initializeNotifications = async (onProcessNotifications?: () => void) => { - console.debug('initializeNotifications: Starting initialization'); try { const noAndDontAskFlag = await AsyncStorage.getItem(NOTIFICATIONS_NO_AND_DONT_ASK_FLAG); - console.debug('initializeNotifications: No ask flag status:', noAndDontAskFlag); - - if (noAndDontAskFlag === 'true') { - console.warn('User has opted out of notifications.'); - return; - } + if (noAndDontAskFlag === 'true') return; const baseUriStored = await AsyncStorage.getItem(GROUNDCONTROL_BASE_URI); baseURI = baseUriStored || groundControlUri; - console.debug('Base URI set to:', baseURI); - setApplicationIconBadgeNumber(0); + await setApplicationIconBadgeNumber(0); - // Only check permissions, never request currentPermissionStatus = await checkNotificationPermissionStatus(); - console.debug('initializeNotifications: Permission status:', currentPermissionStatus); - // Handle Android 13+ permissions differently const canProceed = Platform.OS === 'android' ? isNotificationsCapable && (await checkAndroidNotificationPermission()) : currentPermissionStatus === 'granted'; if (canProceed) { - console.debug('initializeNotifications: Can proceed with notification setup'); const token = await getPushToken(); if (token) { - console.debug('initializeNotifications: Existing token found, configuring'); await configureNotifications(onProcessNotifications); await postTokenConfig(); } else { - console.debug('initializeNotifications: No token found, will request permissions'); await tryToObtainPermissions(); } - } else { - console.debug('Notifications require user action to enable'); } } catch (error) { console.error('Failed to initialize notifications:', error); baseURI = groundControlUri; - await AsyncStorage.setItem(GROUNDCONTROL_BASE_URI, groundControlUri).catch(err => console.error('Failed to reset URI:', err)); + await AsyncStorage.setItem(GROUNDCONTROL_BASE_URI, groundControlUri).catch(() => {}); } }; diff --git a/package-lock.json b/package-lock.json index 9dd96b93d..5da4eebdd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,6 @@ "@react-native-community/cli": "15.1.3", "@react-native-community/cli-platform-android": "15.1.3", "@react-native-community/cli-platform-ios": "15.1.3", - "@react-native-community/push-notification-ios": "1.11.0", "@react-native-menu/menu": "github:BlueWallet/menu#9933468", "@react-native/gradle-plugin": "0.78.2", "@react-native/metro-config": "0.78.2", @@ -57,6 +56,7 @@ "events": "3.3.0", "expo": "^55.0.21", "expo-application": "~55.0.14", + "expo-camera": "~55.0.18", "expo-clipboard": "~55.0.13", "expo-dev-client": "~55.0.32", "expo-device": "~55.0.15", @@ -66,6 +66,7 @@ "expo-image-picker": "~55.0.20", "expo-linear-gradient": "~55.0.13", "expo-localization": "~55.0.13", + "expo-notifications": "~55.0.22", "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", @@ -81,9 +82,7 @@ "react-native-gesture-handler": "~2.30.0", "react-native-get-random-values": "1.11.0", "react-native-keychain": "9.1.0", - "react-native-permissions": "5.4.2", "react-native-prompt-android": "github:BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376", - "react-native-push-notification": "8.1.1", "react-native-qrcode-svg": "6.3.15", "react-native-quick-actions": "0.3.13", "react-native-rate": "1.2.12", @@ -122,7 +121,6 @@ "@types/crypto-js": "^4.2.2", "@types/jest": "^29.5.13", "@types/react": "~19.2.10", - "@types/react-native-push-notification": "^8.1.4", "@types/react-test-renderer": "^19.0.0", "@types/wif": "^2.0.5", "@typescript-eslint/eslint-plugin": "^7.15.0", @@ -5765,17 +5763,6 @@ "node": ">=10" } }, - "node_modules/@react-native-community/push-notification-ios": { - "version": "1.11.0", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": ">=16.6.3", - "react-native": ">=0.58.4" - } - }, "node_modules/@react-native-menu/menu": { "version": "1.2.4", "resolved": "git+ssh://git@github.com/BlueWallet/menu.git#9933468ad6c85c62e455d29fbd079ae9c4a2ef2c", @@ -7333,6 +7320,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/emscripten": { + "version": "1.41.5", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.5.tgz", + "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==", + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "license": "MIT", @@ -7432,11 +7425,6 @@ "@types/react": "*" } }, - "node_modules/@types/react-native-push-notification": { - "version": "8.1.4", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react-native-vector-icons": { "version": "6.4.18", "license": "MIT", @@ -8608,10 +8596,25 @@ "@babel/core": "^7.0.0" } }, + "node_modules/badgin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.2.3.tgz", + "integrity": "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==", + "license": "MIT" + }, "node_modules/balanced-match": { "version": "1.0.2", "license": "MIT" }, + "node_modules/barcode-detector": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-3.1.3.tgz", + "integrity": "sha512-omL3/x26oU9jlR0gUQcGdXIjQtMlrUGKF7xRFO1RwrQkRkRU7WLz0mgQEsdUtYBm2uX3JH+HQLrKlyTS/BxZRw==", + "license": "MIT", + "dependencies": { + "zxing-wasm": "3.0.3" + } + }, "node_modules/base-x": { "version": "4.0.1", "license": "MIT" @@ -12318,6 +12321,26 @@ "react-native": "*" } }, + "node_modules/expo-camera": { + "version": "55.0.18", + "resolved": "https://registry.npmjs.org/expo-camera/-/expo-camera-55.0.18.tgz", + "integrity": "sha512-Us/7JV6O1lHpLBGKJnK2s8gzmPcmMVJSV5586DBeO7x7AXzmvvVGtH+0nJRVIBE3MNzGzGWyfgievjr8QlE7dA==", + "license": "MIT", + "dependencies": { + "barcode-detector": "^3.0.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, "node_modules/expo-clipboard": { "version": "55.0.13", "resolved": "https://registry.npmjs.org/expo-clipboard/-/expo-clipboard-55.0.13.tgz", @@ -12563,6 +12586,24 @@ } } }, + "node_modules/expo-notifications": { + "version": "55.0.22", + "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-55.0.22.tgz", + "integrity": "sha512-Rwvsp/lAEXfDYBxkQZpaLF9ZB25cJ/yfHhD/ESclbPesN0nbQBZ/5rGb1xS/saANtkStbEGfDlA80uHh2zEpsA==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.13", + "abort-controller": "^3.0.0", + "badgin": "^1.1.5", + "expo-application": "~55.0.14", + "expo-constants": "~55.0.15" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/expo-server": { "version": "55.0.8", "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-55.0.8.tgz", @@ -19713,36 +19754,12 @@ "node": ">=18" } }, - "node_modules/react-native-permissions": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-5.4.2.tgz", - "integrity": "sha512-XNMoG1fxrB9q73MLn/ZfTaP7pS8qPu0KWypbeFKVTvoR+JJ3O7uedMOTH/mts9bTG+GKhShOoZ+k0CR63q9jwA==", - "license": "MIT", - "peerDependencies": { - "react": ">=18.1.0", - "react-native": ">=0.70.0", - "react-native-windows": ">=0.70.0" - }, - "peerDependenciesMeta": { - "react-native-windows": { - "optional": true - } - } - }, "node_modules/react-native-prompt-android": { "version": "1.0.0", "resolved": "git+ssh://git@github.com/BlueWallet/react-native-prompt-android.git#ed168d66fed556bc2ed07cf498770f058b78a376", "integrity": "sha512-vTyVQW/EjOYxKdXmq/MWE97MNuQzoqSzvlsIBFMQV9dVH3X9+zPfR7osPO6EM8ATASrcntMSepKyKd7W6DwHPA==", "license": "MIT" }, - "node_modules/react-native-push-notification": { - "version": "8.1.1", - "license": "MIT", - "peerDependencies": { - "@react-native-community/push-notification-ios": "^1.10.1", - "react-native": ">=0.33" - } - }, "node_modules/react-native-qrcode-svg": { "version": "6.3.15", "resolved": "https://registry.npmjs.org/react-native-qrcode-svg/-/react-native-qrcode-svg-6.3.15.tgz", @@ -21638,6 +21655,18 @@ "node": ">=8" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tar-fs": { "version": "2.1.2", "license": "MIT", @@ -22872,6 +22901,34 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zxing-wasm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/zxing-wasm/-/zxing-wasm-3.0.3.tgz", + "integrity": "sha512-DdOn/G5F+qvZELWeO5ZFFwcN611TfMybxPV0LUUoutUmiH2t47MZSB7gLV9O9YLhvudBdnzQNAoFOu4Xz8eOrQ==", + "license": "MIT", + "dependencies": { + "@types/emscripten": "^1.41.5", + "type-fest": "^5.6.0" + }, + "peerDependencies": { + "@types/emscripten": ">=1.39.6" + } + }, + "node_modules/zxing-wasm/node_modules/type-fest": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index e9d866b9c..26c275354 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,6 @@ "@types/crypto-js": "^4.2.2", "@types/jest": "^29.5.13", "@types/react": "~19.2.10", - "@types/react-native-push-notification": "^8.1.4", "@types/react-test-renderer": "^19.0.0", "@types/wif": "^2.0.5", "@typescript-eslint/eslint-plugin": "^7.15.0", @@ -97,7 +96,6 @@ "@react-native-community/cli": "15.1.3", "@react-native-community/cli-platform-android": "15.1.3", "@react-native-community/cli-platform-ios": "15.1.3", - "@react-native-community/push-notification-ios": "1.11.0", "@react-native-menu/menu": "github:BlueWallet/menu#9933468", "@react-native/gradle-plugin": "0.78.2", "@react-native/metro-config": "0.78.2", @@ -131,6 +129,7 @@ "events": "3.3.0", "expo": "^55.0.21", "expo-application": "~55.0.14", + "expo-camera": "~55.0.18", "expo-clipboard": "~55.0.13", "expo-dev-client": "~55.0.32", "expo-device": "~55.0.15", @@ -140,6 +139,7 @@ "expo-image-picker": "~55.0.20", "expo-linear-gradient": "~55.0.13", "expo-localization": "~55.0.13", + "expo-notifications": "~55.0.22", "lottie-react-native": "~7.3.4", "payjoin-client": "1.0.1", "prop-types": "15.8.1", @@ -155,9 +155,7 @@ "react-native-gesture-handler": "~2.30.0", "react-native-get-random-values": "1.11.0", "react-native-keychain": "9.1.0", - "react-native-permissions": "5.4.2", "react-native-prompt-android": "github:BlueWallet/react-native-prompt-android#ed168d66fed556bc2ed07cf498770f058b78a376", - "react-native-push-notification": "8.1.1", "react-native-qrcode-svg": "6.3.15", "react-native-quick-actions": "0.3.13", "react-native-rate": "1.2.12", diff --git a/screen/send/CoinControl.tsx b/screen/send/CoinControl.tsx index c6d201826..5aedd35e2 100644 --- a/screen/send/CoinControl.tsx +++ b/screen/send/CoinControl.tsx @@ -154,7 +154,8 @@ const OutputModal: React.FC = ({ tranText: { fontWeight: 'normal', fontSize: 13, color: colors.alternativeTextColor }, memo: { fontSize: 13, marginTop: 3, color: colors.alternativeTextColor }, }); - const confirmationsFormatted = new Intl.NumberFormat(Localization.getLocales()[0].languageCode, { maximumSignificantDigits: 3 }).format( + const languageCode = Localization.getLocales()[0]?.languageCode ?? 'en'; + const confirmationsFormatted = new Intl.NumberFormat(languageCode, { maximumSignificantDigits: 3 }).format( confirmations, ); diff --git a/screen/send/create.js b/screen/send/create.js index 315c6368b..a1da48260 100644 --- a/screen/send/create.js +++ b/screen/send/create.js @@ -7,7 +7,7 @@ import React, { useCallback, useEffect } from 'react'; import { Alert, FlatList, Linking, Platform, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native'; import { Icon } from '@rneui/themed'; import * as FileSystem from 'expo-file-system'; -import { PERMISSIONS, request, RESULTS } from 'react-native-permissions'; + import Share from 'react-native-share'; import { satoshiToBTC } from '../../modules/currency'; import { isDesktop } from '../../modules/environment'; @@ -75,29 +75,13 @@ const SendCreate = () => { FileSystem.deleteAsync(filePath).catch(() => {}); }); } else if (Platform.OS === 'android') { - const granted = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE); - if (granted === RESULTS.GRANTED) { - console.log('Storage Permission: Granted'); - const filePath = FileSystem.documentDirectory + fileName; - try { - await FileSystem.writeAsStringAsync(filePath, tx); - presentAlert({ message: loc.formatString(loc.send.txSaved, { filePath }) }); - } catch (e) { - console.log(e); - presentAlert({ message: e.message }); - } - } else { - console.log('Storage Permission: Denied'); - Alert.alert(loc.send.permission_storage_title, loc.send.permission_storage_denied_message, [ - { - text: loc.send.open_settings, - onPress: () => { - Linking.openSettings(); - }, - style: 'default', - }, - { text: loc._.cancel, onPress: () => {}, style: 'cancel' }, - ]); + const filePath = FileSystem.documentDirectory + fileName; + try { + await FileSystem.writeAsStringAsync(filePath, tx); + presentAlert({ message: loc.formatString(loc.send.txSaved, { filePath }) }); + } catch (e) { + console.log(e); + presentAlert({ message: e.message }); } } }, [tx]); diff --git a/screen/settings/NotificationSettings.tsx b/screen/settings/NotificationSettings.tsx index 8e727c430..da46076bc 100644 --- a/screen/settings/NotificationSettings.tsx +++ b/screen/settings/NotificationSettings.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useState } from 'react'; -import { Linking, StyleSheet, TextInput, View, Pressable, AppState } from 'react-native'; +import { StyleSheet, TextInput, View, Pressable, AppState } from 'react-native'; import { Button as ButtonRNElements } from '@rneui/themed'; import { getDefaultUri, @@ -24,7 +24,7 @@ import ListItem, { PressableWrapper } from '../../components/ListItem'; import { useTheme } from '../../components/themes'; import loc from '../../loc'; import { Divider } from '@rneui/base'; -import { openSettings } from 'react-native-permissions'; +import { Linking } from 'react-native'; import AsyncStorage from '@react-native-async-storage/async-storage'; import SafeAreaScrollView from '../../components/SafeAreaScrollView'; import { Spacing20, Spacing40 } from '../../components/Spacing'; @@ -75,7 +75,7 @@ const NotificationSettings: React.FC = () => { const onNotificationsSwitch = async (value: boolean) => { if (value) { const currentStatus = await checkNotificationPermissionStatus(); - if (currentStatus === 'blocked') { + if (currentStatus === 'denied') { // If permissions are denied/blocked, show alert and reset the toggle showNotificationPermissionAlert(); setNotificationsEnabledState(false); @@ -191,7 +191,7 @@ const NotificationSettings: React.FC = () => { }, [URI]); const onSystemSettings = () => { - openSettings('notifications'); + Linking.openSettings(); }; return ( diff --git a/screen/settings/SettingsPrivacy.tsx b/screen/settings/SettingsPrivacy.tsx index a81cbac12..cbde21816 100644 --- a/screen/settings/SettingsPrivacy.tsx +++ b/screen/settings/SettingsPrivacy.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; import { Platform, StyleSheet, Text, TouchableWithoutFeedback, View } from 'react-native'; -import { openSettings } from 'react-native-permissions'; +import { Linking } from 'react-native'; import A from '../../modules/analytics'; import { Header } from '../../components/Header'; import ListItem, { PressableWrapper } from '../../components/ListItem'; @@ -94,7 +94,7 @@ const SettingsPrivacy: React.FC = () => { }; const openApplicationSettings = () => { - openSettings(); + Linking.openSettings(); }; return ( diff --git a/tests/setup.js b/tests/setup.js index 53a65ae12..02cd2012e 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -51,11 +51,17 @@ jest.mock('react-native-secure-key-store', () => { return {}; }); -jest.mock('@react-native-community/push-notification-ios', () => { - return {}; -}); - -jest.mock('react-native-permissions', () => require('react-native-permissions/mock')); +jest.mock('expo-notifications', () => ({ + getPermissionsAsync: jest.fn().mockResolvedValue({ status: 'granted' }), + requestPermissionsAsync: jest.fn().mockResolvedValue({ status: 'granted' }), + getDevicePushTokenAsync: jest.fn().mockResolvedValue({ data: 'mock-push-token' }), + setNotificationHandler: jest.fn(), + addNotificationReceivedListener: jest.fn(), + addNotificationResponseReceivedListener: jest.fn(), + dismissAllNotificationsAsync: jest.fn(), + setBadgeCountAsync: jest.fn(), + getPresentedNotificationsAsync: jest.fn().mockResolvedValue([]), +})); jest.mock('expo-device', () => { return { From ea2fb9d358189e2990d791ae1b2a801de61001d2 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Thu, 14 May 2026 21:53:49 +0530 Subject: [PATCH 10/40] feat: finalize Expo SDK 55 migration, update build configurations, and add handoff documentation --- app.json | 9 +- eas.json | 5 +- ios/BlueWallet.xcodeproj/project.pbxproj | 12 - .../xcschemes/BlueWallet.xcscheme | 16 + package-lock.json | 563 +++++++----------- package.json | 8 +- post_migration_handoff.md | 49 ++ 7 files changed, 282 insertions(+), 380 deletions(-) create mode 100644 post_migration_handoff.md diff --git a/app.json b/app.json index 7aa9e0c4f..ef612b931 100644 --- a/app.json +++ b/app.json @@ -13,7 +13,6 @@ "ios": { "supportsTablet": false, "bundleIdentifier": "org.bitshala.shroud", - "deploymentTarget": "16.0", "infoPlist": { "NSCameraUsageDescription": "Shroud Wallet uses the camera to scan QR codes", "NSFaceIDUsageDescription": "Shroud Wallet uses Face ID to unlock your wallet", @@ -36,12 +35,14 @@ }, "plugins": [ "expo-dev-client", - "expo-localization" + "expo-localization", + "expo-font" ], "extra": { "eas": { - "projectId": "YOUR_EAS_PROJECT_ID" + "projectId": "f38beaef-9c29-4709-a6d9-c6aebe6149f2" } - } + }, + "owner": "shroud-developers" } } diff --git a/eas.json b/eas.json index 297c25bfd..ab20d627b 100644 --- a/eas.json +++ b/eas.json @@ -11,7 +11,8 @@ "gradleCommand": ":app:assembleDebug" }, "ios": { - "simulator": true + "simulator": true, + "scheme": "BlueWallet" } }, "preview": { @@ -25,7 +26,7 @@ }, "production": { "android": { - "buildType": "aab" + "buildType": "app-bundle" }, "ios": { "simulator": false diff --git a/ios/BlueWallet.xcodeproj/project.pbxproj b/ios/BlueWallet.xcodeproj/project.pbxproj index bff1a0df7..2470a9562 100644 --- a/ios/BlueWallet.xcodeproj/project.pbxproj +++ b/ios/BlueWallet.xcodeproj/project.pbxproj @@ -174,13 +174,6 @@ remoteGlobalIDString = 6D2A6460258BA92C0092292B; remoteInfo = Stickers; }; - 6D9946672555A661000E52E8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 6D99465D2555A660000E52E8; - remoteInfo = MarketWidgetExtension; - }; 6DD410A5266CADF40087DE03 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; @@ -813,7 +806,6 @@ ); dependencies = ( B40D4E4C225841ED00428FCC /* PBXTargetDependency */, - 6D9946682555A661000E52E8 /* PBXTargetDependency */, 6D2A6467258BA92D0092292B /* PBXTargetDependency */, 6DD410A6266CADF40087DE03 /* PBXTargetDependency */, ); @@ -1294,10 +1286,6 @@ target = 6D2A6460258BA92C0092292B /* Stickers */; targetProxy = 6D2A6466258BA92D0092292B /* PBXContainerItemProxy */; }; - 6D9946682555A661000E52E8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - targetProxy = 6D9946672555A661000E52E8 /* PBXContainerItemProxy */; - }; 6DD410A6266CADF40087DE03 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 6DD4109B266CADF10087DE03 /* WidgetsExtension */; diff --git a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet.xcscheme b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet.xcscheme index 81cc58e2e..0d8c0181d 100644 --- a/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet.xcscheme +++ b/ios/BlueWallet.xcodeproj/xcshareddata/xcschemes/BlueWallet.xcscheme @@ -5,6 +5,22 @@ + + + + + + =6.9.0" @@ -1151,17 +1155,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1875,7 +1879,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1904,14 +1907,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.0", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.27.0", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -2119,14 +2124,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.0", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-typescript": "^7.27.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2587,28 +2594,28 @@ } }, "node_modules/@expo/cli": { - "version": "55.0.28", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-55.0.28.tgz", - "integrity": "sha512-N3ZdMc5h9BZE2jn9O8xR2umJij+C7h1BMhZATw37zuTbh/JIcqBdfY5xRbpnMGw0VvNdK15nh89NYc8SzLUtow==", + "version": "55.0.29", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-55.0.29.tgz", + "integrity": "sha512-r2dXQ82e/3nwxS7faLRL6HBD8UWDo/IyptQ0Vg6Z5Bgyp2Kd24h8xPn3RHfY3LLJ3wfEXglf4E79/Dqkm1Z6WA==", "license": "MIT", "dependencies": { "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~55.0.15", + "@expo/config": "~55.0.16", "@expo/config-plugins": "~55.0.8", "@expo/devcert": "^1.2.1", - "@expo/env": "~2.1.1", - "@expo/image-utils": "^0.8.13", - "@expo/json-file": "^10.0.13", - "@expo/log-box": "55.0.11", + "@expo/env": "~2.1.2", + "@expo/image-utils": "^0.8.14", + "@expo/json-file": "^10.0.14", + "@expo/log-box": "55.0.12", "@expo/metro": "~55.1.1", - "@expo/metro-config": "~55.0.19", - "@expo/osascript": "^2.4.2", - "@expo/package-manager": "^1.10.4", - "@expo/plist": "^0.5.2", - "@expo/prebuild-config": "^55.0.16", - "@expo/require-utils": "^55.0.4", - "@expo/router-server": "^55.0.15", - "@expo/schema-utils": "^55.0.3", + "@expo/metro-config": "~55.0.20", + "@expo/osascript": "^2.4.3", + "@expo/package-manager": "^1.10.5", + "@expo/plist": "^0.5.3", + "@expo/prebuild-config": "^55.0.17", + "@expo/require-utils": "^55.0.5", + "@expo/router-server": "^55.0.16", + "@expo/schema-utils": "^55.0.4", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.4.0", @@ -2624,7 +2631,7 @@ "connect": "^3.7.0", "debug": "^4.3.4", "dnssd-advertise": "^1.1.4", - "expo-server": "^55.0.8", + "expo-server": "^55.0.9", "fetch-nodeshim": "^0.4.10", "getenv": "^2.0.0", "glob": "^13.0.0", @@ -2983,15 +2990,15 @@ } }, "node_modules/@expo/config": { - "version": "55.0.15", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-55.0.15.tgz", - "integrity": "sha512-lHc0ELIQ8126jYOMZpLv3WIuvordW98jFg5aT/J1/12n2ycuXu01XLZkJsdw0avO34cusUYb1It+MvY8JiMduA==", + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-55.0.16.tgz", + "integrity": "sha512-H5dpQv5TfyZDNheZAWO3SmP10diGWZwN5QOUsArkDJih0QKNtahQBOmrV2xbhgln/nrUGoy41U/ZIY/MEx63Ug==", "license": "MIT", "dependencies": { "@expo/config-plugins": "~55.0.8", "@expo/config-types": "^55.0.5", - "@expo/json-file": "^10.0.13", - "@expo/require-utils": "^55.0.4", + "@expo/json-file": "^10.0.14", + "@expo/require-utils": "^55.0.5", "deepmerge": "^4.3.1", "getenv": "^2.0.0", "glob": "^13.0.0", @@ -3177,9 +3184,9 @@ } }, "node_modules/@expo/devtools": { - "version": "55.0.2", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-55.0.2.tgz", - "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==", + "version": "55.0.3", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-55.0.3.tgz", + "integrity": "sha512-KoIDgo0NoXeWLsIcOdZqtAG/1LlsM+JL0DA3bo0vCYaOYTBLXi/ZvRBqa20Ub8D2vKLNa+FgRQW0gRg04Ps1Pg==", "license": "MIT", "dependencies": { "chalk": "^4.1.2" @@ -3198,9 +3205,9 @@ } }, "node_modules/@expo/dom-webview": { - "version": "55.0.5", - "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-55.0.5.tgz", - "integrity": "sha512-lt3uxYOCk3wmWvtOOvsC35CKGbDAOx5C2EaY8SH1JVSfBzqmF8Cs0Xp1MPxncDPMyxpMiWx5SvvV/iLF1rJU4A==", + "version": "55.0.6", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-55.0.6.tgz", + "integrity": "sha512-ZNm8tiNEZysxrr36J0x4mOCGyJDcaIvL/3tMxBz0VJIJDcV19xjuJAhJQxHovu+jKx6s9tRyEAINa1mdrzV39g==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -3209,9 +3216,9 @@ } }, "node_modules/@expo/env": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.1.1.tgz", - "integrity": "sha512-rVvHC4I6xlPcg+mAO09ydUi2Wjv1ZytpLmHOSzvXzBAz9mMrJggqCe4s4dubjJvi/Ino/xQCLhbaLCnTtLpikg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.1.2.tgz", + "integrity": "sha512-RJtGFfj/ygO/6zcVbV3cckHf4THcEkv5IZft1GjCB3dfT6axvzvIwXE9EiQqQYmGHcQ+ZrvC8xZcIhiHba0pYg==", "license": "MIT", "dependencies": { "chalk": "^4.0.0", @@ -3223,12 +3230,12 @@ } }, "node_modules/@expo/fingerprint": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.16.6.tgz", - "integrity": "sha512-nRITNbnu3RKSHPvKVehrSU4KG2VY9V8nvULOHBw98ukHCAU4bGrU5APvcblOkX3JAap+xEHsg/mZvqlvkLInmQ==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.16.7.tgz", + "integrity": "sha512-BH8sicYOqZ1iBMwCVEGIz6uTTfylosjc49FoMmCYIzKOiYdiVehsfoYBwyfxwWIiya1VMhm1gv0cgOP8fxHpDw==", "license": "MIT", "dependencies": { - "@expo/env": "^2.0.11", + "@expo/env": "^2.1.2", "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", "chalk": "^4.1.2", @@ -3310,12 +3317,12 @@ } }, "node_modules/@expo/image-utils": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.13.tgz", - "integrity": "sha512-1I//yBQeTY6p0u1ihqGNDAr35EbSG8uFEupFrIF0jd++h9EWH33521yZJU1yE+mwGlzCb61g3ehu78siMhXBlA==", + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.14.tgz", + "integrity": "sha512-5Sn+jG4Cw+shC2wDMXoqSAJnvERbiwzHn05FpWtD5IBflfTIs5gUmjzwiGVyjOdlMSQhgRrw/AymPbmO9h9mpQ==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^55.0.4", + "@expo/require-utils": "^55.0.5", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "getenv": "^2.0.0", @@ -3337,9 +3344,9 @@ } }, "node_modules/@expo/json-file": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.13.tgz", - "integrity": "sha512-pX/XjQn7tgNw6zuuV2ikmegmwe/S7uiwhrs2wXrANMkq7ozrA+JcZwgW9Q/8WZgciBzfAhNp5hnackHcrmapQA==", + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.14.tgz", + "integrity": "sha512-yWwBFywFv+SxkJp/pIzzA416JVYflNUh7pqQzgaA6nXDqRyK7KfrqVzk8PdUfDnqbBcaZZxpzNssfQZzp5KHrA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -3347,27 +3354,27 @@ } }, "node_modules/@expo/local-build-cache-provider": { - "version": "55.0.11", - "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-55.0.11.tgz", - "integrity": "sha512-rJ4RTCrkeKaXaido/bVyhl90ZRtVTOEbj59F1PWVjIEIVgjdlfc1J3VD9v7hEsbf/+8Tbr/PgvWhT6Visi5sLQ==", + "version": "55.0.12", + "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-55.0.12.tgz", + "integrity": "sha512-Wqhe7ajt6lyIEQvqDC1zm0MQ1RqQLlM9awCepY9pz+tm9rvhuxGPZTSddWeD8k4kolinBlDbLDFnNi06XgaDWQ==", "license": "MIT", "dependencies": { - "@expo/config": "~55.0.15", + "@expo/config": "~55.0.16", "chalk": "^4.1.2" } }, "node_modules/@expo/log-box": { - "version": "55.0.11", - "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-55.0.11.tgz", - "integrity": "sha512-JQHFLWkskIbJi6cxYMjErx8lQqfFJilDQLKmdTO3m3YkdmN9GE/CrzjOfVlCG0DGEGZJ90br0pGKvGPdXNsHKw==", + "version": "55.0.12", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-55.0.12.tgz", + "integrity": "sha512-f9ARS8J60cq3LLNdIqmUjYwyerBzVS5Ecp7KjIf3GOIPjW0571rkcwLz4/U18l/1DeSkSzIkYsNl2TC9oTdWaQ==", "license": "MIT", "dependencies": { - "@expo/dom-webview": "^55.0.5", + "@expo/dom-webview": "^55.0.6", "anser": "^1.4.9", "stacktrace-parser": "^0.1.10" }, "peerDependencies": { - "@expo/dom-webview": "^55.0.5", + "@expo/dom-webview": "^55.0.6", "expo": "*", "react": "*", "react-native": "*" @@ -3396,17 +3403,17 @@ } }, "node_modules/@expo/metro-config": { - "version": "55.0.19", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-55.0.19.tgz", - "integrity": "sha512-tOeSR0w81F4wJxLm77Ee1FkaUUOfx7DuYgpoaOCBqODJOODX5fTydLjQPvezMQtFJubh2XWM9+4QoScqLTWbig==", + "version": "55.0.20", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-55.0.20.tgz", + "integrity": "sha512-dUv0simEyPbN2wbOjI+BdEZyXdghgCZD0+3rrA1WxXZN1lRofUx6g2+Nik2Qg61v/BXFrCTh8reYEzQPzHOhdQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", - "@expo/config": "~55.0.15", - "@expo/env": "~2.1.1", - "@expo/json-file": "~10.0.13", + "@expo/config": "~55.0.16", + "@expo/env": "~2.1.2", + "@expo/json-file": "~10.0.14", "@expo/metro": "~55.1.1", "@expo/spawn-async": "^1.7.2", "browserslist": "^4.25.0", @@ -3977,9 +3984,9 @@ } }, "node_modules/@expo/osascript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.2.tgz", - "integrity": "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.3.tgz", + "integrity": "sha512-wbuj3EebM7W9hN/Wp4xTzKd6rQ2zKJzAxkFxkOOwyysLp0HOAgQ4/5RINyoS241pZUX2rUHq7mAJ7pcCQ8U0Ow==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2" @@ -3989,12 +3996,12 @@ } }, "node_modules/@expo/package-manager": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.4.tgz", - "integrity": "sha512-y9Mr4Kmpk4abAVZrNNPCdzOZr8nLLyi18p1SXr0RCVA8IfzqZX/eY4H+50a0HTmXqIsPZrQdcdb4I3ekMS9GvQ==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.5.tgz", + "integrity": "sha512-nCP9Mebfl3jvOr0/P6VAuyah6PAtun+aihIL2zAtuE8uSe94JWkVZ7051i0MUVO+y3gFpBqnr8IIH5ch+VJjHA==", "license": "MIT", "dependencies": { - "@expo/json-file": "^10.0.13", + "@expo/json-file": "^10.0.14", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", @@ -4163,9 +4170,9 @@ } }, "node_modules/@expo/plist": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.5.2.tgz", - "integrity": "sha512-o4xdVdBpe4aTl3sPMZ2u3fJH4iG1I768EIRk1xRZP+GaFI93MaR3JvoFibYqxeTmLQ1p1kNEVqylfUjezxx45g==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.5.3.tgz", + "integrity": "sha512-jz5oPcPDd3fygwVxwSwmO6wodTwm0Qa14NUyPy0ka7H8sFmCtNZUI2+DzVe/EXjOhq1FbEjrwl89gdlWYOnVjQ==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -4174,16 +4181,16 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "55.0.16", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.16.tgz", - "integrity": "sha512-o4EAVgDGk1lISirtMD8hciO2vyMp7cWlPdfTtjjd5AXSfODVYDIDhygXrfvVQHmJXAztVqPUTKJT+BYOsVkYGQ==", + "version": "55.0.17", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.17.tgz", + "integrity": "sha512-Mcs+dg4Ripu0yCtzf66KZr18PehI1O8HxzJw+G5SUF8VWX+ic99aci1PltvmydWepLwTQL6ykmpXicAUA31IqA==", "license": "MIT", "dependencies": { - "@expo/config": "~55.0.15", + "@expo/config": "~55.0.16", "@expo/config-plugins": "~55.0.8", "@expo/config-types": "^55.0.5", - "@expo/image-utils": "^0.8.13", - "@expo/json-file": "^10.0.13", + "@expo/image-utils": "^0.8.14", + "@expo/json-file": "^10.0.14", "@react-native/normalize-colors": "0.83.6", "debug": "^4.3.1", "resolve-from": "^5.0.0", @@ -4207,9 +4214,9 @@ } }, "node_modules/@expo/require-utils": { - "version": "55.0.4", - "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.4.tgz", - "integrity": "sha512-JAANvXqV7MOysWeVWgaiDzikoyDjJWOV/ulOW60Zb3kXJfrx2oZOtGtDXDFKD1mXuahQgoM5QOjuZhF7gFRNjA==", + "version": "55.0.5", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.5.tgz", + "integrity": "sha512-U4K/CQ2VpXuwfNGsN+daKmYOt15hCP8v/pXaYH6eut7kdYZo6SfJ1yr67BIcJ+1Gzzs+QzTxswAZChKpXmceyw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -4226,20 +4233,20 @@ } }, "node_modules/@expo/router-server": { - "version": "55.0.15", - "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-55.0.15.tgz", - "integrity": "sha512-6LksYO4Pg13qroL138KfUebt/x/EO07zVhdyT/nTgcxnpn6CS4ecTl3DciSKhxbaH+0BVLdANkxYeGdp43TMwQ==", + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-55.0.16.tgz", + "integrity": "sha512-LvAdrm039nQBG+95+ff5Rc4CsBuoc/giDhjQrgxB9lKJqC/ZTq1xbwfEZFNq6yokX6fOCs/vlxdhmSkOjMIrvg==", "license": "MIT", "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { - "@expo/metro-runtime": "^55.0.10", + "@expo/metro-runtime": "^55.0.11", "expo": "*", - "expo-constants": "^55.0.15", - "expo-font": "^55.0.6", + "expo-constants": "^55.0.16", + "expo-font": "^55.0.7", "expo-router": "*", - "expo-server": "^55.0.8", + "expo-server": "^55.0.9", "react": "*", "react-dom": "*", "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" @@ -4260,9 +4267,9 @@ } }, "node_modules/@expo/schema-utils": { - "version": "55.0.3", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.3.tgz", - "integrity": "sha512-l9KHVjTo6MvoeyvwNr6AjckGJm8NIcqZ3QSAh51cWozXW9v2AUjyCyqYtFtyntLWRZ0x/ByYJishpQo4ZQq45Q==", + "version": "55.0.4", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.4.tgz", + "integrity": "sha512-65IdeeE8dAZR3n3J5Eq7LYiQ8BFGeEYCWPBCzycvafL7PkskbCyIclTQarRwf/HXFoRvezKCjaLwy/8v9Prk6g==", "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { @@ -8394,9 +8401,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "55.0.20", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.20.tgz", - "integrity": "sha512-wMSaNtpPrH7+QNBF7HOCfO6WgmdXO84JEdqMhFxWc1CvwcWTvWwgc4yQustW1q1kG5ZE/dHgHkmHPlvVY5apMQ==", + "version": "55.0.21", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.21.tgz", + "integrity": "sha512-anXoUZBcxydLdVs2L+r3bWKGUvZv2FtgOl8xRJ12i/YfKICBpwTGZWSTiEYTqBByZ6GkA3mE9+3TW97X2ocFTQ==", "license": "MIT", "dependencies": { "@babel/generator": "^7.20.5", @@ -8426,7 +8433,7 @@ "peerDependencies": { "@babel/runtime": "^7.20.0", "expo": "*", - "expo-widgets": "^55.0.16", + "expo-widgets": "^55.0.17", "react-refresh": ">=0.14.0 <1.0.0" }, "peerDependenciesMeta": { @@ -12244,31 +12251,31 @@ } }, "node_modules/expo": { - "version": "55.0.21", - "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.21.tgz", - "integrity": "sha512-FgZuKoUUwCKzHeugYefaYyZG3w/q4B7TwvfJUX4v9/k3kNChlgMXvKcd3hpGdCryx75YGVxhYxDnGN5oU5fddw==", + "version": "55.0.23", + "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.23.tgz", + "integrity": "sha512-b+lKwfzJzFiSm9G0wVGWw3c2YoZyubbl9gHOF1ZFuK8FqtxSge8pDDJMuEFmTi14dbKwh/tirB7MiORq54r7CQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "55.0.28", - "@expo/config": "~55.0.15", + "@expo/cli": "55.0.29", + "@expo/config": "~55.0.16", "@expo/config-plugins": "~55.0.8", - "@expo/devtools": "55.0.2", - "@expo/fingerprint": "0.16.6", - "@expo/local-build-cache-provider": "55.0.11", - "@expo/log-box": "55.0.11", + "@expo/devtools": "55.0.3", + "@expo/fingerprint": "0.16.7", + "@expo/local-build-cache-provider": "55.0.12", + "@expo/log-box": "55.0.12", "@expo/metro": "~55.1.1", - "@expo/metro-config": "55.0.19", + "@expo/metro-config": "55.0.20", "@expo/vector-icons": "^15.0.2", "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~55.0.20", - "expo-asset": "~55.0.16", - "expo-constants": "~55.0.15", - "expo-file-system": "~55.0.17", - "expo-font": "~55.0.6", - "expo-keep-awake": "~55.0.7", - "expo-modules-autolinking": "55.0.20", - "expo-modules-core": "55.0.24", + "babel-preset-expo": "~55.0.21", + "expo-asset": "~55.0.17", + "expo-constants": "~55.0.16", + "expo-file-system": "~55.0.19", + "expo-font": "~55.0.7", + "expo-keep-awake": "~55.0.8", + "expo-modules-autolinking": "55.0.21", + "expo-modules-core": "55.0.25", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-minimum": "^0.1.1" @@ -12307,13 +12314,13 @@ } }, "node_modules/expo-asset": { - "version": "55.0.16", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.16.tgz", - "integrity": "sha512-5IJyfJtYqvKGg04NKGQWiCIoK/fULDL9m15mXPPyfabD1jsToVj2hnWmo1r2SWNNmMwtQxi6jTpcGwVo2nLDxg==", + "version": "55.0.17", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.17.tgz", + "integrity": "sha512-pK9HHJuFqjE8kDUcbMFsZj3Cz8WdXpvZHZmYl7ouFQp59P83BvHln6VnqPDGlO+/4929G0Lm8ZUzbONuNRhi9w==", "license": "MIT", "dependencies": { - "@expo/image-utils": "^0.8.13", - "expo-constants": "~55.0.15" + "@expo/image-utils": "^0.8.14", + "expo-constants": "~55.0.16" }, "peerDependencies": { "expo": "*", @@ -12353,12 +12360,12 @@ } }, "node_modules/expo-constants": { - "version": "55.0.15", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.15.tgz", - "integrity": "sha512-w394fcZLJjeKN+9ZnJzL/HiarE1nwZFDa+3S9frevh6Ur+MAAs9QDrcXhDrV8T3xqRzzYaqsP6Z8TFZ4efWN1A==", + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.16.tgz", + "integrity": "sha512-Z15/No94UHoogD+pulxjudGAeOHTEIWZgb/vnX48Wx5D+apWTeCbnKxQZZtGQlosvduYL5kaic2/W8U+NHfBQQ==", "license": "MIT", "dependencies": { - "@expo/env": "~2.1.1" + "@expo/env": "~2.1.2" }, "peerDependencies": { "expo": "*", @@ -12417,9 +12424,9 @@ } }, "node_modules/expo-device": { - "version": "55.0.15", - "resolved": "https://registry.npmjs.org/expo-device/-/expo-device-55.0.15.tgz", - "integrity": "sha512-vXy4U/IeYI+zHGG45Ap6J7EuyQmkstyo8I+/5YGr5q2zmqLBo6SWE62wii8i9hLHheHn6AtF9UPrSWAREJrE8A==", + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/expo-device/-/expo-device-55.0.16.tgz", + "integrity": "sha512-o6eQjO2reoniXpos0FnPcrAVMYUfFPcIUdMRUUpKwQys7cmTJBjJLbOo+SuctVXUrsHUm6zyoKI7nX3C3lpqJw==", "license": "MIT", "dependencies": { "ua-parser-js": "^0.7.33" @@ -12448,9 +12455,9 @@ } }, "node_modules/expo-font": { - "version": "55.0.6", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-55.0.6.tgz", - "integrity": "sha512-x9czUA3UQWjIwa0ZUEs/eWJNqB4mAue/m4ltESlNPLZhHL0nWWqIfsyHmklTLFH7mVfcHSJvew6k+pR2FE1zVw==", + "version": "55.0.7", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-55.0.7.tgz", + "integrity": "sha512-oH39Xb+3i6Y69b7YRP+P+5WLx7621t+ep/RAgLwJJYpTjs7CnSohUG+873rEtqsTAuQGi63ms7x9ZeHj1E9LYw==", "license": "MIT", "dependencies": { "fontfaceobserver": "^2.1.0" @@ -12498,9 +12505,9 @@ "license": "MIT" }, "node_modules/expo-keep-awake": { - "version": "55.0.7", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.7.tgz", - "integrity": "sha512-QBWOEu8FkPBGYc0h0rsCkSTMJNBEKgzVsmLuQpO7V79V9sPR052k3Iiu/G8Kzmny2enyHYYed8RY+CUsip/SeQ==", + "version": "55.0.8", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.8.tgz", + "integrity": "sha512-PfIpMfM+STOBwkR5XOE+yVtER86c44MD+W8QD8JxuO0sT9pF7Y1SJYakWlpvX8xsGA+bjKLxftm9403s9kQhKA==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -12544,12 +12551,12 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "55.0.20", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-55.0.20.tgz", - "integrity": "sha512-gg9eQJpa5yuyxnxubm3yBN9xKfieGgoBmYXGWI7kW0rWqk7OU440tRsZ1IOQunndhHeB/ZbRy7WpkyEBbaOR3Q==", + "version": "55.0.21", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-55.0.21.tgz", + "integrity": "sha512-P9KsJgOwI7JVwxmGfRvcXkXO4LNRvHRdWmb4ukLmX15G/vZ7b6SM17yiYkPceWq1F5KeeZ11KFjEcl0y17xy7w==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^55.0.4", + "@expo/require-utils": "^55.0.5", "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "commander": "^7.2.0" @@ -12568,9 +12575,9 @@ } }, "node_modules/expo-modules-core": { - "version": "55.0.24", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-55.0.24.tgz", - "integrity": "sha512-1FztZjelwf3xQZpD6+LFo6IKjnGF/PMVXYkv9aC3EybMl/ZbXji35cfhy9W5uR/bwQ7L+SVqvd5A00XOoIiO8Q==", + "version": "55.0.25", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-55.0.25.tgz", + "integrity": "sha512-yXpfg7aHLbuqoXocK34Vua6Aey5SCyqLygAsXAMbul9P8vfBjLpaOPiTJ5cLVF7Drfq8ownqVJO6qpGEtZ6GOw==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" @@ -12605,9 +12612,9 @@ } }, "node_modules/expo-server": { - "version": "55.0.8", - "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-55.0.8.tgz", - "integrity": "sha512-AoV5TKuO4biSzrhe/OVLyInfTT0pV9/OOc/g/oVq5vmCjL8SaSYTkES8PLt+67Tm7VqX+Dn0+kSx1nQcjEKaPw==", + "version": "55.0.9", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-55.0.9.tgz", + "integrity": "sha512-N5Ipn1NwqaJzEm+G97o0Jbe4g/th3R/16N1DabnYryXKCiZwDkK13/w3VfGkQN9LOOaBP+JIRxGf4M8lQKPzyA==", "license": "MIT", "engines": { "node": ">=20.16.0" @@ -16759,26 +16766,6 @@ "lightningcss-win32-x64-msvc": "1.32.0" } }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/lightningcss-darwin-arm64": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", @@ -16799,186 +16786,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "license": "MIT" @@ -19935,6 +19742,42 @@ "react-native": ">=0.40" } }, + "node_modules/react-native-worklets": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.7.4.tgz", + "integrity": "sha512-NYOdM1MwBb3n+AtMqy1tFy3Mn8DliQtd8sbzAVRf9Gc+uvQ0zRfxN7dS8ZzoyX7t6cyQL5THuGhlnX+iFlQTag==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-arrow-functions": "7.27.1", + "@babel/plugin-transform-class-properties": "7.27.1", + "@babel/plugin-transform-classes": "7.28.4", + "@babel/plugin-transform-nullish-coalescing-operator": "7.27.1", + "@babel/plugin-transform-optional-chaining": "7.27.1", + "@babel/plugin-transform-shorthand-properties": "7.27.1", + "@babel/plugin-transform-template-literals": "7.27.1", + "@babel/plugin-transform-unicode-regex": "7.27.1", + "@babel/preset-typescript": "7.27.1", + "convert-source-map": "2.0.0", + "semver": "7.7.3" + }, + "peerDependencies": { + "@babel/core": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-worklets/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/react-native/node_modules/@react-native/codegen": { "version": "0.83.6", "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.6.tgz", diff --git a/package.json b/package.json index 26c275354..7a652db51 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,8 @@ "adb": "adb reverse tcp:8081 tcp:8081", "android:clean": "cd android; ./gradlew clean ; cd .. ; npm run android", "ios": "react-native run-ios", + "ios:sim:cloud": "npx eas-cli build --profile development --platform ios", + "ios:sim:local": "npx expo run:ios", "postinstall": "npm run releasenotes2json; npm run branch2json; npm run patches", "patches": "", "test": "npm run tslint && npm run lint && npm run unit && npm run integration", @@ -127,14 +129,15 @@ "electrum-client": "github:BlueWallet/rn-electrum-client#d9f511d", "electrum-mnemonic": "2.0.0", "events": "3.3.0", - "expo": "^55.0.21", + "expo": "~55.0.23", "expo-application": "~55.0.14", "expo-camera": "~55.0.18", "expo-clipboard": "~55.0.13", "expo-dev-client": "~55.0.32", - "expo-device": "~55.0.15", + "expo-device": "~55.0.16", "expo-document-picker": "~55.0.13", "expo-file-system": "~55.0.19", + "expo-font": "~55.0.7", "expo-haptics": "~55.0.14", "expo-image-picker": "~55.0.20", "expo-linear-gradient": "~55.0.13", @@ -167,6 +170,7 @@ "react-native-svg": "15.15.3", "react-native-tcp-socket": "6.3.0", "react-native-watch-connectivity": "1.1.0", + "react-native-worklets": "0.7.4", "react-test-renderer": "19.0.0", "readable-stream": "3.6.2", "realm": "20.1.0", diff --git a/post_migration_handoff.md b/post_migration_handoff.md new file mode 100644 index 000000000..298f71678 --- /dev/null +++ b/post_migration_handoff.md @@ -0,0 +1,49 @@ +# Post-Migration Handoff Summary + +This document summarizes the recent architectural changes made to transition Shroud Wallet to Expo (SDK 55) and outlines the exact next steps required to build and deploy the app. + +## πŸ“¦ Recent Commits & Changes + +### 1. File System & Media Migration +- **Replaced Packages:** `react-native-fs`, `react-native-image-picker`, `@react-native-documents/picker` +- **Expo Equivalents:** `expo-file-system`, `expo-image-picker`, `expo-document-picker` +- **Impact:** Converted legacy synchronous file operations (like reading Realm databases or saving PSBTs) into modern asynchronous Expo APIs. This ensures compatibility with Android 13+ storage scoping rules and iOS file sandboxing. + +### 2. Notifications & Permissions Migration +- **Replaced Packages:** `react-native-push-notification`, `@react-native-community/push-notification-ios`, `react-native-permissions` +- **Expo Equivalents:** `expo-notifications`, `expo-camera` +- **Impact:** Completely refactored the GroundControl push notification logic in `modules/notifications.ts`. Camera permissions for the QR scanner were streamlined using Expo Camera. + +### 3. Environment & Configuration Synchronization +- App configuration (`app.json`) and build profiles (`eas.json`) were generated. +- Missing peer dependencies (`expo-font`, `react-native-worklets`) were installed to ensure stable native compilation. +- Extraneous configurations causing schema validation errors (like `ios.deploymentTarget`) were removed. +- Adjusted local environment by appending NVM configurations to your `~/.zshrc`. + +--- + +## πŸš€ What You Need to Do Next + +The codebase is structurally ready for Expo SDK 55, but requires developer secrets to compile via Expo Application Services (EAS). + +### Step 1: Push Changes to GitHub +Commit any lingering local changes and push the `project-migration` branch to GitHub so the maintainer can pull the code. + +### Step 2: Handoff to Maintainer (Secrets Injection) +Pass the repository to the maintainer. They must execute the following via the Expo CLI (`npx eas-cli`): +1. **Initialize Project ID:** Run `eas init` to link the repository to the Expo Dashboard (this replaces `"YOUR_EAS_PROJECT_ID"` in `app.json`). +2. **Setup Notifications:** Place the `GoogleService-Info.plist` (iOS) and `google-services.json` (Android) in the project. Run `eas credentials` to upload the APNs Auth Key and FCM Server Key. +3. **Generate Keystores/Certificates:** Run `eas credentials` to generate iOS Distribution Certificates and Android Keystores for cloud compilation. + +### Step 3: Compile and Test +Once the maintainer has injected the credentials, you can build the app. +- **To build in the Cloud (EAS):** + ```bash + eas build --profile development --platform ios + ``` + *(This will generate a `.tar.gz` simulator build you can download).* + +- **To build Locally (Requires Xcode):** + 1. Install **Xcode** from the Mac App Store. + 2. Install CocoaPods: `sudo gem install cocoapods`. + 3. Compile and launch Simulator: `npx expo run:ios`. From 4e018d56f0c4a82a461f4432cf8ba1d0d578fe1a Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 00:33:30 +0530 Subject: [PATCH 11/40] refactor: migrate to expo-file-system legacy methods and update QR detection logic in fs module --- modules/fs.ts | 68 ++++++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/modules/fs.ts b/modules/fs.ts index e49f4716a..fb3f9a51e 100644 --- a/modules/fs.ts +++ b/modules/fs.ts @@ -1,13 +1,21 @@ import { Platform } from 'react-native'; import * as DocumentPicker from 'expo-document-picker'; -import * as FileSystem from 'expo-file-system'; +import { + cacheDirectory, + documentDirectory, + deleteAsync, + writeAsStringAsync, + readAsStringAsync, + getInfoAsync, + EncodingType, +} from 'expo-file-system/legacy'; import * as ImagePicker from 'expo-image-picker'; import Share from 'react-native-share'; +import RNQRGenerator from 'rn-qr-generator'; import presentAlert from '../components/Alert'; import loc from '../loc'; import { isDesktop } from './environment'; import { readFile } from './react-native-bw-file-access'; -import { detectQRCodeInImage } from 'react-native-camera-kit-no-google'; const _sanitizeFileName = (fileName: string) => { // Remove any path delimiters and non-alphanumeric characters except for -, _, and . @@ -35,7 +43,7 @@ const _shareOpen = async (filePath: string, showShareDialog: boolean = false) => } } finally { try { - await FileSystem.deleteAsync(filePath, { idempotent: true }); + await deleteAsync(filePath, { idempotent: true }); } catch (e) {} } }; @@ -49,13 +57,13 @@ export const writeFileAndExport = async function (fileName: string, contents: st const sanitizedFileName = _sanitizeFileName(fileName); try { if (Platform.OS === 'ios') { - const filePath = `${FileSystem.cacheDirectory}${sanitizedFileName}`; - await FileSystem.writeAsStringAsync(filePath, contents); + const filePath = `${cacheDirectory}${sanitizedFileName}`; + await writeAsStringAsync(filePath, contents); await _shareOpen(filePath, showShareDialog); } else if (Platform.OS === 'android') { - const filePath = `${FileSystem.documentDirectory}${sanitizedFileName}`; + const filePath = `${documentDirectory}${sanitizedFileName}`; try { - await FileSystem.writeAsStringAsync(filePath, contents); + await writeAsStringAsync(filePath, contents); if (showShareDialog) { await _shareOpen(filePath); } else { @@ -97,7 +105,7 @@ export const openSignedTransaction = async function (): Promise }; const _readPsbtFileIntoBase64 = async function (uri: string): Promise { - const base64 = await FileSystem.readAsStringAsync(uri, { encoding: FileSystem.EncodingType.Base64 }); + const base64 = await readAsStringAsync(uri, { encoding: EncodingType.Base64 }); const stringData = Buffer.from(base64, 'base64').toString(); // decode from base64 if (stringData.startsWith('psbt')) { // file was binary, but outer code expects base64 psbt, so we return base64 we got from rn-fs; @@ -169,7 +177,7 @@ export const showFilePickerAndReadFile = async function (): Promise<{ data: stri return await handleImageFile(fileCopyUri); } - const file = await FileSystem.readAsStringAsync(fileCopyUri, { encoding: FileSystem.EncodingType.UTF8 }); + const file = await readAsStringAsync(fileCopyUri, { encoding: EncodingType.UTF8 }); return { data: file, uri: fileCopyUri }; } catch (err: any) { if (!isCancel(err)) { @@ -181,45 +189,45 @@ export const showFilePickerAndReadFile = async function (): Promise<{ data: stri const readFileAsBase64 = async (uri: string): Promise => { try { - const info = await FileSystem.getInfoAsync(fileCopyUri); + const info = await getInfoAsync(uri); if (!info.exists) { - presentAlert({ message: 'File does not exist' }); - return { data: false, uri: false }; + throw new Error('File does not exist'); } // First attempt: use original URI - let result = await RNQRGenerator.detect({ uri: decodeURI(fileCopyUri) }); + const result = await RNQRGenerator.detect({ uri: decodeURI(uri) }); if (result?.values && result.values.length > 0) { - return { data: result.values[0], uri: fileCopyUri }; + return result.values[0]; } // Second attempt: remove file:// prefix and try again - const altUri = fileCopyUri.replace(/^file:\/\//, ''); - result = await RNQRGenerator.detect({ uri: decodeURI(altUri) }); - if (result?.values && result.values.length > 0) { - return { data: result.values[0], uri: fileCopyUri }; + const altUri = uri.replace(/^file:\/\//, ''); + const result2 = await RNQRGenerator.detect({ uri: decodeURI(altUri) }); + if (result2?.values && result2.values.length > 0) { + return result2.values[0]; } - presentAlert({ message: loc.send.qr_error_no_qrcode }); - return { data: false, uri: false }; + throw new Error(loc.send.qr_error_no_qrcode); } catch (error: any) { console.error(error); - presentAlert({ message: loc.send.qr_error_no_qrcode }); - return { data: false, uri: false }; + throw error; } }; const handleImageFile = async (fileCopyUri: string): Promise<{ data: string | false; uri: string | false }> => { - const base64 = await readFileAsBase64(fileCopyUri); - const result = await detectQRCodeInImage(base64); - if (result) { - return { data: result, uri: fileCopyUri }; + try { + const qrData = await readFileAsBase64(fileCopyUri); + if (qrData) { + return { data: qrData, uri: fileCopyUri }; + } + throw new Error(loc.send.qr_error_no_qrcode); + } catch { + throw new Error(loc.send.qr_error_no_qrcode); } - throw new Error(loc.send.qr_error_no_qrcode); }; export const readFileOutsideSandbox = (filePath: string) => { if (Platform.OS === 'ios') { return readFile(filePath); } else if (Platform.OS === 'android') { - return FileSystem.readAsStringAsync(filePath, { encoding: FileSystem.EncodingType.UTF8 }); + return readAsStringAsync(filePath, { encoding: EncodingType.UTF8 }); } else { presentAlert({ message: 'Not implemented for this platform' }); throw new Error('Not implemented for this platform'); @@ -237,7 +245,7 @@ export const openSignedTransactionRaw: () => Promise = async () => { throw { code: 'OPERATION_CANCELED' }; } - const file = await FileSystem.readAsStringAsync(result.assets[0].uri, { encoding: FileSystem.EncodingType.UTF8 }); + const file = await readAsStringAsync(result.assets[0].uri, { encoding: EncodingType.UTF8 }); if (file) { return file; } else { @@ -261,6 +269,6 @@ export const pickTransaction = async () => { if (result.canceled || !result.assets || result.assets.length === 0) { return null; } - + return result.assets[0]; }; From a130d92b03a162484a7b986f9270ceac59480c28 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 00:38:58 +0530 Subject: [PATCH 12/40] fix: replace react-native-camera-kit-no-google and react-native-fs with expo equivalents - modules/fs.ts: use expo-file-system/legacy for cacheDirectory, EncodingType etc; use rn-qr-generator for QR detection - components/CameraScreen.tsx: migrate from react-native-camera-kit-no-google Camera to expo-camera CameraView - components/AddressInputScanButton.tsx: replace detectQRCodeInImage with RNQRGenerator.detect - hooks/useCompanionListeners.ts: replace RNFS with expo-file-system/legacy, replace detectQRCodeInImage with RNQRGenerator - tests/setup.js: update mocks to match new packages --- components/AddressInputScanButton.tsx | 5 +- components/CameraScreen.tsx | 66 ++++++++------------------- hooks/useCompanionListeners.ts | 11 +++-- tests/setup.js | 32 ++++++++++--- 4 files changed, 53 insertions(+), 61 deletions(-) diff --git a/components/AddressInputScanButton.tsx b/components/AddressInputScanButton.tsx index 06461704b..bbb158165 100644 --- a/components/AddressInputScanButton.tsx +++ b/components/AddressInputScanButton.tsx @@ -6,7 +6,7 @@ import loc from '../loc'; import { showFilePickerAndReadFile, showImagePickerAndReadImage } from '../modules/fs'; import presentAlert from './Alert'; import { useTheme } from './themes'; -import { detectQRCodeInImage } from 'react-native-camera-kit-no-google'; +import RNQRGenerator from 'rn-qr-generator'; import { CommonToolTipActions } from '../typings/CommonToolTipActions'; import { useSettings } from '../hooks/context/useSettings'; import { scanQrHelper } from '../helpers/scan-qr'; @@ -79,7 +79,8 @@ export const AddressInputScanButton = ({ if (getImage) { try { const base64Data = getImage.replace(/^data:image\/(png|jpeg|jpg);base64,/, ''); - const result = await detectQRCodeInImage(base64Data); + const qrResult = await RNQRGenerator.detect({ base64: base64Data }); + const result = qrResult?.values?.[0]; if (result) { onChangeText(result); } else { diff --git a/components/CameraScreen.tsx b/components/CameraScreen.tsx index 5f5f6263d..c18e892db 100644 --- a/components/CameraScreen.tsx +++ b/components/CameraScreen.tsx @@ -1,7 +1,6 @@ -import React, { useRef, useState } from 'react'; +import React, { useState } from 'react'; import { Animated, Platform, StyleSheet, TouchableOpacity, View } from 'react-native'; -import { Camera, CameraApi, CameraType, Orientation } from 'react-native-camera-kit-no-google'; -import { OnOrientationChangeData, OnReadCodeData } from 'react-native-camera-kit-no-google/dist/CameraProps'; +import { CameraView, CameraType, useCameraPermissions, BarcodeScanningResult } from 'expo-camera'; import { isDesktop } from '../modules/environment'; import { triggerSelectionHapticFeedback } from '../modules/hapticFeedback'; @@ -14,7 +13,7 @@ interface CameraScreenProps { showFilePickerButton?: boolean; onImagePickerButtonPress?: () => void; onFilePickerButtonPress?: () => void; - onReadCode?: (event: OnReadCodeData) => void; + onReadCode?: (event: BarcodeScanningResult) => void; } const CameraScreen: React.FC = ({ @@ -25,16 +24,13 @@ const CameraScreen: React.FC = ({ onFilePickerButtonPress, onReadCode, }) => { - const cameraRef = useRef(null); + const [facing, setFacing] = React.useState('back'); const [torchMode, setTorchMode] = useState(false); - const [cameraType, setCameraType] = useState(CameraType.Back); - const [zoom, setZoom] = useState(); + const [, requestPermission] = useCameraPermissions(); const [orientationAnim] = useState(new Animated.Value(3)); const onSwitchCameraPressed = () => { - const direction = cameraType === CameraType.Back ? CameraType.Front : CameraType.Back; - setCameraType(direction); - setZoom(1); // When changing camera type, reset to default zoom for that camera + setFacing(f => (f === 'back' ? 'front' : 'back')); triggerSelectionHapticFeedback(); }; @@ -64,34 +60,17 @@ const CameraScreen: React.FC = ({ const handleZoom = (e: { nativeEvent: { zoom: number } }) => { console.debug('zoom', e.nativeEvent.zoom); - setZoom(e.nativeEvent.zoom); }; - const handleOrientationChange = (e: OnOrientationChangeData) => { - switch (e.nativeEvent.orientation) { - case Orientation.PORTRAIT_UPSIDE_DOWN: - console.debug('orientationChange', 'PORTRAIT_UPSIDE_DOWN'); - rotateUiTo(1); - break; - case Orientation.LANDSCAPE_LEFT: - console.debug('orientationChange', 'LANDSCAPE_LEFT'); - rotateUiTo(2); - break; - case Orientation.PORTRAIT: - console.debug('orientationChange', 'PORTRAIT'); - rotateUiTo(3); - break; - case Orientation.LANDSCAPE_RIGHT: - console.debug('orientationChange', 'LANDSCAPE_RIGHT'); - rotateUiTo(4); - break; - default: - console.debug('orientationChange', e.nativeEvent); - break; - } + const handleOrientationChange = (e: any) => { + const orientation = e?.nativeEvent?.orientation; + if (orientation === 'portrait') rotateUiTo(3); + else if (orientation === 'portrait-upside-down') rotateUiTo(1); + else if (orientation === 'landscape-left') rotateUiTo(2); + else if (orientation === 'landscape-right') rotateUiTo(4); }; - const handleReadCode = (event: OnReadCodeData) => { + const handleReadCode = (event: BarcodeScanningResult) => { onReadCode?.(event); }; @@ -138,19 +117,12 @@ const CameraScreen: React.FC = ({ )} - @@ -190,7 +162,7 @@ const CameraScreen: React.FC = ({ {Platform.OS === 'ios' ? ( ) : ( - + )} diff --git a/hooks/useCompanionListeners.ts b/hooks/useCompanionListeners.ts index 09f5ba9bb..3ae8feb83 100644 --- a/hooks/useCompanionListeners.ts +++ b/hooks/useCompanionListeners.ts @@ -1,8 +1,8 @@ import { CommonActions } from '@react-navigation/native'; import { useCallback, useEffect, useRef } from 'react'; import { AppState, AppStateStatus, Linking } from 'react-native'; -import { detectQRCodeInImage } from 'react-native-camera-kit-no-google'; -import RNFS from 'react-native-fs'; +import RNQRGenerator from 'rn-qr-generator'; +import { readAsStringAsync, EncodingType } from 'expo-file-system/legacy'; import A from '../modules/analytics'; import { getClipboardContent } from '../modules/clipboard'; import { updateExchangeRate } from '../modules/currency'; @@ -180,11 +180,12 @@ const useCompanionListeners = (skipIfNotInitialized = true) => { if (/\.(jpe?g|png)$/i.test(fileName)) { let base64: string; try { - base64 = await RNFS.readFile(decodedUrl, 'base64'); + base64 = await readAsStringAsync(decodedUrl, { encoding: EncodingType.Base64 }); } catch { - base64 = await RNFS.readFile(decodedUrl.replace(/^file:\/\//, ''), 'base64'); + base64 = await readAsStringAsync(decodedUrl.replace(/^file:\/\//, ''), { encoding: EncodingType.Base64 }); } - const qrValue = await detectQRCodeInImage(base64); + const qrResult = await RNQRGenerator.detect({ base64 }); + const qrValue = qrResult?.values?.[0]; if (!qrValue) { throw new Error(loc.send.qr_error_no_qrcode); } diff --git a/tests/setup.js b/tests/setup.js index ba50753ac..425055504 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -178,6 +178,21 @@ jest.mock('expo-file-system', () => { }; }); +jest.mock('expo-file-system/legacy', () => { + return { + documentDirectory: 'file:///mock/document/directory/', + cacheDirectory: 'file:///mock/cache/directory/', + readAsStringAsync: jest.fn().mockResolvedValue(''), + writeAsStringAsync: jest.fn().mockResolvedValue(), + deleteAsync: jest.fn().mockResolvedValue(), + getInfoAsync: jest.fn().mockResolvedValue({ exists: true }), + EncodingType: { + UTF8: 'utf8', + Base64: 'base64', + }, + }; +}); + jest.mock('expo-document-picker', () => ({ getDocumentAsync: jest.fn().mockResolvedValue({ canceled: true }), })); @@ -223,13 +238,16 @@ jest.mock('realm', () => { }; }); -jest.mock('react-native-camera-kit-no-google', () => ({ - detectQRCodeInImage: jest.fn(base64 => { - if (base64 === 'invalid-image') { - return Promise.reject(new Error('Invalid image data')); - } - return Promise.resolve('mocked-qr-code'); - }), +jest.mock('rn-qr-generator', () => ({ + default: { + detect: jest.fn(({ base64, uri }) => { + if (base64 === 'invalid-image' || uri === 'invalid-uri') { + return Promise.reject(new Error('Invalid image data')); + } + return Promise.resolve({ values: ['mocked-qr-code'], type: 'QRCode' }); + }), + generate: jest.fn().mockResolvedValue({ uri: 'mock-qr-uri', width: 200, height: 200 }), + }, })); From a4da2de6e5f232b059f8dae2b512489b00b9bc88 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 00:42:52 +0530 Subject: [PATCH 13/40] fix: update expo-clipboard to async API and fix expo-notifications Notification type casting --- components/AddressInputScanButton.tsx | 5 +++-- hooks/useCompanionListeners.ts | 22 ++++++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/components/AddressInputScanButton.tsx b/components/AddressInputScanButton.tsx index bbb158165..87698f41e 100644 --- a/components/AddressInputScanButton.tsx +++ b/components/AddressInputScanButton.tsx @@ -69,11 +69,12 @@ export const AddressInputScanButton = ({ if (Platform.OS === 'android') { hasImage = true; } else { - hasImage = await Clipboard.hasImage(); + hasImage = await Clipboard.hasImageAsync(); } if (hasImage) { - getImage = await Clipboard.getImage(); + const img = await Clipboard.getImageAsync({ format: 'png' }); + getImage = img?.data ?? null; } if (getImage) { diff --git a/hooks/useCompanionListeners.ts b/hooks/useCompanionListeners.ts index 3ae8feb83..4f9ca857b 100644 --- a/hooks/useCompanionListeners.ts +++ b/hooks/useCompanionListeners.ts @@ -32,7 +32,7 @@ import { useExtendedNavigation } from './useExtendedNavigation'; const useCompanionListeners = (skipIfNotInitialized = true) => { const { wallets, addWallet, saveToDisk, fetchAndSaveWalletTransactions, refreshAllWalletTransactions, walletsInitialized } = useStorage(); const appState = useRef(AppState.currentState); - const clipboardContent = useRef(); + const clipboardContent = useRef(undefined); const navigation = useExtendedNavigation(); const shouldActivateListeners = !skipIfNotInitialized || walletsInitialized; @@ -97,19 +97,29 @@ const useCompanionListeners = (skipIfNotInitialized = true) => { } if (deliveredNotifications.length > 0) { - for (const payload of deliveredNotifications) { - const wasTapped = payload.foreground === false || (payload.foreground === true && payload.userInteraction); + for (const notification of deliveredNotifications) { + // expo-notifications returns Notification objects; custom data is in request.content.data + const data = notification.request.content.data as Record; + const payload = { + foreground: false, + userInteraction: true, + type: data?.type as number | undefined, + address: data?.address as string | undefined, + txid: data?.txid as string | undefined, + hash: data?.hash as string | undefined, + }; + const wasTapped = true; // delivered notifications were interacted with console.log('processing push notification:', payload); let wallet; - switch (+payload.type) { + switch (+(payload.type ?? 0)) { case 2: case 3: - wallet = wallets.find(w => w.weOwnAddress(payload.address)); + wallet = wallets.find(w => w.weOwnAddress(payload.address ?? '')); break; case 1: case 4: - wallet = wallets.find(w => w.weOwnTransaction(payload.txid || payload.hash)); + wallet = wallets.find(w => w.weOwnTransaction((payload.txid || payload.hash) ?? '')); break; } From 2fd98d90b55eb44e4b2003ce2e2437b844b625d4 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 00:43:35 +0530 Subject: [PATCH 14/40] fix: null-safe access for optional TPayload fields in notifications loop --- hooks/useCompanionListeners.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hooks/useCompanionListeners.ts b/hooks/useCompanionListeners.ts index 4f9ca857b..5c171a994 100644 --- a/hooks/useCompanionListeners.ts +++ b/hooks/useCompanionListeners.ts @@ -62,14 +62,14 @@ const useCompanionListeners = (skipIfNotInitialized = true) => { console.log('processing push notification:', payload); let wallet; - switch (+payload.type) { + switch (+(payload.type ?? 0)) { case 2: case 3: - wallet = wallets.find(w => w.weOwnAddress(payload.address)); + wallet = wallets.find(w => w.weOwnAddress(payload.address ?? '')); break; case 1: case 4: - wallet = wallets.find(w => w.weOwnTransaction(payload.txid || payload.hash)); + wallet = wallets.find(w => w.weOwnTransaction((payload.txid || payload.hash) ?? '')); break; } From 1a146bd4265af78235407ff188ff7bcc01078697 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 00:49:55 +0530 Subject: [PATCH 15/40] chore: add missing expo plugins to app.json and correct eas.json scheme --- app.json | 19 ++++++++++++++++++- eas.json | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app.json b/app.json index ef612b931..a48b5d20a 100644 --- a/app.json +++ b/app.json @@ -13,6 +13,7 @@ "ios": { "supportsTablet": false, "bundleIdentifier": "org.bitshala.shroud", + "deploymentTarget": "16.0", "infoPlist": { "NSCameraUsageDescription": "Shroud Wallet uses the camera to scan QR codes", "NSFaceIDUsageDescription": "Shroud Wallet uses Face ID to unlock your wallet", @@ -36,7 +37,23 @@ "plugins": [ "expo-dev-client", "expo-localization", - "expo-font" + "expo-font", + [ + "expo-notifications", + { + "icon": "./img/icon.png", + "color": "#000000", + "sounds": [] + } + ], + [ + "expo-camera", + { + "cameraPermission": "Shroud Wallet uses the camera to scan QR codes" + } + ], + "expo-image-picker", + "expo-document-picker" ], "extra": { "eas": { diff --git a/eas.json b/eas.json index ab20d627b..4bdcbefd9 100644 --- a/eas.json +++ b/eas.json @@ -12,7 +12,7 @@ }, "ios": { "simulator": true, - "scheme": "BlueWallet" + "scheme": "Shroud" } }, "preview": { From 87864226afea0a0bba4c2b2f41909dab778265f3 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 00:58:24 +0530 Subject: [PATCH 16/40] chore: remove Podfile.lock and update EAS and iOS project configuration --- eas.json | 2 +- ios/Podfile | 9 +- ios/Podfile.lock | 2350 ---------------------------------------------- 3 files changed, 6 insertions(+), 2355 deletions(-) delete mode 100644 ios/Podfile.lock diff --git a/eas.json b/eas.json index 4bdcbefd9..ab20d627b 100644 --- a/eas.json +++ b/eas.json @@ -12,7 +12,7 @@ }, "ios": { "simulator": true, - "scheme": "Shroud" + "scheme": "BlueWallet" } }, "preview": { diff --git a/ios/Podfile b/ios/Podfile index 6ac6d7ce9..10eb44308 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,3 +1,5 @@ +require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") + def node_require(script) # Resolve script with node to allow for hoisting require Pod::Executable.execute_command('node', ['-p', @@ -6,10 +8,9 @@ def node_require(script) {paths: [process.argv[1]]}, )", __dir__]).strip end -ENV['RCT_NEW_ARCH_ENABLED'] = '0' + min_ios_version_supported = '15.1' node_require('react-native/scripts/react_native_pods.rb') -node_require('react-native-permissions/scripts/setup.rb') # Resolve react_native_pods.rb with node to allow for hoisting require Pod::Executable.execute_command('node', ['-p', @@ -21,7 +22,7 @@ require Pod::Executable.execute_command('node', ['-p', workspace 'Shroud' platform :ios, min_ios_version_supported prepare_react_native_project! -setup_permissions(['Camera', 'Notifications']) +use_expo_modules! linkage = ENV['USE_FRAMEWORKS'] if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green @@ -43,7 +44,7 @@ def configure_target() end -target 'Shroud' do +target 'BlueWallet' do configure_target() end diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index aeec2175d..000000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,2350 +0,0 @@ -PODS: - - boost (1.84.0) - - BugsnagReactNative (8.4.0): - - React-Core - - BVLinearGradient (2.8.3): - - React-Core - - CocoaAsyncSocket (7.6.5) - - DoubleConversion (1.1.6) - - fast_float (6.1.4) - - FBLazyVector (0.78.2) - - fmt (11.0.2) - - glog (0.3.5) - - hermes-engine (0.78.2): - - hermes-engine/Pre-built (= 0.78.2) - - hermes-engine/Pre-built (0.78.2) - - lottie-ios (4.5.0) - - lottie-react-native (7.2.4): - - DoubleConversion - - glog - - hermes-engine - - lottie-ios (= 4.5.0) - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RCT-Folly (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCT-Folly/Default (= 2024.11.18.00) - - RCT-Folly/Default (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCT-Folly/Fabric (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCTDeprecation (0.78.2) - - RCTRequired (0.78.2) - - RCTTypeSafety (0.78.2): - - FBLazyVector (= 0.78.2) - - RCTRequired (= 0.78.2) - - React-Core (= 0.78.2) - - React (0.78.2): - - React-Core (= 0.78.2) - - React-Core/DevSupport (= 0.78.2) - - React-Core/RCTWebSocket (= 0.78.2) - - React-RCTActionSheet (= 0.78.2) - - React-RCTAnimation (= 0.78.2) - - React-RCTBlob (= 0.78.2) - - React-RCTImage (= 0.78.2) - - React-RCTLinking (= 0.78.2) - - React-RCTNetwork (= 0.78.2) - - React-RCTSettings (= 0.78.2) - - React-RCTText (= 0.78.2) - - React-RCTVibration (= 0.78.2) - - React-callinvoker (0.78.2) - - React-Core (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default (= 0.78.2) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/CoreModulesHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/Default (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/DevSupport (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default (= 0.78.2) - - React-Core/RCTWebSocket (= 0.78.2) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTActionSheetHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTAnimationHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTBlobHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTImageHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTLinkingHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTNetworkHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTSettingsHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTTextHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTVibrationHeaders (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTWebSocket (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTDeprecation - - React-Core/Default (= 0.78.2) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-CoreModules (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety (= 0.78.2) - - React-Core/CoreModulesHeaders (= 0.78.2) - - React-jsi (= 0.78.2) - - React-jsinspector - - React-NativeModulesApple - - React-RCTBlob - - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.78.2) - - ReactCommon - - SocketRocket (= 0.7.1) - - React-cxxreact (0.78.2): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.78.2) - - React-debug (= 0.78.2) - - React-jsi (= 0.78.2) - - React-jsinspector - - React-logger (= 0.78.2) - - React-perflogger (= 0.78.2) - - React-runtimeexecutor (= 0.78.2) - - React-timing (= 0.78.2) - - React-debug (0.78.2) - - React-defaultsnativemodule (0.78.2): - - hermes-engine - - RCT-Folly - - React-domnativemodule - - React-featureflagsnativemodule - - React-idlecallbacksnativemodule - - React-jsi - - React-jsiexecutor - - React-microtasksnativemodule - - React-RCTFBReactNativeSpec - - React-domnativemodule (0.78.2): - - hermes-engine - - RCT-Folly - - React-Fabric - - React-FabricComponents - - React-graphics - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - ReactCommon/turbomodule/core - - Yoga - - React-Fabric (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/animations (= 0.78.2) - - React-Fabric/attributedstring (= 0.78.2) - - React-Fabric/componentregistry (= 0.78.2) - - React-Fabric/componentregistrynative (= 0.78.2) - - React-Fabric/components (= 0.78.2) - - React-Fabric/consistency (= 0.78.2) - - React-Fabric/core (= 0.78.2) - - React-Fabric/dom (= 0.78.2) - - React-Fabric/imagemanager (= 0.78.2) - - React-Fabric/leakchecker (= 0.78.2) - - React-Fabric/mounting (= 0.78.2) - - React-Fabric/observers (= 0.78.2) - - React-Fabric/scheduler (= 0.78.2) - - React-Fabric/telemetry (= 0.78.2) - - React-Fabric/templateprocessor (= 0.78.2) - - React-Fabric/uimanager (= 0.78.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/animations (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.78.2) - - React-Fabric/components/root (= 0.78.2) - - React-Fabric/components/view (= 0.78.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-Fabric/consistency (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/core (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/dom (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/observers (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/observers/events (= 0.78.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/observers/events (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/observers/events - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-performancetimeline - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/uimanager/consistency (= 0.78.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-FabricComponents (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-FabricComponents/components (= 0.78.2) - - React-FabricComponents/textlayoutmanager (= 0.78.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.78.2) - - React-FabricComponents/components/iostextinput (= 0.78.2) - - React-FabricComponents/components/modal (= 0.78.2) - - React-FabricComponents/components/rncore (= 0.78.2) - - React-FabricComponents/components/safeareaview (= 0.78.2) - - React-FabricComponents/components/scrollview (= 0.78.2) - - React-FabricComponents/components/text (= 0.78.2) - - React-FabricComponents/components/textinput (= 0.78.2) - - React-FabricComponents/components/unimplementedview (= 0.78.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/inputaccessory (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/iostextinput (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/modal (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/rncore (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/safeareaview (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/scrollview (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/text (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/textinput (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/unimplementedview (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/textlayoutmanager (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-FabricImage (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired (= 0.78.2) - - RCTTypeSafety (= 0.78.2) - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-jsiexecutor (= 0.78.2) - - React-logger - - React-rendererdebug - - React-utils - - ReactCommon - - Yoga - - React-featureflags (0.78.2): - - RCT-Folly (= 2024.11.18.00) - - React-featureflagsnativemodule (0.78.2): - - hermes-engine - - RCT-Folly - - React-featureflags - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - ReactCommon/turbomodule/core - - React-graphics (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-jsi - - React-jsiexecutor - - React-utils - - React-hermes (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.78.2) - - React-jsi - - React-jsiexecutor (= 0.78.2) - - React-jsinspector - - React-perflogger (= 0.78.2) - - React-runtimeexecutor - - React-idlecallbacksnativemodule (0.78.2): - - glog - - hermes-engine - - RCT-Folly - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - React-runtimescheduler - - ReactCommon/turbomodule/core - - React-ImageManager (0.78.2): - - glog - - RCT-Folly/Fabric - - React-Core/Default - - React-debug - - React-Fabric - - React-graphics - - React-rendererdebug - - React-utils - - React-jserrorhandler (0.78.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-cxxreact - - React-debug - - React-featureflags - - React-jsi - - ReactCommon/turbomodule/bridging - - React-jsi (0.78.2): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-jsiexecutor (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.78.2) - - React-jsi (= 0.78.2) - - React-jsinspector - - React-perflogger (= 0.78.2) - - React-jsinspector (0.78.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly - - React-featureflags - - React-jsi - - React-jsinspectortracing - - React-perflogger (= 0.78.2) - - React-runtimeexecutor (= 0.78.2) - - React-jsinspectortracing (0.78.2): - - RCT-Folly - - React-jsitracing (0.78.2): - - React-jsi - - React-logger (0.78.2): - - glog - - React-Mapbuffer (0.78.2): - - glog - - React-debug - - React-microtasksnativemodule (0.78.2): - - hermes-engine - - RCT-Folly - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - ReactCommon/turbomodule/core - - react-native-biometrics (3.0.1): - - React-Core - - react-native-bw-file-access (1.0.0): - - React-Core - - react-native-capture-protection (2.0.7): - - React-Core - - react-native-document-picker (10.1.5): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-get-random-values (1.11.0): - - React-Core - - react-native-image-picker (8.2.1): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-menu (1.2.4): - - React - - react-native-safe-area-context (5.5.2): - - React-Core - - react-native-secure-key-store (2.0.10): - - React-Core - - react-native-tcp-socket (6.3.0): - - CocoaAsyncSocket - - React-Core - - react-native-true-sheet (2.0.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-NativeModulesApple (0.78.2): - - glog - - hermes-engine - - React-callinvoker - - React-Core - - React-cxxreact - - React-jsi - - React-jsinspector - - React-runtimeexecutor - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-perflogger (0.78.2): - - DoubleConversion - - RCT-Folly (= 2024.11.18.00) - - React-performancetimeline (0.78.2): - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact - - React-featureflags - - React-jsinspectortracing - - React-timing - - React-RCTActionSheet (0.78.2): - - React-Core/RCTActionSheetHeaders (= 0.78.2) - - React-RCTAnimation (0.78.2): - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety - - React-Core/RCTAnimationHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - React-RCTAppDelegate (0.78.2): - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-CoreModules - - React-debug - - React-defaultsnativemodule - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-NativeModulesApple - - React-RCTFabric - - React-RCTFBReactNativeSpec - - React-RCTImage - - React-RCTNetwork - - React-rendererdebug - - React-RuntimeApple - - React-RuntimeCore - - React-RuntimeHermes - - React-runtimescheduler - - React-utils - - ReactCommon - - React-RCTBlob (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-Core/RCTBlobHeaders - - React-Core/RCTWebSocket - - React-jsi - - React-jsinspector - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - React-RCTNetwork - - ReactCommon - - React-RCTFabric (0.78.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-Core - - React-debug - - React-Fabric - - React-FabricComponents - - React-FabricImage - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-jsinspector - - React-jsinspectortracing - - React-performancetimeline - - React-RCTImage - - React-RCTText - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - Yoga - - React-RCTFBReactNativeSpec (0.78.2): - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - ReactCommon - - React-RCTImage (0.78.2): - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety - - React-Core/RCTImageHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - React-RCTNetwork - - ReactCommon - - React-RCTLinking (0.78.2): - - React-Core/RCTLinkingHeaders (= 0.78.2) - - React-jsi (= 0.78.2) - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - ReactCommon/turbomodule/core (= 0.78.2) - - React-RCTNetwork (0.78.2): - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety - - React-Core/RCTNetworkHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - React-RCTSettings (0.78.2): - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety - - React-Core/RCTSettingsHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - React-RCTText (0.78.2): - - React-Core/RCTTextHeaders (= 0.78.2) - - Yoga - - React-RCTVibration (0.78.2): - - RCT-Folly (= 2024.11.18.00) - - React-Core/RCTVibrationHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - React-rendererconsistency (0.78.2) - - React-rendererdebug (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - RCT-Folly (= 2024.11.18.00) - - React-debug - - React-rncore (0.78.2) - - React-RuntimeApple (0.78.2): - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-callinvoker - - React-Core/Default - - React-CoreModules - - React-cxxreact - - React-featureflags - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-Mapbuffer - - React-NativeModulesApple - - React-RCTFabric - - React-RCTFBReactNativeSpec - - React-RuntimeCore - - React-runtimeexecutor - - React-RuntimeHermes - - React-runtimescheduler - - React-utils - - React-RuntimeCore (0.78.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-cxxreact - - React-Fabric - - React-featureflags - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-performancetimeline - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - React-runtimeexecutor (0.78.2): - - React-jsi (= 0.78.2) - - React-RuntimeHermes (0.78.2): - - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-featureflags - - React-hermes - - React-jsi - - React-jsinspector - - React-jsitracing - - React-RuntimeCore - - React-utils - - React-runtimescheduler (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker - - React-cxxreact - - React-debug - - React-featureflags - - React-jsi - - React-performancetimeline - - React-rendererconsistency - - React-rendererdebug - - React-runtimeexecutor - - React-timing - - React-utils - - React-timing (0.78.2) - - React-utils (0.78.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-debug - - React-jsi (= 0.78.2) - - ReactAppDependencyProvider (0.78.2): - - ReactCodegen - - ReactCodegen (0.78.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-FabricImage - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - React-RCTAppDelegate - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - ReactCommon (0.78.2): - - ReactCommon/turbomodule (= 0.78.2) - - ReactCommon/turbomodule (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.78.2) - - React-cxxreact (= 0.78.2) - - React-jsi (= 0.78.2) - - React-logger (= 0.78.2) - - React-perflogger (= 0.78.2) - - ReactCommon/turbomodule/bridging (= 0.78.2) - - ReactCommon/turbomodule/core (= 0.78.2) - - ReactCommon/turbomodule/bridging (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.78.2) - - React-cxxreact (= 0.78.2) - - React-jsi (= 0.78.2) - - React-logger (= 0.78.2) - - React-perflogger (= 0.78.2) - - ReactCommon/turbomodule/core (0.78.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.78.2) - - React-cxxreact (= 0.78.2) - - React-debug (= 0.78.2) - - React-featureflags (= 0.78.2) - - React-jsi (= 0.78.2) - - React-logger (= 0.78.2) - - React-perflogger (= 0.78.2) - - React-utils (= 0.78.2) - - ReactNativeCameraKit (17.0.4): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RealmJS (20.1.0): - - React - - RNCAsyncStorage (2.2.0): - - React-Core - - RNCClipboard (1.16.3): - - React-Core - - RNCPushNotificationIOS (1.11.0): - - React-Core - - RNDefaultPreference (1.5.1): - - React-Core - - RNDeviceInfo (14.0.4): - - React-Core - - RNFS (2.20.0): - - React-Core - - RNGestureHandler (2.25.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNKeychain (9.1.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNLocalize (3.5.2): - - React-Core - - RNPermissions (5.4.2): - - React-Core - - RNQuickAction (0.3.13): - - React - - RNReactNativeHapticFeedback (2.3.3): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNReanimated (3.18.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 3.18.0) - - RNReanimated/worklets (= 3.18.0) - - Yoga - - RNReanimated/reanimated (3.18.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 3.18.0) - - Yoga - - RNReanimated/reanimated/apple (3.18.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNReanimated/worklets (3.18.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNReanimated/worklets/apple (= 3.18.0) - - Yoga - - RNReanimated/worklets/apple (3.18.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNScreens (4.11.1): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNShare (12.1.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNSVG (15.12.1): - - React-Core - - RNVectorIcons (10.2.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RustJsiBridge (0.0.1): - - React-Core - - SocketRocket (0.7.1) - - Yoga (0.0.0) - -DEPENDENCIES: - - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - - "BugsnagReactNative (from `../node_modules/@bugsnag/react-native`)" - - BVLinearGradient (from `../node_modules/react-native-linear-gradient`) - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) - - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) - - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - - lottie-react-native (from `../node_modules/lottie-react-native`) - - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) - - RCTRequired (from `../node_modules/react-native/Libraries/Required`) - - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - - React (from `../node_modules/react-native/`) - - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - - React-Core (from `../node_modules/react-native/`) - - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) - - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) - - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) - - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) - - React-Fabric (from `../node_modules/react-native/ReactCommon`) - - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) - - React-FabricImage (from `../node_modules/react-native/ReactCommon`) - - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) - - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) - - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) - - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) - - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) - - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) - - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - - react-native-biometrics (from `../node_modules/react-native-biometrics`) - - react-native-bw-file-access (from `../modules/react-native-bw-file-access`) - - react-native-capture-protection (from `../node_modules/react-native-capture-protection`) - - "react-native-document-picker (from `../node_modules/@react-native-documents/picker`)" - - react-native-get-random-values (from `../node_modules/react-native-get-random-values`) - - react-native-image-picker (from `../node_modules/react-native-image-picker`) - - "react-native-menu (from `../node_modules/@react-native-menu/menu`)" - - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - - react-native-secure-key-store (from `../node_modules/react-native-secure-key-store`) - - react-native-tcp-socket (from `../node_modules/react-native-tcp-socket`) - - "react-native-true-sheet (from `../node_modules/@lodev09/react-native-true-sheet`)" - - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) - - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) - - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) - - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) - - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) - - React-RCTFabric (from `../node_modules/react-native/React`) - - React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`) - - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) - - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) - - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) - - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) - - React-RCTText (from `../node_modules/react-native/Libraries/Text`) - - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) - - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-rncore (from `../node_modules/react-native/ReactCommon`) - - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) - - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) - - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - - ReactAppDependencyProvider (from `build/generated/ios`) - - ReactCodegen (from `build/generated/ios`) - - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - - ReactNativeCameraKit (from `../node_modules/react-native-camera-kit-no-google`) - - RealmJS (from `../node_modules/realm`) - - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - - "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)" - - "RNCPushNotificationIOS (from `../node_modules/@react-native-community/push-notification-ios`)" - - RNDefaultPreference (from `../node_modules/react-native-default-preference`) - - RNDeviceInfo (from `../node_modules/react-native-device-info`) - - RNFS (from `../node_modules/react-native-fs`) - - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - - RNKeychain (from `../node_modules/react-native-keychain`) - - RNLocalize (from `../node_modules/react-native-localize`) - - RNPermissions (from `../node_modules/react-native-permissions`) - - RNQuickAction (from `../node_modules/react-native-quick-actions`) - - RNReactNativeHapticFeedback (from `../node_modules/react-native-haptic-feedback`) - - RNReanimated (from `../node_modules/react-native-reanimated`) - - RNScreens (from `../node_modules/react-native-screens`) - - RNShare (from `../node_modules/react-native-share`) - - RNSVG (from `../node_modules/react-native-svg`) - - RNVectorIcons (from `../node_modules/react-native-vector-icons`) - - RustJsiBridge (from `.`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - -SPEC REPOS: - trunk: - - CocoaAsyncSocket - - lottie-ios - - SocketRocket - -EXTERNAL SOURCES: - boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" - BugsnagReactNative: - :path: "../node_modules/@bugsnag/react-native" - BVLinearGradient: - :path: "../node_modules/react-native-linear-gradient" - DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" - fast_float: - :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" - FBLazyVector: - :path: "../node_modules/react-native/Libraries/FBLazyVector" - fmt: - :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" - glog: - :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" - hermes-engine: - :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-2025-01-13-RNv0.78.0-a942ef374897d85da38e9c8904574f8376555388 - lottie-react-native: - :path: "../node_modules/lottie-react-native" - RCT-Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" - RCTDeprecation: - :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" - RCTRequired: - :path: "../node_modules/react-native/Libraries/Required" - RCTTypeSafety: - :path: "../node_modules/react-native/Libraries/TypeSafety" - React: - :path: "../node_modules/react-native/" - React-callinvoker: - :path: "../node_modules/react-native/ReactCommon/callinvoker" - React-Core: - :path: "../node_modules/react-native/" - React-CoreModules: - :path: "../node_modules/react-native/React/CoreModules" - React-cxxreact: - :path: "../node_modules/react-native/ReactCommon/cxxreact" - React-debug: - :path: "../node_modules/react-native/ReactCommon/react/debug" - React-defaultsnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" - React-domnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" - React-Fabric: - :path: "../node_modules/react-native/ReactCommon" - React-FabricComponents: - :path: "../node_modules/react-native/ReactCommon" - React-FabricImage: - :path: "../node_modules/react-native/ReactCommon" - React-featureflags: - :path: "../node_modules/react-native/ReactCommon/react/featureflags" - React-featureflagsnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" - React-graphics: - :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" - React-hermes: - :path: "../node_modules/react-native/ReactCommon/hermes" - React-idlecallbacksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" - React-ImageManager: - :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" - React-jserrorhandler: - :path: "../node_modules/react-native/ReactCommon/jserrorhandler" - React-jsi: - :path: "../node_modules/react-native/ReactCommon/jsi" - React-jsiexecutor: - :path: "../node_modules/react-native/ReactCommon/jsiexecutor" - React-jsinspector: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" - React-jsinspectortracing: - :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" - React-jsitracing: - :path: "../node_modules/react-native/ReactCommon/hermes/executor/" - React-logger: - :path: "../node_modules/react-native/ReactCommon/logger" - React-Mapbuffer: - :path: "../node_modules/react-native/ReactCommon" - React-microtasksnativemodule: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" - react-native-biometrics: - :path: "../node_modules/react-native-biometrics" - react-native-bw-file-access: - :path: "../modules/react-native-bw-file-access" - react-native-capture-protection: - :path: "../node_modules/react-native-capture-protection" - react-native-document-picker: - :path: "../node_modules/@react-native-documents/picker" - react-native-get-random-values: - :path: "../node_modules/react-native-get-random-values" - react-native-image-picker: - :path: "../node_modules/react-native-image-picker" - react-native-menu: - :path: "../node_modules/@react-native-menu/menu" - react-native-safe-area-context: - :path: "../node_modules/react-native-safe-area-context" - react-native-secure-key-store: - :path: "../node_modules/react-native-secure-key-store" - react-native-tcp-socket: - :path: "../node_modules/react-native-tcp-socket" - react-native-true-sheet: - :path: "../node_modules/@lodev09/react-native-true-sheet" - React-NativeModulesApple: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" - React-perflogger: - :path: "../node_modules/react-native/ReactCommon/reactperflogger" - React-performancetimeline: - :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" - React-RCTActionSheet: - :path: "../node_modules/react-native/Libraries/ActionSheetIOS" - React-RCTAnimation: - :path: "../node_modules/react-native/Libraries/NativeAnimation" - React-RCTAppDelegate: - :path: "../node_modules/react-native/Libraries/AppDelegate" - React-RCTBlob: - :path: "../node_modules/react-native/Libraries/Blob" - React-RCTFabric: - :path: "../node_modules/react-native/React" - React-RCTFBReactNativeSpec: - :path: "../node_modules/react-native/React" - React-RCTImage: - :path: "../node_modules/react-native/Libraries/Image" - React-RCTLinking: - :path: "../node_modules/react-native/Libraries/LinkingIOS" - React-RCTNetwork: - :path: "../node_modules/react-native/Libraries/Network" - React-RCTSettings: - :path: "../node_modules/react-native/Libraries/Settings" - React-RCTText: - :path: "../node_modules/react-native/Libraries/Text" - React-RCTVibration: - :path: "../node_modules/react-native/Libraries/Vibration" - React-rendererconsistency: - :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" - React-rendererdebug: - :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" - React-rncore: - :path: "../node_modules/react-native/ReactCommon" - React-RuntimeApple: - :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" - React-RuntimeCore: - :path: "../node_modules/react-native/ReactCommon/react/runtime" - React-runtimeexecutor: - :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" - React-RuntimeHermes: - :path: "../node_modules/react-native/ReactCommon/react/runtime" - React-runtimescheduler: - :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" - React-timing: - :path: "../node_modules/react-native/ReactCommon/react/timing" - React-utils: - :path: "../node_modules/react-native/ReactCommon/react/utils" - ReactAppDependencyProvider: - :path: build/generated/ios - ReactCodegen: - :path: build/generated/ios - ReactCommon: - :path: "../node_modules/react-native/ReactCommon" - ReactNativeCameraKit: - :path: "../node_modules/react-native-camera-kit-no-google" - RealmJS: - :path: "../node_modules/realm" - RNCAsyncStorage: - :path: "../node_modules/@react-native-async-storage/async-storage" - RNCClipboard: - :path: "../node_modules/@react-native-clipboard/clipboard" - RNCPushNotificationIOS: - :path: "../node_modules/@react-native-community/push-notification-ios" - RNDefaultPreference: - :path: "../node_modules/react-native-default-preference" - RNDeviceInfo: - :path: "../node_modules/react-native-device-info" - RNFS: - :path: "../node_modules/react-native-fs" - RNGestureHandler: - :path: "../node_modules/react-native-gesture-handler" - RNKeychain: - :path: "../node_modules/react-native-keychain" - RNLocalize: - :path: "../node_modules/react-native-localize" - RNPermissions: - :path: "../node_modules/react-native-permissions" - RNQuickAction: - :path: "../node_modules/react-native-quick-actions" - RNReactNativeHapticFeedback: - :path: "../node_modules/react-native-haptic-feedback" - RNReanimated: - :path: "../node_modules/react-native-reanimated" - RNScreens: - :path: "../node_modules/react-native-screens" - RNShare: - :path: "../node_modules/react-native-share" - RNSVG: - :path: "../node_modules/react-native-svg" - RNVectorIcons: - :path: "../node_modules/react-native-vector-icons" - RustJsiBridge: - :path: "." - Yoga: - :path: "../node_modules/react-native/ReactCommon/yoga" - -SPEC CHECKSUMS: - boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 - BugsnagReactNative: f2731e875074768796910d51fab561dfde4a20be - BVLinearGradient: cb006ba232a1f3e4f341bb62c42d1098c284da70 - CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb - fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 - FBLazyVector: e32d34492c519a2194ec9d7f5e7a79d11b73f91c - fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd - glog: eb93e2f488219332457c3c4eafd2738ddc7e80b8 - hermes-engine: 2771b98fb813fdc6f92edd7c9c0035ecabf9fee7 - lottie-ios: a881093fab623c467d3bce374367755c272bdd59 - lottie-react-native: 3d5879c421eb43a19e3c723f834300fecfd3e5b9 - RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 - RCTDeprecation: be794de7dc6ed8f9f7fbf525f86e7651b8b68746 - RCTRequired: a83787b092ec554c2eb6019ff3f5b8d125472b3b - RCTTypeSafety: 48ad3c858926b1c46f46a81a58822b476e178e2c - React: 3b5754191f1b65f1dbc52fbea7959c3d2d9e39c9 - React-callinvoker: 6beeaf4c7db11b6cc953fac45f2c76e3fb125013 - React-Core: 8a10ac9de53373a3ecb5dfcbcf56df1d3dad0861 - React-CoreModules: af6999b35c7c01b0e12b59d27f3e054e13da43b1 - React-cxxreact: 833f00155ce8c2fda17f6d286f8eaeff2ececc69 - React-debug: 440175830c448e7e53e61ebb8d8468c3256b645e - React-defaultsnativemodule: a970effe18fe50bdbbb7115c3297f873b666d0d4 - React-domnativemodule: 45f886342a724e61531b18fba1859bb6782e5d62 - React-Fabric: 69f1881f2177a8512304a64157943548ab6df0cf - React-FabricComponents: f54111c8e2439fc273ab07483e3a7054ca1e75af - React-FabricImage: 9ad2619dfe8c386d79e8aaa87da6e8f018ab9592 - React-featureflags: b9cf9b35baca1c7f20c06a104ffc325a02752faa - React-featureflagsnativemodule: 7f1bc76d1d2c5bede5e753b8d188dbde7c59b12f - React-graphics: 069e0d0b31ed1e80feb023ad4f7e97f00e84f7b9 - React-hermes: 63df5ac5a944889c8758a6213b39ed825863adb7 - React-idlecallbacksnativemodule: 4c700bd7c0012adf904929075a79418b828b5ffc - React-ImageManager: 5d1ba8a7bae44ebba43fc93da64937c713d42941 - React-jserrorhandler: 0defd58f8bb797cdd0a820f733bf42d8bee708ce - React-jsi: 99d6207ec802ad73473a0dad3c9ad48cd98463f6 - React-jsiexecutor: 8c8097b4ba7e7f480582d6e6238b01be5dcc01c0 - React-jsinspector: ea148ec45bc7ff830e443383ea715f9780c15934 - React-jsinspectortracing: 46bb2841982f01e7b63eaab98140fa1de5b2a1db - React-jsitracing: c1063fc2233960d1c8322291e74bca51d25c10d7 - React-logger: 763728cf4eebc9c5dc9bfc3649e22295784f69f3 - React-Mapbuffer: 63278529b5cf531a7eaf8fc71244fabb062ca90c - React-microtasksnativemodule: 6a39463c32ce831c4c2aa8469273114d894b6be9 - react-native-biometrics: 43ed5b828646a7862dbc7945556446be00798e7d - react-native-bw-file-access: fe925b77dbf48500df0b294c6851f8c84607a203 - react-native-capture-protection: d2d5ced5fead227abb1304518d55774de19c3021 - react-native-document-picker: d71fb688c2a16a1ad30a622ba2fe4461531dbd57 - react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba - react-native-image-picker: 1b6097f71e3cf785a40d22be7904f17e924965bb - react-native-menu: 475e400d9b57949c076a0844e130044b45f2aa3d - react-native-safe-area-context: 0f7bf11598f9a61b7ceac8dc3f59ef98697e99e1 - react-native-secure-key-store: eb45b44bdec3f48e9be5cdfca0f49ddf64892ea6 - react-native-tcp-socket: 120072c8020262032773f80f0daaf3964aaa08a1 - react-native-true-sheet: b593fa693ce5380ffc4a0e895ab2a9435657223e - React-NativeModulesApple: fd0545efbb7f936f78edd15a6564a72d2c34bb32 - React-perflogger: 5f8fa36a8e168fb355efe72099efe77213bc2ac6 - React-performancetimeline: 8c0ecfa1ae459cc5678a65f95ac3bf85644d6feb - React-RCTActionSheet: 2ef95837e89b9b154f13cd8401f9054fc3076aff - React-RCTAnimation: 46abefd5acfda7e6629f9e153646deecc70babd2 - React-RCTAppDelegate: a3814cb61183743c531def98a20f2062edbf61ad - React-RCTBlob: f68c63a801ef1d27e83c4011e3b083cc86a200d7 - React-RCTFabric: 6ef4dccb25f42c5b38b09b95d4dc57dd77b8f722 - React-RCTFBReactNativeSpec: 328962a4a19a8459b40188ee56eea1fab78f7737 - React-RCTImage: 34e0bba1507e55f1c614bd759eb91d9be48c8c5b - React-RCTLinking: a0b6c9f4871c18b0b81ea952f43e752718bd5f1d - React-RCTNetwork: bdafd661ac2b20d23b779e45bf7ac3e4c8bd1b60 - React-RCTSettings: 98aa5163796f43789314787b584a84eba47787a9 - React-RCTText: 424a274fc9015b29de89cf3cbcdf4dd85dd69f83 - React-RCTVibration: 92d9875a955b0adb34b4b773528fdbbbc5addd6c - React-rendererconsistency: 5ac4164ec18cfdd76ed5f864dbfdc56a5a948bc9 - React-rendererdebug: 710dbd7990e355852c786aa6bc7753f6028f357a - React-rncore: 0bace3b991d8843bb5b57c5f2301ec6e9c94718b - React-RuntimeApple: 701ec44a8b5d863ee9b6a2b2447b6a26bb6805a1 - React-RuntimeCore: a82767065b9a936b05e209dc6987bc1ea9eb5d2d - React-runtimeexecutor: 876dfc1d8daa819dfd039c40f78f277c5a3e66a6 - React-RuntimeHermes: e7a051fd91cab8849df56ac917022ef6064ad621 - React-runtimescheduler: c544141f2124ee3d5f3d5bf0d69f4029a61a68b0 - React-timing: 1ee3572c398f5579c9df5bf76aacddf5683ff74e - React-utils: 18703928768cb37e70cf2efff09def12d74a399e - ReactAppDependencyProvider: 4893bde33952f997a323eb1a1ee87a72764018ff - ReactCodegen: 99ea3536c05be3c18d0c517acb56b5a6d726fc7b - ReactCommon: 865ebe76504a95e115b6229dd00a31e56d2d4bfe - ReactNativeCameraKit: 6a2051bec0e0a7a7d921d64c1219a9cd274c020b - RealmJS: 9fd51c849eb552ade9f7b11db42a319b4f6cab4c - RNCAsyncStorage: b44e8a4e798c3e1f56bffccd0f591f674fb9198f - RNCClipboard: f6679d470d0da2bce2a37b0af7b9e0bf369ecda5 - RNCPushNotificationIOS: 6c4ca3388c7434e4a662b92e4dfeeee858e6f440 - RNDefaultPreference: 8a089ee8ce829a66c5453e3c5434f0785499d1c3 - RNDeviceInfo: d863506092aef7e7af3a1c350c913d867d795047 - RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 - RNGestureHandler: 92e89a04cd0d1c77f383a55d14c15e7f423f4c00 - RNKeychain: fa7765e6af5a8ec866bea4e86d2a1086f562d69f - RNLocalize: 3c4d0abd777a546fa77bdb6caef85a87fb9ea349 - RNPermissions: c48851513712284b650e8a166fdd409aa81b6104 - RNQuickAction: c2c8f379e614428be0babe4d53a575739667744d - RNReactNativeHapticFeedback: f9cfb40676f21a52e9e172648d033f539156a5ec - RNReanimated: 76e3bdba62bb728ea8d8d23b451e8070e6c2c2bc - RNScreens: 9ef996b6041d0960a4794a845f7d0808b171b4ef - RNShare: 5bc29e5794f5d451ca1308d6ad9101088eb15f8c - RNSVG: cd580f422f3c4f0ffa490b6ac479c6602ae54bca - RNVectorIcons: f7a99433a71f4b38891c14c64b21fc521d064392 - RustJsiBridge: 4d2e33eec3ba03119c1786253d35ce03a8d48cd9 - SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: e14bad835e12b6c7e2260fc320bd00e0f4b45add - -PODFILE CHECKSUM: bb9413d120e560e7bd3a2f4d963a8ac013dff89d - -COCOAPODS: 1.15.2 From 54962f19f3217827eac5e22ee89302a0b88dc408 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 01:00:00 +0530 Subject: [PATCH 17/40] fix: revert eas scheme to Shroud to match xcscheme --- eas.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eas.json b/eas.json index ab20d627b..4bdcbefd9 100644 --- a/eas.json +++ b/eas.json @@ -12,7 +12,7 @@ }, "ios": { "simulator": true, - "scheme": "BlueWallet" + "scheme": "Shroud" } }, "preview": { From c285f529de899cebf3b247f9bd9e1ccf35f8f921 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 01:04:57 +0530 Subject: [PATCH 18/40] chore: remove react-native-camera-kit-no-google from package.json and sync lockfile --- package-lock.json | 939 +--------------------------------------------- package.json | 1 - 2 files changed, 5 insertions(+), 935 deletions(-) diff --git a/package-lock.json b/package-lock.json index 494655802..8deffc631 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@babel/preset-env": "7.27.2", "@bugsnag/react-native": "8.4.0", "@bugsnag/source-maps": "2.3.3", "@expo/vector-icons": "^15.0.2", @@ -33,7 +32,6 @@ "@rneui/base": "4.0.0-rc.8", "@rneui/themed": "4.0.0-rc.8", "@silent-pay/core": "^0.0.6", - "aezeed": "0.0.5", "assert": "2.1.0", "base-x": "4.0.1", "bc-bech32": "file:modules/bc-bech32", @@ -41,10 +39,8 @@ "bignumber.js": "9.3.1", "bip21": "2.0.3", "bip32": "3.1.0", - "bip38": "github:BlueWallet/bip38", "bip39": "3.1.0", "bitcoinjs-lib": "^7.0.0-rc.0", - "bitcoinjs-message": "2.2.0", "buffer": "6.0.3", "coinselect": "github:BlueWallet/coinselect#35f8038", "crypto-browserify": "3.12.1", @@ -52,7 +48,6 @@ "dayjs": "1.11.18", "ecpair": "3.0.0", "electrum-client": "github:BlueWallet/rn-electrum-client#d9f511d", - "electrum-mnemonic": "2.0.0", "events": "3.3.0", "expo": "~55.0.23", "expo-application": "~55.0.14", @@ -75,8 +70,6 @@ "react-localization": "github:BlueWallet/react-localization#ae7969a", "react-native": "0.83.6", "react-native-biometrics": "3.0.1", - "react-native-blue-crypto": "github:BlueWallet/react-native-blue-crypto#3cb5442", - "react-native-camera-kit": "15.0.1", "react-native-capture-protection": "github:BlueWallet/react-native-capture-protection#54d900", "react-native-default-preference": "https://github.com/BlueWallet/react-native-default-preference.git#6338a1f1235e4130b8cfc2dd3b53015eeff2870c", "react-native-draglist": "github:BlueWallet/react-native-draglist#354c28e", @@ -97,18 +90,14 @@ "react-native-watch-connectivity": "1.1.0", "react-native-worklets": "0.7.4", "react-test-renderer": "19.0.0", - "readable-stream": "3.6.2", "realm": "20.1.0", - "rn-qr-generator": "https://github.com/BlueWallet/rn-qr-generator.git#731ed8eb445f65f3a659632232e18ff7e1ce56d6", "silent-payments": "github:BlueWallet/SilentPayments#7ac4d17", - "slip39": "https://github.com/BlueWallet/slip39-js#d316ee6", "stream-browserify": "3.0.0", "url": "0.11.4", "wif": "2.0.6" }, "devDependencies": { "@babel/core": "^7.26.0", - "@babel/preset-env": "^7.26.0", "@babel/runtime": "^7.26.0", "@jest/reporters": "^27.5.1", "@react-native/babel-preset": "0.78.2", @@ -117,7 +106,6 @@ "@react-native/metro-babel-transformer": "^0.78.3", "@react-native/typescript-config": "0.78.2", "@testing-library/react-native": "^13.0.1", - "@types/bip38": "^3.1.2", "@types/bs58check": "^2.1.0", "@types/create-hash": "^1.2.2", "@types/crypto-js": "^4.2.2", @@ -143,7 +131,6 @@ "eslint-plugin-react-native": "^4.1.0", "jest": "^29.6.3", "jest-environment-node": "^29.7.0", - "metro-react-native-babel-preset": "0.76.8", "node-fetch": "^2.6.7", "prettier": "^3.2.5", "ts-jest": "^29.1.1", @@ -332,17 +319,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -530,122 +506,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", @@ -676,96 +536,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "license": "MIT", @@ -860,22 +630,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", @@ -1027,21 +781,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", @@ -1091,22 +830,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", @@ -1205,88 +928,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", @@ -1349,22 +990,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-literals": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", @@ -1395,39 +1020,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", @@ -1444,42 +1036,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", @@ -1496,22 +1052,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", @@ -1560,23 +1100,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", @@ -1639,30 +1162,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { + "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "license": "MIT", "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -1778,39 +1285,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.26.10", "license": "MIT", @@ -1890,22 +1364,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", @@ -1925,39 +1383,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", @@ -1974,107 +1399,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/preset-flow": { "version": "7.25.9", "license": "MIT", @@ -2090,19 +1414,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/preset-react": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", @@ -7298,14 +6609,6 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/bip38": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/bs58check": { "version": "2.1.2", "dev": true, @@ -7783,27 +7086,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/aez": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "blakejs": "^1.1.0", - "safe-buffer": "^5.1.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/aezeed": { - "version": "0.0.5", - "license": "MIT", - "dependencies": { - "aez": "^1.0.1", - "crc-32": "^1.2.1", - "randombytes": "^2.1.0", - "scryptsy": "^2.1.0" - } - }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -8714,9 +7996,6 @@ "node": ">=0.6" } }, - "node_modules/bigi": { - "version": "1.4.2" - }, "node_modules/bignumber.js": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", @@ -8764,27 +8043,6 @@ "node": ">=6.0.0" } }, - "node_modules/bip38": { - "version": "3.1.1", - "resolved": "git+ssh://git@github.com/BlueWallet/bip38.git#7ec4b1932b98eaaff16c5a26765a26466958e6b4", - "dependencies": { - "bigi": "^1.2.0", - "browserify-aes": "^1.0.1", - "bs58check": "<3.0.0", - "buffer-xor": "^1.0.2", - "create-hash": "^1.1.1", - "ecurve": "^1.0.0", - "safe-buffer": "~5.1.1", - "scryptsy": "^2.1.0" - }, - "peerDependencies": { - "react-native-blue-crypto": "*" - } - }, - "node_modules/bip38/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" - }, "node_modules/bip39": { "version": "3.1.0", "license": "ISC", @@ -8877,25 +8135,6 @@ "node": ">=14.0.0" } }, - "node_modules/bitcoinjs-message": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "bech32": "^1.1.3", - "bs58check": "^2.1.2", - "buffer-equals": "^1.0.3", - "create-hash": "^1.1.2", - "secp256k1": "^3.0.1", - "varuint-bitcoin": "^1.0.1" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/bitcoinjs-message/node_modules/bech32": { - "version": "1.1.4", - "license": "MIT" - }, "node_modules/bl": { "version": "4.1.0", "license": "MIT", @@ -8927,10 +8166,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/blakejs": { - "version": "1.2.1", - "license": "MIT" - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -9261,13 +8496,6 @@ "ieee754": "^1.2.1" } }, - "node_modules/buffer-equals": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "license": "MIT" @@ -10003,16 +9231,6 @@ "buffer": "^5.1.0" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/crc/node_modules/buffer": { "version": "5.7.1", "funding": [ @@ -10750,18 +9968,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/drbg.js": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/dtrace-provider": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", @@ -10920,14 +10126,6 @@ "bs58check": "^4.0.0" } }, - "node_modules/ecurve": { - "version": "1.0.6", - "license": "MIT", - "dependencies": { - "bigi": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, "node_modules/ee-first": { "version": "1.1.1", "license": "MIT" @@ -10960,15 +10158,6 @@ "node": ">=18" } }, - "node_modules/electrum-mnemonic": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "create-hmac": "^1.1.7", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0" - } - }, "node_modules/elliptic": { "version": "6.6.1", "license": "MIT", @@ -17390,66 +16579,6 @@ "node": ">=18.18" } }, - "node_modules/metro-react-native-babel-preset": { - "version": "0.76.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.4.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/metro-react-native-babel-preset/node_modules/react-refresh": { - "version": "0.4.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/metro-resolver": { "version": "0.81.4", "license": "MIT", @@ -19448,28 +18577,6 @@ "react-native": ">=0.60.0" } }, - "node_modules/react-native-blue-crypto": { - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/BlueWallet/react-native-blue-crypto.git#3cb5442425bd835e185284fbc62e84b7155bc441", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-camera-kit": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/react-native-camera-kit/-/react-native-camera-kit-15.0.1.tgz", - "integrity": "sha512-JAa/2m73vKRp9oJ6ynYDr2KIIbglUbXYmDmsUrxLdk820eMGfxlb2HukqmVrkwt9KgX5vlBWoDHys3dhmrqa/w==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/react-native-capture-protection": { "version": "2.0.7", "resolved": "git+ssh://git@github.com/BlueWallet/react-native-capture-protection.git#54d9009d8cafc41230e608a1f8b912008e6d8e8e", @@ -20394,15 +19501,6 @@ "inherits": "^2.0.1" } }, - "node_modules/rn-qr-generator": { - "version": "1.4.3", - "resolved": "git+ssh://git@github.com/BlueWallet/rn-qr-generator.git#731ed8eb445f65f3a659632232e18ff7e1ce56d6", - "integrity": "sha512-+hZFzqkWjxg7Ey9Tw8wjGuyY6I7R8ypQJa23wL0GUyeEBISxGCnz0W/2ULMxvd/w2FethMeTAkXe8+lDy8/vvw==", - "license": "MIT", - "peerDependencies": { - "react-native": ">=0.55" - } - }, "node_modules/rtl-detect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", @@ -20539,28 +19637,6 @@ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", "license": "MIT" }, - "node_modules/scryptsy": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/secp256k1": { - "version": "3.8.1", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.5.7", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/semver": { "version": "6.3.1", "license": "ISC", @@ -21022,11 +20098,6 @@ "version": "1.1.3", "license": "MIT" }, - "node_modules/slip39": { - "version": "0.1.9", - "resolved": "git+ssh://git@github.com/BlueWallet/slip39-js.git#d316ee6a929ab645fe5462ef1c91720eb66889c8", - "license": "MIT" - }, "node_modules/slugify": { "version": "1.6.9", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", diff --git a/package.json b/package.json index cc59a589e..b0f1f350a 100644 --- a/package.json +++ b/package.json @@ -142,7 +142,6 @@ "react-localization": "github:BlueWallet/react-localization#ae7969a", "react-native": "0.83.6", "react-native-biometrics": "3.0.1", - "react-native-camera-kit-no-google": "github:BlueWallet/react-native-camera-kit-no-google#0ed049a62da29cf304019363ec9d9ef3a73652e6", "react-native-capture-protection": "github:BlueWallet/react-native-capture-protection#54d900", "react-native-default-preference": "https://github.com/BlueWallet/react-native-default-preference.git#6338a1f1235e4130b8cfc2dd3b53015eeff2870c", "react-native-draglist": "github:BlueWallet/react-native-draglist#354c28e", From 49fa4e9148b6a7ae375c28e25336671a6af0a999 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 01:13:39 +0530 Subject: [PATCH 19/40] fix: remove missing Stickers.xcassets reference from Xcode project --- ios/Shroud.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index 2470a9562..c19fb049c 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -11,7 +11,7 @@ 17CDA0718F42DB2CE856C872 /* libPods-BlueWallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 040819EDF8BD9C50A9C83E24 /* libPods-BlueWallet.a */; }; 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; }; 32F0A29A2311DBB20095C559 /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F0A2992311DBB20095C559 /* ComplicationController.swift */; }; - 6D2A6464258BA92D0092292B /* Stickers.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D2A6463258BA92D0092292B /* Stickers.xcassets */; }; + 6D2A6468258BA92D0092292B /* Stickers.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 6D2A6461258BA92C0092292B /* Stickers.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 6D4AF15925D21172009DD853 /* MarketAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* MarketAPI.swift */; }; 6D4AF16D25D21192009DD853 /* Placeholders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Placeholders.swift */; }; @@ -263,7 +263,7 @@ 6D294A9B24D512770039E22B /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Interface.strings; sourceTree = ""; }; 6D294A9D24D5127F0039E22B /* xh */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = xh; path = xh.lproj/Interface.strings; sourceTree = ""; }; 6D2A6461258BA92C0092292B /* Stickers.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Stickers.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 6D2A6463258BA92D0092292B /* Stickers.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Stickers.xcassets; sourceTree = ""; }; + 6D2A6465258BA92D0092292B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6D2AA8072568B8F40090B089 /* FiatUnit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiatUnit.swift; sourceTree = ""; }; 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; @@ -507,7 +507,7 @@ 6D2A6462258BA92C0092292B /* Stickers */ = { isa = PBXGroup; children = ( - 6D2A6463258BA92D0092292B /* Stickers.xcassets */, + 6D2A6465258BA92D0092292B /* Info.plist */, ); path = Stickers; @@ -966,7 +966,7 @@ buildActionMask = 2147483647; files = ( B4742E9A2CCDBE8300380EEE /* Localizable.xcstrings in Resources */, - 6D2A6464258BA92D0092292B /* Stickers.xcassets in Resources */, + ); runOnlyForDeploymentPostprocessing = 0; }; From c0aeab7450eddd77b61523819777e1a8e782d23d Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 01:25:19 +0530 Subject: [PATCH 20/40] fix: remove broken Stickers app extension target from Xcode project --- ios/Shroud.xcodeproj/project.pbxproj | 50 ++-------------------------- 1 file changed, 2 insertions(+), 48 deletions(-) diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index c19fb049c..66054615b 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -11,7 +11,6 @@ 17CDA0718F42DB2CE856C872 /* libPods-BlueWallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 040819EDF8BD9C50A9C83E24 /* libPods-BlueWallet.a */; }; 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; }; 32F0A29A2311DBB20095C559 /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F0A2992311DBB20095C559 /* ComplicationController.swift */; }; - 6D2A6468258BA92D0092292B /* Stickers.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 6D2A6461258BA92C0092292B /* Stickers.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 6D4AF15925D21172009DD853 /* MarketAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* MarketAPI.swift */; }; 6D4AF16D25D21192009DD853 /* Placeholders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Placeholders.swift */; }; @@ -263,7 +262,6 @@ 6D294A9B24D512770039E22B /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Interface.strings; sourceTree = ""; }; 6D294A9D24D5127F0039E22B /* xh */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = xh; path = xh.lproj/Interface.strings; sourceTree = ""; }; 6D2A6461258BA92C0092292B /* Stickers.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Stickers.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - 6D2A6465258BA92D0092292B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6D2AA8072568B8F40090B089 /* FiatUnit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiatUnit.swift; sourceTree = ""; }; 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; @@ -424,13 +422,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 8889F8F93C39BB72C97DD77E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -507,7 +498,6 @@ 6D2A6462258BA92C0092292B /* Stickers */ = { isa = PBXGroup; children = ( - 6D2A6465258BA92D0092292B /* Info.plist */, ); path = Stickers; @@ -814,22 +804,6 @@ productReference = 13B07F961A680F5B00A75B9A /* BlueWallet.app */; productType = "com.apple.product-type.application"; }; - 6D2A6460258BA92C0092292B /* Stickers */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6D2A646B258BA92D0092292B /* Build configuration list for PBXNativeTarget "Stickers" */; - buildPhases = ( - 6D2A645F258BA92C0092292B /* Resources */, - 8889F8F93C39BB72C97DD77E /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Stickers; - productName = Stickers; - productReference = 6D2A6461258BA92C0092292B /* Stickers.appex */; - productType = "com.apple.product-type.app-extension.messages-sticker-pack"; - }; 6DD4109B266CADF10087DE03 /* WidgetsExtension */ = { isa = PBXNativeTarget; buildConfigurationList = 6DD410A9266CADF40087DE03 /* Build configuration list for PBXNativeTarget "WidgetsExtension" */; @@ -896,7 +870,7 @@ }; }; }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "BlueWallet" */; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Shroud" */; compatibilityVersion = "Xcode 15.3"; developmentRegion = en_US; hasScannedForEncodings = 0; @@ -940,7 +914,6 @@ targets = ( 13B07F861A680F5B00A75B9A /* BlueWallet */, B40D4E2F225841EC00428FCC /* BlueWalletWatch */, - 6D2A6460258BA92C0092292B /* Stickers */, 6DD4109B266CADF10087DE03 /* WidgetsExtension */, ); }; @@ -961,15 +934,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 6D2A645F258BA92C0092292B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B4742E9A2CCDBE8300380EEE /* Localizable.xcstrings in Resources */, - - ); - runOnlyForDeploymentPostprocessing = 0; - }; 6DD4109A266CADF10087DE03 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1283,7 +1247,6 @@ /* Begin PBXTargetDependency section */ 6D2A6467258BA92D0092292B /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 6D2A6460258BA92C0092292B /* Stickers */; targetProxy = 6D2A6466258BA92D0092292B /* PBXContainerItemProxy */; }; 6DD410A6266CADF40087DE03 /* PBXTargetDependency */ = { @@ -1918,15 +1881,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6D2A646B258BA92D0092292B /* Build configuration list for PBXNativeTarget "Stickers" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6D2A6469258BA92D0092292B /* Debug */, - 6D2A646A258BA92D0092292B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 6DD410A9266CADF40087DE03 /* Build configuration list for PBXNativeTarget "WidgetsExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1936,7 +1890,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "BlueWallet" */ = { + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Shroud" */ = { isa = XCConfigurationList; buildConfigurations = ( 83CBBA201A601CBA00E9B192 /* Debug */, From d1f2d9fe09f77d9e81d3b386f3864dc23f68440b Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 01:34:22 +0530 Subject: [PATCH 21/40] fix: remove incompatible expo config plugins and add dummy Expo.plist to unblock EAS prebuild checks --- app.json | 18 +----------------- ios/Shroud/Supporting/Expo.plist | 12 ++++++++++++ 2 files changed, 13 insertions(+), 17 deletions(-) create mode 100644 ios/Shroud/Supporting/Expo.plist diff --git a/app.json b/app.json index a48b5d20a..90c22bf68 100644 --- a/app.json +++ b/app.json @@ -37,23 +37,7 @@ "plugins": [ "expo-dev-client", "expo-localization", - "expo-font", - [ - "expo-notifications", - { - "icon": "./img/icon.png", - "color": "#000000", - "sounds": [] - } - ], - [ - "expo-camera", - { - "cameraPermission": "Shroud Wallet uses the camera to scan QR codes" - } - ], - "expo-image-picker", - "expo-document-picker" + "expo-font" ], "extra": { "eas": { diff --git a/ios/Shroud/Supporting/Expo.plist b/ios/Shroud/Supporting/Expo.plist new file mode 100644 index 000000000..750be020c --- /dev/null +++ b/ios/Shroud/Supporting/Expo.plist @@ -0,0 +1,12 @@ + + + + + EXUpdatesCheckOnLaunch + ALWAYS + EXUpdatesEnabled + + EXUpdatesLaunchWaitMs + 0 + + \ No newline at end of file From 880813fa595ed827530b49c3b0dc2be4e2884af3 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 01:36:15 +0530 Subject: [PATCH 22/40] chore: rebrand project to ShroudWallet and configure iOS splash screen and build settings --- ios/Podfile.properties.json | 3 + ios/Shroud.xcodeproj/project.pbxproj | 27 +- .../App-Icon-1024x1024@1x.png | Bin 0 -> 92390 bytes .../AppIcon.appiconset/Contents.json | 42 +- .../Contents.json | 20 + ios/Shroud/Info.plist | 636 +++++++++--------- ios/Shroud/ShroudWallet.entitlements | 8 + ios/Shroud/SplashScreen.storyboard | 37 + package.json | 4 +- 9 files changed, 418 insertions(+), 359 deletions(-) create mode 100644 ios/Podfile.properties.json create mode 100644 ios/Shroud/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png create mode 100644 ios/Shroud/Images.xcassets/SplashScreenBackground.colorset/Contents.json create mode 100644 ios/Shroud/ShroudWallet.entitlements create mode 100644 ios/Shroud/SplashScreen.storyboard diff --git a/ios/Podfile.properties.json b/ios/Podfile.properties.json new file mode 100644 index 000000000..b1bd45da5 --- /dev/null +++ b/ios/Podfile.properties.json @@ -0,0 +1,3 @@ +{ + "expo.jsEngine": "hermes" +} diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index 66054615b..cc5ef5a01 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -386,6 +386,7 @@ FC63C7054F1C4FDFB7A830E5 /* libRCTPrivacySnapshot.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTPrivacySnapshot.a; sourceTree = ""; }; FC98DC24A81A463AB8B2E6B1 /* libRNImagePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNImagePicker.a; sourceTree = ""; }; FD7977067E1A496F94D8B1B7 /* libRNDeviceInfo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDeviceInfo.a; sourceTree = ""; }; + EC1EA93419C748E99321C5AE /* SplashScreen.storyboard */ = {isa = PBXFileReference; name = "SplashScreen.storyboard"; path = "Shroud/SplashScreen.storyboard"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -607,6 +608,7 @@ B40FE50A21FAD228005D5578 /* Recovered References */, 4B0CACE36C3348E1BCEA92C8 /* Resources */, FAA856B639C61E61D2CF90A8 /* Pods */, + EC1EA93419C748E99321C5AE /* SplashScreen.storyboard */, ); indentWidth = 2; sourceTree = ""; @@ -931,6 +933,7 @@ B4549F362B82B10D002E3153 /* ci_post_clone.sh in Resources */, B41C2E562BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 4E899DF9F00E48EDA19BAF50 /* SplashScreen.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1304,7 +1307,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWallet.entitlements; + CODE_SIGN_ENTITLEMENTS = Shroud/ShroudWallet.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; @@ -1344,7 +1347,7 @@ ); PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud; - PRODUCT_NAME = BlueWallet; + PRODUCT_NAME = "ShroudWallet"; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.bitshala.shroud"; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development org.bitshala.shroud catalyst"; @@ -1355,7 +1358,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,6"; + TARGETED_DEVICE_FAMILY = "1"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -1366,7 +1369,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = BlueWallet/BlueWalletRelease.entitlements; + CODE_SIGN_ENTITLEMENTS = Shroud/ShroudWallet.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Distribution"; @@ -1401,7 +1404,7 @@ ); PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud; - PRODUCT_NAME = BlueWallet; + PRODUCT_NAME = "ShroudWallet"; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.bitshala.shroud"; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore org.bitshala.shroud catalyst"; @@ -1411,7 +1414,7 @@ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,6"; + TARGETED_DEVICE_FAMILY = "1"; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; @@ -1454,7 +1457,7 @@ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1"; }; name = Debug; }; @@ -1496,7 +1499,7 @@ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1"; }; name = Release; }; @@ -1554,7 +1557,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,4,6"; + TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 15.6; WATCHOS_DEPLOYMENT_TARGET = 9.6; }; @@ -1613,7 +1616,7 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2,4,6"; + TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 15.6; WATCHOS_DEPLOYMENT_TARGET = 9.6; }; @@ -1807,7 +1810,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "BlueWalletWatch/BlueWalletWatch-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; + TARGETED_DEVICE_FAMILY = "1"; WATCHOS_DEPLOYMENT_TARGET = 11.0; }; name = Debug; @@ -1864,7 +1867,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "BlueWalletWatch/BlueWalletWatch-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; + TARGETED_DEVICE_FAMILY = "1"; WATCHOS_DEPLOYMENT_TARGET = 11.0; }; name = Release; diff --git a/ios/Shroud/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png b/ios/Shroud/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..71b27afd77825117a22b3760b1353e4db9521b2a GIT binary patch literal 92390 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
!RzBAKS{QJaUPFYd!;xsqR* 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 J0);0p{s;3{(9Hk< literal 0 HcmV?d00001 diff --git a/ios/Shroud/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/Shroud/Images.xcassets/AppIcon.appiconset/Contents.json index 3e655793d..90d8d4c2a 100644 --- a/ios/Shroud/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Shroud/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,38 +1,14 @@ { - "images" : [ + "images": [ { - "filename" : "Shroud-1024.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "1024.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "tinted" - } - ], - "filename" : "1024 1.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" + "filename": "App-Icon-1024x1024@1x.png", + "idiom": "universal", + "platform": "ios", + "size": "1024x1024" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "version": 1, + "author": "expo" } -} +} \ No newline at end of file diff --git a/ios/Shroud/Images.xcassets/SplashScreenBackground.colorset/Contents.json b/ios/Shroud/Images.xcassets/SplashScreenBackground.colorset/Contents.json new file mode 100644 index 000000000..fe54c3cdf --- /dev/null +++ b/ios/Shroud/Images.xcassets/SplashScreenBackground.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors": [ + { + "color": { + "components": { + "alpha": "1.000", + "blue": "0.00000000000000", + "green": "0.00000000000000", + "red": "0.00000000000000" + }, + "color-space": "srgb" + }, + "idiom": "universal" + } + ], + "info": { + "version": 1, + "author": "expo" + } +} \ No newline at end of file diff --git a/ios/Shroud/Info.plist b/ios/Shroud/Info.plist index 45aed90e4..b51382e49 100644 --- a/ios/Shroud/Info.plist +++ b/ios/Shroud/Info.plist @@ -1,315 +1,327 @@ - - BGTaskSchedulerPermittedIdentifiers - - org.bitshala.shroud.fetchTxsForWallet - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - Shroud - CFBundleDocumentTypes - - - CFBundleTypeIconFiles - - CFBundleTypeName - PSBT - CFBundleTypeRole - Editor - LSHandlerRank - Owner - LSItemContentTypes - - org.bitshala.shroud.psbt - - - - CFBundleTypeIconFiles - - CFBundleTypeName - Image - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - LSItemContentTypes - - public.jpeg - public.image - - - - CFBundleTypeIconFiles - - CFBundleTypeName - TXN - CFBundleTypeRole - Editor - LSHandlerRank - Owner - LSItemContentTypes - - org.bitshala.shroud.psbt.txn - - - - CFBundleTypeIconFiles - - CFBundleTypeName - ELECTRUMBACKUP - CFBundleTypeRole - Editor - LSHandlerRank - Owner - LSItemContentTypes - - org.bitshala.shroud.backup - - - - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - bitcoin - shroud - - - - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - FIREBASE_ANALYTICS_COLLECTION_ENABLED - - FIREBASE_MESSAGING_AUTO_INIT_ENABLED - - ITSAppUsesNonExemptEncryption - - LSApplicationCategoryType - public.app-category.finance - LSApplicationQueriesSchemes - - https - http - - LSMinimumSystemVersion - 11 - LSRequiresIPhoneOS - - LSSupportsOpeningDocumentsInPlace - - NSAppIntents - - - INIntentClassName - PriceView - IntentDescription - Quickly view the current Bitcoin market rate. - IntentName - Bitcoin Price - - - NSAppTransportSecurity - - NSAllowsLocalNetworking - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - onion - - NSExceptionAllowsInsecureHTTPLoads - - NSIncludesSubdomains - - - tailscale.net - - NSExceptionAllowsInsecureHTTPLoads - - NSIncludesSubdomains - - - ts.net - - NSExceptionAllowsInsecureHTTPLoads - - NSIncludesSubdomains - - - - - NSCameraUsageDescription - In order to quickly scan the recipient's address, we need your permission to use the camera to scan their QR Code. - NSFaceIDUsageDescription - In order to use FaceID for authentication when performing sensitive actions, we need your permission. - NSPhotoLibraryAddUsageDescription - Your authorization is required to save this image. - NSPhotoLibraryUsageDescription - In order to import an image for scanning, we need your permission to access your photo library. - NSUserActivityTypes - - org.bitshala.shroud.receiveonchain - org.bitshala.shroud.xpub - - UIAppFonts - - Entypo.ttf - FontAwesome.ttf - FontAwesome5_Brands.ttf - FontAwesome5_Regular.ttf - FontAwesome5_Solid.ttf - Ionicons.ttf - MaterialIcons.ttf - Octicons.ttf - - UIBackgroundModes - - fetch - processing - remote-notification - - UIFileSharingEnabled - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortrait - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~iphone-MaxScreenSizePhone - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - UTExportedTypeDeclarations - - - UTTypeConformsTo - - public.data - - UTTypeDescription - Partially Signed Bitcoin Transaction - UTTypeIdentifier - org.bitshala.shroud.psbt - UTTypeTagSpecification - - public.filename-extension - - psbt - - - - - UTTypeConformsTo - - public.data - - UTTypeDescription - Bitcoin Transaction - UTTypeIdentifier - org.bitshala.shroud.psbt.txn - UTTypeTagSpecification - - public.filename-extension - - txn - - - - - UTTypeConformsTo - - public.data - - UTTypeDescription - Electrum Backup - UTTypeIdentifier - org.bitshala.shroud.backup - UTTypeTagSpecification - - public.filename-extension - - backup - - - - - UTImportedTypeDeclarations - - - LSHandlerRank - Alternate - UTTypeConformsTo - - public.text - - UTTypeDescription - JSON File - UTTypeIdentifier - public.json - UTTypeTagSpecification - - public.filename-extension - - json - - public.mime-type - - application/json - - - - - WKCompanionAppBundleIdentifier - org.bitshala.shroud - bugsnag - - apiKey - 17ba9059f676f1cc4f45d98182388b01 - - - + + BGTaskSchedulerPermittedIdentifiers + + org.bitshala.shroud.fetchTxsForWallet + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Shroud Wallet + CFBundleDocumentTypes + + + CFBundleTypeIconFiles + + CFBundleTypeName + PSBT + CFBundleTypeRole + Editor + LSHandlerRank + Owner + LSItemContentTypes + + org.bitshala.shroud.psbt + + + + CFBundleTypeIconFiles + + CFBundleTypeName + Image + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + LSItemContentTypes + + public.jpeg + public.image + + + + CFBundleTypeIconFiles + + CFBundleTypeName + TXN + CFBundleTypeRole + Editor + LSHandlerRank + Owner + LSItemContentTypes + + org.bitshala.shroud.psbt.txn + + + + CFBundleTypeIconFiles + + CFBundleTypeName + ELECTRUMBACKUP + CFBundleTypeRole + Editor + LSHandlerRank + Owner + LSItemContentTypes + + org.bitshala.shroud.backup + + + + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.0.1 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLSchemes + + org.bitshala.shroud + + + + CFBundleURLSchemes + + exp+shroud-wallet + + + + CFBundleVersion + 1 + FIREBASE_ANALYTICS_COLLECTION_ENABLED + + FIREBASE_MESSAGING_AUTO_INIT_ENABLED + + LSApplicationCategoryType + public.app-category.finance + LSApplicationQueriesSchemes + + https + http + + LSMinimumSystemVersion + 11 + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + + NSAppIntents + + + INIntentClassName + PriceView + IntentDescription + Quickly view the current Bitcoin market rate. + IntentName + Bitcoin Price + + + NSAppTransportSecurity + + NSAllowsLocalNetworking + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + onion + + NSExceptionAllowsInsecureHTTPLoads + + NSIncludesSubdomains + + + tailscale.net + + NSExceptionAllowsInsecureHTTPLoads + + NSIncludesSubdomains + + + ts.net + + NSExceptionAllowsInsecureHTTPLoads + + NSIncludesSubdomains + + + + + NSBonjourServices + + _expo._tcp + + NSCameraUsageDescription + Shroud Wallet uses the camera to scan QR codes + NSFaceIDUsageDescription + Shroud Wallet uses Face ID to unlock your wallet + NSLocalNetworkUsageDescription + Expo Dev Launcher uses the local network to discover and connect to development servers running on your computer. + NSMicrophoneUsageDescription + Allow $(PRODUCT_NAME) to access your microphone + NSPhotoLibraryAddUsageDescription + Your authorization is required to save this image. + NSPhotoLibraryUsageDescription + Shroud Wallet needs access to photos to import wallet backups + NSUserActivityTypes + + org.bitshala.shroud.receiveonchain + org.bitshala.shroud.xpub + + UIAppFonts + + Entypo.ttf + FontAwesome.ttf + FontAwesome5_Brands.ttf + FontAwesome5_Regular.ttf + FontAwesome5_Solid.ttf + Ionicons.ttf + MaterialIcons.ttf + Octicons.ttf + + UIBackgroundModes + + fetch + processing + remote-notification + + UIFileSharingEnabled + + UILaunchStoryboardName + SplashScreen + UIRequiredDeviceCapabilities + + arm64 + + UIRequiresFullScreen + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~iphone-MaxScreenSizePhone + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIUserInterfaceStyle + Automatic + UIViewControllerBasedStatusBarAppearance + + UTExportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Partially Signed Bitcoin Transaction + UTTypeIdentifier + org.bitshala.shroud.psbt + UTTypeTagSpecification + + public.filename-extension + + psbt + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Bitcoin Transaction + UTTypeIdentifier + org.bitshala.shroud.psbt.txn + UTTypeTagSpecification + + public.filename-extension + + txn + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Electrum Backup + UTTypeIdentifier + org.bitshala.shroud.backup + UTTypeTagSpecification + + public.filename-extension + + backup + + + + + UTImportedTypeDeclarations + + + LSHandlerRank + Alternate + UTTypeConformsTo + + public.text + + UTTypeDescription + JSON File + UTTypeIdentifier + public.json + UTTypeTagSpecification + + public.filename-extension + + json + + public.mime-type + + application/json + + + + + WKCompanionAppBundleIdentifier + org.bitshala.shroud + bugsnag + + apiKey + 17ba9059f676f1cc4f45d98182388b01 + + + \ No newline at end of file diff --git a/ios/Shroud/ShroudWallet.entitlements b/ios/Shroud/ShroudWallet.entitlements new file mode 100644 index 000000000..018a6e20c --- /dev/null +++ b/ios/Shroud/ShroudWallet.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + \ No newline at end of file diff --git a/ios/Shroud/SplashScreen.storyboard b/ios/Shroud/SplashScreen.storyboard new file mode 100644 index 000000000..58c975798 --- /dev/null +++ b/ios/Shroud/SplashScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/package.json b/package.json index b0f1f350a..198c1a1f5 100644 --- a/package.json +++ b/package.json @@ -55,10 +55,10 @@ "releasenotes2json": "./scripts/release-notes.sh > release-notes.txt; node -e 'console.log(JSON.stringify(require(\"fs\").readFileSync(\"release-notes.txt\", \"utf8\")));' > release-notes.json", "branch2json": "./scripts/current-branch.sh > current-branch.json", "start": "react-native start", - "android": "react-native run-android", + "android": "expo run:android", "adb": "adb reverse tcp:8081 tcp:8081", "android:clean": "cd android; ./gradlew clean ; cd .. ; npm run android", - "ios": "react-native run-ios", + "ios": "expo run:ios", "ios:sim:cloud": "npx eas-cli build --profile development --platform ios", "ios:sim:local": "npx expo run:ios", "postinstall": "npm run releasenotes2json; npm run branch2json; npm run patches", From 72ce549015619dc21482ded8400cf3f0de4e5dc2 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 01:39:11 +0530 Subject: [PATCH 23/40] fix: remove leftover PBXTargetDependency for Stickers target to fix EAS build parsing error --- ios/Shroud.xcodeproj/project.pbxproj | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index cc5ef5a01..b6429c07d 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -166,13 +166,7 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 6D2A6466258BA92D0092292B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 6D2A6460258BA92C0092292B; - remoteInfo = Stickers; - }; + 6DD410A5266CADF40087DE03 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; @@ -798,7 +792,6 @@ ); dependencies = ( B40D4E4C225841ED00428FCC /* PBXTargetDependency */, - 6D2A6467258BA92D0092292B /* PBXTargetDependency */, 6DD410A6266CADF40087DE03 /* PBXTargetDependency */, ); name = BlueWallet; @@ -1248,10 +1241,7 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 6D2A6467258BA92D0092292B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - targetProxy = 6D2A6466258BA92D0092292B /* PBXContainerItemProxy */; - }; + 6DD410A6266CADF40087DE03 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 6DD4109B266CADF10087DE03 /* WidgetsExtension */; From 9ee29efa600a55702a1af22b07fb07b5ab3d44aa Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 02:00:18 +0530 Subject: [PATCH 24/40] fix: remove completely unused BlueWalletWatch and WidgetsExtension targets to fix build loop --- ios/Shroud.xcodeproj/project.pbxproj | 350 +-------------------------- 1 file changed, 7 insertions(+), 343 deletions(-) diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index b6429c07d..ab3eac972 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -116,7 +116,6 @@ B4742E972CCDBE8300380EEE /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4742E962CCDBE8300380EEE /* Localizable.xcstrings */; }; B4742E982CCDBE8300380EEE /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4742E962CCDBE8300380EEE /* Localizable.xcstrings */; }; B4742E992CCDBE8300380EEE /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4742E962CCDBE8300380EEE /* Localizable.xcstrings */; }; - B4742E9A2CCDBE8300380EEE /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4742E962CCDBE8300380EEE /* Localizable.xcstrings */; }; B4742E9B2CCDBE8300380EEE /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4742E962CCDBE8300380EEE /* Localizable.xcstrings */; }; B4793DBB2CEDACBD00C92C2E /* Chain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DBA2CEDACBD00C92C2E /* Chain.swift */; }; B4793DBC2CEDACBD00C92C2E /* Chain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DBA2CEDACBD00C92C2E /* Chain.swift */; }; @@ -166,21 +165,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - - 6DD410A5266CADF40087DE03 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 6DD4109B266CADF10087DE03; - remoteInfo = WidgetsExtension; - }; - B40D4E4B225841ED00428FCC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B40D4E2F225841EC00428FCC; - remoteInfo = BlueWalletWatch; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -374,13 +358,13 @@ CF4A4D7AAD974D67A2D62B3E /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; E6B44173A8854B6D85D7F933 /* libRNVectorIcons-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNVectorIcons-tvOS.a"; sourceTree = ""; }; E8E8CE89B3D142C6A8A56C34 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; + EC1EA93419C748E99321C5AE /* SplashScreen.storyboard */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = SplashScreen.storyboard; path = Shroud/SplashScreen.storyboard; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; F6F53AFC25FB422485CB22D6 /* SystemConfiguration.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; FC63C7054F1C4FDFB7A830E5 /* libRCTPrivacySnapshot.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTPrivacySnapshot.a; sourceTree = ""; }; FC98DC24A81A463AB8B2E6B1 /* libRNImagePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNImagePicker.a; sourceTree = ""; }; FD7977067E1A496F94D8B1B7 /* libRNDeviceInfo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDeviceInfo.a; sourceTree = ""; }; - EC1EA93419C748E99321C5AE /* SplashScreen.storyboard */ = {isa = PBXFileReference; name = "SplashScreen.storyboard"; path = "Shroud/SplashScreen.storyboard"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -395,28 +379,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 421830728822A20A50D8A07C /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - B4D59C1C2D8BAFE300B7025B /* Bugsnag in Frameworks */, - B4D59C1E2D8BAFE300B7025B /* BugsnagNetworkRequestPlugin in Frameworks */, - B41B76872B66B2FF002C48D5 /* BugsnagNetworkRequestPlugin in Frameworks */, - B41B76852B66B2FF002C48D5 /* Bugsnag in Frameworks */, - B4D59C1A2D8BAFE300B7025B /* EFQRCode in Frameworks */, - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6DD41099266CADF10087DE03 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6DD4109E266CADF10087DE03 /* SwiftUI.framework in Frameworks */, - 6DD4109D266CADF10087DE03 /* WidgetKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -791,49 +753,12 @@ buildRules = ( ); dependencies = ( - B40D4E4C225841ED00428FCC /* PBXTargetDependency */, - 6DD410A6266CADF40087DE03 /* PBXTargetDependency */, ); name = BlueWallet; productName = "Hello World"; productReference = 13B07F961A680F5B00A75B9A /* BlueWallet.app */; productType = "com.apple.product-type.application"; }; - 6DD4109B266CADF10087DE03 /* WidgetsExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6DD410A9266CADF40087DE03 /* Build configuration list for PBXNativeTarget "WidgetsExtension" */; - buildPhases = ( - 6DD41098266CADF10087DE03 /* Sources */, - 6DD41099266CADF10087DE03 /* Frameworks */, - 6DD4109A266CADF10087DE03 /* Resources */, - CF0725821442A3000F20E874 /* Upload Bugsnag dSYM */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = WidgetsExtension; - productName = WidgetsExtension; - productReference = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; - productType = "com.apple.product-type.app-extension"; - }; - B40D4E2F225841EC00428FCC /* BlueWalletWatch */ = { - isa = PBXNativeTarget; - buildConfigurationList = B40D4E52225841ED00428FCC /* Build configuration list for PBXNativeTarget "BlueWalletWatch" */; - buildPhases = ( - B40D4E2E225841EC00428FCC /* Resources */, - 421830728822A20A50D8A07C /* Frameworks */, - B40D4E38225841ED00428FCC /* Sources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = BlueWalletWatch; - productName = BlueWalletWatch; - productReference = B40D4E30225841EC00428FCC /* BlueWalletWatch.app */; - productType = "com.apple.product-type.application"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -908,8 +833,6 @@ projectRoot = ""; targets = ( 13B07F861A680F5B00A75B9A /* BlueWallet */, - B40D4E2F225841EC00428FCC /* BlueWalletWatch */, - 6DD4109B266CADF10087DE03 /* WidgetsExtension */, ); }; /* End PBXProject section */ @@ -926,32 +849,6 @@ B4549F362B82B10D002E3153 /* ci_post_clone.sh in Resources */, B41C2E562BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 4E899DF9F00E48EDA19BAF50 /* SplashScreen.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6DD4109A266CADF10087DE03 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B41C2E582BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */, - B44034112BCC40A400162242 /* fiatUnits.json in Resources */, - B4742E9B2CCDBE8300380EEE /* Localizable.xcstrings in Resources */, - 6DD410B7266CAF5C0087DE03 /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B40D4E2E225841EC00428FCC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B4742E982CCDBE8300380EEE /* Localizable.xcstrings in Resources */, - B44034102BCC40A400162242 /* fiatUnits.json in Resources */, - B4742E992CCDBE8300380EEE /* Localizable.xcstrings in Resources */, - B40D4E36225841ED00428FCC /* Assets.xcassets in Resources */, - B4EE583C226703320003363C /* Assets.xcassets in Resources */, - B41C2E572BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */, - B40D4E34225841EC00428FCC /* Interface.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1054,27 +951,6 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - CF0725821442A3000F20E874 /* Upload Bugsnag dSYM */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", - "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", - ); - name = "Upload Bugsnag dSYM"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = "/usr/bin/env ruby"; - shellScript = "api_key = nil # Insert your key here to use it directly from this script\n\n# Attempt to get the API key from an environment variable\nunless api_key\n api_key = ENV[\"BUGSNAG_API_KEY\"]\n\n # If not present, attempt to lookup the value from the Info.plist\n unless api_key\n info_plist_path = \"#{ENV[\"BUILT_PRODUCTS_DIR\"]}/#{ENV[\"INFOPLIST_PATH\"]}\"\n plist_buddy_response = `/usr/libexec/PlistBuddy -c \"print :bugsnag:apiKey\" \"#{info_plist_path}\"`\n plist_buddy_response = `/usr/libexec/PlistBuddy -c \"print :BugsnagAPIKey\" \"#{info_plist_path}\"` if !$?.success?\n api_key = plist_buddy_response if $?.success?\n end\nend\n\nfail(\"No Bugsnag API key detected - add your key to your Info.plist, BUGSNAG_API_KEY environment variable or this Run Script phase\") unless api_key\n\nfork do\n Process.setsid\n STDIN.reopen(\"/dev/null\")\n STDOUT.reopen(\"/dev/null\", \"a\")\n STDERR.reopen(\"/dev/null\", \"a\")\n\n require 'shellwords'\n\n Dir[\"#{ENV[\"DWARF_DSYM_FOLDER_PATH\"]}/*/Contents/Resources/DWARF/*\"].each do |dsym|\n curl_command = \"curl --http1.1 -F dsym=@#{Shellwords.escape(dsym)} -F projectRoot=#{Shellwords.escape(ENV[\"PROJECT_DIR\"])} \"\n curl_command += \"-F apiKey=#{Shellwords.escape(api_key)} \"\n curl_command += \"https://upload.bugsnag.com/\"\n system(curl_command)\n end\nend\n\n"; - showEnvVarsInLog = 0; - }; D0E81659D2FBFDD27024CF05 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1140,119 +1016,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 6DD41098266CADF10087DE03 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6DD410BE266CAF5C0087DE03 /* SendReceiveButtons.swift in Sources */, - B48630E02CCEE7C800A8425C /* PriceWidgetEntryView.swift in Sources */, - 6DD410B4266CAF5C0087DE03 /* MarketAPI.swift in Sources */, - B4793DC32CEDAD4400C92C2E /* KeychainHelper.swift in Sources */, - B40FC3FA29CCD1D00007EBAC /* SwiftTCPClient.swift in Sources */, - B48630EC2CCEEEA700A8425C /* WalletAppShortcuts.swift in Sources */, - 6DD410A1266CADF10087DE03 /* Widgets.swift in Sources */, - B450109D2C0FCD9F00619044 /* Utilities.swift in Sources */, - B49A28BE2CD189B0006B08E4 /* FiatUnitEnum.swift in Sources */, - 6DD410AC266CAE470087DE03 /* PriceWidget.swift in Sources */, - B4B1A4642BFA73110072E3BB /* WidgetHelper.swift in Sources */, - B44033D52BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */, - 6DD410B2266CAF5C0087DE03 /* WalletInformationView.swift in Sources */, - B44034022BCC37F800162242 /* Bundle+decode.swift in Sources */, - B48630D62CCEE67100A8425C /* PriceWidgetProvider.swift in Sources */, - B44033CC2BCC350A00162242 /* Currency.swift in Sources */, - 6DD410B6266CAF5C0087DE03 /* PriceView.swift in Sources */, - B48630DE2CCEE7AC00A8425C /* PriceWidgetEntry.swift in Sources */, - B49A28BB2CD18999006B08E4 /* CompactPriceView.swift in Sources */, - 6DD410B3266CAF5C0087DE03 /* Colors.swift in Sources */, - B44033C12BCC32F800162242 /* BitcoinUnit.swift in Sources */, - 6DD410BB266CAF5C0087DE03 /* MarketView.swift in Sources */, - B44033F02BCC374500162242 /* Numeric+abbreviated.swift in Sources */, - B44033DF2BCC36C300162242 /* LatestTransaction.swift in Sources */, - 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */, - B4793DBC2CEDACBD00C92C2E /* Chain.swift in Sources */, - B4AB225E2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */, - B44033F62BCC377F00162242 /* WidgetData.swift in Sources */, - 6DD410BA266CAF5C0087DE03 /* FiatUnit.swift in Sources */, - B44033FB2BCC379200162242 /* WidgetDataStore.swift in Sources */, - B44033EB2BCC371A00162242 /* MarketData.swift in Sources */, - 6DD410AF266CAF5C0087DE03 /* WalletInformationAndMarketWidget.swift in Sources */, - B44033C62BCC332400162242 /* Balance.swift in Sources */, - B44033E62BCC36FF00162242 /* WalletData.swift in Sources */, - 6DD410BF266CB13D0087DE03 /* Placeholders.swift in Sources */, - 6DD410B0266CAF5C0087DE03 /* WalletInformationWidget.swift in Sources */, - 6DD410B1266CAF5C0087DE03 /* MarketAPI+Electrum.swift in Sources */, - 6DD410B9266CAF5C0087DE03 /* UserDefaultsGroup.swift in Sources */, - 6DD410B8266CAF5C0087DE03 /* UserDefaultsExtension.swift in Sources */, - B48630EA2CCEED8400A8425C /* PriceIntent.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B40D4E38225841ED00428FCC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B43D037C225847C500FBAA95 /* Wallet.swift in Sources */, - 6D4AF17825D211A3009DD853 /* FiatUnit.swift in Sources */, - B43D037A225847C500FBAA95 /* Transaction.swift in Sources */, - 32F0A29A2311DBB20095C559 /* ComplicationController.swift in Sources */, - B40D4E602258425500428FCC /* SpecifyInterfaceController.swift in Sources */, - B4D0B2642C1DEA99006B6B1B /* ReceiveType.swift in Sources */, - B43D0379225847C500FBAA95 /* WatchDataSource.swift in Sources */, - B450109F2C0FCDA500619044 /* Utilities.swift in Sources */, - B44033D42BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */, - B4D59C212D8BB42100B7025B /* File.swift in Sources */, - B44034012BCC37F800162242 /* Bundle+decode.swift in Sources */, - B4D0B2682C1DED67006B6B1B /* ReceiveMethod.swift in Sources */, - 849047CA2702A32A008EE567 /* Handoff.swift in Sources */, - B44033EA2BCC371A00162242 /* MarketData.swift in Sources */, - B44033CB2BCC350A00162242 /* Currency.swift in Sources */, - 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */, - B40D4E46225841ED00428FCC /* NotificationController.swift in Sources */, - B40D4E5D2258425500428FCC /* InterfaceController.swift in Sources */, - B4D59C272D8C5D6F00B7025B /* main.swift in Sources */, - B4793DBD2CEDACBD00C92C2E /* Chain.swift in Sources */, - B44033FA2BCC379200162242 /* WidgetDataStore.swift in Sources */, - B44033DE2BCC36C300162242 /* LatestTransaction.swift in Sources */, - B4D0B2662C1DEB7F006B6B1B /* ReceiveInterfaceMode.swift in Sources */, - B43D037B225847C500FBAA95 /* TransactionTableRow.swift in Sources */, - B43D037D225847C500FBAA95 /* WalletInformation.swift in Sources */, - 6D4AF15925D21172009DD853 /* MarketAPI.swift in Sources */, - B40D4E642258425500428FCC /* WalletDetailsInterfaceController.swift in Sources */, - 6D4AF16D25D21192009DD853 /* Placeholders.swift in Sources */, - B4793DC42CEDAD4400C92C2E /* KeychainHelper.swift in Sources */, - B40D4E632258425500428FCC /* ReceiveInterfaceController.swift in Sources */, - B43D0378225847C500FBAA95 /* WalletGradient.swift in Sources */, - B4EFF73B2C3F6C5E0095D655 /* MockData.swift in Sources */, - B44033C02BCC32F800162242 /* BitcoinUnit.swift in Sources */, - B44033E52BCC36FF00162242 /* WalletData.swift in Sources */, - B44033EF2BCC374500162242 /* Numeric+abbreviated.swift in Sources */, - B4793DC12CEDACE700C92C2E /* WalletType.swift in Sources */, - B4793DBF2CEDACDA00C92C2E /* TransactionType.swift in Sources */, - B4D0B2622C1DEA11006B6B1B /* ReceivePageInterfaceController.swift in Sources */, - B44033D02BCC352F00162242 /* UserDefaultsGroup.swift in Sources */, - B44033C52BCC332400162242 /* Balance.swift in Sources */, - 6D4AF18425D215D1009DD853 /* UserDefaultsExtension.swift in Sources */, - B4AB225D2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */, - B40D4E5E2258425500428FCC /* NumericKeypadInterfaceController.swift in Sources */, - B44033F52BCC377F00162242 /* WidgetData.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - - 6DD410A6266CADF40087DE03 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 6DD4109B266CADF10087DE03 /* WidgetsExtension */; - targetProxy = 6DD410A5266CADF40087DE03 /* PBXContainerItemProxy */; - }; - B40D4E4C225841ED00428FCC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - platformFilter = ios; - target = B40D4E2F225841EC00428FCC /* BlueWalletWatch */; - targetProxy = B40D4E4B225841ED00428FCC /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -1337,7 +1103,7 @@ ); PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud; - PRODUCT_NAME = "ShroudWallet"; + PRODUCT_NAME = ShroudWallet; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.bitshala.shroud"; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development org.bitshala.shroud catalyst"; @@ -1348,7 +1114,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1"; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -1394,7 +1160,7 @@ ); PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud; - PRODUCT_NAME = "ShroudWallet"; + PRODUCT_NAME = ShroudWallet; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.bitshala.shroud"; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore org.bitshala.shroud catalyst"; @@ -1404,95 +1170,11 @@ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1"; + TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; }; - 6D2A6469258BA92D0092292B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1703239999; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = Stickers/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LIBRARY_SEARCH_PATHS = ( - "$(SDKROOT)/usr/lib/swift", - "$(SDKROOT)/System/iOSSupport/usr/lib/swift", - "$(inherited)", - ); - MARKETING_VERSION = 7.2.1; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud.Stickers; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development org.bitshala.shroud.Stickers"; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - TARGETED_DEVICE_FAMILY = "1"; - }; - name = Debug; - }; - 6D2A646A258BA92D0092292B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "iMessage App Icon"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1703239999; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = Stickers/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LIBRARY_SEARCH_PATHS = ( - "$(SDKROOT)/usr/lib/swift", - "$(SDKROOT)/System/iOSSupport/usr/lib/swift", - "$(inherited)", - ); - MARKETING_VERSION = 7.2.1; - MTL_FAST_MATH = YES; - PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud.Stickers; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.bitshala.shroud.Stickers"; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - TARGETED_DEVICE_FAMILY = "1"; - }; - name = Release; - }; 6DD410AA266CADF40087DE03 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1800,7 +1482,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "BlueWalletWatch/BlueWalletWatch-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1"; + TARGETED_DEVICE_FAMILY = 1; WATCHOS_DEPLOYMENT_TARGET = 11.0; }; name = Debug; @@ -1857,7 +1539,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "BlueWalletWatch/BlueWalletWatch-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1"; + TARGETED_DEVICE_FAMILY = 1; WATCHOS_DEPLOYMENT_TARGET = 11.0; }; name = Release; @@ -1874,15 +1556,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6DD410A9266CADF40087DE03 /* Build configuration list for PBXNativeTarget "WidgetsExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6DD410AA266CADF40087DE03 /* Debug */, - 6DD410AB266CADF40087DE03 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Shroud" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1892,15 +1565,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - B40D4E52225841ED00428FCC /* Build configuration list for PBXNativeTarget "BlueWalletWatch" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B40D4E53225841ED00428FCC /* Debug */, - B40D4E54225841ED00428FCC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ From 2be46e420e32110d96499b85c147c439cd192a78 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 02:27:33 +0530 Subject: [PATCH 25/40] chore: patch expo-dev-menu to remove RCTPackagerConnection and fix build --- package.json | 2 +- patches/expo-dev-menu+55.0.27.patch | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 patches/expo-dev-menu+55.0.27.patch diff --git a/package.json b/package.json index 198c1a1f5..bc3c342e3 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "ios:sim:cloud": "npx eas-cli build --profile development --platform ios", "ios:sim:local": "npx expo run:ios", "postinstall": "npm run releasenotes2json; npm run branch2json; npm run patches", - "patches": "", + "patches": "patch-package", "test": "npm run tslint && npm run lint && npm run unit && npm run integration", "integration": "jest tests/integration/*", "e2e:debug-build": "detox build -c android.debug", diff --git a/patches/expo-dev-menu+55.0.27.patch b/patches/expo-dev-menu+55.0.27.patch new file mode 100644 index 000000000..c288b9f55 --- /dev/null +++ b/patches/expo-dev-menu+55.0.27.patch @@ -0,0 +1,20 @@ +diff --git a/node_modules/expo-dev-menu/ios/DevMenuPackagerConnectionHandler.swift b/node_modules/expo-dev-menu/ios/DevMenuPackagerConnectionHandler.swift +index aaeb550..345ddee 100644 +--- a/node_modules/expo-dev-menu/ios/DevMenuPackagerConnectionHandler.swift ++++ b/node_modules/expo-dev-menu/ios/DevMenuPackagerConnectionHandler.swift +@@ -17,6 +17,7 @@ class DevMenuPackagerConnectionHandler { + #if DEBUG + self.swizzleRCTDevMenuShow() + ++/* + RCTPackagerConnection + .shared() + .addNotificationHandler( +@@ -32,6 +33,7 @@ class DevMenuPackagerConnectionHandler { + queue: DispatchQueue.main, + forMethod: "devMenu" + ) ++*/ + #endif + } + From fceb155d42fdeeab1e531e611a53495e2affcd7f Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Fri, 15 May 2026 02:34:22 +0530 Subject: [PATCH 26/40] chore: use npx for patch-package to fix cloud build --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bc3c342e3..09df0c20d 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "ios:sim:cloud": "npx eas-cli build --profile development --platform ios", "ios:sim:local": "npx expo run:ios", "postinstall": "npm run releasenotes2json; npm run branch2json; npm run patches", - "patches": "patch-package", + "patches": "npx --yes patch-package", "test": "npm run tslint && npm run lint && npm run unit && npm run integration", "integration": "jest tests/integration/*", "e2e:debug-build": "detox build -c android.debug", From 251ac80a2315d3946d9244e911071ad9479f60da Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Sat, 16 May 2026 01:23:42 +0530 Subject: [PATCH 27/40] refactor: update Xcode project paths and naming conventions from BlueWallet to Shroud --- ios/Shroud.xcodeproj/project.pbxproj | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index ab3eac972..ea82c7b51 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -197,8 +197,8 @@ 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 040819EDF8BD9C50A9C83E24 /* libPods-BlueWallet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BlueWallet.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07F961A680F5B00A75B9A /* BlueWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = BlueWallet/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = BlueWallet/Info.plist; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Shroud/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Shroud/Info.plist; sourceTree = ""; }; 1AE7FA8B4A18928E917F42D1 /* Pods-BlueWallet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWallet.debug.xcconfig"; path = "Target Support Files/Pods-BlueWallet/Pods-BlueWallet.debug.xcconfig"; sourceTree = ""; }; 1DD63E4B5C8344BB9880C9EC /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libReactNativePermissions.a; sourceTree = ""; }; 253243E162CE4822BF3A3B7D /* libRNRandomBytes-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNRandomBytes-tvOS.a"; sourceTree = ""; }; @@ -318,7 +318,7 @@ B440340E2BCC40A400162242 /* fiatUnits.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = fiatUnits.json; path = ../../../models/fiatUnits.json; sourceTree = ""; }; B450109B2C0FCD8A00619044 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; B4549F352B82B10D002E3153 /* ci_post_clone.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = ci_post_clone.sh; sourceTree = ""; }; - B461B851299599F800E431AA /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = BlueWallet/AppDelegate.swift; sourceTree = ""; }; + B461B851299599F800E431AA /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Shroud/AppDelegate.swift; sourceTree = ""; }; B4742E962CCDBE8300380EEE /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; B4742E9C2CCDC31300380EEE /* en_US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en_US; path = en_US.lproj/Interface.strings; sourceTree = ""; }; B4793DBA2CEDACBD00C92C2E /* Chain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Chain.swift; sourceTree = ""; }; @@ -326,7 +326,7 @@ B4793DC02CEDACE700C92C2E /* WalletType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletType.swift; sourceTree = ""; }; B4793DC22CEDAD4400C92C2E /* KeychainHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainHelper.swift; sourceTree = ""; }; B47B21EB2B2128B8001F6690 /* BlueWalletUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlueWalletUITests.swift; sourceTree = ""; }; - B48283572DA0DE02007EEC62 /* BlueWallet-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BlueWallet-Bridging-Header.h"; sourceTree = ""; }; + B48283572DA0DE02007EEC62 /* Shroud-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Shroud-Bridging-Header.h"; sourceTree = ""; }; B48630D02CCEE3B300A8425C /* PriceIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceIntent.swift; sourceTree = ""; }; B48630D52CCEE67100A8425C /* PriceWidgetProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceWidgetProvider.swift; sourceTree = ""; }; B48630DC2CCEE7AC00A8425C /* PriceWidgetEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceWidgetEntry.swift; sourceTree = ""; }; @@ -412,7 +412,7 @@ 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */, 84E05A832721191B001A0D3A /* Settings.bundle */, B4742E962CCDBE8300380EEE /* Localizable.xcstrings */, - B48283572DA0DE02007EEC62 /* BlueWallet-Bridging-Header.h */, + B48283572DA0DE02007EEC62 /* Shroud-Bridging-Header.h */, ); name = BlueWallet; sourceTree = ""; @@ -1081,7 +1081,7 @@ "FB_SONARKIT_ENABLED=1", ); HEADER_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = BlueWallet/Info.plist; + INFOPLIST_FILE = Shroud/Info.plist; INFOPLIST_KEY_CLKComplicationPrincipalClass = "$(PRODUCT_BUNDLE_IDENTIFIER).ComplicationController"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = org.bitshala.shroud; @@ -1111,7 +1111,7 @@ SUPPORTS_MACCATALYST = YES; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "Shroud-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; @@ -1138,7 +1138,7 @@ ENABLE_BITCODE = NO; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; HEADER_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = BlueWallet/Info.plist; + INFOPLIST_FILE = Shroud/Info.plist; INFOPLIST_KEY_CLKComplicationPrincipalClass = "$(PRODUCT_BUNDLE_IDENTIFIER).ComplicationController"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = org.bitshala.shroud; @@ -1168,7 +1168,7 @@ SUPPORTS_MACCATALYST = YES; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; - SWIFT_OBJC_BRIDGING_HEADER = "BlueWallet-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = "Shroud-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; VERSIONING_SYSTEM = "apple-generic"; From bd0a8721456ee49f4c6ef9bba5a0d14cb494fb8a Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Sat, 16 May 2026 11:36:12 +0530 Subject: [PATCH 28/40] chore: rename project target to BlueWallet and update bundle configuration --- ios/Podfile.lock | 3935 +++++++++++++++++ ios/PrivacyInfo.xcprivacy | 13 +- ios/Shroud.xcodeproj/project.pbxproj | 430 +- .../xcschemes/MarketWidget.xcscheme | 12 +- .../xcschemes/PriceWidget.xcscheme | 12 +- .../xcshareddata/xcschemes/Shroud.xcscheme | 8 +- .../WalletInformationAndMarketWidget.xcscheme | 12 +- .../WalletInformationWidget.xcscheme | 12 +- ios/Shroud/Info.plist | 650 +-- ios/Widgets/Info.plist | 22 +- 10 files changed, 4359 insertions(+), 747 deletions(-) create mode 100644 ios/Podfile.lock diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 000000000..d106fcf6c --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,3935 @@ +PODS: + - boost (1.84.0) + - BugsnagReactNative (8.4.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - CocoaAsyncSocket (7.6.5) + - DoubleConversion (1.1.6) + - EXApplication (55.0.14): + - ExpoModulesCore + - EXConstants (55.0.16): + - ExpoModulesCore + - EXJSONUtils (55.0.2) + - EXManifests (55.0.16): + - ExpoModulesCore + - Expo (55.0.23): + - boost + - DoubleConversion + - ExpoModulesCore + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - expo-dev-client (55.0.32): + - EXManifests + - expo-dev-launcher + - expo-dev-menu + - expo-dev-menu-interface + - EXUpdatesInterface + - expo-dev-launcher (55.0.33): + - boost + - DoubleConversion + - EXManifests + - expo-dev-launcher/Main (= 55.0.33) + - expo-dev-menu + - expo-dev-menu-interface + - ExpoModulesCore + - EXUpdatesInterface + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - expo-dev-launcher/Main (55.0.33): + - boost + - DoubleConversion + - EXManifests + - expo-dev-launcher/Unsafe + - expo-dev-menu + - expo-dev-menu-interface + - ExpoModulesCore + - EXUpdatesInterface + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - expo-dev-launcher/Unsafe (55.0.33): + - boost + - DoubleConversion + - EXManifests + - expo-dev-menu + - expo-dev-menu-interface + - ExpoModulesCore + - EXUpdatesInterface + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactAppDependencyProvider + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - expo-dev-menu (55.0.27): + - boost + - DoubleConversion + - expo-dev-menu/Main (= 55.0.27) + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - expo-dev-menu-interface (55.0.2) + - expo-dev-menu/Main (55.0.27): + - boost + - DoubleConversion + - EXManifests + - expo-dev-menu-interface + - ExpoModulesCore + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - ExpoAsset (55.0.17): + - ExpoModulesCore + - ExpoCamera (55.0.18): + - ExpoModulesCore + - ExpoCameraBarcodeScanning (55.0.18): + - ExpoCamera + - ZXingObjC/OneD + - ZXingObjC/PDF417 + - ExpoClipboard (55.0.13): + - ExpoModulesCore + - ExpoDevice (55.0.16): + - ExpoModulesCore + - ExpoDocumentPicker (55.0.13): + - ExpoModulesCore + - ExpoDomWebView (55.0.6): + - ExpoModulesCore + - ExpoFileSystem (55.0.19): + - ExpoModulesCore + - ExpoFont (55.0.7): + - ExpoModulesCore + - ExpoHaptics (55.0.14): + - ExpoModulesCore + - ExpoImagePicker (55.0.20): + - ExpoModulesCore + - ExpoKeepAwake (55.0.8): + - ExpoModulesCore + - ExpoLinearGradient (55.0.13): + - ExpoModulesCore + - ExpoLocalization (55.0.13): + - ExpoModulesCore + - ExpoLogBox (55.0.12): + - React-Core + - ExpoModulesCore (55.0.25): + - boost + - DoubleConversion + - ExpoModulesJSI + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNWorklets + - SocketRocket + - Yoga + - ExpoModulesJSI (55.0.25): + - hermes-engine + - React-Core + - React-runtimescheduler + - ReactCommon + - ExpoNotifications (55.0.22): + - ExpoModulesCore + - EXUpdatesInterface (55.1.6): + - ExpoModulesCore + - fast_float (8.0.0) + - FBLazyVector (0.83.6) + - fmt (12.1.0) + - glog (0.3.5) + - hermes-engine (0.14.1): + - hermes-engine/Pre-built (= 0.14.1) + - hermes-engine/Pre-built (0.14.1) + - lottie-ios (4.6.0) + - lottie-react-native (7.3.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - lottie-ios (= 4.6.0) + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RCT-Folly (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 12.1.0) + - glog + - RCT-Folly/Default (= 2024.11.18.00) + - RCT-Folly/Default (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 12.1.0) + - glog + - RCT-Folly/Fabric (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 12.1.0) + - glog + - RCTDeprecation (0.83.6) + - RCTRequired (0.83.6) + - RCTSwiftUI (0.83.6) + - RCTSwiftUIWrapper (0.83.6): + - RCTSwiftUI + - RCTTypeSafety (0.83.6): + - FBLazyVector (= 0.83.6) + - RCTRequired (= 0.83.6) + - React-Core (= 0.83.6) + - React (0.83.6): + - React-Core (= 0.83.6) + - React-Core/DevSupport (= 0.83.6) + - React-Core/RCTWebSocket (= 0.83.6) + - React-RCTActionSheet (= 0.83.6) + - React-RCTAnimation (= 0.83.6) + - React-RCTBlob (= 0.83.6) + - React-RCTImage (= 0.83.6) + - React-RCTLinking (= 0.83.6) + - React-RCTNetwork (= 0.83.6) + - React-RCTSettings (= 0.83.6) + - React-RCTText (= 0.83.6) + - React-RCTVibration (= 0.83.6) + - React-callinvoker (0.83.6) + - React-Codegen (0.1.0) + - React-Core (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.83.6) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/CoreModulesHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/Default (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/DevSupport (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.83.6) + - React-Core/RCTWebSocket (= 0.83.6) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTActionSheetHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTAnimationHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTBlobHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTImageHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTLinkingHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTNetworkHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTSettingsHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTTextHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTVibrationHeaders (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTWebSocket (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.83.6) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-CoreModules (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety (= 0.83.6) + - React-Core/CoreModulesHeaders (= 0.83.6) + - React-debug + - React-jsi (= 0.83.6) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-NativeModulesApple + - React-RCTBlob + - React-RCTFBReactNativeSpec + - React-RCTImage (= 0.83.6) + - React-runtimeexecutor + - React-utils + - ReactCommon + - SocketRocket + - React-cxxreact (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.83.6) + - React-debug (= 0.83.6) + - React-jsi (= 0.83.6) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-logger (= 0.83.6) + - React-perflogger (= 0.83.6) + - React-runtimeexecutor + - React-timing (= 0.83.6) + - React-utils + - SocketRocket + - React-debug (0.83.6) + - React-defaultsnativemodule (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-domnativemodule + - React-featureflags + - React-featureflagsnativemodule + - React-idlecallbacksnativemodule + - React-intersectionobservernativemodule + - React-jsi + - React-jsiexecutor + - React-microtasksnativemodule + - React-RCTFBReactNativeSpec + - React-webperformancenativemodule + - SocketRocket + - Yoga + - React-domnativemodule (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Fabric + - React-Fabric/bridging + - React-FabricComponents + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-Fabric (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/animated (= 0.83.6) + - React-Fabric/animationbackend (= 0.83.6) + - React-Fabric/animations (= 0.83.6) + - React-Fabric/attributedstring (= 0.83.6) + - React-Fabric/bridging (= 0.83.6) + - React-Fabric/componentregistry (= 0.83.6) + - React-Fabric/componentregistrynative (= 0.83.6) + - React-Fabric/components (= 0.83.6) + - React-Fabric/consistency (= 0.83.6) + - React-Fabric/core (= 0.83.6) + - React-Fabric/dom (= 0.83.6) + - React-Fabric/imagemanager (= 0.83.6) + - React-Fabric/leakchecker (= 0.83.6) + - React-Fabric/mounting (= 0.83.6) + - React-Fabric/observers (= 0.83.6) + - React-Fabric/scheduler (= 0.83.6) + - React-Fabric/telemetry (= 0.83.6) + - React-Fabric/templateprocessor (= 0.83.6) + - React-Fabric/uimanager (= 0.83.6) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/animated (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/animationbackend (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/animations (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/attributedstring (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/bridging (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/componentregistry (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/componentregistrynative (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.83.6) + - React-Fabric/components/root (= 0.83.6) + - React-Fabric/components/scrollview (= 0.83.6) + - React-Fabric/components/view (= 0.83.6) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/legacyviewmanagerinterop (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/root (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/scrollview (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/view (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-Fabric/consistency (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/core (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/dom (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/imagemanager (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/leakchecker (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/mounting (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.83.6) + - React-Fabric/observers/intersection (= 0.83.6) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers/events (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers/intersection (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/scheduler (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancecdpmetrics + - React-performancetimeline + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/telemetry (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/templateprocessor (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.83.6) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager/consistency (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-FabricComponents (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.83.6) + - React-FabricComponents/textlayoutmanager (= 0.83.6) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.83.6) + - React-FabricComponents/components/iostextinput (= 0.83.6) + - React-FabricComponents/components/modal (= 0.83.6) + - React-FabricComponents/components/rncore (= 0.83.6) + - React-FabricComponents/components/safeareaview (= 0.83.6) + - React-FabricComponents/components/scrollview (= 0.83.6) + - React-FabricComponents/components/switch (= 0.83.6) + - React-FabricComponents/components/text (= 0.83.6) + - React-FabricComponents/components/textinput (= 0.83.6) + - React-FabricComponents/components/unimplementedview (= 0.83.6) + - React-FabricComponents/components/virtualview (= 0.83.6) + - React-FabricComponents/components/virtualviewexperimental (= 0.83.6) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/inputaccessory (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/iostextinput (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/modal (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/rncore (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/safeareaview (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/scrollview (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/switch (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/text (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/textinput (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/unimplementedview (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/virtualview (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/virtualviewexperimental (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/textlayoutmanager (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricImage (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired (= 0.83.6) + - RCTTypeSafety (= 0.83.6) + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.83.6) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - SocketRocket + - Yoga + - React-featureflags (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-featureflagsnativemodule (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - React-graphics (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-utils + - SocketRocket + - React-hermes (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.83.6) + - React-jsi + - React-jsiexecutor (= 0.83.6) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-oscompat + - React-perflogger (= 0.83.6) + - React-runtimeexecutor + - SocketRocket + - React-idlecallbacksnativemodule (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - SocketRocket + - React-ImageManager (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - SocketRocket + - React-intersectionobservernativemodule (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-Fabric + - React-Fabric/bridging + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-jserrorhandler (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - ReactCommon/turbomodule/bridging + - SocketRocket + - React-jsi (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsiexecutor (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-debug + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket + - React-jsinspector (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-oscompat + - React-perflogger (= 0.83.6) + - React-runtimeexecutor + - React-utils + - SocketRocket + - React-jsinspectorcdp (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsinspectornetwork (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-jsinspectorcdp + - SocketRocket + - React-jsinspectortracing (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsinspectornetwork + - React-oscompat + - React-timing + - React-utils + - SocketRocket + - React-jsitooling (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.83.6) + - React-debug + - React-jsi (= 0.83.6) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-runtimeexecutor + - React-utils + - SocketRocket + - React-jsitracing (0.83.6): + - React-jsi + - React-logger (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-Mapbuffer (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-microtasksnativemodule (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - react-native-biometrics (3.0.1): + - React-Core + - react-native-bw-file-access (1.0.0): + - React-Core + - react-native-capture-protection (2.0.7): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - ReactCommon/turbomodule/core + - react-native-get-random-values (1.11.0): + - React-Core + - react-native-menu (1.2.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context (5.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common (= 5.6.2) + - react-native-safe-area-context/fabric (= 5.6.2) + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/common (5.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/fabric (5.6.2): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - react-native-safe-area-context/common + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-secure-key-store (2.0.10): + - React-Core + - react-native-tcp-socket (6.3.0): + - CocoaAsyncSocket + - React-Core + - react-native-true-sheet (2.0.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-NativeModulesApple (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - React-networking (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectornetwork + - React-jsinspectortracing + - React-performancetimeline + - React-timing + - SocketRocket + - React-oscompat (0.83.6) + - React-perflogger (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-performancecdpmetrics (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-performancetimeline + - React-runtimeexecutor + - React-timing + - SocketRocket + - React-performancetimeline (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectortracing + - React-perflogger + - React-timing + - SocketRocket + - React-RCTActionSheet (0.83.6): + - React-Core/RCTActionSheetHeaders (= 0.83.6) + - React-RCTAnimation (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-featureflags + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTAppDelegate (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsitooling + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTNetwork + - React-RCTRuntime + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon + - SocketRocket + - React-RCTBlob (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - React-RCTFabric (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTSwiftUIWrapper + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-networking + - React-performancecdpmetrics + - React-performancetimeline + - React-RCTAnimation + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-RCTFBReactNativeSpec (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec/components (= 0.83.6) + - ReactCommon + - SocketRocket + - React-RCTFBReactNativeSpec/components (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon + - SocketRocket + - Yoga + - React-RCTImage (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - React-RCTLinking (0.83.6): + - React-Core/RCTLinkingHeaders (= 0.83.6) + - React-jsi (= 0.83.6) + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactCommon/turbomodule/core (= 0.83.6) + - React-RCTNetwork (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-debug + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-NativeModulesApple + - React-networking + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTRuntime (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-debug + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-utils + - SocketRocket + - React-RCTSettings (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTText (0.83.6): + - React-Core/RCTTextHeaders (= 0.83.6) + - Yoga + - React-RCTVibration (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-rendererconsistency (0.83.6) + - React-renderercss (0.83.6): + - React-debug + - React-utils + - React-rendererdebug (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-RuntimeApple (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - SocketRocket + - React-RuntimeCore (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-Fabric + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-performancetimeline + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - React-runtimeexecutor (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-featureflags + - React-jsi (= 0.83.6) + - React-utils + - SocketRocket + - React-RuntimeHermes (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-jsitracing + - React-RuntimeCore + - React-runtimeexecutor + - React-utils + - SocketRocket + - React-runtimescheduler (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - React-jsinspectortracing + - React-performancetimeline + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-timing + - React-utils + - SocketRocket + - React-timing (0.83.6): + - React-debug + - React-utils (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-jsi (= 0.83.6) + - SocketRocket + - React-webperformancenativemodule (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-jsi + - React-jsiexecutor + - React-performancetimeline + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - SocketRocket + - ReactAppDependencyProvider (0.83.6): + - ReactCodegen + - ReactCodegen (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-RCTAppDelegate + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - ReactCommon (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - ReactCommon/turbomodule (= 0.83.6) + - SocketRocket + - ReactCommon/turbomodule (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.83.6) + - React-cxxreact (= 0.83.6) + - React-jsi (= 0.83.6) + - React-logger (= 0.83.6) + - React-perflogger (= 0.83.6) + - ReactCommon/turbomodule/bridging (= 0.83.6) + - ReactCommon/turbomodule/core (= 0.83.6) + - SocketRocket + - ReactCommon/turbomodule/bridging (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.83.6) + - React-cxxreact (= 0.83.6) + - React-jsi (= 0.83.6) + - React-logger (= 0.83.6) + - React-perflogger (= 0.83.6) + - SocketRocket + - ReactCommon/turbomodule/core (0.83.6): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker (= 0.83.6) + - React-cxxreact (= 0.83.6) + - React-debug (= 0.83.6) + - React-featureflags (= 0.83.6) + - React-jsi (= 0.83.6) + - React-logger (= 0.83.6) + - React-perflogger (= 0.83.6) + - React-utils (= 0.83.6) + - SocketRocket + - RealmJS (20.1.0): + - React + - RNCAsyncStorage (2.2.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNDefaultPreference (1.5.1): + - React-Core + - RNGestureHandler (2.30.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNKeychain (9.1.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNQuickAction (0.3.13): + - React + - RNRate (1.2.12): + - React-Core + - RNReanimated (4.2.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 4.2.1) + - RNWorklets + - SocketRocket + - Yoga + - RNReanimated/reanimated (4.2.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated/apple (= 4.2.1) + - RNWorklets + - SocketRocket + - Yoga + - RNReanimated/reanimated/apple (4.2.1): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNWorklets + - SocketRocket + - Yoga + - RNScreens (4.23.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNScreens/common (= 4.23.0) + - SocketRocket + - Yoga + - RNScreens/common (4.23.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNShare (12.1.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNSVG (15.15.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNSVG/common (= 15.15.3) + - SocketRocket + - Yoga + - RNSVG/common (15.15.3): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNWatch (1.1.0): + - React + - RNWorklets (0.7.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNWorklets/worklets (= 0.7.4) + - SocketRocket + - Yoga + - RNWorklets/worklets (0.7.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNWorklets/worklets/apple (= 0.7.4) + - SocketRocket + - Yoga + - RNWorklets/worklets/apple (0.7.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RustJsiBridge (0.0.1): + - React-Core + - SocketRocket (0.7.1) + - Yoga (0.0.0) + - ZXingObjC/Core (3.6.9) + - ZXingObjC/OneD (3.6.9): + - ZXingObjC/Core + - ZXingObjC/PDF417 (3.6.9): + - ZXingObjC/Core + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - "BugsnagReactNative (from `../node_modules/@bugsnag/react-native`)" + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - EXApplication (from `../node_modules/expo-application/ios`) + - EXConstants (from `../node_modules/expo-constants/ios`) + - EXJSONUtils (from `../node_modules/expo-json-utils/ios`) + - EXManifests (from `../node_modules/expo-manifests/ios`) + - Expo (from `../node_modules/expo`) + - expo-dev-client (from `../node_modules/expo-dev-client/ios`) + - expo-dev-launcher (from `../node_modules/expo-dev-launcher`) + - expo-dev-menu (from `../node_modules/expo-dev-menu`) + - expo-dev-menu-interface (from `../node_modules/expo-dev-menu-interface/ios`) + - ExpoAsset (from `../node_modules/expo-asset/ios`) + - ExpoCamera (from `../node_modules/expo-camera/ios`) + - ExpoCameraBarcodeScanning (from `../node_modules/expo-camera/ios`) + - ExpoClipboard (from `../node_modules/expo-clipboard/ios`) + - ExpoDevice (from `../node_modules/expo-device/ios`) + - ExpoDocumentPicker (from `../node_modules/expo-document-picker/ios`) + - "ExpoDomWebView (from `../node_modules/@expo/dom-webview/ios`)" + - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) + - ExpoFont (from `../node_modules/expo-font/ios`) + - ExpoHaptics (from `../node_modules/expo-haptics/ios`) + - ExpoImagePicker (from `../node_modules/expo-image-picker/ios`) + - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) + - ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`) + - ExpoLocalization (from `../node_modules/expo-localization/ios`) + - "ExpoLogBox (from `../node_modules/@expo/log-box`)" + - ExpoModulesCore (from `../node_modules/expo-modules-core`) + - ExpoModulesJSI (from `../node_modules/expo-modules-core`) + - ExpoNotifications (from `../node_modules/expo-notifications/ios`) + - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`) + - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - lottie-react-native (from `../node_modules/lottie-react-native`) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) + - RCTRequired (from `../node_modules/react-native/Libraries/Required`) + - RCTSwiftUI (from `../node_modules/react-native/ReactApple/RCTSwiftUI`) + - RCTSwiftUIWrapper (from `../node_modules/react-native/ReactApple/RCTSwiftUIWrapper`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-intersectionobservernativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/intersectionobserver`) + - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsinspectorcdp (from `../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) + - React-jsinspectornetwork (from `../node_modules/react-native/ReactCommon/jsinspector-modern/network`) + - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) + - React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`) + - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) + - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) + - react-native-biometrics (from `../node_modules/react-native-biometrics`) + - react-native-bw-file-access (from `../modules/react-native-bw-file-access`) + - react-native-capture-protection (from `../node_modules/react-native-capture-protection`) + - react-native-get-random-values (from `../node_modules/react-native-get-random-values`) + - "react-native-menu (from `../node_modules/@react-native-menu/menu`)" + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - react-native-secure-key-store (from `../node_modules/react-native-secure-key-store`) + - react-native-tcp-socket (from `../node_modules/react-native-tcp-socket`) + - "react-native-true-sheet (from `../node_modules/@lodev09/react-native-true-sheet`)" + - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-networking (from `../node_modules/react-native/ReactCommon/react/networking`) + - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancecdpmetrics (from `../node_modules/react-native/ReactCommon/react/performance/cdpmetrics`) + - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `../node_modules/react-native/React`) + - React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTRuntime (from `../node_modules/react-native/React/Runtime`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) + - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - React-webperformancenativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/webperformance`) + - ReactAppDependencyProvider (from `build/generated/ios/ReactAppDependencyProvider`) + - ReactCodegen (from `build/generated/ios/ReactCodegen`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RealmJS (from `../node_modules/realm`) + - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" + - RNDefaultPreference (from `../node_modules/react-native-default-preference`) + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - RNKeychain (from `../node_modules/react-native-keychain`) + - RNQuickAction (from `../node_modules/react-native-quick-actions`) + - RNRate (from `../node_modules/react-native-rate`) + - RNReanimated (from `../node_modules/react-native-reanimated`) + - RNScreens (from `../node_modules/react-native-screens`) + - RNShare (from `../node_modules/react-native-share`) + - RNSVG (from `../node_modules/react-native-svg`) + - RNWatch (from `../node_modules/react-native-watch-connectivity`) + - RNWorklets (from `../node_modules/react-native-worklets`) + - RustJsiBridge (from `.`) + - SocketRocket (~> 0.7.1) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - CocoaAsyncSocket + - lottie-ios + - React-Codegen + - SocketRocket + - ZXingObjC + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + BugsnagReactNative: + :path: "../node_modules/@bugsnag/react-native" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + EXApplication: + :path: "../node_modules/expo-application/ios" + EXConstants: + :path: "../node_modules/expo-constants/ios" + EXJSONUtils: + :path: "../node_modules/expo-json-utils/ios" + EXManifests: + :path: "../node_modules/expo-manifests/ios" + Expo: + :path: "../node_modules/expo" + expo-dev-client: + :path: "../node_modules/expo-dev-client/ios" + expo-dev-launcher: + :path: "../node_modules/expo-dev-launcher" + expo-dev-menu: + :path: "../node_modules/expo-dev-menu" + expo-dev-menu-interface: + :path: "../node_modules/expo-dev-menu-interface/ios" + ExpoAsset: + :path: "../node_modules/expo-asset/ios" + ExpoCamera: + :path: "../node_modules/expo-camera/ios" + ExpoCameraBarcodeScanning: + :path: "../node_modules/expo-camera/ios" + ExpoClipboard: + :path: "../node_modules/expo-clipboard/ios" + ExpoDevice: + :path: "../node_modules/expo-device/ios" + ExpoDocumentPicker: + :path: "../node_modules/expo-document-picker/ios" + ExpoDomWebView: + :path: "../node_modules/@expo/dom-webview/ios" + ExpoFileSystem: + :path: "../node_modules/expo-file-system/ios" + ExpoFont: + :path: "../node_modules/expo-font/ios" + ExpoHaptics: + :path: "../node_modules/expo-haptics/ios" + ExpoImagePicker: + :path: "../node_modules/expo-image-picker/ios" + ExpoKeepAwake: + :path: "../node_modules/expo-keep-awake/ios" + ExpoLinearGradient: + :path: "../node_modules/expo-linear-gradient/ios" + ExpoLocalization: + :path: "../node_modules/expo-localization/ios" + ExpoLogBox: + :path: "../node_modules/@expo/log-box" + ExpoModulesCore: + :path: "../node_modules/expo-modules-core" + ExpoModulesJSI: + :path: "../node_modules/expo-modules-core" + ExpoNotifications: + :path: "../node_modules/expo-notifications/ios" + EXUpdatesInterface: + :path: "../node_modules/expo-updates-interface/ios" + fast_float: + :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + fmt: + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-v0.14.1 + lottie-react-native: + :path: "../node_modules/lottie-react-native" + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + RCTRequired: + :path: "../node_modules/react-native/Libraries/Required" + RCTSwiftUI: + :path: "../node_modules/react-native/ReactApple/RCTSwiftUI" + RCTSwiftUIWrapper: + :path: "../node_modules/react-native/ReactApple/RCTSwiftUIWrapper" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../node_modules/react-native/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" + React-Fabric: + :path: "../node_modules/react-native/ReactCommon" + React-FabricComponents: + :path: "../node_modules/react-native/ReactCommon" + React-FabricImage: + :path: "../node_modules/react-native/ReactCommon" + React-featureflags: + :path: "../node_modules/react-native/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + React-graphics: + :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" + React-idlecallbacksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + React-ImageManager: + :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-intersectionobservernativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/intersectionobserver" + React-jserrorhandler: + :path: "../node_modules/react-native/ReactCommon/jserrorhandler" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsinspectorcdp: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + React-jsinspectornetwork: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" + React-jsinspectortracing: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + React-jsitooling: + :path: "../node_modules/react-native/ReactCommon/jsitooling" + React-jsitracing: + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../node_modules/react-native/ReactCommon" + React-microtasksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-biometrics: + :path: "../node_modules/react-native-biometrics" + react-native-bw-file-access: + :path: "../modules/react-native-bw-file-access" + react-native-capture-protection: + :path: "../node_modules/react-native-capture-protection" + react-native-get-random-values: + :path: "../node_modules/react-native-get-random-values" + react-native-menu: + :path: "../node_modules/@react-native-menu/menu" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + react-native-secure-key-store: + :path: "../node_modules/react-native-secure-key-store" + react-native-tcp-socket: + :path: "../node_modules/react-native-tcp-socket" + react-native-true-sheet: + :path: "../node_modules/@lodev09/react-native-true-sheet" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-networking: + :path: "../node_modules/react-native/ReactCommon/react/networking" + React-oscompat: + :path: "../node_modules/react-native/ReactCommon/oscompat" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-performancecdpmetrics: + :path: "../node_modules/react-native/ReactCommon/react/performance/cdpmetrics" + React-performancetimeline: + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTFabric: + :path: "../node_modules/react-native/React" + React-RCTFBReactNativeSpec: + :path: "../node_modules/react-native/React" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTRuntime: + :path: "../node_modules/react-native/React/Runtime" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-rendererconsistency: + :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-renderercss: + :path: "../node_modules/react-native/ReactCommon/react/renderer/css" + React-rendererdebug: + :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + React-RuntimeApple: + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimescheduler: + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-timing: + :path: "../node_modules/react-native/ReactCommon/react/timing" + React-utils: + :path: "../node_modules/react-native/ReactCommon/react/utils" + React-webperformancenativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/webperformance" + ReactAppDependencyProvider: + :path: build/generated/ios/ReactAppDependencyProvider + ReactCodegen: + :path: build/generated/ios/ReactCodegen + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + RealmJS: + :path: "../node_modules/realm" + RNCAsyncStorage: + :path: "../node_modules/@react-native-async-storage/async-storage" + RNDefaultPreference: + :path: "../node_modules/react-native-default-preference" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" + RNKeychain: + :path: "../node_modules/react-native-keychain" + RNQuickAction: + :path: "../node_modules/react-native-quick-actions" + RNRate: + :path: "../node_modules/react-native-rate" + RNReanimated: + :path: "../node_modules/react-native-reanimated" + RNScreens: + :path: "../node_modules/react-native-screens" + RNShare: + :path: "../node_modules/react-native-share" + RNSVG: + :path: "../node_modules/react-native-svg" + RNWatch: + :path: "../node_modules/react-native-watch-connectivity" + RNWorklets: + :path: "../node_modules/react-native-worklets" + RustJsiBridge: + :path: "." + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 + BugsnagReactNative: 746d9a6b5b99f6efd716222bc4d38cb3552e8aa1 + CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 + DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb + EXApplication: ab5a9ca485adce8be81309a5172d1565e9d7467f + EXConstants: dadbeba983acc30f855a919658a2b34fbd86615d + EXJSONUtils: 04bc3807d351331a5fe154ce1da596ec15d99169 + EXManifests: f4e50a54115948e206f4c2391bdea755a1aa74ec + Expo: 71d7bf2059afadf9b54b4645b433be1748f9e75b + expo-dev-client: 3541acbf4b009c36c2509038eba98d2d041b8f1e + expo-dev-launcher: eb6e196f363ee7226b4f05ab5815d2629840e745 + expo-dev-menu: dd303a751bfbd5cf5e43cabc674a59da82b8df73 + expo-dev-menu-interface: 833795f4c98a674d36cbc12b11b21756c38e01e8 + ExpoAsset: 7721c5c4ae2a7c3c8147a046727ac6c020b05648 + ExpoCamera: 82498151f9c05cc70d116d2bf68e4c187869300c + ExpoCameraBarcodeScanning: 66aa18c44eb8d034bdb49ea1b893fe549372ef7b + ExpoClipboard: 5d1b0cd2686406f21e616f2d9b3431259dee2e6a + ExpoDevice: 4c6425237cc10a3e5905323c5aa87e244d7b0017 + ExpoDocumentPicker: be59b82799ae30811e3f37a7521d6622baa63a19 + ExpoDomWebView: b2e9d601f9cb77d3c97da73234e175b64be91928 + ExpoFileSystem: 0b73b097e67c83622640168f620defc65a1a6f70 + ExpoFont: a95606f106a6394df8edf6d0d87aab9020af5ad4 + ExpoHaptics: 679f09dc37d5981e619bc197732007a3334e80b8 + ExpoImagePicker: 7c75b2f076d6f45598fcbd035908aebc4c2eb257 + ExpoKeepAwake: d0eb7a0719500d2a43fbf29b6f79e84d70c75ebf + ExpoLinearGradient: c654e92d726a6d64c588a0988bb22bea331d5e79 + ExpoLocalization: c5cd7fa65c797d3a2f1adbd1fd4c601c524fd677 + ExpoLogBox: a678d36477ab9544fe63e0b5328a0716539b6774 + ExpoModulesCore: cc07ebf5b947a239f1669cb5856d905cb2b093f7 + ExpoModulesJSI: 964334271fc77832736f66ee1785761cdc778dbe + ExpoNotifications: f5c15fdabb5cc3168c20cf49b6551a9d46304657 + EXUpdatesInterface: 4c11f4d1594526258f14d09817dc407acbf24e3b + fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 + FBLazyVector: 06b1c8278e6e1b31ef68e9e14c296b7872e79e48 + fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac + glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 + hermes-engine: a300c5096f4e61f093bf6bc38e4521b67c6f552f + lottie-ios: 8f959969761e9c45d70353667d00af0e5b9cadb3 + lottie-react-native: 983fd0489530e8d40f173de7f04e2f88b9317a15 + RCT-Folly: b29feb752b08042c62badaef7d453f3bb5e6ae23 + RCTDeprecation: c5e70bcdbc24b9edbca24b96f3997319f01ba8fb + RCTRequired: 7fbf6c9b97de59aab5c6a1ca5a5d91555d5ba403 + RCTSwiftUI: cff211c5e4d94e491dda240d663b8effd25296d7 + RCTSwiftUIWrapper: b731e4d3257895dfcc4bbe2dc3ae24249cd55f6e + RCTTypeSafety: 5937ceaab149032168467c48f06598e6aa99add2 + React: 9b033c7a99e1c8eec40960b6b2e6844e011e8bd1 + React-callinvoker: a860be36304d1f9fcd3b9fe6180daddd912bd2d2 + React-Codegen: 4b8b4817cea7a54b83851d4c1f91f79aa73de30a + React-Core: a133a20afa1ab940309453cba1a3e4951d8f1730 + React-CoreModules: 045ee1aeb798a3423707acaa710330bf31577c26 + React-cxxreact: 144ac8b603c13649e02189dc2db525dfe3e588f0 + React-debug: f68de18a43b52725e5a78cc4ee6db713bb0b7301 + React-defaultsnativemodule: 60fcb9272e82c3ec70f4ec29592a028ae1e65f71 + React-domnativemodule: 0d7e4e2759be37354ff7e548db97f13522559178 + React-Fabric: a779c07162259cc2523a19b36193f6faf7bfc67b + React-FabricComponents: 828affaa31683a4c48b097a4c284c14ed6ac1bf1 + React-FabricImage: baeb0119589a4b955a2d476d86d9904bef4226ba + React-featureflags: 4bcba97d55bd080300eb7fdb4a0ec7ee0a658946 + React-featureflagsnativemodule: ee90d74f4d4b8fc87677304ee0aba396753c652b + React-graphics: 6cd473951a11774dd351868d1c256f4a960332f1 + React-hermes: dcf2af884219f74bc959ee2638c9646b04e52b93 + React-idlecallbacksnativemodule: 848e21d5123dc4eb8cc01785b661aadfa36f9b8a + React-ImageManager: 932249b2c010a267460a125340f9442c2c53389d + React-intersectionobservernativemodule: 09d58ee6b954e134c592d7a09b15858d4eedd845 + React-jserrorhandler: ba8b6fd1bab73b6feeb11511dbc92c5974a7f74b + React-jsi: 2a2c17e5a7c75b8ce3795c894a1986b588939690 + React-jsiexecutor: 8f488f898c1ee018bc56cbf4f826478ad768b7c4 + React-jsinspector: cbe2639df02f634d80a120bbdcfbe732a48a27f2 + React-jsinspectorcdp: ee825a42f3b0b69ec00919dff2ec547a031d77ea + React-jsinspectornetwork: dcdec729fd14aa2cfb37b659dba8a9e7ed6c0aaf + React-jsinspectortracing: 83630ce7649ae83806571db33fbb0b6b53cc6fab + React-jsitooling: 6ac62eabd87a3cbf32e6d23355d3cd361ad5c28e + React-jsitracing: 02147eb8b166cd1a03ef848b38ebc8107fb0910f + React-logger: 984bd45f1fddb75e49627ca13c9470a4f4abe7a7 + React-Mapbuffer: ceeccd6570db88ba4bc04278073392adf96a0fc1 + React-microtasksnativemodule: c71eb8a79998c20dd13de58a7525eb32d200d9c8 + react-native-biometrics: 43ed5b828646a7862dbc7945556446be00798e7d + react-native-bw-file-access: fe925b77dbf48500df0b294c6851f8c84607a203 + react-native-capture-protection: 9bcc879e5d577b55050dc12ff0f283595c9e5873 + react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba + react-native-menu: d3cbac7d7bd6ae1c283f4f3c9993f69d209a61b4 + react-native-safe-area-context: c00143b4823773bba23f2f19f85663ae89ceb460 + react-native-secure-key-store: eb45b44bdec3f48e9be5cdfca0f49ddf64892ea6 + react-native-tcp-socket: 120072c8020262032773f80f0daaf3964aaa08a1 + react-native-true-sheet: 23d40eaff5fec52e683ccbde7df0a56eead6dec6 + React-NativeModulesApple: 70b1879ac2b642ef784fb6d43360c40803b0a142 + React-networking: 49160c13f35f3eb93791d062c330caea323bde87 + React-oscompat: f518cb4925e21c3ae08051c060dd054273613a4f + React-perflogger: ccc02e28f360ccaa5cdb4a7372e3d2bd9efb283f + React-performancecdpmetrics: b10eeb001395dd04413671971c8f654b57200167 + React-performancetimeline: 8f62f9e66923c65b9b5019ea90aa20f56e16e57d + React-RCTActionSheet: 46f6d7a9001ed24897e6388c88c65e8d22f2dac5 + React-RCTAnimation: e6f53e904627b1139e9e3954feba4306bde2ab57 + React-RCTAppDelegate: aa6fcd38ed16393d8a5e3198c73f6f25420504a6 + React-RCTBlob: 06afb6e3c79acc0965fdfed0790690ada1c0ce04 + React-RCTFabric: ba65f4ff51e46ac2322bfa6e6e31270255386e83 + React-RCTFBReactNativeSpec: aaadb548208f50e63f101508476a34af513d8ee7 + React-RCTImage: f3b2518d733229ec2f39f7a5c6b194fe15909438 + React-RCTLinking: 8fb6514d82535f07d9c4b20facb8d3f9f92e5140 + React-RCTNetwork: 3e5870de79ffe04e3c483d0ee934354af0bba582 + React-RCTRuntime: d937bbfbb294e55a8aa2023228014568f1f839c5 + React-RCTSettings: 2d2fa1bc1841b17aaac2f30aaaf51a3208759258 + React-RCTText: c6c767054f6857fa137e85ae0714384da68e91af + React-RCTVibration: 932b4434f96a8ad9020ef3c231453547d69dd4e2 + React-rendererconsistency: defe8835560e6654c627eae9e7b0e1f33ae5be60 + React-renderercss: 27c8970bf529bfa83d199900b0af1f8561c2e9a7 + React-rendererdebug: 665de0ca3f7c198435544a8af0259b34310d008e + React-RuntimeApple: 29dc7582caac2d8f9d575dbcfc14ae013677008b + React-RuntimeCore: 58e9df1ad887a070d0f84690d17a747917569057 + React-runtimeexecutor: f8cf54b8940a619d2d3bd78a9c7d88a07736bdb4 + React-RuntimeHermes: d44e587d4525fa47b3bb22723a6f9d2d37fd54ef + React-runtimescheduler: b293323e7e0e409ba12d404a439affde5831eecc + React-timing: 9477f0c5b77ff392af4a164a8102bf841391df1c + React-utils: d03e2ae03aae054c0d588c475dec38740add6f24 + React-webperformancenativemodule: d7e1a5cee24b48908676ab4748185017c78bb2e9 + ReactAppDependencyProvider: 3ec8fc5d32ad422f5b805523a5a5ea5556d8b3a2 + ReactCodegen: c8db9328177bc793ed2e3a217931689c594c5cf8 + ReactCommon: e788387a0b387a927a2a5d041fab09472fe8dedc + RealmJS: 9fd51c849eb552ade9f7b11db42a319b4f6cab4c + RNCAsyncStorage: 29f0230e1a25f36c20b05f65e2eb8958d6526e82 + RNDefaultPreference: 8a089ee8ce829a66c5453e3c5434f0785499d1c3 + RNGestureHandler: b407c25a3f51d22dd7430e6b530f753f112b7e77 + RNKeychain: 6ade38fa11cde4337b5fe2e6c13c11550082f03b + RNQuickAction: c2c8f379e614428be0babe4d53a575739667744d + RNRate: 7641919330e0d6688ad885a985b4bd697ed7d14c + RNReanimated: 292cd58688552a22b3fc1cefcfbc49b336dfed68 + RNScreens: afaf526a9c804c3b4503f950cf3e67ed81e29ada + RNShare: e273da7d123eedb1daa2d48916d40b2835873571 + RNSVG: 595abfa0f9ac26d56afcaaedf4e37a00f54cab71 + RNWatch: 28fe1f5e0c6410d45fd20925f4796fce05522e3f + RNWorklets: a3184955a41f2be46898a937e2821469c8c8da42 + RustJsiBridge: 4d2e33eec3ba03119c1786253d35ce03a8d48cd9 + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + Yoga: cf2a67aa1c8a225f0cb98a5f531d6f305d3f12e5 + ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 + +PODFILE CHECKSUM: 7fa516f1878bc797481133c6a11254daf899e303 + +COCOAPODS: 1.16.2 diff --git a/ios/PrivacyInfo.xcprivacy b/ios/PrivacyInfo.xcprivacy index 4126cc03c..c6b452ea2 100644 --- a/ios/PrivacyInfo.xcprivacy +++ b/ios/PrivacyInfo.xcprivacy @@ -6,10 +6,12 @@ NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPICategoryFileTimestamp NSPrivacyAccessedAPITypeReasons - 35F9.1 + C617.1 + 0A2A.1 + 3B52.1 @@ -22,11 +24,10 @@ NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPICategorySystemBootTime NSPrivacyAccessedAPITypeReasons - C617.1 - 3B52.1 + 35F9.1 @@ -34,8 +35,8 @@ NSPrivacyAccessedAPICategoryDiskSpace NSPrivacyAccessedAPITypeReasons - 85F4.1 E174.1 + 85F4.1 diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index ea82c7b51..2fa9b9892 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -10,163 +10,58 @@ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 17CDA0718F42DB2CE856C872 /* libPods-BlueWallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 040819EDF8BD9C50A9C83E24 /* libPods-BlueWallet.a */; }; 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; }; - 32F0A29A2311DBB20095C559 /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F0A2992311DBB20095C559 /* ComplicationController.swift */; }; 6D2A6468258BA92D0092292B /* Stickers.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 6D2A6461258BA92C0092292B /* Stickers.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6D4AF15925D21172009DD853 /* MarketAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* MarketAPI.swift */; }; - 6D4AF16D25D21192009DD853 /* Placeholders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Placeholders.swift */; }; - 6D4AF17825D211A3009DD853 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; - 6D4AF18425D215D1009DD853 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; - 6DD4109D266CADF10087DE03 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */; }; - 6DD4109E266CADF10087DE03 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */; }; - 6DD410A1266CADF10087DE03 /* Widgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DD410A0266CADF10087DE03 /* Widgets.swift */; }; 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6DD410AC266CAE470087DE03 /* PriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */; }; - 6DD410AF266CAF5C0087DE03 /* WalletInformationAndMarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E06254BA347007B5B82 /* WalletInformationAndMarketWidget.swift */; }; - 6DD410B0266CAF5C0087DE03 /* WalletInformationWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4AB1254FB59C00E9F9AA /* WalletInformationWidget.swift */; }; - 6DD410B1266CAF5C0087DE03 /* MarketAPI+Electrum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5142558EBA3009312A5 /* MarketAPI+Electrum.swift */; }; - 6DD410B2266CAF5C0087DE03 /* WalletInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F2225525053003792DF /* WalletInformationView.swift */; }; - 6DD410B3266CAF5C0087DE03 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; }; - 6DD410B4266CAF5C0087DE03 /* MarketAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* MarketAPI.swift */; }; - 6DD410B6266CAF5C0087DE03 /* PriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5272558EC52009312A5 /* PriceView.swift */; }; - 6DD410B7266CAF5C0087DE03 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D9A2E08254BA348007B5B82 /* Assets.xcassets */; }; - 6DD410B8266CAF5C0087DE03 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; - 6DD410B9266CAF5C0087DE03 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; }; - 6DD410BA266CAF5C0087DE03 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; - 6DD410BB266CAF5C0087DE03 /* MarketView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F17255226DA003792DF /* MarketView.swift */; }; - 6DD410BE266CAF5C0087DE03 /* SendReceiveButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D641F3425526311003792DF /* SendReceiveButtons.swift */; }; - 6DD410BF266CB13D0087DE03 /* Placeholders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Placeholders.swift */; }; - 6DD410C0266CB1460087DE03 /* MarketWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9946622555A660000E52E8 /* MarketWidget.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; - 6DFC807024EA0B6C007B8700 /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = 6DFC806F24EA0B6C007B8700 /* EFQRCode */; }; - 6DFC807224EA2FA9007B8700 /* ViewQRCodefaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC807124EA2FA9007B8700 /* ViewQRCodefaceController.swift */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; - 849047CA2702A32A008EE567 /* Handoff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849047C92702A32A008EE567 /* Handoff.swift */; }; 84E05A842721191B001A0D3A /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 84E05A832721191B001A0D3A /* Settings.bundle */; }; B409AB062D71E07500BA06F8 /* MenuElementsEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B409AB052D71E07500BA06F8 /* MenuElementsEmitter.swift */; }; - B40D4E34225841EC00428FCC /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E32225841EC00428FCC /* Interface.storyboard */; }; - B40D4E36225841ED00428FCC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; }; - B40D4E46225841ED00428FCC /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E45225841ED00428FCC /* NotificationController.swift */; }; B40D4E4D225841ED00428FCC /* BlueWalletWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = B40D4E30225841EC00428FCC /* BlueWalletWatch.app */; platformFilter = ios; }; - B40D4E5D2258425500428FCC /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E552258425400428FCC /* InterfaceController.swift */; }; - B40D4E5E2258425500428FCC /* NumericKeypadInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E562258425400428FCC /* NumericKeypadInterfaceController.swift */; }; - B40D4E602258425500428FCC /* SpecifyInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E582258425400428FCC /* SpecifyInterfaceController.swift */; }; - B40D4E632258425500428FCC /* ReceiveInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E5B2258425500428FCC /* ReceiveInterfaceController.swift */; }; - B40D4E642258425500428FCC /* WalletDetailsInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D4E5C2258425500428FCC /* WalletDetailsInterfaceController.swift */; }; - B40FC3FA29CCD1D00007EBAC /* SwiftTCPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40FC3F829CCD1AC0007EBAC /* SwiftTCPClient.swift */; }; - B41B76852B66B2FF002C48D5 /* Bugsnag in Frameworks */ = {isa = PBXBuildFile; productRef = B41B76842B66B2FF002C48D5 /* Bugsnag */; }; - B41B76872B66B2FF002C48D5 /* BugsnagNetworkRequestPlugin in Frameworks */ = {isa = PBXBuildFile; productRef = B41B76862B66B2FF002C48D5 /* BugsnagNetworkRequestPlugin */; }; B41C2E562BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B41C2E552BB3DCB8000FE097 /* PrivacyInfo.xcprivacy */; }; - B41C2E572BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B41C2E552BB3DCB8000FE097 /* PrivacyInfo.xcprivacy */; }; - B41C2E582BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B41C2E552BB3DCB8000FE097 /* PrivacyInfo.xcprivacy */; }; - B43D0378225847C500FBAA95 /* WalletGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0372225847C500FBAA95 /* WalletGradient.swift */; }; - B43D0379225847C500FBAA95 /* WatchDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0373225847C500FBAA95 /* WatchDataSource.swift */; }; - B43D037A225847C500FBAA95 /* Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0374225847C500FBAA95 /* Transaction.swift */; }; - B43D037B225847C500FBAA95 /* TransactionTableRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0375225847C500FBAA95 /* TransactionTableRow.swift */; }; - B43D037C225847C500FBAA95 /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0376225847C500FBAA95 /* Wallet.swift */; }; - B43D037D225847C500FBAA95 /* WalletInformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B43D0377225847C500FBAA95 /* WalletInformation.swift */; }; B44033BF2BCC32F800162242 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; }; - B44033C02BCC32F800162242 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; }; - B44033C12BCC32F800162242 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; }; B44033C42BCC332400162242 /* Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C32BCC332400162242 /* Balance.swift */; }; - B44033C52BCC332400162242 /* Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C32BCC332400162242 /* Balance.swift */; }; - B44033C62BCC332400162242 /* Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C32BCC332400162242 /* Balance.swift */; }; B44033CA2BCC350A00162242 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C92BCC350A00162242 /* Currency.swift */; }; - B44033CB2BCC350A00162242 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C92BCC350A00162242 /* Currency.swift */; }; - B44033CC2BCC350A00162242 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C92BCC350A00162242 /* Currency.swift */; }; B44033CE2BCC352900162242 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; }; - B44033D02BCC352F00162242 /* UserDefaultsGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7047D254E24D5005FE5E2 /* UserDefaultsGroup.swift */; }; B44033D32BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033D22BCC368800162242 /* UserDefaultsGroupKey.swift */; }; - B44033D42BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033D22BCC368800162242 /* UserDefaultsGroupKey.swift */; }; - B44033D52BCC368800162242 /* UserDefaultsGroupKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033D22BCC368800162242 /* UserDefaultsGroupKey.swift */; }; B44033D82BCC369500162242 /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4AF18325D215D1009DD853 /* UserDefaultsExtension.swift */; }; B44033DA2BCC369A00162242 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4C3A254FBF4800E9F9AA /* Colors.swift */; }; B44033DD2BCC36C300162242 /* LatestTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033DC2BCC36C300162242 /* LatestTransaction.swift */; }; - B44033DE2BCC36C300162242 /* LatestTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033DC2BCC36C300162242 /* LatestTransaction.swift */; }; - B44033DF2BCC36C300162242 /* LatestTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033DC2BCC36C300162242 /* LatestTransaction.swift */; }; B44033E22BCC36CB00162242 /* Placeholders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DEB4BFA254FBA0E00E9F9AA /* Placeholders.swift */; }; B44033E42BCC36FF00162242 /* WalletData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E32BCC36FF00162242 /* WalletData.swift */; }; - B44033E52BCC36FF00162242 /* WalletData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E32BCC36FF00162242 /* WalletData.swift */; }; - B44033E62BCC36FF00162242 /* WalletData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E32BCC36FF00162242 /* WalletData.swift */; }; - B44033EA2BCC371A00162242 /* MarketData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E82BCC371A00162242 /* MarketData.swift */; }; - B44033EB2BCC371A00162242 /* MarketData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E82BCC371A00162242 /* MarketData.swift */; }; B44033EE2BCC374500162242 /* Numeric+abbreviated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033ED2BCC374500162242 /* Numeric+abbreviated.swift */; }; - B44033EF2BCC374500162242 /* Numeric+abbreviated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033ED2BCC374500162242 /* Numeric+abbreviated.swift */; }; - B44033F02BCC374500162242 /* Numeric+abbreviated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033ED2BCC374500162242 /* Numeric+abbreviated.swift */; }; B44033F42BCC377F00162242 /* WidgetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F32BCC377F00162242 /* WidgetData.swift */; }; - B44033F52BCC377F00162242 /* WidgetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F32BCC377F00162242 /* WidgetData.swift */; }; - B44033F62BCC377F00162242 /* WidgetData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F32BCC377F00162242 /* WidgetData.swift */; }; B44033F92BCC379200162242 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F82BCC379200162242 /* WidgetDataStore.swift */; }; - B44033FA2BCC379200162242 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F82BCC379200162242 /* WidgetDataStore.swift */; }; - B44033FB2BCC379200162242 /* WidgetDataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033F82BCC379200162242 /* WidgetDataStore.swift */; }; B44033FE2BCC37D700162242 /* MarketAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9A2E6A254BAB1B007B5B82 /* MarketAPI.swift */; }; B44034002BCC37F800162242 /* Bundle+decode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033FF2BCC37F800162242 /* Bundle+decode.swift */; }; - B44034012BCC37F800162242 /* Bundle+decode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033FF2BCC37F800162242 /* Bundle+decode.swift */; }; - B44034022BCC37F800162242 /* Bundle+decode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033FF2BCC37F800162242 /* Bundle+decode.swift */; }; B44034052BCC389200162242 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; }; B44034072BCC38A000162242 /* FiatUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2AA8072568B8F40090B089 /* FiatUnit.swift */; }; B440340F2BCC40A400162242 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = B440340E2BCC40A400162242 /* fiatUnits.json */; }; - B44034102BCC40A400162242 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = B440340E2BCC40A400162242 /* fiatUnits.json */; }; - B44034112BCC40A400162242 /* fiatUnits.json in Resources */ = {isa = PBXBuildFile; fileRef = B440340E2BCC40A400162242 /* fiatUnits.json */; }; B450109C2C0FCD8A00619044 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B450109B2C0FCD8A00619044 /* Utilities.swift */; }; - B450109D2C0FCD9F00619044 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B450109B2C0FCD8A00619044 /* Utilities.swift */; }; - B450109F2C0FCDA500619044 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B450109B2C0FCD8A00619044 /* Utilities.swift */; }; B4549F362B82B10D002E3153 /* ci_post_clone.sh in Resources */ = {isa = PBXBuildFile; fileRef = B4549F352B82B10D002E3153 /* ci_post_clone.sh */; }; B461B852299599F800E431AA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B461B851299599F800E431AA /* AppDelegate.swift */; }; B4742E972CCDBE8300380EEE /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4742E962CCDBE8300380EEE /* Localizable.xcstrings */; }; - B4742E982CCDBE8300380EEE /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4742E962CCDBE8300380EEE /* Localizable.xcstrings */; }; - B4742E992CCDBE8300380EEE /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4742E962CCDBE8300380EEE /* Localizable.xcstrings */; }; - B4742E9B2CCDBE8300380EEE /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4742E962CCDBE8300380EEE /* Localizable.xcstrings */; }; B4793DBB2CEDACBD00C92C2E /* Chain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DBA2CEDACBD00C92C2E /* Chain.swift */; }; - B4793DBC2CEDACBD00C92C2E /* Chain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DBA2CEDACBD00C92C2E /* Chain.swift */; }; - B4793DBD2CEDACBD00C92C2E /* Chain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DBA2CEDACBD00C92C2E /* Chain.swift */; }; - B4793DBF2CEDACDA00C92C2E /* TransactionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DBE2CEDACDA00C92C2E /* TransactionType.swift */; }; - B4793DC12CEDACE700C92C2E /* WalletType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DC02CEDACE700C92C2E /* WalletType.swift */; }; - B4793DC32CEDAD4400C92C2E /* KeychainHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DC22CEDAD4400C92C2E /* KeychainHelper.swift */; }; - B4793DC42CEDAD4400C92C2E /* KeychainHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DC22CEDAD4400C92C2E /* KeychainHelper.swift */; }; B4793DC52CEDAD4400C92C2E /* KeychainHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4793DC22CEDAD4400C92C2E /* KeychainHelper.swift */; }; - B48630D62CCEE67100A8425C /* PriceWidgetProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630D52CCEE67100A8425C /* PriceWidgetProvider.swift */; }; B48630DD2CCEE7AC00A8425C /* PriceWidgetEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630DC2CCEE7AC00A8425C /* PriceWidgetEntry.swift */; }; - B48630DE2CCEE7AC00A8425C /* PriceWidgetEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630DC2CCEE7AC00A8425C /* PriceWidgetEntry.swift */; }; - B48630E02CCEE7C800A8425C /* PriceWidgetEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630DF2CCEE7C800A8425C /* PriceWidgetEntryView.swift */; }; B48630E12CCEE7C800A8425C /* PriceWidgetEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630DF2CCEE7C800A8425C /* PriceWidgetEntryView.swift */; }; B48630E52CCEE8B800A8425C /* PriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA5272558EC52009312A5 /* PriceView.swift */; }; B48630E72CCEE91900A8425C /* PriceWidgetProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630D52CCEE67100A8425C /* PriceWidgetProvider.swift */; }; B48630E82CCEE92400A8425C /* PriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6CA4BC255872E3009312A5 /* PriceWidget.swift */; }; - B48630EA2CCEED8400A8425C /* PriceIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630D02CCEE3B300A8425C /* PriceIntent.swift */; }; - B48630EC2CCEEEA700A8425C /* WalletAppShortcuts.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630EB2CCEEEA700A8425C /* WalletAppShortcuts.swift */; }; B48630ED2CCEEEB000A8425C /* WalletAppShortcuts.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630EB2CCEEEA700A8425C /* WalletAppShortcuts.swift */; }; B48630EE2CCEEEE900A8425C /* PriceIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48630D02CCEE3B300A8425C /* PriceIntent.swift */; }; - B49A28BB2CD18999006B08E4 /* CompactPriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B49A28BA2CD18999006B08E4 /* CompactPriceView.swift */; }; B49A28BC2CD18999006B08E4 /* CompactPriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B49A28BA2CD18999006B08E4 /* CompactPriceView.swift */; }; - B49A28BE2CD189B0006B08E4 /* FiatUnitEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = B49A28BD2CD189B0006B08E4 /* FiatUnitEnum.swift */; }; B49A28BF2CD18A9A006B08E4 /* FiatUnitEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = B49A28BD2CD189B0006B08E4 /* FiatUnitEnum.swift */; }; B49A28C52CD1A894006B08E4 /* MarketData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033E82BCC371A00162242 /* MarketData.swift */; }; B4AA75242DAA339E00CF5CBE /* MenuElementsEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = B4AA75232DAA339E00CF5CBE /* MenuElementsEmitter.m */; }; - B4AB225D2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; }; - B4AB225E2B02AD12001F4328 /* XMLParserDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AB225C2B02AD12001F4328 /* XMLParserDelegate.swift */; }; B4B1A4622BFA73110072E3BB /* WidgetHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B1A4612BFA73110072E3BB /* WidgetHelper.swift */; }; - B4B1A4642BFA73110072E3BB /* WidgetHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B1A4612BFA73110072E3BB /* WidgetHelper.swift */; }; B4B3EC222D69FF6C00327F3D /* CustomSegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B3EC202D69FF6C00327F3D /* CustomSegmentedControl.swift */; }; B4B3EC252D69FF8700327F3D /* EventEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B3EC232D69FF8700327F3D /* EventEmitter.swift */; }; - B4D0B2622C1DEA11006B6B1B /* ReceivePageInterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D0B2612C1DEA11006B6B1B /* ReceivePageInterfaceController.swift */; }; - B4D0B2642C1DEA99006B6B1B /* ReceiveType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D0B2632C1DEA99006B6B1B /* ReceiveType.swift */; }; - B4D0B2662C1DEB7F006B6B1B /* ReceiveInterfaceMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D0B2652C1DEB7F006B6B1B /* ReceiveInterfaceMode.swift */; }; - B4D0B2682C1DED67006B6B1B /* ReceiveMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D0B2672C1DED67006B6B1B /* ReceiveMethod.swift */; }; - B4D59C1A2D8BAFE300B7025B /* EFQRCode in Frameworks */ = {isa = PBXBuildFile; productRef = B4D59C192D8BAFE300B7025B /* EFQRCode */; }; - B4D59C1C2D8BAFE300B7025B /* Bugsnag in Frameworks */ = {isa = PBXBuildFile; productRef = B4D59C1B2D8BAFE300B7025B /* Bugsnag */; }; - B4D59C1E2D8BAFE300B7025B /* BugsnagNetworkRequestPlugin in Frameworks */ = {isa = PBXBuildFile; productRef = B4D59C1D2D8BAFE300B7025B /* BugsnagNetworkRequestPlugin */; }; - B4D59C212D8BB42100B7025B /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D59C202D8BB41F00B7025B /* File.swift */; }; - B4D59C272D8C5D6F00B7025B /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4D59C262D8C5D6E00B7025B /* main.swift */; }; B4D899942DCAE67700B959AA /* CustomSegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = B4D899932DCAE67700B959AA /* CustomSegmentedControl.m */; }; - B4EE583C226703320003363C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B40D4E35225841ED00428FCC /* Assets.xcassets */; }; - B4EFF73B2C3F6C5E0095D655 /* MockData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EFF73A2C3F6C5E0095D655 /* MockData.swift */; }; C978A716948AB7DEC5B6F677 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; + E3D89ABA85DFC3B782B1A9C2 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FEE6B2DC250032D610A48 /* ExpoModulesProvider.swift */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ 3271B0B6236E2E0700DA766F /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; @@ -201,13 +96,14 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Shroud/Info.plist; sourceTree = ""; }; 1AE7FA8B4A18928E917F42D1 /* Pods-BlueWallet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWallet.debug.xcconfig"; path = "Target Support Files/Pods-BlueWallet/Pods-BlueWallet.debug.xcconfig"; sourceTree = ""; }; 1DD63E4B5C8344BB9880C9EC /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libReactNativePermissions.a; sourceTree = ""; }; + 1F8FEE6B2DC250032D610A48 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-BlueWallet/ExpoModulesProvider.swift"; sourceTree = ""; }; 253243E162CE4822BF3A3B7D /* libRNRandomBytes-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNRandomBytes-tvOS.a"; sourceTree = ""; }; 2654894D4DE44A4C8F71773D /* CoreData.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3271B0AA236E2E0700DA766F /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; 32B5A3292334450100F8D608 /* Bridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bridge.swift; sourceTree = ""; }; - 32C7944323B8879D00BE2AFA /* BlueWalletRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = BlueWalletRelease.entitlements; path = BlueWallet/BlueWalletRelease.entitlements; sourceTree = ""; }; - 32F0A2502310B0910095C559 /* BlueWallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = BlueWallet.entitlements; path = BlueWallet/BlueWallet.entitlements; sourceTree = ""; }; + 32C7944323B8879D00BE2AFA /* ShroudRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = ShroudRelease.entitlements; path = Shroud/ShroudRelease.entitlements; sourceTree = ""; }; + 32F0A2502310B0910095C559 /* Shroud.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Shroud.entitlements; path = Shroud/Shroud.entitlements; sourceTree = ""; }; 32F0A2992311DBB20095C559 /* ComplicationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = ""; }; 334051161886419EA186F4BA /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; 3703B10AAB374CF896CCC2EA /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = ""; }; @@ -404,8 +300,8 @@ isa = PBXGroup; children = ( B461B851299599F800E431AA /* AppDelegate.swift */, - 32C7944323B8879D00BE2AFA /* BlueWalletRelease.entitlements */, - 32F0A2502310B0910095C559 /* BlueWallet.entitlements */, + 32C7944323B8879D00BE2AFA /* ShroudRelease.entitlements */, + 32F0A2502310B0910095C559 /* Shroud.entitlements */, 13B07FB51A68108700A75B9A /* Images.xcassets */, 13B07FB61A68108700A75B9A /* Info.plist */, 32B5A3292334450100F8D608 /* Bridge.swift */, @@ -417,6 +313,14 @@ name = BlueWallet; sourceTree = ""; }; + 1DFE8D29A7045CA05D6D5799 /* ExpoModulesProviders */ = { + isa = PBXGroup; + children = ( + 45C0511849669DAF4DC9FACC /* BlueWallet */, + ); + name = ExpoModulesProviders; + sourceTree = ""; + }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( @@ -437,6 +341,14 @@ name = Frameworks; sourceTree = ""; }; + 45C0511849669DAF4DC9FACC /* BlueWallet */ = { + isa = PBXGroup; + children = ( + 1F8FEE6B2DC250032D610A48 /* ExpoModulesProvider.swift */, + ); + name = BlueWallet; + sourceTree = ""; + }; 4B0CACE36C3348E1BCEA92C8 /* Resources */ = { isa = PBXGroup; children = ( @@ -565,6 +477,7 @@ 4B0CACE36C3348E1BCEA92C8 /* Resources */, FAA856B639C61E61D2CF90A8 /* Pods */, EC1EA93419C748E99321C5AE /* SplashScreen.storyboard */, + 1DFE8D29A7045CA05D6D5799 /* ExpoModulesProviders */, ); indentWidth = 2; sourceTree = ""; @@ -739,6 +652,7 @@ buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "BlueWallet" */; buildPhases = ( 3B467A525D105B531AB91B81 /* [CP] Check Pods Manifest.lock */, + B1220DEFC1B8A3B1FEDDCD23 /* [Expo] Configure project */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, @@ -934,6 +848,30 @@ shellPath = /bin/sh; shellScript = "SOURCE_MAP=\"$TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\" ../node_modules/@bugsnag/react-native/bugsnag-react-native-xcode.sh\n\n"; }; + B1220DEFC1B8A3B1FEDDCD23 /* [Expo] Configure project */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env", + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/Shroud/ShroudWallet.entitlements", + "$(SRCROOT)/Pods/Target Support Files/Pods-BlueWallet/expo-configure-project.sh", + ); + name = "[Expo] Configure project"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(SRCROOT)/Pods/Target Support Files/Pods-BlueWallet/ExpoModulesProvider.swift", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-BlueWallet/expo-configure-project.sh\"\n"; + }; BFE56A9A22A21E360BF7A1EC /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1013,14 +951,12 @@ B44034052BCC389200162242 /* XMLParserDelegate.swift in Sources */, B48630DD2CCEE7AC00A8425C /* PriceWidgetEntry.swift in Sources */, B44033F92BCC379200162242 /* WidgetDataStore.swift in Sources */, + E3D89ABA85DFC3B782B1A9C2 /* ExpoModulesProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ B40D4E32225841EC00428FCC /* Interface.storyboard */ = { isa = PBXVariantGroup; @@ -1101,6 +1037,7 @@ "-ObjC", "-lc++", ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud; PRODUCT_NAME = ShroudWallet; @@ -1158,6 +1095,7 @@ "-ObjC", "-lc++", ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud; PRODUCT_NAME = ShroudWallet; @@ -1175,125 +1113,6 @@ }; name = Release; }; - 6DD410AA266CADF40087DE03 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = WidgetsExtension.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1703239999; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = A7W54YZ4WU; - "DEVELOPMENT_TEAM[sdk=macosx*]" = A7W54YZ4WU; - "DEVELOPMENT_TEAM[sdk=watchos*]" = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = Widgets/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(SDKROOT)/usr/lib/swift", - "$(SDKROOT)/System/iOSSupport/usr/lib/swift", - "$(inherited)", - ); - MARKETING_VERSION = 7.2.1; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud.MarketWidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development org.bitshala.shroud.MarketWidget"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development org.bitshala.shroud.MarketWidget catalyst"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=watchos*]" = "match Development org.bitshala.shroud.MarketWidget"; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator"; - SUPPORTS_MACCATALYST = YES; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 15.6; - WATCHOS_DEPLOYMENT_TARGET = 9.6; - }; - name = Debug; - }; - 6DD410AB266CADF40087DE03 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = WidgetsExtension.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Distribution"; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1703239999; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = A7W54YZ4WU; - "DEVELOPMENT_TEAM[sdk=macosx*]" = A7W54YZ4WU; - "DEVELOPMENT_TEAM[sdk=watchos*]" = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = Widgets/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(SDKROOT)/usr/lib/swift", - "$(SDKROOT)/System/iOSSupport/usr/lib/swift", - "$(inherited)", - ); - MARKETING_VERSION = 7.2.1; - MTL_FAST_MATH = YES; - PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud.MarketWidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.bitshala.shroud.MarketWidget"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore org.bitshala.shroud.MarketWidget catalyst"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=watchos*]" = "match AppStore org.bitshala.shroud.MarketWidget"; - SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator"; - SUPPORTS_MACCATALYST = YES; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 15.6; - WATCHOS_DEPLOYMENT_TARGET = 9.6; - }; - name = Release; - }; 83CBBA201A601CBA00E9B192 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1430,120 +1249,6 @@ }; name = Release; }; - B40D4E53225841ED00428FCC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = BlueWalletWatch/BlueWalletWatch.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1703239999; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=watchos*]" = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = BlueWalletWatch/Info.plist; - INFOPLIST_KEY_CLKComplicationPrincipalClass = org.bitshala.shroud.watch.extension.ComplicationController; - INFOPLIST_KEY_UIMainStoryboardFile = Interface; - INFOPLIST_KEY_UIUserInterfaceStyle = Automatic; - INFOPLIST_KEY_WKCompanionAppBundleIdentifier = org.bitshala.shroud; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(SDKROOT)/usr/lib/swift", - "$(SDKROOT)/System/iOSSupport/usr/lib/swift", - "$(inherited)", - ); - MACOSX_DEPLOYMENT_TARGET = 12.4; - MARKETING_VERSION = 7.2.1; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud.watch; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=watchos*]" = "match Development org.bitshala.shroud.watch"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OBJC_BRIDGING_HEADER = "BlueWalletWatch/BlueWalletWatch-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - WATCHOS_DEPLOYMENT_TARGET = 11.0; - }; - name = Debug; - }; - B40D4E54225841ED00428FCC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = BlueWalletWatch/BlueWalletWatch.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1703239999; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=watchos*]" = A7W54YZ4WU; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = BlueWalletWatch/Info.plist; - INFOPLIST_KEY_CLKComplicationPrincipalClass = org.bitshala.shroud.watch.extension.ComplicationController; - INFOPLIST_KEY_UIMainStoryboardFile = Interface; - INFOPLIST_KEY_UIUserInterfaceStyle = Automatic; - INFOPLIST_KEY_WKCompanionAppBundleIdentifier = org.bitshala.shroud; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(SDKROOT)/usr/lib/swift", - "$(SDKROOT)/System/iOSSupport/usr/lib/swift", - "$(inherited)", - ); - MACOSX_DEPLOYMENT_TARGET = 12.4; - MARKETING_VERSION = 7.2.1; - MTL_FAST_MATH = YES; - PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud.watch; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=watchos*]" = "match AppStore org.bitshala.shroud.watch"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OBJC_BRIDGING_HEADER = "BlueWalletWatch/BlueWalletWatch-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; - WATCHOS_DEPLOYMENT_TARGET = 11.0; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1585,39 +1290,6 @@ }; }; /* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 6DFC806F24EA0B6C007B8700 /* EFQRCode */ = { - isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; - productName = EFQRCode; - }; - B41B76842B66B2FF002C48D5 /* Bugsnag */ = { - isa = XCSwiftPackageProductDependency; - package = B41B76832B66B2FF002C48D5 /* XCRemoteSwiftPackageReference "bugsnag-cocoa" */; - productName = Bugsnag; - }; - B41B76862B66B2FF002C48D5 /* BugsnagNetworkRequestPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = B41B76832B66B2FF002C48D5 /* XCRemoteSwiftPackageReference "bugsnag-cocoa" */; - productName = BugsnagNetworkRequestPlugin; - }; - B4D59C192D8BAFE300B7025B /* EFQRCode */ = { - isa = XCSwiftPackageProductDependency; - package = 6DFC806E24EA0B6C007B8700 /* XCRemoteSwiftPackageReference "EFQRCode" */; - productName = EFQRCode; - }; - B4D59C1B2D8BAFE300B7025B /* Bugsnag */ = { - isa = XCSwiftPackageProductDependency; - package = B41B76832B66B2FF002C48D5 /* XCRemoteSwiftPackageReference "bugsnag-cocoa" */; - productName = Bugsnag; - }; - B4D59C1D2D8BAFE300B7025B /* BugsnagNetworkRequestPlugin */ = { - isa = XCSwiftPackageProductDependency; - package = B41B76832B66B2FF002C48D5 /* XCRemoteSwiftPackageReference "bugsnag-cocoa" */; - productName = BugsnagNetworkRequestPlugin; - }; -/* End XCSwiftPackageProductDependency section */ }; rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; } diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/MarketWidget.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/MarketWidget.xcscheme index 603f0c6b6..77f8521f2 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/MarketWidget.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/MarketWidget.xcscheme @@ -30,8 +30,8 @@ @@ -84,8 +84,8 @@ @@ -120,8 +120,8 @@ diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/PriceWidget.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/PriceWidget.xcscheme index a22614847..9a44c70e8 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/PriceWidget.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/PriceWidget.xcscheme @@ -30,8 +30,8 @@ @@ -84,8 +84,8 @@ @@ -120,8 +120,8 @@ diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/Shroud.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/Shroud.xcscheme index e2a66d025..528f104f6 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/Shroud.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/Shroud.xcscheme @@ -56,8 +56,8 @@ @@ -72,8 +72,8 @@ diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidget.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidget.xcscheme index 0273703d4..433c7ebb8 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidget.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidget.xcscheme @@ -30,8 +30,8 @@ @@ -84,8 +84,8 @@ @@ -120,8 +120,8 @@ diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationWidget.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationWidget.xcscheme index 8f2a25ffa..dcb6589e9 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationWidget.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationWidget.xcscheme @@ -30,8 +30,8 @@ @@ -84,8 +84,8 @@ @@ -120,8 +120,8 @@ diff --git a/ios/Shroud/Info.plist b/ios/Shroud/Info.plist index b51382e49..5f5ec1def 100644 --- a/ios/Shroud/Info.plist +++ b/ios/Shroud/Info.plist @@ -1,327 +1,329 @@ - - BGTaskSchedulerPermittedIdentifiers - - org.bitshala.shroud.fetchTxsForWallet - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - Shroud Wallet - CFBundleDocumentTypes - - - CFBundleTypeIconFiles - - CFBundleTypeName - PSBT - CFBundleTypeRole - Editor - LSHandlerRank - Owner - LSItemContentTypes - - org.bitshala.shroud.psbt - - - - CFBundleTypeIconFiles - - CFBundleTypeName - Image - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - LSItemContentTypes - - public.jpeg - public.image - - - - CFBundleTypeIconFiles - - CFBundleTypeName - TXN - CFBundleTypeRole - Editor - LSHandlerRank - Owner - LSItemContentTypes - - org.bitshala.shroud.psbt.txn - - - - CFBundleTypeIconFiles - - CFBundleTypeName - ELECTRUMBACKUP - CFBundleTypeRole - Editor - LSHandlerRank - Owner - LSItemContentTypes - - org.bitshala.shroud.backup - - - - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 0.0.1 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleURLSchemes - - org.bitshala.shroud - - - - CFBundleURLSchemes - - exp+shroud-wallet - - - - CFBundleVersion - 1 - FIREBASE_ANALYTICS_COLLECTION_ENABLED - - FIREBASE_MESSAGING_AUTO_INIT_ENABLED - - LSApplicationCategoryType - public.app-category.finance - LSApplicationQueriesSchemes - - https - http - - LSMinimumSystemVersion - 11 - LSRequiresIPhoneOS - - LSSupportsOpeningDocumentsInPlace - - NSAppIntents - - - INIntentClassName - PriceView - IntentDescription - Quickly view the current Bitcoin market rate. - IntentName - Bitcoin Price - - - NSAppTransportSecurity - - NSAllowsLocalNetworking - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - onion - - NSExceptionAllowsInsecureHTTPLoads - - NSIncludesSubdomains - - - tailscale.net - - NSExceptionAllowsInsecureHTTPLoads - - NSIncludesSubdomains - - - ts.net - - NSExceptionAllowsInsecureHTTPLoads - - NSIncludesSubdomains - - - - - NSBonjourServices - - _expo._tcp - - NSCameraUsageDescription - Shroud Wallet uses the camera to scan QR codes - NSFaceIDUsageDescription - Shroud Wallet uses Face ID to unlock your wallet - NSLocalNetworkUsageDescription - Expo Dev Launcher uses the local network to discover and connect to development servers running on your computer. - NSMicrophoneUsageDescription - Allow $(PRODUCT_NAME) to access your microphone - NSPhotoLibraryAddUsageDescription - Your authorization is required to save this image. - NSPhotoLibraryUsageDescription - Shroud Wallet needs access to photos to import wallet backups - NSUserActivityTypes - - org.bitshala.shroud.receiveonchain - org.bitshala.shroud.xpub - - UIAppFonts - - Entypo.ttf - FontAwesome.ttf - FontAwesome5_Brands.ttf - FontAwesome5_Regular.ttf - FontAwesome5_Solid.ttf - Ionicons.ttf - MaterialIcons.ttf - Octicons.ttf - - UIBackgroundModes - - fetch - processing - remote-notification - - UIFileSharingEnabled - - UILaunchStoryboardName - SplashScreen - UIRequiredDeviceCapabilities - - arm64 - - UIRequiresFullScreen - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~iphone-MaxScreenSizePhone - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIUserInterfaceStyle - Automatic - UIViewControllerBasedStatusBarAppearance - - UTExportedTypeDeclarations - - - UTTypeConformsTo - - public.data - - UTTypeDescription - Partially Signed Bitcoin Transaction - UTTypeIdentifier - org.bitshala.shroud.psbt - UTTypeTagSpecification - - public.filename-extension - - psbt - - - - - UTTypeConformsTo - - public.data - - UTTypeDescription - Bitcoin Transaction - UTTypeIdentifier - org.bitshala.shroud.psbt.txn - UTTypeTagSpecification - - public.filename-extension - - txn - - - - - UTTypeConformsTo - - public.data - - UTTypeDescription - Electrum Backup - UTTypeIdentifier - org.bitshala.shroud.backup - UTTypeTagSpecification - - public.filename-extension - - backup - - - - - UTImportedTypeDeclarations - - - LSHandlerRank - Alternate - UTTypeConformsTo - - public.text - - UTTypeDescription - JSON File - UTTypeIdentifier - public.json - UTTypeTagSpecification - - public.filename-extension - - json - - public.mime-type - - application/json - - - - - WKCompanionAppBundleIdentifier - org.bitshala.shroud - bugsnag - - apiKey - 17ba9059f676f1cc4f45d98182388b01 - - - \ No newline at end of file + + BGTaskSchedulerPermittedIdentifiers + + org.bitshala.shroud.fetchTxsForWallet + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Shroud Wallet + CFBundleDocumentTypes + + + CFBundleTypeIconFiles + + CFBundleTypeName + PSBT + CFBundleTypeRole + Editor + LSHandlerRank + Owner + LSItemContentTypes + + org.bitshala.shroud.psbt + + + + CFBundleTypeIconFiles + + CFBundleTypeName + Image + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + LSItemContentTypes + + public.jpeg + public.image + + + + CFBundleTypeIconFiles + + CFBundleTypeName + TXN + CFBundleTypeRole + Editor + LSHandlerRank + Owner + LSItemContentTypes + + org.bitshala.shroud.psbt.txn + + + + CFBundleTypeIconFiles + + CFBundleTypeName + ELECTRUMBACKUP + CFBundleTypeRole + Editor + LSHandlerRank + Owner + LSItemContentTypes + + org.bitshala.shroud.backup + + + + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.0.1 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLSchemes + + org.bitshala.shroud + + + + CFBundleURLSchemes + + exp+shroud-wallet + + + + CFBundleVersion + 1 + FIREBASE_ANALYTICS_COLLECTION_ENABLED + + FIREBASE_MESSAGING_AUTO_INIT_ENABLED + + LSApplicationCategoryType + public.app-category.finance + LSApplicationQueriesSchemes + + https + http + + LSMinimumSystemVersion + 11 + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + + NSAppIntents + + + INIntentClassName + PriceView + IntentDescription + Quickly view the current Bitcoin market rate. + IntentName + Bitcoin Price + + + NSAppTransportSecurity + + NSAllowsLocalNetworking + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + onion + + NSExceptionAllowsInsecureHTTPLoads + + NSIncludesSubdomains + + + tailscale.net + + NSExceptionAllowsInsecureHTTPLoads + + NSIncludesSubdomains + + + ts.net + + NSExceptionAllowsInsecureHTTPLoads + + NSIncludesSubdomains + + + + + NSBonjourServices + + _expo._tcp + + NSCameraUsageDescription + Shroud Wallet uses the camera to scan QR codes + NSFaceIDUsageDescription + Shroud Wallet uses Face ID to unlock your wallet + NSLocalNetworkUsageDescription + Expo Dev Launcher uses the local network to discover and connect to development servers running on your computer. + NSMicrophoneUsageDescription + Allow $(PRODUCT_NAME) to access your microphone + NSPhotoLibraryAddUsageDescription + Your authorization is required to save this image. + NSPhotoLibraryUsageDescription + Shroud Wallet needs access to photos to import wallet backups + NSUserActivityTypes + + org.bitshala.shroud.receiveonchain + org.bitshala.shroud.xpub + + RCTNewArchEnabled + + UIAppFonts + + Entypo.ttf + FontAwesome.ttf + FontAwesome5_Brands.ttf + FontAwesome5_Regular.ttf + FontAwesome5_Solid.ttf + Ionicons.ttf + MaterialIcons.ttf + Octicons.ttf + + UIBackgroundModes + + fetch + processing + remote-notification + + UIFileSharingEnabled + + UILaunchStoryboardName + SplashScreen + UIRequiredDeviceCapabilities + + arm64 + + UIRequiresFullScreen + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~iphone-MaxScreenSizePhone + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIUserInterfaceStyle + Automatic + UIViewControllerBasedStatusBarAppearance + + UTExportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Partially Signed Bitcoin Transaction + UTTypeIdentifier + org.bitshala.shroud.psbt + UTTypeTagSpecification + + public.filename-extension + + psbt + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Bitcoin Transaction + UTTypeIdentifier + org.bitshala.shroud.psbt.txn + UTTypeTagSpecification + + public.filename-extension + + txn + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Electrum Backup + UTTypeIdentifier + org.bitshala.shroud.backup + UTTypeTagSpecification + + public.filename-extension + + backup + + + + + UTImportedTypeDeclarations + + + LSHandlerRank + Alternate + UTTypeConformsTo + + public.text + + UTTypeDescription + JSON File + UTTypeIdentifier + public.json + UTTypeTagSpecification + + public.filename-extension + + json + + public.mime-type + + application/json + + + + + WKCompanionAppBundleIdentifier + org.bitshala.shroud + bugsnag + + apiKey + 17ba9059f676f1cc4f45d98182388b01 + + + diff --git a/ios/Widgets/Info.plist b/ios/Widgets/Info.plist index f50ceb791..72c00dced 100644 --- a/ios/Widgets/Info.plist +++ b/ios/Widgets/Info.plist @@ -20,16 +20,6 @@ $(MARKETING_VERSION) CFBundleVersion $(CURRENT_PROJECT_VERSION) - NSExtension - - NSExtensionPointIdentifier - com.apple.widgetkit-extension - - bugsnag - - apiKey - 17ba9059f676f1cc4f45d98182388b01 - NSAppTransportSecurity NSAllowsArbitraryLoads @@ -64,5 +54,17 @@ + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + RCTNewArchEnabled + + bugsnag + + apiKey + 17ba9059f676f1cc4f45d98182388b01 + From 9c2449d462dbc7084f5ed5bf8f4d145b9505f7cd Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Sat, 16 May 2026 11:50:46 +0530 Subject: [PATCH 29/40] fix: remove stale RNCPushNotificationIOS import from bridging header and clean up pbxproj --- ios/Shroud-Bridging-Header.h | 1 - 1 file changed, 1 deletion(-) diff --git a/ios/Shroud-Bridging-Header.h b/ios/Shroud-Bridging-Header.h index 76a6f5796..7eeb80545 100644 --- a/ios/Shroud-Bridging-Header.h +++ b/ios/Shroud-Bridging-Header.h @@ -6,5 +6,4 @@ // Copyright Β© 2026 Shroud contributors. All rights reserved. // -#import #import "RNQuickActionManager.h" From 4ef534f2c216fe3e0cb6dbc9b6417b62ca022d8e Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Sat, 16 May 2026 12:00:00 +0530 Subject: [PATCH 30/40] fix: remove RNCPushNotificationIOS.didReceive call from AppDelegate (package not installed) --- ios/Shroud/AppDelegate.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/ios/Shroud/AppDelegate.swift b/ios/Shroud/AppDelegate.swift index 38a953097..4cc1c279c 100644 --- a/ios/Shroud/AppDelegate.swift +++ b/ios/Shroud/AppDelegate.swift @@ -351,7 +351,6 @@ class AppDelegate: RCTAppDelegate, UNUserNotificationCenterDelegate { } } - RNCPushNotificationIOS.didReceive(response) completionHandler() } From 256706cf22252c84967da4e901f0f69ba572f2c9 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Sat, 16 May 2026 12:19:06 +0530 Subject: [PATCH 31/40] fix: add eas-build-pre-install hook to build Rust xcframework on EAS cloud --- package.json | 4 +++- rust-native-setup.sh | 42 ++++++++++++++++++++++-------------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 09df0c20d..ad8091037 100644 --- a/package.json +++ b/package.json @@ -78,8 +78,10 @@ "lint:quickfix": "git status --porcelain | grep -v '\\.json' | grep -E '\\.js|\\.ts' --color=never | awk '{print $2}' | xargs eslint --fix; exit 0", "unit": "jest -b -w tests/unit/*", "rust:build": "bash rust-native-setup.sh", + "rust:ios": "bash rust-native-setup.sh ios", "rust:rebuild": "cd rust_jsi_bridge && cargo clean && cd .. && npm run rust:build", - "android:rust": "npm run rust:build && cd android && ./gradlew clean && cd .. && npm run android" + "android:rust": "npm run rust:build && cd android && ./gradlew clean && cd .. && npm run android", + "eas-build-pre-install": "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && export PATH=\"$HOME/.cargo/bin:$PATH\" && npm run rust:ios" }, "dependencies": { "@bugsnag/react-native": "8.4.0", diff --git a/rust-native-setup.sh b/rust-native-setup.sh index 62b1dbf53..2c8a3e9b0 100755 --- a/rust-native-setup.sh +++ b/rust-native-setup.sh @@ -183,29 +183,31 @@ main() { error "Must run from the root or the $PROJECT_NAME directory." fi - echo "πŸ¦€ Starting Rust JSI Bridge Build System" + local platform="${1:-both}" + + echo "πŸ¦€ Starting Rust JSI Bridge Build System (Platform: $platform)" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - if is_macos; then - log "Detected macOS host. Building iOS + Android targets." - ensure_rust_targets "ios" - configure_android_toolchain - ensure_rust_targets "android" - - echo -e "\nπŸ“± iOS Targets:" - for item in "${IOS_TARGETS[@]}"; do - build_ios_target "$item" - done - - echo -e "\nπŸ€– Android Targets:" - for item in "${ANDROID_TARGETS[@]}"; do - build_and_copy_android "$item" - done + if [[ "$platform" == "both" || "$platform" == "ios" ]]; then + if is_macos; then + log "Building iOS targets..." + ensure_rust_targets "ios" + + echo -e "\nπŸ“± iOS Targets:" + for item in "${IOS_TARGETS[@]}"; do + build_ios_target "$item" + done + echo + create_ios_xcframework + else + if [[ "$platform" == "ios" ]]; then + error "Cannot build iOS targets on non-macOS host." + fi + fi + fi - echo - create_ios_xcframework - else - log "Non-macOS host detected. Building Android targets only." + if [[ "$platform" == "both" || "$platform" == "android" ]]; then + log "Building Android targets..." configure_android_toolchain ensure_rust_targets "android" From 8dcb1242fb898fa7defcbd905b453eaaed2241ab Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 19 May 2026 00:30:34 +0530 Subject: [PATCH 32/40] chore: migrate to Expo CLI, update iOS build scripts, and temporarily disable QR generator dependency --- components/AddressInputScanButton.tsx | 19 ++--- hooks/useCompanionListeners.ts | 25 ++++--- ios/Localizable.xcstrings | 104 +------------------------- ios/Shroud.xcodeproj/project.pbxproj | 6 -- ios/Shroud/AppDelegate.swift | 11 ++- modules/fs.ts | 30 ++++---- package.json | 4 +- rust-native-setup.sh | 20 +++-- 8 files changed, 59 insertions(+), 160 deletions(-) diff --git a/components/AddressInputScanButton.tsx b/components/AddressInputScanButton.tsx index 87698f41e..288b4fdb4 100644 --- a/components/AddressInputScanButton.tsx +++ b/components/AddressInputScanButton.tsx @@ -6,7 +6,7 @@ import loc from '../loc'; import { showFilePickerAndReadFile, showImagePickerAndReadImage } from '../modules/fs'; import presentAlert from './Alert'; import { useTheme } from './themes'; -import RNQRGenerator from 'rn-qr-generator'; +// import RNQRGenerator from 'rn-qr-generator'; import { CommonToolTipActions } from '../typings/CommonToolTipActions'; import { useSettings } from '../hooks/context/useSettings'; import { scanQrHelper } from '../helpers/scan-qr'; @@ -79,14 +79,15 @@ export const AddressInputScanButton = ({ if (getImage) { try { - const base64Data = getImage.replace(/^data:image\/(png|jpeg|jpg);base64,/, ''); - const qrResult = await RNQRGenerator.detect({ base64: base64Data }); - const result = qrResult?.values?.[0]; - if (result) { - onChangeText(result); - } else { - presentAlert({ message: loc.send.qr_error_no_qrcode }); - } + // Temporarily disabled due to missing rn-qr-generator dependency + // const base64Data = getImage.replace(/^data:image\/(png|jpeg|jpg);base64,/, ''); + // const qrResult = await RNQRGenerator.detect({ base64: base64Data }); + // const result = qrResult?.values?.[0]; + // if (result) { + // onChangeText(result); + // } else { + // presentAlert({ message: loc.send.qr_error_no_qrcode }); + // } } catch (error) { presentAlert({ message: (error as Error).message }); } diff --git a/hooks/useCompanionListeners.ts b/hooks/useCompanionListeners.ts index 5c171a994..c44427577 100644 --- a/hooks/useCompanionListeners.ts +++ b/hooks/useCompanionListeners.ts @@ -1,7 +1,7 @@ import { CommonActions } from '@react-navigation/native'; import { useCallback, useEffect, useRef } from 'react'; import { AppState, AppStateStatus, Linking } from 'react-native'; -import RNQRGenerator from 'rn-qr-generator'; +// import RNQRGenerator from 'rn-qr-generator'; import { readAsStringAsync, EncodingType } from 'expo-file-system/legacy'; import A from '../modules/analytics'; import { getClipboardContent } from '../modules/clipboard'; @@ -194,17 +194,18 @@ const useCompanionListeners = (skipIfNotInitialized = true) => { } catch { base64 = await readAsStringAsync(decodedUrl.replace(/^file:\/\//, ''), { encoding: EncodingType.Base64 }); } - const qrResult = await RNQRGenerator.detect({ base64 }); - const qrValue = qrResult?.values?.[0]; - if (!qrValue) { - throw new Error(loc.send.qr_error_no_qrcode); - } - triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess); - DeeplinkSchemaMatch.navigationRouteFor({ url: qrValue }, (value: [string, any]) => navigationRef.navigate(...value), { - wallets, - addWallet, - saveToDisk, - }); + // Temporarily disabled due to missing rn-qr-generator dependency + // const qrResult = await RNQRGenerator.detect({ base64 }); + // const qrValue = qrResult?.values?.[0]; + // if (!qrValue) { + // throw new Error(loc.send.qr_error_no_qrcode); + // } + // triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess); + // DeeplinkSchemaMatch.navigationRouteFor({ url: qrValue }, (value: [string, any]) => navigationRef.navigate(...value), { + // wallets, + // addWallet, + // saveToDisk, + // }); } else { DeeplinkSchemaMatch.navigationRouteFor(event, (value: [string, any]) => navigationRef.navigate(...value), { wallets, diff --git a/ios/Localizable.xcstrings b/ios/Localizable.xcstrings index 0ca2b12ca..45f803cb7 100644 --- a/ios/Localizable.xcstrings +++ b/ios/Localizable.xcstrings @@ -18,9 +18,6 @@ }, "Bahrain (Bahraini Dinar)" : { - }, - "Balance" : { - }, "Bitcoin (%@)" : { @@ -39,9 +36,6 @@ }, "Central African Republic (Central African Franc)" : { - }, - "Checked at %@" : { - }, "Chile (Chilean Peso)" : { @@ -51,36 +45,18 @@ }, "Choose your preferred currency." : { - }, - "Choose your preferred fiat currency." : { - }, "Colombia (Colombian Peso)" : { - }, - "Configure Market Widget with ${electrumHost}" : { - - }, - "Configure Market Widget with ${electrumHost} and show error messages: ${showErrorMessages}" : { - - }, - "Configure the Market Widget to show the Electrum host connected to/being attempted and display error messages if data retrieval fails." : { - }, "Croatia (Croatian Kuna)" : { }, "Currency" : { - }, - "Currency: %@" : { - }, "Current Bitcoin Market Rate" : { - }, - "Current Bitcoin Price: %@" : { - }, "Czech Republic (Czech Koruna)" : { @@ -89,6 +65,7 @@ }, "display_in_BROWSER_TITLE" : { + "extractionState" : "stale", "localizations" : { "en_US" : { "stringUnit" : { @@ -109,21 +86,12 @@ } } } - }, - "Electrum Host" : { - - }, - "Error" : { - }, "European Union (Euro)" : { }, "Failed to retrieve the Bitcoin market rate." : { - }, - "Fiat Currency" : { - }, "from" : { @@ -166,40 +134,15 @@ }, "Last Updated" : { - }, - "Last updated %@ from %@" : { - "localizations" : { - "en_US" : { - "stringUnit" : { - "state" : "new", - "value" : "Last updated %1$@ from %2$@" - } - } - } - }, - "Latest transaction" : { - }, "Lebanon (Lebanese Pound)" : { }, "Malaysia (Malaysian Ringgit)" : { - }, - "Market" : { - }, "Market Rate" : { - }, - "Market Widget" : { - - }, - "Market Widget Configuration" : { - - }, - "Market Widget is connected to ${electrumHost}" : { - }, "Mexico (Mexican Peso)" : { @@ -209,9 +152,6 @@ }, "New Zealand (New Zealand Dollar)" : { - }, - "Next Block" : { - }, "Nigeria (Nigerian Naira)" : { @@ -233,33 +173,18 @@ }, "Qatar (Qatari Riyal)" : { - }, - "receive" : { - }, "Romania (Romanian Leu)" : { }, "Russia (Russian Ruble)" : { - }, - "Sats/%@" : { - }, "Saudi Arabia (Saudi Riyal)" : { - }, - "send" : { - - }, - "Show Error Messages" : { - }, "Singapore (Singapore Dollar)" : { - }, - "Source: %@" : { - }, "South Africa (South African Rand)" : { @@ -302,9 +227,6 @@ }, "United States of America (US Dollar)" : { - }, - "Updated: %@" : { - }, "Uruguay (Uruguayan Peso)" : { @@ -317,30 +239,9 @@ }, "View the current Bitcoin market rate in your preferred currency." : { - }, - "View the current Bitcoin market rate in your preferred fiat currency." : { - - }, - "View the current Bitcoin market rate." : { - - }, - "View the current market information." : { - - }, - "View the current price of Bitcoin" : { - }, "View the current price of Bitcoin." : { - }, - "View the Electrum host connected to/being attempted" : { - - }, - "View your accumulated balance." : { - - }, - "View your total wallet balance and network prices." : { - }, "VIEW_ADDRESS_TRANSACTIONS_TITLE" : { "extractionState" : "manual", @@ -375,9 +276,6 @@ } } } - }, - "Wallet and Market" : { - } }, "version" : "1.0" diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index 2fa9b9892..93e9fd927 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -10,14 +10,11 @@ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 17CDA0718F42DB2CE856C872 /* libPods-BlueWallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 040819EDF8BD9C50A9C83E24 /* libPods-BlueWallet.a */; }; 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; }; - 6D2A6468258BA92D0092292B /* Stickers.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 6D2A6461258BA92C0092292B /* Stickers.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; 84E05A842721191B001A0D3A /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 84E05A832721191B001A0D3A /* Settings.bundle */; }; B409AB062D71E07500BA06F8 /* MenuElementsEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B409AB052D71E07500BA06F8 /* MenuElementsEmitter.swift */; }; - B40D4E4D225841ED00428FCC /* BlueWalletWatch.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = B40D4E30225841EC00428FCC /* BlueWalletWatch.app */; platformFilter = ios; }; B41C2E562BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B41C2E552BB3DCB8000FE097 /* PrivacyInfo.xcprivacy */; }; B44033BF2BCC32F800162242 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; }; B44033C42BCC332400162242 /* Balance.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033C32BCC332400162242 /* Balance.swift */; }; @@ -69,8 +66,6 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( - 6D2A6468258BA92D0092292B /* Stickers.appex in Embed Foundation Extensions */, - 6DD410A7266CADF40087DE03 /* WidgetsExtension.appex in Embed Foundation Extensions */, ); name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -81,7 +76,6 @@ dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; dstSubfolderSpec = 16; files = ( - B40D4E4D225841ED00428FCC /* BlueWalletWatch.app in Embed Watch Content */, ); name = "Embed Watch Content"; runOnlyForDeploymentPostprocessing = 0; diff --git a/ios/Shroud/AppDelegate.swift b/ios/Shroud/AppDelegate.swift index 4cc1c279c..07ccb095a 100644 --- a/ios/Shroud/AppDelegate.swift +++ b/ios/Shroud/AppDelegate.swift @@ -4,7 +4,7 @@ import React_RCTAppDelegate import ReactAppDependencyProvider import UserNotifications import Bugsnag - +public import ExpoModulesCore @main class AppDelegate: RCTAppDelegate, UNUserNotificationCenterDelegate { @@ -63,13 +63,12 @@ class AppDelegate: RCTAppDelegate, UNUserNotificationCenterDelegate { return super.application(application, didFinishLaunchingWithOptions: launchOptions) } - override func sourceURL(for bridge: RCTBridge) -> URL? { - return bundleURL() - } - override func bundleURL() -> URL? { #if DEBUG - return RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") + if let url = RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") { + return url + } + return URL(string: "http://localhost:8081/index.bundle?platform=ios&dev=true") #else return Bundle.main.url(forResource: "main", withExtension: "jsbundle") #endif diff --git a/modules/fs.ts b/modules/fs.ts index fb3f9a51e..4cefd8de2 100644 --- a/modules/fs.ts +++ b/modules/fs.ts @@ -11,7 +11,7 @@ import { } from 'expo-file-system/legacy'; import * as ImagePicker from 'expo-image-picker'; import Share from 'react-native-share'; -import RNQRGenerator from 'rn-qr-generator'; +// import RNQRGenerator from 'rn-qr-generator'; import presentAlert from '../components/Alert'; import loc from '../loc'; import { isDesktop } from './environment'; @@ -132,10 +132,11 @@ export const showImagePickerAndReadImage = async (): Promise try { const uri = response.assets[0].uri; if (uri) { - const result = await RNQRGenerator.detect({ uri: decodeURI(uri) }); - if (result?.values && result.values.length > 0) { - return result.values[0]; - } + // Temporarily disabled due to missing rn-qr-generator dependency + // const result = await RNQRGenerator.detect({ uri: decodeURI(uri) }); + // if (result?.values && result.values.length > 0) { + // return result.values[0]; + // } } throw new Error(loc.send.qr_error_no_qrcode); } catch (error) { @@ -193,17 +194,18 @@ const readFileAsBase64 = async (uri: string): Promise => { if (!info.exists) { throw new Error('File does not exist'); } + // Temporarily disabled due to missing rn-qr-generator dependency // First attempt: use original URI - const result = await RNQRGenerator.detect({ uri: decodeURI(uri) }); - if (result?.values && result.values.length > 0) { - return result.values[0]; - } + // const result = await RNQRGenerator.detect({ uri: decodeURI(uri) }); + // if (result?.values && result.values.length > 0) { + // return result.values[0]; + // } // Second attempt: remove file:// prefix and try again - const altUri = uri.replace(/^file:\/\//, ''); - const result2 = await RNQRGenerator.detect({ uri: decodeURI(altUri) }); - if (result2?.values && result2.values.length > 0) { - return result2.values[0]; - } + // const altUri = uri.replace(/^file:\/\//, ''); + // const result2 = await RNQRGenerator.detect({ uri: decodeURI(altUri) }); + // if (result2?.values && result2.values.length > 0) { + // return result2.values[0]; + // } throw new Error(loc.send.qr_error_no_qrcode); } catch (error: any) { console.error(error); diff --git a/package.json b/package.json index ad8091037..5a181d9ce 100644 --- a/package.json +++ b/package.json @@ -54,13 +54,13 @@ "clean:ios": "rm -fr node_modules && rm -fr ios/Pods && npm i && cd ios && pod update && cd ..; npm start -- --reset-cache", "releasenotes2json": "./scripts/release-notes.sh > release-notes.txt; node -e 'console.log(JSON.stringify(require(\"fs\").readFileSync(\"release-notes.txt\", \"utf8\")));' > release-notes.json", "branch2json": "./scripts/current-branch.sh > current-branch.json", - "start": "react-native start", + "start": "expo start", "android": "expo run:android", "adb": "adb reverse tcp:8081 tcp:8081", "android:clean": "cd android; ./gradlew clean ; cd .. ; npm run android", "ios": "expo run:ios", "ios:sim:cloud": "npx eas-cli build --profile development --platform ios", - "ios:sim:local": "npx expo run:ios", + "ios:sim:local": "npx expo run:ios --scheme Shroud", "postinstall": "npm run releasenotes2json; npm run branch2json; npm run patches", "patches": "npx --yes patch-package", "test": "npm run tslint && npm run lint && npm run unit && npm run integration", diff --git a/rust-native-setup.sh b/rust-native-setup.sh index 2c8a3e9b0..0d7d12ca1 100755 --- a/rust-native-setup.sh +++ b/rust-native-setup.sh @@ -73,6 +73,7 @@ ANDROID_TARGETS=( IOS_TARGETS=( "aarch64-apple-ios|iOS Device (ARM64)" "aarch64-apple-ios-sim|iOS Simulator (ARM64)" + "x86_64-apple-ios|iOS Simulator (x86_64)" ) @@ -145,10 +146,8 @@ build_ios_target() { if cargo build --release --target "$target"; then success "$name built successfully" - return 0 else - warn "$name build failed. Try: rustup target add $target" - return 1 + error "$name build failed. Try: rustup target add $target" fi } @@ -158,17 +157,22 @@ create_ios_xcframework() { mkdir -p "$IOS_DEST" local device_lib="target/aarch64-apple-ios/release/$LIB_NAME" - local sim_lib="target/aarch64-apple-ios-sim/release/$LIB_NAME" + local sim_arm_lib="target/aarch64-apple-ios-sim/release/$LIB_NAME" + local sim_x86_lib="target/x86_64-apple-ios/release/$LIB_NAME" + local sim_fat_lib="target/universal-ios-sim/release/$LIB_NAME" - if [ ! -f "$device_lib" ] || [ ! -f "$sim_lib" ]; then - warn "Missing iOS .a files; skipping XCFramework creation" - return + if [ ! -f "$device_lib" ] || [ ! -f "$sim_arm_lib" ] || [ ! -f "$sim_x86_lib" ]; then + error "Missing iOS .a files; cannot create XCFramework. Ensure previous build steps succeeded." fi + log "Creating universal simulator binary..." + mkdir -p "target/universal-ios-sim/release" + lipo -create -output "$sim_fat_lib" "$sim_arm_lib" "$sim_x86_lib" + rm -rf "$IOS_DEST/RustJsiBridge.xcframework" xcodebuild -create-xcframework \ -library "$device_lib" \ - -library "$sim_lib" \ + -library "$sim_fat_lib" \ -output "$IOS_DEST/RustJsiBridge.xcframework" >/dev/null success "XCFramework written to $IOS_DEST/RustJsiBridge.xcframework" } From a0965b66d301418c0eea1249cc0593f62944bf93 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 19 May 2026 00:46:43 +0530 Subject: [PATCH 33/40] Refactor: Move source files to src/ directory and update config --- .detoxrc.json | 4 +- App.tsx | 16 +-- app.json | 4 +- index.js | 4 +- jest.config.js | 6 +- metro.config.js | 2 +- modules/bc-bech32/dist/bech32.js | 136 ------------------ modules/bc-bech32/dist/index.js | 75 ---------- modules/bc-ur/dist/decodeUR.js | 115 --------------- modules/bc-ur/dist/encodeUR.js | 37 ----- modules/bc-ur/dist/index.js | 8 -- modules/bc-ur/dist/miniCbor.js | 62 -------- modules/bc-ur/dist/utils.js | 19 --- package-lock.json | 9 +- package.json | 8 +- scripts/find-unused-loc.js | 6 +- scripts/run-ln-acceptance-tests.sh | 2 +- .../class}/bip39_wallet_formats.json | 0 {class => src/class}/camera.ts | 0 {class => src/class}/deeplink-schema-match.ts | 0 .../class}/hd-segwit-bech32-transaction.ts | 0 {class => src/class}/index.ts | 0 {class => src/class}/rng.ts | 0 {class => src/class}/shroud-app.ts | 0 {class => src/class}/wallet-gradient.ts | 0 .../wallets/abstract-hd-electrum-wallet.ts | 0 .../class}/wallets/abstract-hd-wallet.ts | 0 .../class}/wallets/abstract-wallet.ts | 0 .../class}/wallets/hd-bip352-wallet.ts | 0 .../class}/wallets/hd-taproot-wallet.ts | 0 {class => src/class}/wallets/types.ts | 0 .../components}/AddressInput.tsx | 0 .../components}/AddressInputScanButton.tsx | 0 {components => src/components}/Alert.ts | 2 +- .../components}/AmountInput.tsx | 2 +- .../components}/BigCheckmark.tsx | 0 .../components}/BlurredBalanceView.tsx | 0 .../components}/BottomModal.tsx | 0 {components => src/components}/Button.tsx | 0 .../components}/CameraScreen.tsx | 0 .../components}/CoinsSelected.tsx | 0 .../components}/Context/SettingsProvider.tsx | 0 .../components}/Context/SizeClassProvider.tsx | 0 .../components}/Context/StorageProvider.tsx | 2 +- .../components}/CopyTextToClipboard.tsx | 0 .../components}/CopyToClipboardButton.tsx | 0 {components => src/components}/DevMenu.tsx | 0 .../DismissKeyboardInputAccessory.tsx | 2 +- .../DoneAndDismissKeyboardInputAccessory.tsx | 2 +- .../components}/DynamicQRCode.tsx | 0 .../components}/FloatButtons.tsx | 0 {components => src/components}/Header.tsx | 0 .../components}/HeaderMenuButton.tsx | 0 .../components}/HeaderRightButton.tsx | 0 .../components}/HighlightedText.tsx | 0 .../components}/InputAccessoryAllFunds.tsx | 2 +- {components => src/components}/ListItem.tsx | 0 {components => src/components}/Loading.tsx | 0 .../PromptPasswordConfirmationModal.tsx | 0 .../components}/QRCodeComponent.tsx | 0 .../components}/ReplaceFeeSuggestions.tsx | 2 +- {components => src/components}/SafeArea.tsx | 0 .../components}/SafeAreaFlatList.tsx | 0 .../components}/SafeAreaScrollView.tsx | 0 .../components}/SafeAreaSectionList.tsx | 0 .../components}/SaveFileButton.tsx | 0 {components => src/components}/ScanIcon.tsx | 0 .../components}/SecondButton.tsx | 0 .../components}/SeedVerification.tsx | 0 {components => src/components}/SeedWords.tsx | 0 .../components}/SegmentControl.tsx | 0 ...SettingsBlockExplorerCustomUrlListItem.tsx | 0 .../components/ShroudComponents.js | 2 +- {components => src/components}/Spacing.tsx | 0 {components => src/components}/Tabs.tsx | 0 {components => src/components}/TipBox.tsx | 2 +- .../components}/TooltipMenu.tsx | 0 .../components}/TransactionListItem.tsx | 2 +- .../components}/TransactionPendingIconBig.tsx | 0 .../TransactionsNavigationHeader.tsx | 0 .../components}/WalletBirthSection.tsx | 2 +- .../components}/WalletsCarousel.tsx | 0 .../components}/addresses/AddressItem.tsx | 0 .../addresses/AddressTypeBadge.tsx | 0 .../components}/icons/SettingsButton.tsx | 0 .../icons/TransactionIncomingIcon.tsx | 0 .../icons/TransactionOutgoingIcon.tsx | 0 .../icons/TransactionPendingIcon.tsx | 0 .../components}/navigationStyle.tsx | 0 {components => src/components}/themes.ts | 0 {components => src/components}/types.ts | 0 {helpers => src/helpers}/confirm.ts | 0 .../helpers}/presentWalletExportReminder.ts | 0 {helpers => src/helpers}/prompt.ts | 0 {helpers => src/helpers}/scan-qr.ts | 2 +- .../silent-payments/IndexerHttpClient.ts | 2 +- .../RustTransactionProcessor.ts | 0 .../SilentPaymentKeyDerivation.ts | 0 .../helpers}/silent-payments/index.ts | 0 .../helpers}/silent-payments/types.ts | 0 {hooks => src/hooks}/context/useSettings.ts | 0 {hooks => src/hooks}/context/useStorage.ts | 0 {hooks => src/hooks}/useAnimateOnChange.ts | 0 {hooks => src/hooks}/useAppState.ts | 0 {hooks => src/hooks}/useBiometrics.ts | 2 +- {hooks => src/hooks}/useBounceAnimation.ts | 0 {hooks => src/hooks}/useCompanionListeners.ts | 4 +- {hooks => src/hooks}/useDeviceQuickActions.ts | 2 +- {hooks => src/hooks}/useExtendedNavigation.ts | 2 +- {hooks => src/hooks}/useKeyboard.ts | 0 {hooks => src/hooks}/useOnAppLaunch.ts | 0 {hooks => src/hooks}/useScreenProtect.ts | 0 {hooks => src/hooks}/useWalletSubscribe.tsx | 0 {img => src/img}/addWallet/bitcoin.png | Bin {img => src/img}/addWallet/bitcoin@2x.png | Bin {img => src/img}/addWallet/bitcoin@3x.png | Bin {img => src/img}/bitcoin.png | Bin {img => src/img}/bluenice.json | 0 {img => src/img}/btc-shape-rtl.png | Bin {img => src/img}/btc-shape.png | Bin {img => src/img}/close-white.png | Bin {img => src/img}/close-white@2x.png | Bin {img => src/img}/close-white@3x.png | Bin {img => src/img}/close.png | Bin {img => src/img}/close@2x.png | Bin {img => src/img}/close@3x.png | Bin {img => src/img}/coin1.png | Bin {img => src/img}/coin2.png | Bin {img => src/img}/icon.png | Bin {img => src/img}/icon@2x.png | Bin {img => src/img}/icon@3x.png | Bin {img => src/img}/logo.png | Bin {img => src/img}/mshelp/mshelp-intro.png | Bin {img => src/img}/mshelp/mshelp-intro@2x.png | Bin {img => src/img}/mshelp/mshelp-intro@3x.png | Bin {img => src/img}/mshelp/tip2.png | Bin {img => src/img}/mshelp/tip2@2x.png | Bin {img => src/img}/mshelp/tip2@3x.png | Bin {img => src/img}/mshelp/tip3.png | Bin {img => src/img}/mshelp/tip3@2x.png | Bin {img => src/img}/mshelp/tip3@3x.png | Bin {img => src/img}/mshelp/tip4.png | Bin {img => src/img}/mshelp/tip4@2x.png | Bin {img => src/img}/mshelp/tip4@3x.png | Bin {img => src/img}/mshelp/tip5.png | Bin {img => src/img}/mshelp/tip5@2x.png | Bin {img => src/img}/mshelp/tip5@3x.png | Bin {img => src/img}/msvault.json | 0 .../img}/round-compare-arrows-24-px.png | Bin .../img}/round-compare-arrows-24-px@2x.png | Bin .../img}/round-compare-arrows-24-px@3x.png | Bin {img => src/img}/scan-white.png | Bin {img => src/img}/scan-white@2x.png | Bin {img => src/img}/scan-white@3x.png | Bin {img => src/img}/scan.svg | 0 {loc => src/loc}/ar.json | 0 {loc => src/loc}/be@tarask.json | 0 {loc => src/loc}/bg_bg.json | 0 {loc => src/loc}/bqi.json | 0 {loc => src/loc}/ca.json | 0 {loc => src/loc}/cs_cz.json | 0 {loc => src/loc}/cy.json | 0 {loc => src/loc}/da_dk.json | 0 {loc => src/loc}/de_de.json | 0 {loc => src/loc}/el.json | 0 {loc => src/loc}/en.json | 0 {loc => src/loc}/es.json | 0 {loc => src/loc}/es_419.json | 0 {loc => src/loc}/et_EE.json | 0 {loc => src/loc}/fa.json | 0 {loc => src/loc}/fi_fi.json | 0 {loc => src/loc}/fr_fr.json | 0 {loc => src/loc}/he.json | 0 {loc => src/loc}/hr_hr.json | 0 {loc => src/loc}/hu_hu.json | 0 {loc => src/loc}/id_id.json | 0 {loc => src/loc}/index.ts | 0 {loc => src/loc}/it.json | 0 {loc => src/loc}/jp_jp.json | 0 {loc => src/loc}/kk@Cyrl.json | 0 {loc => src/loc}/kn.json | 0 {loc => src/loc}/ko_KR.json | 0 {loc => src/loc}/languages.ts | 0 {loc => src/loc}/lrc.json | 0 {loc => src/loc}/ms.json | 0 {loc => src/loc}/nb_no.json | 0 {loc => src/loc}/ne.json | 0 {loc => src/loc}/nl_nl.json | 0 {loc => src/loc}/pcm.json | 0 {loc => src/loc}/pl.json | 0 {loc => src/loc}/pt_br.json | 0 {loc => src/loc}/pt_pt.json | 0 {loc => src/loc}/ro.json | 0 {loc => src/loc}/ru.json | 0 {loc => src/loc}/si_LK.json | 0 {loc => src/loc}/sk_sk.json | 0 {loc => src/loc}/sl_SI.json | 0 {loc => src/loc}/sq_AL.json | 0 {loc => src/loc}/sr_RS.json | 0 {loc => src/loc}/sv_se.json | 0 {loc => src/loc}/th_th.json | 0 {loc => src/loc}/tr_tr.json | 0 {loc => src/loc}/ua.json | 0 {loc => src/loc}/vi_vn.json | 0 {loc => src/loc}/zar_afr.json | 0 {loc => src/loc}/zar_xho.json | 0 {loc => src/loc}/zh_cn.json | 0 {loc => src/loc}/zh_tw.json | 0 {models => src/models}/bitcoinUnits.ts | 0 {models => src/models}/blockExplorer.ts | 0 {models => src/models}/fiatUnit.ts | 2 +- {models => src/models}/fiatUnits.json | 0 .../models}/networkTransactionFees.ts | 0 {modules => src/modules}/Electrum.ts | 2 +- {modules => src/modules}/RustJsiBridge.ts | 0 .../modules}/SilentPaymentIndexer.ts | 0 {modules => src/modules}/analytics.ts | 0 {modules => src/modules}/base43.ts | 0 {modules => src/modules}/bc-bech32/Readme.md | 0 .../modules}/bc-bech32/package.json | 0 {modules => src/modules}/bc-ur/README.md | 0 {modules => src/modules}/bc-ur/package.json | 0 {modules => src/modules}/bip39.ts | 0 {modules => src/modules}/checksumWords.ts | 0 {modules => src/modules}/clipboard.ts | 0 {modules => src/modules}/constants.ts | 0 {modules => src/modules}/currency.ts | 0 {modules => src/modules}/debounce.ts | 0 {modules => src/modules}/encryption.ts | 0 {modules => src/modules}/environment.ts | 0 {modules => src/modules}/fs.ts | 0 {modules => src/modules}/hapticFeedback.ts | 0 {modules => src/modules}/noble_ecc.ts | 0 {modules => src/modules}/notifications.ts | 2 +- .../react-native-bw-file-access/.gitignore | 0 .../react-native-bw-file-access/README.md | 0 .../react-native-bw-file-access/index.ts | 0 .../ios/BwFileAccess.h | 0 .../ios/BwFileAccess.m | 0 .../BwFileAccess.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../react-native-bw-file-access/package.json | 0 .../react-native-bw-file-access.podspec | 0 {modules => src/modules}/sizeClass.ts | 0 {modules => src/modules}/start-and-decrypt.ts | 0 .../modules}/uint8array-extras/index.d.ts | 0 .../modules}/uint8array-extras/index.js | 0 {modules => src/modules}/ur/index.js | 0 .../navigation}/AddWalletStack.tsx | 0 .../navigation}/DetailViewScreensStack.tsx | 62 ++++---- .../navigation}/DetailViewStackParamList.ts | 2 +- .../navigation}/DrawerParamList.ts | 0 {navigation => src/navigation}/DrawerRoot.tsx | 2 +- .../navigation}/LazyLoadAddWalletStack.tsx | 10 +- .../navigation}/LazyLoadScanQRCodeStack.tsx | 2 +- .../navigation}/LazyLoadSendDetailsStack.tsx | 12 +- .../navigation}/LazyLoadSignVerifyStack.tsx | 2 +- .../navigation}/LazyLoadWalletExportStack.tsx | 2 +- .../navigation}/LazyLoadWalletXpubStack.tsx | 2 +- .../navigation}/LazyLoadingIndicator.tsx | 0 {navigation => src/navigation}/MasterView.tsx | 0 .../navigation/NavigationService.ts | 0 .../navigation}/OnboardingStack.tsx | 6 +- .../ReceiveDetailsStackParamList.ts | 0 .../navigation}/SendDetailsStack.tsx | 2 +- .../navigation}/SendDetailsStackParamList.ts | 2 +- .../navigation}/SignVerifyStack.tsx | 0 .../navigation}/WalletExportStack.tsx | 0 .../navigation}/WalletXpubStack.tsx | 0 .../helpers/getWalletTransactionsOptions.tsx | 2 +- {navigation => src/navigation}/index.tsx | 4 +- {screen => src/screens}/ActionSheet.common.ts | 0 {screen => src/screens}/ActionSheet.ts | 0 .../screens}/PlausibleDeniability.tsx | 2 +- {screen => src/screens}/SelectFeeScreen.tsx | 0 {screen => src/screens}/UnlockWith.tsx | 2 +- .../screens}/receive/ReceiveDetails.tsx | 2 +- {screen => src/screens}/send/Broadcast.tsx | 2 +- {screen => src/screens}/send/CoinControl.tsx | 0 {screen => src/screens}/send/Confirm.tsx | 2 +- {screen => src/screens}/send/ScanQRCode.tsx | 2 +- {screen => src/screens}/send/SendDetails.tsx | 2 +- {screen => src/screens}/send/create.js | 2 +- .../screens}/send/psbtWithHardwareWallet.js | 2 +- {screen => src/screens}/send/success.tsx | 2 +- {screen => src/screens}/settings/About.tsx | 2 +- {screen => src/screens}/settings/Currency.tsx | 2 +- .../screens}/settings/DefaultView.tsx | 0 .../screens}/settings/DeleteWallet.tsx | 0 .../screens}/settings/ElectrumSettings.tsx | 2 +- .../screens}/settings/EncryptStorage.tsx | 0 .../screens}/settings/GeneralSettings.tsx | 0 .../screens}/settings/IsItMyAddress.tsx | 2 +- {screen => src/screens}/settings/Language.tsx | 0 .../screens}/settings/Licensing.tsx | 2 +- .../screens}/settings/NetworkSettings.tsx | 0 .../settings/NotificationSettings.tsx | 2 +- .../screens}/settings/ReleaseNotes.tsx | 4 +- {screen => src/screens}/settings/SelfTest.tsx | 2 +- {screen => src/screens}/settings/Settings.tsx | 0 .../settings/SettingsBlockExplorer.tsx | 0 .../screens}/settings/SettingsPrivacy.tsx | 0 {screen => src/screens}/settings/tools.tsx | 0 {screen => src/screens}/transactions/CPFP.js | 2 +- .../screens}/transactions/RBFBumpFee.js | 2 +- .../screens}/transactions/RBFCancel.js | 2 +- .../transactions/TransactionDetails.tsx | 2 +- .../transactions/TransactionStatus.tsx | 2 +- {screen => src/screens}/wallets/Add.tsx | 2 +- .../screens}/wallets/CreateWalletScreen.tsx | 0 .../screens}/wallets/DrawerList.tsx | 0 .../screens}/wallets/ImportSpeed.tsx | 2 +- .../screens}/wallets/ImportWallet.tsx | 2 +- .../screens}/wallets/OnboardingScreen.tsx | 0 .../screens}/wallets/PleaseBackup.tsx | 0 .../screens}/wallets/ProvideEntropy.tsx | 0 .../screens}/wallets/WalletAddresses.tsx | 0 .../screens}/wallets/WalletDetails.tsx | 2 +- .../screens}/wallets/WalletExport.tsx | 2 +- .../screens}/wallets/WalletTransactions.tsx | 0 .../screens}/wallets/WalletsList.tsx | 0 .../screens}/wallets/generateWord.js | 2 +- {screen => src/screens}/wallets/signVerify.js | 2 +- .../screens}/wallets/xpub.styles.ts | 0 {screen => src/screens}/wallets/xpub.tsx | 2 +- {tests => src/tests}/.eslintrc | 0 {tests => src/tests}/custom-environment.js | 0 {tests => src/tests}/custom-reporter.js | 0 .../tests}/e2e/detox-build-release-apk.sh | 0 .../tests}/e2e/detox-prepare-android-emu.sh | 0 {tests => src/tests}/e2e/helperz.js | 0 {tests => src/tests}/e2e/jest.config.js | 0 {tests => src/tests}/e2e/shroud.spec.js | 0 {tests => src/tests}/e2e/shroud2.spec.js | 0 {tests => src/tests}/e2e/shroud3.spec.js | 0 {tests => src/tests}/integration/App.test.js | 4 +- .../tests}/integration/Currency.test.js | 0 .../tests}/integration/Electrum.test.js | 0 .../tests}/integration/ElectrumClient.test.js | 0 .../tests}/integration/notifications.test.js | 0 {tests => src/tests}/setup.js | 0 {tests => src/tests}/unit/addresses.test.ts | 2 +- {tests => src/tests}/unit/bip352.test.ts | 0 .../tests}/unit/checksumWords.test.ts | 0 {tests => src/tests}/unit/currency.test.ts | 0 .../tests}/unit/deeplink-schema-match.test.js | 0 {tests => src/tests}/unit/ecc.test.ts | 0 {tests => src/tests}/unit/encryption.test.ts | 0 .../unit/fixtures/caravan-multisig.json | 0 .../unit/fixtures/coldcardmk4/descriptor.txt | 0 .../unit/fixtures/coldcardmk4/new-wasabi.json | 0 .../fixtures/coldcardmk4/sparrow-export.json | 0 ...tisig-wallet-with-seed-and-passphrase.json | 0 .../electrum-multisig-wallet-with-seed.json | 0 .../unit/fixtures/fromsparrow-coldcard.txt | 0 .../unit/fixtures/fromsparrow-electrum.json | 0 .../unit/fixtures/fromsparrow-specter.json | 0 .../tests}/unit/fixtures/nunchuck-bsms.txt | 0 .../tests}/unit/fixtures/skeleton-cobo.txt | 0 .../unit/fixtures/skeleton-coldcard.txt | 0 .../fixtures/skeleton-electrum-hex-only.txt | 0 .../unit/fixtures/skeleton-electrum.txt | 0 .../fixtures/skeleton-walletdescriptor.txt | 0 .../tests}/unit/hd-taproot-wallet.test.ts | 0 .../tests}/unit/isValidBech32Address.test.ts | 0 {tests => src/tests}/unit/loc.test.js | 0 .../tests}/unit/provide-entropy.test.ts | 2 +- {typings => src/typings}/ActionIcons.ts | 0 .../typings}/CommonToolTipActions.ts | 0 {typings => src/typings}/bip21.d.ts | 0 {typings => src/typings}/coinselect.d.ts | 0 {typings => src/typings}/globals.d.ts | 0 .../typings}/react-native-passcode-auth.d.ts | 0 .../typings}/react-native-prompt-android.d.ts | 0 {typings => src/typings}/tiny-secp256k1.d.ts | 0 {util => src/utils}/fetch.ts | 0 {utils => src/utils}/isValidBech32Address.ts | 0 {utils => src/utils}/transactionHelpers.ts | 0 tsconfig.json | 2 +- 379 files changed, 147 insertions(+), 594 deletions(-) delete mode 100644 modules/bc-bech32/dist/bech32.js delete mode 100644 modules/bc-bech32/dist/index.js delete mode 100644 modules/bc-ur/dist/decodeUR.js delete mode 100644 modules/bc-ur/dist/encodeUR.js delete mode 100644 modules/bc-ur/dist/index.js delete mode 100644 modules/bc-ur/dist/miniCbor.js delete mode 100644 modules/bc-ur/dist/utils.js rename {class => src/class}/bip39_wallet_formats.json (100%) rename {class => src/class}/camera.ts (100%) rename {class => src/class}/deeplink-schema-match.ts (100%) rename {class => src/class}/hd-segwit-bech32-transaction.ts (100%) rename {class => src/class}/index.ts (100%) rename {class => src/class}/rng.ts (100%) rename {class => src/class}/shroud-app.ts (100%) rename {class => src/class}/wallet-gradient.ts (100%) rename {class => src/class}/wallets/abstract-hd-electrum-wallet.ts (100%) rename {class => src/class}/wallets/abstract-hd-wallet.ts (100%) rename {class => src/class}/wallets/abstract-wallet.ts (100%) rename {class => src/class}/wallets/hd-bip352-wallet.ts (100%) rename {class => src/class}/wallets/hd-taproot-wallet.ts (100%) rename {class => src/class}/wallets/types.ts (100%) rename {components => src/components}/AddressInput.tsx (100%) rename {components => src/components}/AddressInputScanButton.tsx (100%) rename {components => src/components}/Alert.ts (97%) rename {components => src/components}/AmountInput.tsx (99%) rename {components => src/components}/BigCheckmark.tsx (100%) rename {components => src/components}/BlurredBalanceView.tsx (100%) rename {components => src/components}/BottomModal.tsx (100%) rename {components => src/components}/Button.tsx (100%) rename {components => src/components}/CameraScreen.tsx (100%) rename {components => src/components}/CoinsSelected.tsx (100%) rename {components => src/components}/Context/SettingsProvider.tsx (100%) rename {components => src/components}/Context/SizeClassProvider.tsx (100%) rename {components => src/components}/Context/StorageProvider.tsx (99%) rename {components => src/components}/CopyTextToClipboard.tsx (100%) rename {components => src/components}/CopyToClipboardButton.tsx (100%) rename {components => src/components}/DevMenu.tsx (100%) rename {components => src/components}/DismissKeyboardInputAccessory.tsx (93%) rename {components => src/components}/DoneAndDismissKeyboardInputAccessory.tsx (95%) rename {components => src/components}/DynamicQRCode.tsx (100%) rename {components => src/components}/FloatButtons.tsx (100%) rename {components => src/components}/Header.tsx (100%) rename {components => src/components}/HeaderMenuButton.tsx (100%) rename {components => src/components}/HeaderRightButton.tsx (100%) rename {components => src/components}/HighlightedText.tsx (100%) rename {components => src/components}/InputAccessoryAllFunds.tsx (97%) rename {components => src/components}/ListItem.tsx (100%) rename {components => src/components}/Loading.tsx (100%) rename {components => src/components}/PromptPasswordConfirmationModal.tsx (100%) rename {components => src/components}/QRCodeComponent.tsx (100%) rename {components => src/components}/ReplaceFeeSuggestions.tsx (99%) rename {components => src/components}/SafeArea.tsx (100%) rename {components => src/components}/SafeAreaFlatList.tsx (100%) rename {components => src/components}/SafeAreaScrollView.tsx (100%) rename {components => src/components}/SafeAreaSectionList.tsx (100%) rename {components => src/components}/SaveFileButton.tsx (100%) rename {components => src/components}/ScanIcon.tsx (100%) rename {components => src/components}/SecondButton.tsx (100%) rename {components => src/components}/SeedVerification.tsx (100%) rename {components => src/components}/SeedWords.tsx (100%) rename {components => src/components}/SegmentControl.tsx (100%) rename {components => src/components}/SettingsBlockExplorerCustomUrlListItem.tsx (100%) rename ShroudComponents.js => src/components/ShroudComponents.js (98%) rename {components => src/components}/Spacing.tsx (100%) rename {components => src/components}/Tabs.tsx (100%) rename {components => src/components}/TipBox.tsx (96%) rename {components => src/components}/TooltipMenu.tsx (100%) rename {components => src/components}/TransactionListItem.tsx (99%) rename {components => src/components}/TransactionPendingIconBig.tsx (100%) rename {components => src/components}/TransactionsNavigationHeader.tsx (100%) rename {components => src/components}/WalletBirthSection.tsx (95%) rename {components => src/components}/WalletsCarousel.tsx (100%) rename {components => src/components}/addresses/AddressItem.tsx (100%) rename {components => src/components}/addresses/AddressTypeBadge.tsx (100%) rename {components => src/components}/icons/SettingsButton.tsx (100%) rename {components => src/components}/icons/TransactionIncomingIcon.tsx (100%) rename {components => src/components}/icons/TransactionOutgoingIcon.tsx (100%) rename {components => src/components}/icons/TransactionPendingIcon.tsx (100%) rename {components => src/components}/navigationStyle.tsx (100%) rename {components => src/components}/themes.ts (100%) rename {components => src/components}/types.ts (100%) rename {helpers => src/helpers}/confirm.ts (100%) rename {helpers => src/helpers}/presentWalletExportReminder.ts (100%) rename {helpers => src/helpers}/prompt.ts (100%) rename {helpers => src/helpers}/scan-qr.ts (92%) rename {helpers => src/helpers}/silent-payments/IndexerHttpClient.ts (94%) rename {helpers => src/helpers}/silent-payments/RustTransactionProcessor.ts (100%) rename {helpers => src/helpers}/silent-payments/SilentPaymentKeyDerivation.ts (100%) rename {helpers => src/helpers}/silent-payments/index.ts (100%) rename {helpers => src/helpers}/silent-payments/types.ts (100%) rename {hooks => src/hooks}/context/useSettings.ts (100%) rename {hooks => src/hooks}/context/useStorage.ts (100%) rename {hooks => src/hooks}/useAnimateOnChange.ts (100%) rename {hooks => src/hooks}/useAppState.ts (100%) rename {hooks => src/hooks}/useBiometrics.ts (98%) rename {hooks => src/hooks}/useBounceAnimation.ts (100%) rename {hooks => src/hooks}/useCompanionListeners.ts (98%) rename {hooks => src/hooks}/useDeviceQuickActions.ts (98%) rename {hooks => src/hooks}/useExtendedNavigation.ts (98%) rename {hooks => src/hooks}/useKeyboard.ts (100%) rename {hooks => src/hooks}/useOnAppLaunch.ts (100%) rename {hooks => src/hooks}/useScreenProtect.ts (100%) rename {hooks => src/hooks}/useWalletSubscribe.tsx (100%) rename {img => src/img}/addWallet/bitcoin.png (100%) rename {img => src/img}/addWallet/bitcoin@2x.png (100%) rename {img => src/img}/addWallet/bitcoin@3x.png (100%) rename {img => src/img}/bitcoin.png (100%) rename {img => src/img}/bluenice.json (100%) rename {img => src/img}/btc-shape-rtl.png (100%) rename {img => src/img}/btc-shape.png (100%) rename {img => src/img}/close-white.png (100%) rename {img => src/img}/close-white@2x.png (100%) rename {img => src/img}/close-white@3x.png (100%) rename {img => src/img}/close.png (100%) rename {img => src/img}/close@2x.png (100%) rename {img => src/img}/close@3x.png (100%) rename {img => src/img}/coin1.png (100%) rename {img => src/img}/coin2.png (100%) rename {img => src/img}/icon.png (100%) rename {img => src/img}/icon@2x.png (100%) rename {img => src/img}/icon@3x.png (100%) rename {img => src/img}/logo.png (100%) rename {img => src/img}/mshelp/mshelp-intro.png (100%) rename {img => src/img}/mshelp/mshelp-intro@2x.png (100%) rename {img => src/img}/mshelp/mshelp-intro@3x.png (100%) rename {img => src/img}/mshelp/tip2.png (100%) rename {img => src/img}/mshelp/tip2@2x.png (100%) rename {img => src/img}/mshelp/tip2@3x.png (100%) rename {img => src/img}/mshelp/tip3.png (100%) rename {img => src/img}/mshelp/tip3@2x.png (100%) rename {img => src/img}/mshelp/tip3@3x.png (100%) rename {img => src/img}/mshelp/tip4.png (100%) rename {img => src/img}/mshelp/tip4@2x.png (100%) rename {img => src/img}/mshelp/tip4@3x.png (100%) rename {img => src/img}/mshelp/tip5.png (100%) rename {img => src/img}/mshelp/tip5@2x.png (100%) rename {img => src/img}/mshelp/tip5@3x.png (100%) rename {img => src/img}/msvault.json (100%) rename {img => src/img}/round-compare-arrows-24-px.png (100%) rename {img => src/img}/round-compare-arrows-24-px@2x.png (100%) rename {img => src/img}/round-compare-arrows-24-px@3x.png (100%) rename {img => src/img}/scan-white.png (100%) rename {img => src/img}/scan-white@2x.png (100%) rename {img => src/img}/scan-white@3x.png (100%) rename {img => src/img}/scan.svg (100%) rename {loc => src/loc}/ar.json (100%) rename {loc => src/loc}/be@tarask.json (100%) rename {loc => src/loc}/bg_bg.json (100%) rename {loc => src/loc}/bqi.json (100%) rename {loc => src/loc}/ca.json (100%) rename {loc => src/loc}/cs_cz.json (100%) rename {loc => src/loc}/cy.json (100%) rename {loc => src/loc}/da_dk.json (100%) rename {loc => src/loc}/de_de.json (100%) rename {loc => src/loc}/el.json (100%) rename {loc => src/loc}/en.json (100%) rename {loc => src/loc}/es.json (100%) rename {loc => src/loc}/es_419.json (100%) rename {loc => src/loc}/et_EE.json (100%) rename {loc => src/loc}/fa.json (100%) rename {loc => src/loc}/fi_fi.json (100%) rename {loc => src/loc}/fr_fr.json (100%) rename {loc => src/loc}/he.json (100%) rename {loc => src/loc}/hr_hr.json (100%) rename {loc => src/loc}/hu_hu.json (100%) rename {loc => src/loc}/id_id.json (100%) rename {loc => src/loc}/index.ts (100%) rename {loc => src/loc}/it.json (100%) rename {loc => src/loc}/jp_jp.json (100%) rename {loc => src/loc}/kk@Cyrl.json (100%) rename {loc => src/loc}/kn.json (100%) rename {loc => src/loc}/ko_KR.json (100%) rename {loc => src/loc}/languages.ts (100%) rename {loc => src/loc}/lrc.json (100%) rename {loc => src/loc}/ms.json (100%) rename {loc => src/loc}/nb_no.json (100%) rename {loc => src/loc}/ne.json (100%) rename {loc => src/loc}/nl_nl.json (100%) rename {loc => src/loc}/pcm.json (100%) rename {loc => src/loc}/pl.json (100%) rename {loc => src/loc}/pt_br.json (100%) rename {loc => src/loc}/pt_pt.json (100%) rename {loc => src/loc}/ro.json (100%) rename {loc => src/loc}/ru.json (100%) rename {loc => src/loc}/si_LK.json (100%) rename {loc => src/loc}/sk_sk.json (100%) rename {loc => src/loc}/sl_SI.json (100%) rename {loc => src/loc}/sq_AL.json (100%) rename {loc => src/loc}/sr_RS.json (100%) rename {loc => src/loc}/sv_se.json (100%) rename {loc => src/loc}/th_th.json (100%) rename {loc => src/loc}/tr_tr.json (100%) rename {loc => src/loc}/ua.json (100%) rename {loc => src/loc}/vi_vn.json (100%) rename {loc => src/loc}/zar_afr.json (100%) rename {loc => src/loc}/zar_xho.json (100%) rename {loc => src/loc}/zh_cn.json (100%) rename {loc => src/loc}/zh_tw.json (100%) rename {models => src/models}/bitcoinUnits.ts (100%) rename {models => src/models}/blockExplorer.ts (100%) rename {models => src/models}/fiatUnit.ts (99%) rename {models => src/models}/fiatUnits.json (100%) rename {models => src/models}/networkTransactionFees.ts (100%) rename {modules => src/modules}/Electrum.ts (99%) rename {modules => src/modules}/RustJsiBridge.ts (100%) rename {modules => src/modules}/SilentPaymentIndexer.ts (100%) rename {modules => src/modules}/analytics.ts (100%) rename {modules => src/modules}/base43.ts (100%) rename {modules => src/modules}/bc-bech32/Readme.md (100%) rename {modules => src/modules}/bc-bech32/package.json (100%) rename {modules => src/modules}/bc-ur/README.md (100%) rename {modules => src/modules}/bc-ur/package.json (100%) rename {modules => src/modules}/bip39.ts (100%) rename {modules => src/modules}/checksumWords.ts (100%) rename {modules => src/modules}/clipboard.ts (100%) rename {modules => src/modules}/constants.ts (100%) rename {modules => src/modules}/currency.ts (100%) rename {modules => src/modules}/debounce.ts (100%) rename {modules => src/modules}/encryption.ts (100%) rename {modules => src/modules}/environment.ts (100%) rename {modules => src/modules}/fs.ts (100%) rename {modules => src/modules}/hapticFeedback.ts (100%) rename {modules => src/modules}/noble_ecc.ts (100%) rename {modules => src/modules}/notifications.ts (99%) rename {modules => src/modules}/react-native-bw-file-access/.gitignore (100%) rename {modules => src/modules}/react-native-bw-file-access/README.md (100%) rename {modules => src/modules}/react-native-bw-file-access/index.ts (100%) rename {modules => src/modules}/react-native-bw-file-access/ios/BwFileAccess.h (100%) rename {modules => src/modules}/react-native-bw-file-access/ios/BwFileAccess.m (100%) rename {modules => src/modules}/react-native-bw-file-access/ios/BwFileAccess.xcodeproj/project.pbxproj (100%) rename {modules => src/modules}/react-native-bw-file-access/ios/BwFileAccess.xcworkspace/contents.xcworkspacedata (100%) rename {modules => src/modules}/react-native-bw-file-access/package.json (100%) rename {modules => src/modules}/react-native-bw-file-access/react-native-bw-file-access.podspec (100%) rename {modules => src/modules}/sizeClass.ts (100%) rename {modules => src/modules}/start-and-decrypt.ts (100%) rename {modules => src/modules}/uint8array-extras/index.d.ts (100%) rename {modules => src/modules}/uint8array-extras/index.js (100%) rename {modules => src/modules}/ur/index.js (100%) rename {navigation => src/navigation}/AddWalletStack.tsx (100%) rename {navigation => src/navigation}/DetailViewScreensStack.tsx (81%) rename {navigation => src/navigation}/DetailViewStackParamList.ts (96%) rename {navigation => src/navigation}/DrawerParamList.ts (100%) rename {navigation => src/navigation}/DrawerRoot.tsx (97%) rename {navigation => src/navigation}/LazyLoadAddWalletStack.tsx (69%) rename {navigation => src/navigation}/LazyLoadScanQRCodeStack.tsx (77%) rename {navigation => src/navigation}/LazyLoadSendDetailsStack.tsx (69%) rename {navigation => src/navigation}/LazyLoadSignVerifyStack.tsx (76%) rename {navigation => src/navigation}/LazyLoadWalletExportStack.tsx (77%) rename {navigation => src/navigation}/LazyLoadWalletXpubStack.tsx (78%) rename {navigation => src/navigation}/LazyLoadingIndicator.tsx (100%) rename {navigation => src/navigation}/MasterView.tsx (100%) rename NavigationService.ts => src/navigation/NavigationService.ts (100%) rename {navigation => src/navigation}/OnboardingStack.tsx (84%) rename {navigation => src/navigation}/ReceiveDetailsStackParamList.ts (100%) rename {navigation => src/navigation}/SendDetailsStack.tsx (98%) rename {navigation => src/navigation}/SendDetailsStackParamList.ts (97%) rename {navigation => src/navigation}/SignVerifyStack.tsx (100%) rename {navigation => src/navigation}/WalletExportStack.tsx (100%) rename {navigation => src/navigation}/WalletXpubStack.tsx (100%) rename {navigation => src/navigation}/helpers/getWalletTransactionsOptions.tsx (95%) rename {navigation => src/navigation}/index.tsx (97%) rename {screen => src/screens}/ActionSheet.common.ts (100%) rename {screen => src/screens}/ActionSheet.ts (100%) rename {screen => src/screens}/PlausibleDeniability.tsx (98%) rename {screen => src/screens}/SelectFeeScreen.tsx (100%) rename {screen => src/screens}/UnlockWith.tsx (98%) rename {screen => src/screens}/receive/ReceiveDetails.tsx (99%) rename {screen => src/screens}/send/Broadcast.tsx (99%) rename {screen => src/screens}/send/CoinControl.tsx (100%) rename {screen => src/screens}/send/Confirm.tsx (99%) rename {screen => src/screens}/send/ScanQRCode.tsx (99%) rename {screen => src/screens}/send/SendDetails.tsx (99%) rename {screen => src/screens}/send/create.js (99%) rename {screen => src/screens}/send/psbtWithHardwareWallet.js (99%) rename {screen => src/screens}/send/success.tsx (98%) rename {screen => src/screens}/settings/About.tsx (97%) rename {screen => src/screens}/settings/Currency.tsx (98%) rename {screen => src/screens}/settings/DefaultView.tsx (100%) rename {screen => src/screens}/settings/DeleteWallet.tsx (100%) rename {screen => src/screens}/settings/ElectrumSettings.tsx (99%) rename {screen => src/screens}/settings/EncryptStorage.tsx (100%) rename {screen => src/screens}/settings/GeneralSettings.tsx (100%) rename {screen => src/screens}/settings/IsItMyAddress.tsx (99%) rename {screen => src/screens}/settings/Language.tsx (100%) rename {screen => src/screens}/settings/Licensing.tsx (95%) rename {screen => src/screens}/settings/NetworkSettings.tsx (100%) rename {screen => src/screens}/settings/NotificationSettings.tsx (99%) rename {screen => src/screens}/settings/ReleaseNotes.tsx (73%) rename {screen => src/screens}/settings/SelfTest.tsx (98%) rename {screen => src/screens}/settings/Settings.tsx (100%) rename {screen => src/screens}/settings/SettingsBlockExplorer.tsx (100%) rename {screen => src/screens}/settings/SettingsPrivacy.tsx (100%) rename {screen => src/screens}/settings/tools.tsx (100%) rename {screen => src/screens}/transactions/CPFP.js (99%) rename {screen => src/screens}/transactions/RBFBumpFee.js (98%) rename {screen => src/screens}/transactions/RBFCancel.js (98%) rename {screen => src/screens}/transactions/TransactionDetails.tsx (99%) rename {screen => src/screens}/transactions/TransactionStatus.tsx (99%) rename {screen => src/screens}/wallets/Add.tsx (99%) rename {screen => src/screens}/wallets/CreateWalletScreen.tsx (100%) rename {screen => src/screens}/wallets/DrawerList.tsx (100%) rename {screen => src/screens}/wallets/ImportSpeed.tsx (97%) rename {screen => src/screens}/wallets/ImportWallet.tsx (99%) rename {screen => src/screens}/wallets/OnboardingScreen.tsx (100%) rename {screen => src/screens}/wallets/PleaseBackup.tsx (100%) rename {screen => src/screens}/wallets/ProvideEntropy.tsx (100%) rename {screen => src/screens}/wallets/WalletAddresses.tsx (100%) rename {screen => src/screens}/wallets/WalletDetails.tsx (99%) rename {screen => src/screens}/wallets/WalletExport.tsx (99%) rename {screen => src/screens}/wallets/WalletTransactions.tsx (100%) rename {screen => src/screens}/wallets/WalletsList.tsx (100%) rename {screen => src/screens}/wallets/generateWord.js (97%) rename {screen => src/screens}/wallets/signVerify.js (99%) rename {screen => src/screens}/wallets/xpub.styles.ts (100%) rename {screen => src/screens}/wallets/xpub.tsx (98%) rename {tests => src/tests}/.eslintrc (100%) rename {tests => src/tests}/custom-environment.js (100%) rename {tests => src/tests}/custom-reporter.js (100%) rename {tests => src/tests}/e2e/detox-build-release-apk.sh (100%) rename {tests => src/tests}/e2e/detox-prepare-android-emu.sh (100%) rename {tests => src/tests}/e2e/helperz.js (100%) rename {tests => src/tests}/e2e/jest.config.js (100%) rename {tests => src/tests}/e2e/shroud.spec.js (100%) rename {tests => src/tests}/e2e/shroud2.spec.js (100%) rename {tests => src/tests}/e2e/shroud3.spec.js (100%) rename {tests => src/tests}/integration/App.test.js (90%) rename {tests => src/tests}/integration/Currency.test.js (100%) rename {tests => src/tests}/integration/Electrum.test.js (100%) rename {tests => src/tests}/integration/ElectrumClient.test.js (100%) rename {tests => src/tests}/integration/notifications.test.js (100%) rename {tests => src/tests}/setup.js (100%) rename {tests => src/tests}/unit/addresses.test.ts (98%) rename {tests => src/tests}/unit/bip352.test.ts (100%) rename {tests => src/tests}/unit/checksumWords.test.ts (100%) rename {tests => src/tests}/unit/currency.test.ts (100%) rename {tests => src/tests}/unit/deeplink-schema-match.test.js (100%) rename {tests => src/tests}/unit/ecc.test.ts (100%) rename {tests => src/tests}/unit/encryption.test.ts (100%) rename {tests => src/tests}/unit/fixtures/caravan-multisig.json (100%) rename {tests => src/tests}/unit/fixtures/coldcardmk4/descriptor.txt (100%) rename {tests => src/tests}/unit/fixtures/coldcardmk4/new-wasabi.json (100%) rename {tests => src/tests}/unit/fixtures/coldcardmk4/sparrow-export.json (100%) rename {tests => src/tests}/unit/fixtures/electrum-multisig-wallet-with-seed-and-passphrase.json (100%) rename {tests => src/tests}/unit/fixtures/electrum-multisig-wallet-with-seed.json (100%) rename {tests => src/tests}/unit/fixtures/fromsparrow-coldcard.txt (100%) rename {tests => src/tests}/unit/fixtures/fromsparrow-electrum.json (100%) rename {tests => src/tests}/unit/fixtures/fromsparrow-specter.json (100%) rename {tests => src/tests}/unit/fixtures/nunchuck-bsms.txt (100%) rename {tests => src/tests}/unit/fixtures/skeleton-cobo.txt (100%) rename {tests => src/tests}/unit/fixtures/skeleton-coldcard.txt (100%) rename {tests => src/tests}/unit/fixtures/skeleton-electrum-hex-only.txt (100%) rename {tests => src/tests}/unit/fixtures/skeleton-electrum.txt (100%) rename {tests => src/tests}/unit/fixtures/skeleton-walletdescriptor.txt (100%) rename {tests => src/tests}/unit/hd-taproot-wallet.test.ts (100%) rename {tests => src/tests}/unit/isValidBech32Address.test.ts (100%) rename {tests => src/tests}/unit/loc.test.js (100%) rename {tests => src/tests}/unit/provide-entropy.test.ts (99%) rename {typings => src/typings}/ActionIcons.ts (100%) rename {typings => src/typings}/CommonToolTipActions.ts (100%) rename {typings => src/typings}/bip21.d.ts (100%) rename {typings => src/typings}/coinselect.d.ts (100%) rename {typings => src/typings}/globals.d.ts (100%) rename {typings => src/typings}/react-native-passcode-auth.d.ts (100%) rename {typings => src/typings}/react-native-prompt-android.d.ts (100%) rename {typings => src/typings}/tiny-secp256k1.d.ts (100%) rename {util => src/utils}/fetch.ts (100%) rename {utils => src/utils}/isValidBech32Address.ts (100%) rename {utils => src/utils}/transactionHelpers.ts (100%) diff --git a/.detoxrc.json b/.detoxrc.json index 7216cee9a..9ec06b779 100644 --- a/.detoxrc.json +++ b/.detoxrc.json @@ -2,7 +2,7 @@ "testRunner": { "$0": "jest", "args": { - "config": "tests/e2e/jest.config.js", + "config": "src/tests/e2e/jest.config.js", "_": ["e2e"] } }, @@ -21,7 +21,7 @@ "type": "android.apk", "testBinaryPath": "android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk", "binaryPath": "android/app/build/outputs/apk/release/app-release.apk", - "build": "./tests/e2e/detox-build-release-apk.sh" + "build": "./src/tests/e2e/detox-build-release-apk.sh" } }, "devices": { diff --git a/App.tsx b/App.tsx index e172a349a..db7cf84b9 100644 --- a/App.tsx +++ b/App.tsx @@ -1,15 +1,15 @@ import { NavigationContainer } from '@react-navigation/native'; import React from 'react'; import { SafeAreaProvider } from 'react-native-safe-area-context'; -import { SizeClassProvider } from './components/Context/SizeClassProvider'; -import { SettingsProvider } from './components/Context/SettingsProvider'; -import { BlueDefaultTheme } from './components/themes'; -import MasterView from './navigation/MasterView'; -import { navigationRef } from './NavigationService'; +import { SizeClassProvider } from './src/components/Context/SizeClassProvider'; +import { SettingsProvider } from './src/components/Context/SettingsProvider'; +import { BlueDefaultTheme } from './src/components/themes'; +import MasterView from './src/navigation/MasterView'; +import { navigationRef } from './src/navigation/NavigationService'; import { useLogger } from '@react-navigation/devtools'; -import { StorageProvider } from './components/Context/StorageProvider'; -import { initializeIndexer } from './modules/SilentPaymentIndexer'; -import { initializeRustJsiBridge } from './modules/RustJsiBridge'; +import { StorageProvider } from './src/components/Context/StorageProvider'; +import { initializeIndexer } from './src/modules/SilentPaymentIndexer'; +import { initializeRustJsiBridge } from './src/modules/RustJsiBridge'; const App = () => { initializeRustJsiBridge(); diff --git a/app.json b/app.json index 90c22bf68..dc5efd02f 100644 --- a/app.json +++ b/app.json @@ -4,7 +4,7 @@ "slug": "shroud-wallet", "version": "0.0.1", "orientation": "portrait", - "icon": "./img/icon.png", + "icon": "./src/img/icon.png", "userInterfaceStyle": "automatic", "splash": { "resizeMode": "contain", @@ -23,7 +23,7 @@ "android": { "package": "org.bitshala.shroud", "adaptiveIcon": { - "foregroundImage": "./img/icon.png", + "foregroundImage": "./src/img/icon.png", "backgroundColor": "#000000" }, "permissions": [ diff --git a/index.js b/index.js index cc7f33434..459fb5814 100644 --- a/index.js +++ b/index.js @@ -7,8 +7,8 @@ import React, { useEffect } from 'react'; import { AppRegistry, LogBox } from 'react-native'; import App from './App'; -import A from './modules/analytics'; -import { restoreSavedPreferredFiatCurrencyAndExchangeFromStorage } from './modules/currency'; +import A from './src/modules/analytics'; +import { restoreSavedPreferredFiatCurrencyAndExchangeFromStorage } from './src/modules/currency'; if (!Error.captureStackTrace) { // captureStackTrace is only available when debugging diff --git a/jest.config.js b/jest.config.js index aad6d2147..00f31ca4f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,6 @@ module.exports = { - testEnvironment: '/tests/custom-environment.js', - reporters: ['default', ['/tests/custom-reporter.js', {}]], + testEnvironment: '/src/tests/custom-environment.js', + reporters: ['default', ['/src/tests/custom-reporter.js', {}]], preset: 'react-native', transform: { '^.+\\.(ts|tsx)$': 'ts-jest', @@ -9,6 +9,6 @@ module.exports = { transformIgnorePatterns: [ 'node_modules/(?!((jest-)?react-native(-.*)?|@react-native(-community)?)|@rneui|silent-payments/|@react-navigation)', ], - setupFiles: ['./tests/setup.js'], + setupFiles: ['./src/tests/setup.js'], watchPathIgnorePatterns: ['/node_modules'], }; diff --git a/metro.config.js b/metro.config.js index 2bbba3625..5c18abfa8 100644 --- a/metro.config.js +++ b/metro.config.js @@ -15,7 +15,7 @@ const config = { crypto: require.resolve('crypto-browserify'), net: require.resolve('react-native-tcp-socket'), tls: require.resolve('react-native-tcp-socket'), - 'bc-bech32': path.resolve(__dirname, 'modules/bc-bech32'), + 'bc-bech32': path.resolve(__dirname, 'src/modules/bc-bech32'), }, }, }; diff --git a/modules/bc-bech32/dist/bech32.js b/modules/bc-bech32/dist/bech32.js deleted file mode 100644 index 509227178..000000000 --- a/modules/bc-bech32/dist/bech32.js +++ /dev/null @@ -1,136 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var index_1 = {}; -var Bech32Version; -(function (Bech32Version) { - Bech32Version[Bech32Version["Origin"] = 1] = "Origin"; - Bech32Version[Bech32Version["bis"] = 2] = "bis"; -})(Bech32Version = Bech32Version || (Bech32Version = {})); -index_1.Bech32Version=Bech32Version; -var CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'; -var GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]; -function polymod(values) { - var chk = 1; - for (var p = 0; p < values.length; ++p) { - var top_1 = chk >> 25; - chk = ((chk & 0x1ffffff) << 5) ^ values[p]; - for (var i = 0; i < 6; ++i) { - if ((top_1 >> i) & 1) { - chk ^= GENERATOR[i]; - } - } - } - return chk; -} -function hrpExpand(hrp) { - var ret = []; - var p; - for (p = 0; p < hrp.length; ++p) { - ret.push(hrp.charCodeAt(p) >> 5); - } - ret.push(0); - for (p = 0; p < hrp.length; ++p) { - ret.push(hrp.charCodeAt(p) & 31); - } - return ret; -} -function verifyChecksum(hrp, data, version) { - var header; - if (hrp) { - header = hrpExpand(hrp); - } - else { - header = [0]; - } - var check = version === index_1.Bech32Version.Origin ? 1 : 0x3fffffff; - return polymod(header.concat(data)) === check; -} -function createChecksum(hrp, data, bech32Version) { - var values; - if (hrp) { - values = hrpExpand(hrp).concat(data).concat([0, 0, 0, 0, 0, 0]); - } - else { - values = [0].concat(data).concat([0, 0, 0, 0, 0, 0]); - } - var chk = bech32Version === index_1.Bech32Version.Origin ? 1 : 0x3fffffff; - var mod = polymod(values) ^ chk; - var ret = []; - for (var p = 0; p < 6; ++p) { - ret.push((mod >> (5 * (5 - p))) & 31); - } - return ret; -} -var encode = function (hrp, data, version) { - var combined = data.concat(createChecksum(hrp, data, version)); - var ret; - if (hrp) { - ret = hrp + '1'; - } - else { - ret = ''; - } - for (var p = 0; p < combined.length; ++p) { - ret += CHARSET.charAt(combined[p]); - } - return ret; -}; -var decodeBc32 = function (bechString) { - var data = []; - for (var p = 0; p < bechString.length; ++p) { - var d = CHARSET.indexOf(bechString.charAt(p)); - if (d === -1) { - return null; - } - data.push(d); - } - if (!verifyChecksum(null, data, index_1.Bech32Version.bis)) { - return null; - } - return { hrp: null, data: data.slice(0, data.length - 6) }; -}; -var decode = function (bechString) { - var p; - var hasLower = false; - var hasUpper = false; - for (p = 0; p < bechString.length; ++p) { - if (bechString.charCodeAt(p) < 33 || bechString.charCodeAt(p) > 126) { - return null; - } - if (bechString.charCodeAt(p) >= 97 && bechString.charCodeAt(p) <= 122) { - hasLower = true; - } - if (bechString.charCodeAt(p) >= 65 && bechString.charCodeAt(p) <= 90) { - hasUpper = true; - } - } - if (hasLower && hasUpper) { - return null; - } - bechString = bechString.toLowerCase(); - var pos = bechString.lastIndexOf('1'); - if (pos === -1) { - return decodeBc32(bechString); - } - if (pos < 1 || pos + 7 > bechString.length || bechString.length > 90) { - return null; - } - var hrp = bechString.substring(0, pos); - var data = []; - for (p = pos + 1; p < bechString.length; ++p) { - var d = CHARSET.indexOf(bechString.charAt(p)); - if (d === -1) { - return null; - } - data.push(d); - } - if (!verifyChecksum(hrp, data, index_1.Bech32Version.Origin)) { - return null; - } - return { hrp: hrp, data: data.slice(0, data.length - 6) }; -}; -exports.default = { - encode: encode, - decode: decode, -}; -//# sourceMappingURL=bech32.js.map \ No newline at end of file diff --git a/modules/bc-bech32/dist/index.js b/modules/bc-bech32/dist/index.js deleted file mode 100644 index 3550fdc7a..000000000 --- a/modules/bc-bech32/dist/index.js +++ /dev/null @@ -1,75 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.decodeBc32Data = exports.encodeBc32Data = exports.encodeSegwitAddress = exports.decodeSegwitAddress = exports.Bech32Version = void 0; -var bech32_1 = __importDefault(require("./bech32")); -var Bech32Version; -(function (Bech32Version) { - Bech32Version[Bech32Version["Origin"] = 1] = "Origin"; - Bech32Version[Bech32Version["bis"] = 2] = "bis"; -})(Bech32Version = exports.Bech32Version || (exports.Bech32Version = {})); -var convertBits = function (data, fromBits, toBits, pad) { - var acc = 0; - var bits = 0; - var ret = []; - var maxv = (1 << toBits) - 1; - for (var p = 0; p < data.length; ++p) { - var value = data[p]; - if (value < 0 || value >> fromBits !== 0) { - return null; - } - acc = (acc << fromBits) | value; - bits += fromBits; - while (bits >= toBits) { - bits -= toBits; - ret.push((acc >> bits) & maxv); - } - } - if (pad) { - if (bits > 0) { - ret.push((acc << (toBits - bits)) & maxv); - } - } - else if (bits >= fromBits || (acc << (toBits - bits)) & maxv) { - return null; - } - return ret; -}; -exports.decodeSegwitAddress = function (hrp, addr) { - var dec = bech32_1.default.decode(addr); - if (dec === null || dec.hrp !== hrp || dec.data.length < 1 || dec.data[0] > 16) { - return null; - } - var res = convertBits(Uint8Array.from(dec.data.slice(1)), 5, 8, false); - if (res === null || res.length < 2 || res.length > 40) { - return null; - } - if (dec.data[0] === 0 && res.length !== 20 && res.length !== 32) { - return null; - } - return { version: dec.data[0], program: res }; -}; -exports.encodeSegwitAddress = function (hrp, version, program) { - var ret = bech32_1.default.encode(hrp, [version].concat(convertBits(program, 8, 5, true)), Bech32Version.Origin); - if (exports.decodeSegwitAddress(hrp, ret) === null) { - return null; - } - return ret; -}; -exports.encodeBc32Data = function (hex) { - var data = Buffer.from(hex, 'hex'); - return bech32_1.default.encode(null, convertBits(data, 8, 5, true), Bech32Version.bis); -}; -exports.decodeBc32Data = function (data) { - var result = bech32_1.default.decode(data); - if (result) { - var res = convertBits(Buffer.from(result.data), 5, 8, false); - return Buffer.from(res).toString('hex'); - } - else { - return null; - } -}; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/modules/bc-ur/dist/decodeUR.js b/modules/bc-ur/dist/decodeUR.js deleted file mode 100644 index 517f02c02..000000000 --- a/modules/bc-ur/dist/decodeUR.js +++ /dev/null @@ -1,115 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.extractSingleWorkload = exports.decodeUR = void 0; -var utils_1 = require("./utils"); -var miniCbor_1 = require("./miniCbor"); -var bc_bech32_1 = require("bc-bech32"); -var checkAndGetSequence = function (sequence) { - var pieces = sequence.toUpperCase().split('OF'); - if (pieces.length !== 2) - throw new Error("invalid sequence: " + sequence); - var index = pieces[0], total = pieces[1]; - return [+index, +total]; -}; -var checkDigest = function (digest, payload) { - if (bc_bech32_1.decodeBc32Data(digest) !== utils_1.sha256Hash(Buffer.from(bc_bech32_1.decodeBc32Data(payload), 'hex')).toString('hex')) { - throw new Error("invalid digest: \n digest:" + digest + " \n payload:" + payload); - } -}; -var checkURHeader = function (UR, type) { - if (type === void 0) { type = 'bytes'; } - if (UR.toUpperCase() !== ("ur:" + type).toUpperCase()) - throw new Error("invalid UR header: " + UR); -}; -var dealWithSingleWorkload = function (workload, type) { - if (type === void 0) { type = 'bytes'; } - var pieces = workload.split('/'); - switch (pieces.length) { - case 2: { - //UR:Type/[Fragment] - checkURHeader(pieces[0], type); - return pieces[1]; - } - case 3: { - //UR:Type/[Digest]/[Fragment] when Sequencing is omitted, Digest MAY be omitted; - //should check digest - checkURHeader(pieces[0], type); - var digest = pieces[1]; - var fragment = pieces[2]; - checkDigest(digest, fragment); - return fragment; - } - case 4: { - //UR:Type/[Sequencing]/[Digest]/[Fragment] - //should check sequencing and digest - checkURHeader(pieces[0], type); - checkAndGetSequence(pieces[1]); - var digest = pieces[2]; - var fragment = pieces[3]; - checkDigest(digest, fragment); - return fragment; - } - default: - throw new Error("invalid workload pieces length: expect 2 / 3 / 4 bug got " + pieces.length); - } -}; -var dealWithMultipleWorkloads = function (workloads, type) { - if (type === void 0) { type = 'bytes'; } - var length = workloads.length; - var fragments = new Array(length).fill(''); - var digest = ''; - workloads.forEach(function (workload) { - var pieces = workload.split('/'); - checkURHeader(pieces[0], type); - var _a = checkAndGetSequence(pieces[1]), index = _a[0], total = _a[1]; - if (total !== length) - throw new Error("invalid workload: " + workload + ", total " + total + " not equal workloads length " + length); - if (digest && digest !== pieces[2]) - throw new Error("invalid workload: " + workload + ", checksum changed " + digest + ", " + pieces[2]); - digest = pieces[2]; - if (fragments[index - 1]) - throw new Error("invalid workload: " + workload + ", index " + index + " has already been set"); - fragments[index - 1] = pieces[3]; - }); - var payload = fragments.join(''); - checkDigest(digest, payload); - return payload; -}; -var getBC32Payload = function (workloads, type) { - if (type === void 0) { type = 'bytes'; } - try { - var length_1 = workloads.length; - if (length_1 === 1) { - return dealWithSingleWorkload(workloads[0], type); - } - else { - return dealWithMultipleWorkloads(workloads, type); - } - } - catch (e) { - throw new Error("invalid workloads: " + workloads + "\n " + e); - } -}; -exports.decodeUR = function (workloads, type) { - if (type === void 0) { type = 'bytes'; } - var bc32Payload = getBC32Payload(workloads, type); - var cborPayload = bc_bech32_1.decodeBc32Data(bc32Payload); - return miniCbor_1.decodeSimpleCBOR(cborPayload); -}; -exports.extractSingleWorkload = function (workload) { - var pieces = workload.toUpperCase().split('/'); - switch (pieces.length) { - case 2: //UR:Type/[Fragment] - case 3: { - //UR:Type/[Digest]/[Fragment] when Sequencing is omitted, Digest MAY be omitted; - return [1, 1]; - } - case 4: { - //UR:Type/[Sequencing]/[Digest]/[Fragment] - return checkAndGetSequence(pieces[1]); - } - default: - throw new Error("invalid workload pieces length: expect 2 / 3 / 4 bug got " + pieces.length); - } -}; -//# sourceMappingURL=decodeUR.js.map \ No newline at end of file diff --git a/modules/bc-ur/dist/encodeUR.js b/modules/bc-ur/dist/encodeUR.js deleted file mode 100644 index 8e419cb04..000000000 --- a/modules/bc-ur/dist/encodeUR.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.encodeUR = void 0; -var miniCbor_1 = require("./miniCbor"); -var bc_bech32_1 = require("bc-bech32"); -var utils_1 = require("./utils"); -var composeUR = function (payload, type) { - if (type === void 0) { type = 'bytes'; } - return "ur:" + type + "/" + payload; -}; -var composeDigest = function (payload, digest) { - return digest + "/" + payload; -}; -var composeSequencing = function (payload, index, total) { - return index + 1 + "of" + total + "/" + payload; -}; -var composeHeadersToFragments = function (fragments, digest, type) { - if (type === void 0) { type = 'bytes'; } - if (fragments.length === 1) { - return [composeUR(fragments[0])]; - } - else { - return fragments.map(function (f, index) { - return utils_1.compose3(function (payload) { return composeUR(payload, type); }, function (payload) { return composeSequencing(payload, index, fragments.length); }, function (payload) { return composeDigest(payload, digest); })(f); - }); - } -}; -exports.encodeUR = function (payload, fragmentCapacity) { - if (fragmentCapacity === void 0) { fragmentCapacity = 200; } - var cborPayload = miniCbor_1.encodeSimpleCBOR(payload); - var bc32Payload = bc_bech32_1.encodeBc32Data(cborPayload); - var digest = utils_1.sha256Hash(Buffer.from(cborPayload, 'hex')).toString('hex'); - var bc32Digest = bc_bech32_1.encodeBc32Data(digest); - var fragments = bc32Payload.match(new RegExp('.{1,' + fragmentCapacity + '}', 'g')); - return composeHeadersToFragments(fragments, bc32Digest, 'bytes'); -}; -//# sourceMappingURL=encodeUR.js.map \ No newline at end of file diff --git a/modules/bc-ur/dist/index.js b/modules/bc-ur/dist/index.js deleted file mode 100644 index 2c808a8bd..000000000 --- a/modules/bc-ur/dist/index.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var encodeUR_1 = require("./encodeUR"); -Object.defineProperty(exports, "encodeUR", { enumerable: true, get: function () { return encodeUR_1.encodeUR; } }); -var decodeUR_1 = require("./decodeUR"); -Object.defineProperty(exports, "decodeUR", { enumerable: true, get: function () { return decodeUR_1.decodeUR; } }); -Object.defineProperty(exports, "extractSingleWorkload", { enumerable: true, get: function () { return decodeUR_1.extractSingleWorkload; } }); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/modules/bc-ur/dist/miniCbor.js b/modules/bc-ur/dist/miniCbor.js deleted file mode 100644 index 5967221a4..000000000 --- a/modules/bc-ur/dist/miniCbor.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.decodeSimpleCBOR = exports.encodeSimpleCBOR = exports.composeHeader = void 0; -/* - this an simple cbor implementation which is just using - on BCR-05 -*/ -exports.composeHeader = function (length) { - var header; - if (length > 0 && length <= 23) { - header = Buffer.from([0x40 + length]); - } - if (length >= 24 && length <= 255) { - var headerLength = Buffer.alloc(1); - headerLength.writeUInt8(length); - header = Buffer.concat([Buffer.from([0x58]), headerLength]); - } - if (length >= 256 && length <= 65535) { - var headerLength = Buffer.alloc(2); - headerLength.writeUInt16BE(length); - header = Buffer.concat([Buffer.from([0x59]), headerLength]); - } - if (length >= 65536 && length <= Math.pow(2, 32) - 1) { - var headerLength = Buffer.alloc(4); - headerLength.writeUInt32BE(length); - header = Buffer.concat([Buffer.from([0x60]), headerLength]); - } - return header; -}; -exports.encodeSimpleCBOR = function (data) { - var bufferData = Buffer.from(data, 'hex'); - if (bufferData.length <= 0 || bufferData.length >= Math.pow(2, 32)) { - throw new Error('data is too large'); - } - var header = exports.composeHeader(bufferData.length); - var endcoded = Buffer.concat([header, bufferData]); - return endcoded.toString('hex'); -}; -exports.decodeSimpleCBOR = function (data) { - var dataBuffer = Buffer.from(data, 'hex'); - if (dataBuffer.length <= 0) { - throw new Error('input data is not valid'); - } - var header = dataBuffer[0]; - if (header < 0x58) { - var dataLength = header - 0x40; - return dataBuffer.slice(1, 1 + dataLength).toString('hex'); - } - if (header == 0x58) { - var dataLength = dataBuffer.slice(1, 2).readUInt8(); - return dataBuffer.slice(2, 2 + dataLength).toString('hex'); - } - if (header == 0x59) { - var dataLength = dataBuffer.slice(1, 3).readUInt16BE(); - return dataBuffer.slice(3, 3 + dataLength).toString('hex'); - } - if (header == 0x60) { - var dataLength = dataBuffer.slice(1, 5).readUInt32BE(); - return dataBuffer.slice(5, 5 + dataLength).toString('hex'); - } -}; -//# sourceMappingURL=miniCbor.js.map \ No newline at end of file diff --git a/modules/bc-ur/dist/utils.js b/modules/bc-ur/dist/utils.js deleted file mode 100644 index 514588dd8..000000000 --- a/modules/bc-ur/dist/utils.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; -import { sha256 as _sha256 } from '@noble/hashes/sha256'; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.compose3 = exports.sha256Hash = void 0; -var bitcoinjs_lib_1 = require("bitcoinjs-lib"); -const {uint8ArrayToHex} = require("../../uint8array-extras"); -exports.sha256Hash = function (data) { - return bitcoinjs_crypto_sha256(data); -}; - -function bitcoinjs_crypto_sha256(buffer/*: Buffer*/)/*: Buffer*/ { - return Buffer.from(_sha256(Uint8Array.from(buffer))); -} - - -exports.compose3 = function (f, g, h) { return function (x) { - return f(g(h(x))); -}; }; -//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8deffc631..d86ed9cf0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "@silent-pay/core": "^0.0.6", "assert": "2.1.0", "base-x": "4.0.1", - "bc-bech32": "file:modules/bc-bech32", + "bc-bech32": "file:src/modules/bc-bech32", "bech32": "2.0.0", "bignumber.js": "9.3.1", "bip21": "2.0.3", @@ -142,6 +142,7 @@ }, "modules/bc-bech32": { "version": "1.0.2", + "extraneous": true, "license": "MIT" }, "node_modules/@ampproject/remapping": { @@ -7939,7 +7940,7 @@ } }, "node_modules/bc-bech32": { - "resolved": "modules/bc-bech32", + "resolved": "src/modules/bc-bech32", "link": true }, "node_modules/bech32": { @@ -21843,6 +21844,10 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "src/modules/bc-bech32": { + "version": "1.0.2", + "license": "MIT" } } } diff --git a/package.json b/package.json index 5a181d9ce..e37dbb431 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "postinstall": "npm run releasenotes2json; npm run branch2json; npm run patches", "patches": "npx --yes patch-package", "test": "npm run tslint && npm run lint && npm run unit && npm run integration", - "integration": "jest tests/integration/*", + "integration": "jest src/tests/integration/*", "e2e:debug-build": "detox build -c android.debug", "e2e:debug-test": "detox test -c android.debug -d 200000 --loglevel error --reuse", "e2e:debug-test-device": "detox test -c android.debug.device -d 200000 --loglevel error --reuse", @@ -73,10 +73,10 @@ "e2e:release-test": "detox test -c android.release --loglevel error", "e2e:release-test-device": "detox test -c android.release.device --loglevel info --record-videos all", "tslint": "tsc", - "lint": "node scripts/find-unused-loc.js && eslint --ext .js,.ts,.tsx '*.@(js|ts|tsx)' screen 'modules/*.@(js|ts|tsx)' class models loc tests components navigation typings helpers hooks util utils", + "lint": "node scripts/find-unused-loc.js && eslint --ext .js,.ts,.tsx '*.@(js|ts|tsx)' src", "lint:fix": "npm run lint -- --fix", "lint:quickfix": "git status --porcelain | grep -v '\\.json' | grep -E '\\.js|\\.ts' --color=never | awk '{print $2}' | xargs eslint --fix; exit 0", - "unit": "jest -b -w tests/unit/*", + "unit": "jest -b -w src/tests/unit/*", "rust:build": "bash rust-native-setup.sh", "rust:ios": "bash rust-native-setup.sh ios", "rust:rebuild": "cd rust_jsi_bridge && cargo clean && cd .. && npm run rust:build", @@ -108,7 +108,7 @@ "@silent-pay/core": "^0.0.6", "assert": "2.1.0", "base-x": "4.0.1", - "bc-bech32": "file:modules/bc-bech32", + "bc-bech32": "file:src/modules/bc-bech32", "bech32": "2.0.0", "bignumber.js": "9.3.1", "bip21": "2.0.3", diff --git a/scripts/find-unused-loc.js b/scripts/find-unused-loc.js index 03c90b0a9..58a7fabaa 100644 --- a/scripts/find-unused-loc.js +++ b/scripts/find-unused-loc.js @@ -1,9 +1,9 @@ const fs = require('fs'); const path = require('path'); -const mainLocFile = './loc/en.json'; -const dirsToInterate = ['components', 'screen', 'modules', 'class', 'hooks', 'helpers', 'navigation', 'typings']; -const addFiles = ['ShroudComponents.js', 'App.tsx', 'navigation/index.tsx']; +const mainLocFile = './src/loc/en.json'; +const dirsToInterate = ['src/components', 'src/screens', 'src/modules', 'src/class', 'src/hooks', 'src/helpers', 'src/navigation', 'src/typings']; +const addFiles = ['src/components/ShroudComponents.js', 'App.tsx', 'src/navigation/index.tsx']; const allowedLocPrefixes = ['loc.lnurl_auth', 'loc.units']; const allLocKeysHashmap = {}; // loc key -> used or not diff --git a/scripts/run-ln-acceptance-tests.sh b/scripts/run-ln-acceptance-tests.sh index fac479301..56cbcb742 100755 --- a/scripts/run-ln-acceptance-tests.sh +++ b/scripts/run-ln-acceptance-tests.sh @@ -1 +1 @@ -./node_modules/.bin/jest --testNamePattern='can pay invoice' tests/integration/lightning-custodian-wallet.test.js +./node_modules/.bin/jest --testNamePattern='can pay invoice' src/tests/integration/lightning-custodian-wallet.test.js diff --git a/class/bip39_wallet_formats.json b/src/class/bip39_wallet_formats.json similarity index 100% rename from class/bip39_wallet_formats.json rename to src/class/bip39_wallet_formats.json diff --git a/class/camera.ts b/src/class/camera.ts similarity index 100% rename from class/camera.ts rename to src/class/camera.ts diff --git a/class/deeplink-schema-match.ts b/src/class/deeplink-schema-match.ts similarity index 100% rename from class/deeplink-schema-match.ts rename to src/class/deeplink-schema-match.ts diff --git a/class/hd-segwit-bech32-transaction.ts b/src/class/hd-segwit-bech32-transaction.ts similarity index 100% rename from class/hd-segwit-bech32-transaction.ts rename to src/class/hd-segwit-bech32-transaction.ts diff --git a/class/index.ts b/src/class/index.ts similarity index 100% rename from class/index.ts rename to src/class/index.ts diff --git a/class/rng.ts b/src/class/rng.ts similarity index 100% rename from class/rng.ts rename to src/class/rng.ts diff --git a/class/shroud-app.ts b/src/class/shroud-app.ts similarity index 100% rename from class/shroud-app.ts rename to src/class/shroud-app.ts diff --git a/class/wallet-gradient.ts b/src/class/wallet-gradient.ts similarity index 100% rename from class/wallet-gradient.ts rename to src/class/wallet-gradient.ts diff --git a/class/wallets/abstract-hd-electrum-wallet.ts b/src/class/wallets/abstract-hd-electrum-wallet.ts similarity index 100% rename from class/wallets/abstract-hd-electrum-wallet.ts rename to src/class/wallets/abstract-hd-electrum-wallet.ts diff --git a/class/wallets/abstract-hd-wallet.ts b/src/class/wallets/abstract-hd-wallet.ts similarity index 100% rename from class/wallets/abstract-hd-wallet.ts rename to src/class/wallets/abstract-hd-wallet.ts diff --git a/class/wallets/abstract-wallet.ts b/src/class/wallets/abstract-wallet.ts similarity index 100% rename from class/wallets/abstract-wallet.ts rename to src/class/wallets/abstract-wallet.ts diff --git a/class/wallets/hd-bip352-wallet.ts b/src/class/wallets/hd-bip352-wallet.ts similarity index 100% rename from class/wallets/hd-bip352-wallet.ts rename to src/class/wallets/hd-bip352-wallet.ts diff --git a/class/wallets/hd-taproot-wallet.ts b/src/class/wallets/hd-taproot-wallet.ts similarity index 100% rename from class/wallets/hd-taproot-wallet.ts rename to src/class/wallets/hd-taproot-wallet.ts diff --git a/class/wallets/types.ts b/src/class/wallets/types.ts similarity index 100% rename from class/wallets/types.ts rename to src/class/wallets/types.ts diff --git a/components/AddressInput.tsx b/src/components/AddressInput.tsx similarity index 100% rename from components/AddressInput.tsx rename to src/components/AddressInput.tsx diff --git a/components/AddressInputScanButton.tsx b/src/components/AddressInputScanButton.tsx similarity index 100% rename from components/AddressInputScanButton.tsx rename to src/components/AddressInputScanButton.tsx diff --git a/components/Alert.ts b/src/components/Alert.ts similarity index 97% rename from components/Alert.ts rename to src/components/Alert.ts index a8a370991..de6b309a0 100644 --- a/components/Alert.ts +++ b/src/components/Alert.ts @@ -1,7 +1,7 @@ import { Alert as RNAlert, Platform, ToastAndroid, AlertButton, AlertOptions } from 'react-native'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../modules/hapticFeedback'; import loc from '../loc'; -import { navigationRef } from '../NavigationService'; +import { navigationRef } from '../navigation/NavigationService'; export enum AlertType { Alert, diff --git a/components/AmountInput.tsx b/src/components/AmountInput.tsx similarity index 99% rename from components/AmountInput.tsx rename to src/components/AmountInput.tsx index e1a7cfea3..c1dd4446b 100644 --- a/components/AmountInput.tsx +++ b/src/components/AmountInput.tsx @@ -24,7 +24,7 @@ import { satoshiToBTC, updateExchangeRate, } from '../modules/currency'; -import { ShroudText } from '../ShroudComponents'; +import { ShroudText } from '../components/ShroudComponents'; import confirm from '../helpers/confirm'; import loc, { formatBalancePlain, formatBalanceWithoutSuffix, removeTrailingZeros } from '../loc'; import { BitcoinUnit } from '../models/bitcoinUnits'; diff --git a/components/BigCheckmark.tsx b/src/components/BigCheckmark.tsx similarity index 100% rename from components/BigCheckmark.tsx rename to src/components/BigCheckmark.tsx diff --git a/components/BlurredBalanceView.tsx b/src/components/BlurredBalanceView.tsx similarity index 100% rename from components/BlurredBalanceView.tsx rename to src/components/BlurredBalanceView.tsx diff --git a/components/BottomModal.tsx b/src/components/BottomModal.tsx similarity index 100% rename from components/BottomModal.tsx rename to src/components/BottomModal.tsx diff --git a/components/Button.tsx b/src/components/Button.tsx similarity index 100% rename from components/Button.tsx rename to src/components/Button.tsx diff --git a/components/CameraScreen.tsx b/src/components/CameraScreen.tsx similarity index 100% rename from components/CameraScreen.tsx rename to src/components/CameraScreen.tsx diff --git a/components/CoinsSelected.tsx b/src/components/CoinsSelected.tsx similarity index 100% rename from components/CoinsSelected.tsx rename to src/components/CoinsSelected.tsx diff --git a/components/Context/SettingsProvider.tsx b/src/components/Context/SettingsProvider.tsx similarity index 100% rename from components/Context/SettingsProvider.tsx rename to src/components/Context/SettingsProvider.tsx diff --git a/components/Context/SizeClassProvider.tsx b/src/components/Context/SizeClassProvider.tsx similarity index 100% rename from components/Context/SizeClassProvider.tsx rename to src/components/Context/SizeClassProvider.tsx diff --git a/components/Context/StorageProvider.tsx b/src/components/Context/StorageProvider.tsx similarity index 99% rename from components/Context/StorageProvider.tsx rename to src/components/Context/StorageProvider.tsx index 61c3797b4..5d970b6c4 100644 --- a/components/Context/StorageProvider.tsx +++ b/src/components/Context/StorageProvider.tsx @@ -11,7 +11,7 @@ import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/haptic import { startAndDecrypt } from '../../modules/start-and-decrypt'; import { isNotificationsEnabled, majorTomToGroundControl, unsubscribe } from '../../modules/notifications'; import { BitcoinUnit } from '../../models/bitcoinUnits'; -import { navigationRef } from '../../NavigationService'; +import { navigationRef } from '../../navigation/NavigationService'; const shroudApp = ShroudApp.getInstance(); diff --git a/components/CopyTextToClipboard.tsx b/src/components/CopyTextToClipboard.tsx similarity index 100% rename from components/CopyTextToClipboard.tsx rename to src/components/CopyTextToClipboard.tsx diff --git a/components/CopyToClipboardButton.tsx b/src/components/CopyToClipboardButton.tsx similarity index 100% rename from components/CopyToClipboardButton.tsx rename to src/components/CopyToClipboardButton.tsx diff --git a/components/DevMenu.tsx b/src/components/DevMenu.tsx similarity index 100% rename from components/DevMenu.tsx rename to src/components/DevMenu.tsx diff --git a/components/DismissKeyboardInputAccessory.tsx b/src/components/DismissKeyboardInputAccessory.tsx similarity index 93% rename from components/DismissKeyboardInputAccessory.tsx rename to src/components/DismissKeyboardInputAccessory.tsx index 396d0e1d2..e686fdffb 100644 --- a/components/DismissKeyboardInputAccessory.tsx +++ b/src/components/DismissKeyboardInputAccessory.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { InputAccessoryView, Keyboard, Platform, StyleSheet, View } from 'react-native'; import { useTheme } from './themes'; -import { ShroudButtonLink } from '../ShroudComponents'; +import { ShroudButtonLink } from '../components/ShroudComponents'; import loc from '../loc'; export const DismissKeyboardInputAccessoryViewID = 'DismissKeyboardInputAccessory'; diff --git a/components/DoneAndDismissKeyboardInputAccessory.tsx b/src/components/DoneAndDismissKeyboardInputAccessory.tsx similarity index 95% rename from components/DoneAndDismissKeyboardInputAccessory.tsx rename to src/components/DoneAndDismissKeyboardInputAccessory.tsx index ca96831b0..c2743815f 100644 --- a/components/DoneAndDismissKeyboardInputAccessory.tsx +++ b/src/components/DoneAndDismissKeyboardInputAccessory.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { InputAccessoryView, Keyboard, Platform, StyleSheet, View } from 'react-native'; -import { ShroudButtonLink } from '../ShroudComponents'; +import { ShroudButtonLink } from '../components/ShroudComponents'; import loc from '../loc'; import { useTheme } from './themes'; import * as Clipboard from 'expo-clipboard'; diff --git a/components/DynamicQRCode.tsx b/src/components/DynamicQRCode.tsx similarity index 100% rename from components/DynamicQRCode.tsx rename to src/components/DynamicQRCode.tsx diff --git a/components/FloatButtons.tsx b/src/components/FloatButtons.tsx similarity index 100% rename from components/FloatButtons.tsx rename to src/components/FloatButtons.tsx diff --git a/components/Header.tsx b/src/components/Header.tsx similarity index 100% rename from components/Header.tsx rename to src/components/Header.tsx diff --git a/components/HeaderMenuButton.tsx b/src/components/HeaderMenuButton.tsx similarity index 100% rename from components/HeaderMenuButton.tsx rename to src/components/HeaderMenuButton.tsx diff --git a/components/HeaderRightButton.tsx b/src/components/HeaderRightButton.tsx similarity index 100% rename from components/HeaderRightButton.tsx rename to src/components/HeaderRightButton.tsx diff --git a/components/HighlightedText.tsx b/src/components/HighlightedText.tsx similarity index 100% rename from components/HighlightedText.tsx rename to src/components/HighlightedText.tsx diff --git a/components/InputAccessoryAllFunds.tsx b/src/components/InputAccessoryAllFunds.tsx similarity index 97% rename from components/InputAccessoryAllFunds.tsx rename to src/components/InputAccessoryAllFunds.tsx index cd9c5e86c..05d9b8995 100644 --- a/components/InputAccessoryAllFunds.tsx +++ b/src/components/InputAccessoryAllFunds.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { InputAccessoryView, Keyboard, Platform, StyleSheet, View } from 'react-native'; import { Text } from '@rneui/themed'; -import { ShroudButtonLink } from '../ShroudComponents'; +import { ShroudButtonLink } from '../components/ShroudComponents'; import loc from '../loc'; import { BitcoinUnit } from '../models/bitcoinUnits'; import { useTheme } from './themes'; diff --git a/components/ListItem.tsx b/src/components/ListItem.tsx similarity index 100% rename from components/ListItem.tsx rename to src/components/ListItem.tsx diff --git a/components/Loading.tsx b/src/components/Loading.tsx similarity index 100% rename from components/Loading.tsx rename to src/components/Loading.tsx diff --git a/components/PromptPasswordConfirmationModal.tsx b/src/components/PromptPasswordConfirmationModal.tsx similarity index 100% rename from components/PromptPasswordConfirmationModal.tsx rename to src/components/PromptPasswordConfirmationModal.tsx diff --git a/components/QRCodeComponent.tsx b/src/components/QRCodeComponent.tsx similarity index 100% rename from components/QRCodeComponent.tsx rename to src/components/QRCodeComponent.tsx diff --git a/components/ReplaceFeeSuggestions.tsx b/src/components/ReplaceFeeSuggestions.tsx similarity index 99% rename from components/ReplaceFeeSuggestions.tsx rename to src/components/ReplaceFeeSuggestions.tsx index a785e434e..5c0edb677 100644 --- a/components/ReplaceFeeSuggestions.tsx +++ b/src/components/ReplaceFeeSuggestions.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect, useRef, useCallback } from 'react'; import { View, Text, TextInput, TouchableOpacity, Keyboard, StyleSheet } from 'react-native'; import AsyncStorage from '@react-native-async-storage/async-storage'; -import { ShroudText } from '../ShroudComponents'; +import { ShroudText } from '../components/ShroudComponents'; import loc, { formatStringAddTwoWhiteSpaces } from '../loc'; import NetworkTransactionFees, { NetworkTransactionFee, NetworkTransactionFeeType } from '../models/networkTransactionFees'; import { useTheme } from './themes'; diff --git a/components/SafeArea.tsx b/src/components/SafeArea.tsx similarity index 100% rename from components/SafeArea.tsx rename to src/components/SafeArea.tsx diff --git a/components/SafeAreaFlatList.tsx b/src/components/SafeAreaFlatList.tsx similarity index 100% rename from components/SafeAreaFlatList.tsx rename to src/components/SafeAreaFlatList.tsx diff --git a/components/SafeAreaScrollView.tsx b/src/components/SafeAreaScrollView.tsx similarity index 100% rename from components/SafeAreaScrollView.tsx rename to src/components/SafeAreaScrollView.tsx diff --git a/components/SafeAreaSectionList.tsx b/src/components/SafeAreaSectionList.tsx similarity index 100% rename from components/SafeAreaSectionList.tsx rename to src/components/SafeAreaSectionList.tsx diff --git a/components/SaveFileButton.tsx b/src/components/SaveFileButton.tsx similarity index 100% rename from components/SaveFileButton.tsx rename to src/components/SaveFileButton.tsx diff --git a/components/ScanIcon.tsx b/src/components/ScanIcon.tsx similarity index 100% rename from components/ScanIcon.tsx rename to src/components/ScanIcon.tsx diff --git a/components/SecondButton.tsx b/src/components/SecondButton.tsx similarity index 100% rename from components/SecondButton.tsx rename to src/components/SecondButton.tsx diff --git a/components/SeedVerification.tsx b/src/components/SeedVerification.tsx similarity index 100% rename from components/SeedVerification.tsx rename to src/components/SeedVerification.tsx diff --git a/components/SeedWords.tsx b/src/components/SeedWords.tsx similarity index 100% rename from components/SeedWords.tsx rename to src/components/SeedWords.tsx diff --git a/components/SegmentControl.tsx b/src/components/SegmentControl.tsx similarity index 100% rename from components/SegmentControl.tsx rename to src/components/SegmentControl.tsx diff --git a/components/SettingsBlockExplorerCustomUrlListItem.tsx b/src/components/SettingsBlockExplorerCustomUrlListItem.tsx similarity index 100% rename from components/SettingsBlockExplorerCustomUrlListItem.tsx rename to src/components/SettingsBlockExplorerCustomUrlListItem.tsx diff --git a/ShroudComponents.js b/src/components/ShroudComponents.js similarity index 98% rename from ShroudComponents.js rename to src/components/ShroudComponents.js index 5b25c0e20..d55b09d77 100644 --- a/ShroudComponents.js +++ b/src/components/ShroudComponents.js @@ -2,7 +2,7 @@ import React, { forwardRef } from 'react'; import { Dimensions, Platform, Pressable, StyleSheet, TextInput, View } from 'react-native'; import { Icon, Text } from '@rneui/themed'; -import { useTheme } from './components/themes'; +import { useTheme } from './themes'; import { useLocale } from '@react-navigation/native'; const { height, width } = Dimensions.get('window'); diff --git a/components/Spacing.tsx b/src/components/Spacing.tsx similarity index 100% rename from components/Spacing.tsx rename to src/components/Spacing.tsx diff --git a/components/Tabs.tsx b/src/components/Tabs.tsx similarity index 100% rename from components/Tabs.tsx rename to src/components/Tabs.tsx diff --git a/components/TipBox.tsx b/src/components/TipBox.tsx similarity index 96% rename from components/TipBox.tsx rename to src/components/TipBox.tsx index d87076acc..1c283ed8b 100644 --- a/components/TipBox.tsx +++ b/src/components/TipBox.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { View, StyleSheet, ViewStyle } from 'react-native'; import { useTheme } from './themes'; -import { ShroudText } from '../ShroudComponents'; +import { ShroudText } from '../components/ShroudComponents'; interface TipBoxProps { number?: string; diff --git a/components/TooltipMenu.tsx b/src/components/TooltipMenu.tsx similarity index 100% rename from components/TooltipMenu.tsx rename to src/components/TooltipMenu.tsx diff --git a/components/TransactionListItem.tsx b/src/components/TransactionListItem.tsx similarity index 99% rename from components/TransactionListItem.tsx rename to src/components/TransactionListItem.tsx index 638825fba..eeec80662 100644 --- a/components/TransactionListItem.tsx +++ b/src/components/TransactionListItem.tsx @@ -14,7 +14,7 @@ import { DetailViewStackParamList } from '../navigation/DetailViewStackParamList import { useStorage } from '../hooks/context/useStorage'; import ToolTipMenu from './TooltipMenu'; import { CommonToolTipActions } from '../typings/CommonToolTipActions'; -import { pop } from '../NavigationService'; +import { pop } from '../navigation/NavigationService'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import HighlightedText from './HighlightedText'; import { shortenAddress, getRelevantAddress } from '../utils/transactionHelpers'; diff --git a/components/TransactionPendingIconBig.tsx b/src/components/TransactionPendingIconBig.tsx similarity index 100% rename from components/TransactionPendingIconBig.tsx rename to src/components/TransactionPendingIconBig.tsx diff --git a/components/TransactionsNavigationHeader.tsx b/src/components/TransactionsNavigationHeader.tsx similarity index 100% rename from components/TransactionsNavigationHeader.tsx rename to src/components/TransactionsNavigationHeader.tsx diff --git a/components/WalletBirthSection.tsx b/src/components/WalletBirthSection.tsx similarity index 95% rename from components/WalletBirthSection.tsx rename to src/components/WalletBirthSection.tsx index 520067791..ca1a02942 100644 --- a/components/WalletBirthSection.tsx +++ b/src/components/WalletBirthSection.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { Platform, StyleSheet, TextInput, View } from 'react-native'; -import { ShroudFormLabel } from '../ShroudComponents'; +import { ShroudFormLabel } from '../components/ShroudComponents'; import { useTheme } from './themes'; import loc from '../loc'; diff --git a/components/WalletsCarousel.tsx b/src/components/WalletsCarousel.tsx similarity index 100% rename from components/WalletsCarousel.tsx rename to src/components/WalletsCarousel.tsx diff --git a/components/addresses/AddressItem.tsx b/src/components/addresses/AddressItem.tsx similarity index 100% rename from components/addresses/AddressItem.tsx rename to src/components/addresses/AddressItem.tsx diff --git a/components/addresses/AddressTypeBadge.tsx b/src/components/addresses/AddressTypeBadge.tsx similarity index 100% rename from components/addresses/AddressTypeBadge.tsx rename to src/components/addresses/AddressTypeBadge.tsx diff --git a/components/icons/SettingsButton.tsx b/src/components/icons/SettingsButton.tsx similarity index 100% rename from components/icons/SettingsButton.tsx rename to src/components/icons/SettingsButton.tsx diff --git a/components/icons/TransactionIncomingIcon.tsx b/src/components/icons/TransactionIncomingIcon.tsx similarity index 100% rename from components/icons/TransactionIncomingIcon.tsx rename to src/components/icons/TransactionIncomingIcon.tsx diff --git a/components/icons/TransactionOutgoingIcon.tsx b/src/components/icons/TransactionOutgoingIcon.tsx similarity index 100% rename from components/icons/TransactionOutgoingIcon.tsx rename to src/components/icons/TransactionOutgoingIcon.tsx diff --git a/components/icons/TransactionPendingIcon.tsx b/src/components/icons/TransactionPendingIcon.tsx similarity index 100% rename from components/icons/TransactionPendingIcon.tsx rename to src/components/icons/TransactionPendingIcon.tsx diff --git a/components/navigationStyle.tsx b/src/components/navigationStyle.tsx similarity index 100% rename from components/navigationStyle.tsx rename to src/components/navigationStyle.tsx diff --git a/components/themes.ts b/src/components/themes.ts similarity index 100% rename from components/themes.ts rename to src/components/themes.ts diff --git a/components/types.ts b/src/components/types.ts similarity index 100% rename from components/types.ts rename to src/components/types.ts diff --git a/helpers/confirm.ts b/src/helpers/confirm.ts similarity index 100% rename from helpers/confirm.ts rename to src/helpers/confirm.ts diff --git a/helpers/presentWalletExportReminder.ts b/src/helpers/presentWalletExportReminder.ts similarity index 100% rename from helpers/presentWalletExportReminder.ts rename to src/helpers/presentWalletExportReminder.ts diff --git a/helpers/prompt.ts b/src/helpers/prompt.ts similarity index 100% rename from helpers/prompt.ts rename to src/helpers/prompt.ts diff --git a/helpers/scan-qr.ts b/src/helpers/scan-qr.ts similarity index 92% rename from helpers/scan-qr.ts rename to src/helpers/scan-qr.ts index c1e2fe6d8..9c7b84d57 100644 --- a/helpers/scan-qr.ts +++ b/src/helpers/scan-qr.ts @@ -1,5 +1,5 @@ import { Camera } from 'expo-camera'; -import { navigationRef } from '../NavigationService'; +import { navigationRef } from '../navigation/NavigationService'; const isCameraAuthorizationStatusGranted = async () => { const { status } = await Camera.getCameraPermissionsAsync(); diff --git a/helpers/silent-payments/IndexerHttpClient.ts b/src/helpers/silent-payments/IndexerHttpClient.ts similarity index 94% rename from helpers/silent-payments/IndexerHttpClient.ts rename to src/helpers/silent-payments/IndexerHttpClient.ts index 2fcdc724b..0a2ac204d 100644 --- a/helpers/silent-payments/IndexerHttpClient.ts +++ b/src/helpers/silent-payments/IndexerHttpClient.ts @@ -1,4 +1,4 @@ -import { fetchWithRetries } from '../../util/fetch'; +import { fetchWithRetries } from '../../utils/fetch'; export class IndexerHttpClient { constructor( diff --git a/helpers/silent-payments/RustTransactionProcessor.ts b/src/helpers/silent-payments/RustTransactionProcessor.ts similarity index 100% rename from helpers/silent-payments/RustTransactionProcessor.ts rename to src/helpers/silent-payments/RustTransactionProcessor.ts diff --git a/helpers/silent-payments/SilentPaymentKeyDerivation.ts b/src/helpers/silent-payments/SilentPaymentKeyDerivation.ts similarity index 100% rename from helpers/silent-payments/SilentPaymentKeyDerivation.ts rename to src/helpers/silent-payments/SilentPaymentKeyDerivation.ts diff --git a/helpers/silent-payments/index.ts b/src/helpers/silent-payments/index.ts similarity index 100% rename from helpers/silent-payments/index.ts rename to src/helpers/silent-payments/index.ts diff --git a/helpers/silent-payments/types.ts b/src/helpers/silent-payments/types.ts similarity index 100% rename from helpers/silent-payments/types.ts rename to src/helpers/silent-payments/types.ts diff --git a/hooks/context/useSettings.ts b/src/hooks/context/useSettings.ts similarity index 100% rename from hooks/context/useSettings.ts rename to src/hooks/context/useSettings.ts diff --git a/hooks/context/useStorage.ts b/src/hooks/context/useStorage.ts similarity index 100% rename from hooks/context/useStorage.ts rename to src/hooks/context/useStorage.ts diff --git a/hooks/useAnimateOnChange.ts b/src/hooks/useAnimateOnChange.ts similarity index 100% rename from hooks/useAnimateOnChange.ts rename to src/hooks/useAnimateOnChange.ts diff --git a/hooks/useAppState.ts b/src/hooks/useAppState.ts similarity index 100% rename from hooks/useAppState.ts rename to src/hooks/useAppState.ts diff --git a/hooks/useBiometrics.ts b/src/hooks/useBiometrics.ts similarity index 98% rename from hooks/useBiometrics.ts rename to src/hooks/useBiometrics.ts index da563b9ec..969c4c39f 100644 --- a/hooks/useBiometrics.ts +++ b/src/hooks/useBiometrics.ts @@ -3,7 +3,7 @@ import { Alert, Platform } from 'react-native'; import ReactNativeBiometrics, { BiometryTypes as RNBiometryTypes } from 'react-native-biometrics'; import RNSecureKeyStore, { ACCESSIBLE } from 'react-native-secure-key-store'; import loc from '../loc'; -import * as NavigationService from '../NavigationService'; +import * as NavigationService from '../navigation/NavigationService'; import presentAlert from '../components/Alert'; import { useStorage } from './context/useStorage'; diff --git a/hooks/useBounceAnimation.ts b/src/hooks/useBounceAnimation.ts similarity index 100% rename from hooks/useBounceAnimation.ts rename to src/hooks/useBounceAnimation.ts diff --git a/hooks/useCompanionListeners.ts b/src/hooks/useCompanionListeners.ts similarity index 98% rename from hooks/useCompanionListeners.ts rename to src/hooks/useCompanionListeners.ts index c44427577..39ca6a8e2 100644 --- a/hooks/useCompanionListeners.ts +++ b/src/hooks/useCompanionListeners.ts @@ -18,8 +18,8 @@ import { import DeeplinkSchemaMatch from '../class/deeplink-schema-match'; import presentAlert from '../components/Alert'; import loc from '../loc'; -import { navigationRef } from '../NavigationService'; -import ActionSheet from '../screen/ActionSheet'; +import { navigationRef } from '../navigation/NavigationService'; +import ActionSheet from '../screens/ActionSheet'; import { useStorage } from './context/useStorage'; import useDeviceQuickActions from './useDeviceQuickActions'; import { useExtendedNavigation } from './useExtendedNavigation'; diff --git a/hooks/useDeviceQuickActions.ts b/src/hooks/useDeviceQuickActions.ts similarity index 98% rename from hooks/useDeviceQuickActions.ts rename to src/hooks/useDeviceQuickActions.ts index c2ed1b887..74f98f158 100644 --- a/hooks/useDeviceQuickActions.ts +++ b/src/hooks/useDeviceQuickActions.ts @@ -7,7 +7,7 @@ import DeeplinkSchemaMatch from '../class/deeplink-schema-match'; import { TWallet } from '../class/wallets/types'; import useOnAppLaunch from '../hooks/useOnAppLaunch'; import { formatBalance } from '../loc'; -import * as NavigationService from '../NavigationService'; +import * as NavigationService from '../navigation/NavigationService'; import { useSettings } from '../hooks/context/useSettings'; import { useStorage } from '../hooks/context/useStorage'; diff --git a/hooks/useExtendedNavigation.ts b/src/hooks/useExtendedNavigation.ts similarity index 98% rename from hooks/useExtendedNavigation.ts rename to src/hooks/useExtendedNavigation.ts index b94d54f24..dbb3a1593 100644 --- a/hooks/useExtendedNavigation.ts +++ b/src/hooks/useExtendedNavigation.ts @@ -1,5 +1,5 @@ import { useNavigation, NavigationProp, ParamListBase, CommonActions } from '@react-navigation/native'; -import { navigationRef } from '../NavigationService'; +import { navigationRef } from '../navigation/NavigationService'; import { presentWalletExportReminder } from '../helpers/presentWalletExportReminder'; import { unlockWithBiometrics, useBiometrics } from './useBiometrics'; import { useStorage } from './context/useStorage'; diff --git a/hooks/useKeyboard.ts b/src/hooks/useKeyboard.ts similarity index 100% rename from hooks/useKeyboard.ts rename to src/hooks/useKeyboard.ts diff --git a/hooks/useOnAppLaunch.ts b/src/hooks/useOnAppLaunch.ts similarity index 100% rename from hooks/useOnAppLaunch.ts rename to src/hooks/useOnAppLaunch.ts diff --git a/hooks/useScreenProtect.ts b/src/hooks/useScreenProtect.ts similarity index 100% rename from hooks/useScreenProtect.ts rename to src/hooks/useScreenProtect.ts diff --git a/hooks/useWalletSubscribe.tsx b/src/hooks/useWalletSubscribe.tsx similarity index 100% rename from hooks/useWalletSubscribe.tsx rename to src/hooks/useWalletSubscribe.tsx diff --git a/img/addWallet/bitcoin.png b/src/img/addWallet/bitcoin.png similarity index 100% rename from img/addWallet/bitcoin.png rename to src/img/addWallet/bitcoin.png diff --git a/img/addWallet/bitcoin@2x.png b/src/img/addWallet/bitcoin@2x.png similarity index 100% rename from img/addWallet/bitcoin@2x.png rename to src/img/addWallet/bitcoin@2x.png diff --git a/img/addWallet/bitcoin@3x.png b/src/img/addWallet/bitcoin@3x.png similarity index 100% rename from img/addWallet/bitcoin@3x.png rename to src/img/addWallet/bitcoin@3x.png diff --git a/img/bitcoin.png b/src/img/bitcoin.png similarity index 100% rename from img/bitcoin.png rename to src/img/bitcoin.png diff --git a/img/bluenice.json b/src/img/bluenice.json similarity index 100% rename from img/bluenice.json rename to src/img/bluenice.json diff --git a/img/btc-shape-rtl.png b/src/img/btc-shape-rtl.png similarity index 100% rename from img/btc-shape-rtl.png rename to src/img/btc-shape-rtl.png diff --git a/img/btc-shape.png b/src/img/btc-shape.png similarity index 100% rename from img/btc-shape.png rename to src/img/btc-shape.png diff --git a/img/close-white.png b/src/img/close-white.png similarity index 100% rename from img/close-white.png rename to src/img/close-white.png diff --git a/img/close-white@2x.png b/src/img/close-white@2x.png similarity index 100% rename from img/close-white@2x.png rename to src/img/close-white@2x.png diff --git a/img/close-white@3x.png b/src/img/close-white@3x.png similarity index 100% rename from img/close-white@3x.png rename to src/img/close-white@3x.png diff --git a/img/close.png b/src/img/close.png similarity index 100% rename from img/close.png rename to src/img/close.png diff --git a/img/close@2x.png b/src/img/close@2x.png similarity index 100% rename from img/close@2x.png rename to src/img/close@2x.png diff --git a/img/close@3x.png b/src/img/close@3x.png similarity index 100% rename from img/close@3x.png rename to src/img/close@3x.png diff --git a/img/coin1.png b/src/img/coin1.png similarity index 100% rename from img/coin1.png rename to src/img/coin1.png diff --git a/img/coin2.png b/src/img/coin2.png similarity index 100% rename from img/coin2.png rename to src/img/coin2.png diff --git a/img/icon.png b/src/img/icon.png similarity index 100% rename from img/icon.png rename to src/img/icon.png diff --git a/img/icon@2x.png b/src/img/icon@2x.png similarity index 100% rename from img/icon@2x.png rename to src/img/icon@2x.png diff --git a/img/icon@3x.png b/src/img/icon@3x.png similarity index 100% rename from img/icon@3x.png rename to src/img/icon@3x.png diff --git a/img/logo.png b/src/img/logo.png similarity index 100% rename from img/logo.png rename to src/img/logo.png diff --git a/img/mshelp/mshelp-intro.png b/src/img/mshelp/mshelp-intro.png similarity index 100% rename from img/mshelp/mshelp-intro.png rename to src/img/mshelp/mshelp-intro.png diff --git a/img/mshelp/mshelp-intro@2x.png b/src/img/mshelp/mshelp-intro@2x.png similarity index 100% rename from img/mshelp/mshelp-intro@2x.png rename to src/img/mshelp/mshelp-intro@2x.png diff --git a/img/mshelp/mshelp-intro@3x.png b/src/img/mshelp/mshelp-intro@3x.png similarity index 100% rename from img/mshelp/mshelp-intro@3x.png rename to src/img/mshelp/mshelp-intro@3x.png diff --git a/img/mshelp/tip2.png b/src/img/mshelp/tip2.png similarity index 100% rename from img/mshelp/tip2.png rename to src/img/mshelp/tip2.png diff --git a/img/mshelp/tip2@2x.png b/src/img/mshelp/tip2@2x.png similarity index 100% rename from img/mshelp/tip2@2x.png rename to src/img/mshelp/tip2@2x.png diff --git a/img/mshelp/tip2@3x.png b/src/img/mshelp/tip2@3x.png similarity index 100% rename from img/mshelp/tip2@3x.png rename to src/img/mshelp/tip2@3x.png diff --git a/img/mshelp/tip3.png b/src/img/mshelp/tip3.png similarity index 100% rename from img/mshelp/tip3.png rename to src/img/mshelp/tip3.png diff --git a/img/mshelp/tip3@2x.png b/src/img/mshelp/tip3@2x.png similarity index 100% rename from img/mshelp/tip3@2x.png rename to src/img/mshelp/tip3@2x.png diff --git a/img/mshelp/tip3@3x.png b/src/img/mshelp/tip3@3x.png similarity index 100% rename from img/mshelp/tip3@3x.png rename to src/img/mshelp/tip3@3x.png diff --git a/img/mshelp/tip4.png b/src/img/mshelp/tip4.png similarity index 100% rename from img/mshelp/tip4.png rename to src/img/mshelp/tip4.png diff --git a/img/mshelp/tip4@2x.png b/src/img/mshelp/tip4@2x.png similarity index 100% rename from img/mshelp/tip4@2x.png rename to src/img/mshelp/tip4@2x.png diff --git a/img/mshelp/tip4@3x.png b/src/img/mshelp/tip4@3x.png similarity index 100% rename from img/mshelp/tip4@3x.png rename to src/img/mshelp/tip4@3x.png diff --git a/img/mshelp/tip5.png b/src/img/mshelp/tip5.png similarity index 100% rename from img/mshelp/tip5.png rename to src/img/mshelp/tip5.png diff --git a/img/mshelp/tip5@2x.png b/src/img/mshelp/tip5@2x.png similarity index 100% rename from img/mshelp/tip5@2x.png rename to src/img/mshelp/tip5@2x.png diff --git a/img/mshelp/tip5@3x.png b/src/img/mshelp/tip5@3x.png similarity index 100% rename from img/mshelp/tip5@3x.png rename to src/img/mshelp/tip5@3x.png diff --git a/img/msvault.json b/src/img/msvault.json similarity index 100% rename from img/msvault.json rename to src/img/msvault.json diff --git a/img/round-compare-arrows-24-px.png b/src/img/round-compare-arrows-24-px.png similarity index 100% rename from img/round-compare-arrows-24-px.png rename to src/img/round-compare-arrows-24-px.png diff --git a/img/round-compare-arrows-24-px@2x.png b/src/img/round-compare-arrows-24-px@2x.png similarity index 100% rename from img/round-compare-arrows-24-px@2x.png rename to src/img/round-compare-arrows-24-px@2x.png diff --git a/img/round-compare-arrows-24-px@3x.png b/src/img/round-compare-arrows-24-px@3x.png similarity index 100% rename from img/round-compare-arrows-24-px@3x.png rename to src/img/round-compare-arrows-24-px@3x.png diff --git a/img/scan-white.png b/src/img/scan-white.png similarity index 100% rename from img/scan-white.png rename to src/img/scan-white.png diff --git a/img/scan-white@2x.png b/src/img/scan-white@2x.png similarity index 100% rename from img/scan-white@2x.png rename to src/img/scan-white@2x.png diff --git a/img/scan-white@3x.png b/src/img/scan-white@3x.png similarity index 100% rename from img/scan-white@3x.png rename to src/img/scan-white@3x.png diff --git a/img/scan.svg b/src/img/scan.svg similarity index 100% rename from img/scan.svg rename to src/img/scan.svg diff --git a/loc/ar.json b/src/loc/ar.json similarity index 100% rename from loc/ar.json rename to src/loc/ar.json diff --git a/loc/be@tarask.json b/src/loc/be@tarask.json similarity index 100% rename from loc/be@tarask.json rename to src/loc/be@tarask.json diff --git a/loc/bg_bg.json b/src/loc/bg_bg.json similarity index 100% rename from loc/bg_bg.json rename to src/loc/bg_bg.json diff --git a/loc/bqi.json b/src/loc/bqi.json similarity index 100% rename from loc/bqi.json rename to src/loc/bqi.json diff --git a/loc/ca.json b/src/loc/ca.json similarity index 100% rename from loc/ca.json rename to src/loc/ca.json diff --git a/loc/cs_cz.json b/src/loc/cs_cz.json similarity index 100% rename from loc/cs_cz.json rename to src/loc/cs_cz.json diff --git a/loc/cy.json b/src/loc/cy.json similarity index 100% rename from loc/cy.json rename to src/loc/cy.json diff --git a/loc/da_dk.json b/src/loc/da_dk.json similarity index 100% rename from loc/da_dk.json rename to src/loc/da_dk.json diff --git a/loc/de_de.json b/src/loc/de_de.json similarity index 100% rename from loc/de_de.json rename to src/loc/de_de.json diff --git a/loc/el.json b/src/loc/el.json similarity index 100% rename from loc/el.json rename to src/loc/el.json diff --git a/loc/en.json b/src/loc/en.json similarity index 100% rename from loc/en.json rename to src/loc/en.json diff --git a/loc/es.json b/src/loc/es.json similarity index 100% rename from loc/es.json rename to src/loc/es.json diff --git a/loc/es_419.json b/src/loc/es_419.json similarity index 100% rename from loc/es_419.json rename to src/loc/es_419.json diff --git a/loc/et_EE.json b/src/loc/et_EE.json similarity index 100% rename from loc/et_EE.json rename to src/loc/et_EE.json diff --git a/loc/fa.json b/src/loc/fa.json similarity index 100% rename from loc/fa.json rename to src/loc/fa.json diff --git a/loc/fi_fi.json b/src/loc/fi_fi.json similarity index 100% rename from loc/fi_fi.json rename to src/loc/fi_fi.json diff --git a/loc/fr_fr.json b/src/loc/fr_fr.json similarity index 100% rename from loc/fr_fr.json rename to src/loc/fr_fr.json diff --git a/loc/he.json b/src/loc/he.json similarity index 100% rename from loc/he.json rename to src/loc/he.json diff --git a/loc/hr_hr.json b/src/loc/hr_hr.json similarity index 100% rename from loc/hr_hr.json rename to src/loc/hr_hr.json diff --git a/loc/hu_hu.json b/src/loc/hu_hu.json similarity index 100% rename from loc/hu_hu.json rename to src/loc/hu_hu.json diff --git a/loc/id_id.json b/src/loc/id_id.json similarity index 100% rename from loc/id_id.json rename to src/loc/id_id.json diff --git a/loc/index.ts b/src/loc/index.ts similarity index 100% rename from loc/index.ts rename to src/loc/index.ts diff --git a/loc/it.json b/src/loc/it.json similarity index 100% rename from loc/it.json rename to src/loc/it.json diff --git a/loc/jp_jp.json b/src/loc/jp_jp.json similarity index 100% rename from loc/jp_jp.json rename to src/loc/jp_jp.json diff --git a/loc/kk@Cyrl.json b/src/loc/kk@Cyrl.json similarity index 100% rename from loc/kk@Cyrl.json rename to src/loc/kk@Cyrl.json diff --git a/loc/kn.json b/src/loc/kn.json similarity index 100% rename from loc/kn.json rename to src/loc/kn.json diff --git a/loc/ko_KR.json b/src/loc/ko_KR.json similarity index 100% rename from loc/ko_KR.json rename to src/loc/ko_KR.json diff --git a/loc/languages.ts b/src/loc/languages.ts similarity index 100% rename from loc/languages.ts rename to src/loc/languages.ts diff --git a/loc/lrc.json b/src/loc/lrc.json similarity index 100% rename from loc/lrc.json rename to src/loc/lrc.json diff --git a/loc/ms.json b/src/loc/ms.json similarity index 100% rename from loc/ms.json rename to src/loc/ms.json diff --git a/loc/nb_no.json b/src/loc/nb_no.json similarity index 100% rename from loc/nb_no.json rename to src/loc/nb_no.json diff --git a/loc/ne.json b/src/loc/ne.json similarity index 100% rename from loc/ne.json rename to src/loc/ne.json diff --git a/loc/nl_nl.json b/src/loc/nl_nl.json similarity index 100% rename from loc/nl_nl.json rename to src/loc/nl_nl.json diff --git a/loc/pcm.json b/src/loc/pcm.json similarity index 100% rename from loc/pcm.json rename to src/loc/pcm.json diff --git a/loc/pl.json b/src/loc/pl.json similarity index 100% rename from loc/pl.json rename to src/loc/pl.json diff --git a/loc/pt_br.json b/src/loc/pt_br.json similarity index 100% rename from loc/pt_br.json rename to src/loc/pt_br.json diff --git a/loc/pt_pt.json b/src/loc/pt_pt.json similarity index 100% rename from loc/pt_pt.json rename to src/loc/pt_pt.json diff --git a/loc/ro.json b/src/loc/ro.json similarity index 100% rename from loc/ro.json rename to src/loc/ro.json diff --git a/loc/ru.json b/src/loc/ru.json similarity index 100% rename from loc/ru.json rename to src/loc/ru.json diff --git a/loc/si_LK.json b/src/loc/si_LK.json similarity index 100% rename from loc/si_LK.json rename to src/loc/si_LK.json diff --git a/loc/sk_sk.json b/src/loc/sk_sk.json similarity index 100% rename from loc/sk_sk.json rename to src/loc/sk_sk.json diff --git a/loc/sl_SI.json b/src/loc/sl_SI.json similarity index 100% rename from loc/sl_SI.json rename to src/loc/sl_SI.json diff --git a/loc/sq_AL.json b/src/loc/sq_AL.json similarity index 100% rename from loc/sq_AL.json rename to src/loc/sq_AL.json diff --git a/loc/sr_RS.json b/src/loc/sr_RS.json similarity index 100% rename from loc/sr_RS.json rename to src/loc/sr_RS.json diff --git a/loc/sv_se.json b/src/loc/sv_se.json similarity index 100% rename from loc/sv_se.json rename to src/loc/sv_se.json diff --git a/loc/th_th.json b/src/loc/th_th.json similarity index 100% rename from loc/th_th.json rename to src/loc/th_th.json diff --git a/loc/tr_tr.json b/src/loc/tr_tr.json similarity index 100% rename from loc/tr_tr.json rename to src/loc/tr_tr.json diff --git a/loc/ua.json b/src/loc/ua.json similarity index 100% rename from loc/ua.json rename to src/loc/ua.json diff --git a/loc/vi_vn.json b/src/loc/vi_vn.json similarity index 100% rename from loc/vi_vn.json rename to src/loc/vi_vn.json diff --git a/loc/zar_afr.json b/src/loc/zar_afr.json similarity index 100% rename from loc/zar_afr.json rename to src/loc/zar_afr.json diff --git a/loc/zar_xho.json b/src/loc/zar_xho.json similarity index 100% rename from loc/zar_xho.json rename to src/loc/zar_xho.json diff --git a/loc/zh_cn.json b/src/loc/zh_cn.json similarity index 100% rename from loc/zh_cn.json rename to src/loc/zh_cn.json diff --git a/loc/zh_tw.json b/src/loc/zh_tw.json similarity index 100% rename from loc/zh_tw.json rename to src/loc/zh_tw.json diff --git a/models/bitcoinUnits.ts b/src/models/bitcoinUnits.ts similarity index 100% rename from models/bitcoinUnits.ts rename to src/models/bitcoinUnits.ts diff --git a/models/blockExplorer.ts b/src/models/blockExplorer.ts similarity index 100% rename from models/blockExplorer.ts rename to src/models/blockExplorer.ts diff --git a/models/fiatUnit.ts b/src/models/fiatUnit.ts similarity index 99% rename from models/fiatUnit.ts rename to src/models/fiatUnit.ts index 5c29532b0..afa865de5 100644 --- a/models/fiatUnit.ts +++ b/src/models/fiatUnit.ts @@ -1,4 +1,4 @@ -import { fetch } from '../util/fetch'; +import { fetch } from '../utils/fetch'; import untypedFiatUnit from './fiatUnits.json'; export const FiatUnitSource = { diff --git a/models/fiatUnits.json b/src/models/fiatUnits.json similarity index 100% rename from models/fiatUnits.json rename to src/models/fiatUnits.json diff --git a/models/networkTransactionFees.ts b/src/models/networkTransactionFees.ts similarity index 100% rename from models/networkTransactionFees.ts rename to src/models/networkTransactionFees.ts diff --git a/modules/Electrum.ts b/src/modules/Electrum.ts similarity index 99% rename from modules/Electrum.ts rename to src/modules/Electrum.ts index b3ed2995a..e5cd1cf75 100644 --- a/modules/Electrum.ts +++ b/src/modules/Electrum.ts @@ -9,7 +9,7 @@ import { sha256 as _sha256 } from '@noble/hashes/sha256'; import presentAlert from '../components/Alert'; import loc from '../loc'; import { GROUP_IO_SHROUD } from './currency'; -import { ElectrumServerItem } from '../screen/settings/ElectrumSettings'; +import { ElectrumServerItem } from '../screens/settings/ElectrumSettings'; import { triggerWarningHapticFeedback } from './hapticFeedback'; import { AlertButton } from 'react-native'; import { uint8ArrayToHex } from './uint8array-extras/index'; diff --git a/modules/RustJsiBridge.ts b/src/modules/RustJsiBridge.ts similarity index 100% rename from modules/RustJsiBridge.ts rename to src/modules/RustJsiBridge.ts diff --git a/modules/SilentPaymentIndexer.ts b/src/modules/SilentPaymentIndexer.ts similarity index 100% rename from modules/SilentPaymentIndexer.ts rename to src/modules/SilentPaymentIndexer.ts diff --git a/modules/analytics.ts b/src/modules/analytics.ts similarity index 100% rename from modules/analytics.ts rename to src/modules/analytics.ts diff --git a/modules/base43.ts b/src/modules/base43.ts similarity index 100% rename from modules/base43.ts rename to src/modules/base43.ts diff --git a/modules/bc-bech32/Readme.md b/src/modules/bc-bech32/Readme.md similarity index 100% rename from modules/bc-bech32/Readme.md rename to src/modules/bc-bech32/Readme.md diff --git a/modules/bc-bech32/package.json b/src/modules/bc-bech32/package.json similarity index 100% rename from modules/bc-bech32/package.json rename to src/modules/bc-bech32/package.json diff --git a/modules/bc-ur/README.md b/src/modules/bc-ur/README.md similarity index 100% rename from modules/bc-ur/README.md rename to src/modules/bc-ur/README.md diff --git a/modules/bc-ur/package.json b/src/modules/bc-ur/package.json similarity index 100% rename from modules/bc-ur/package.json rename to src/modules/bc-ur/package.json diff --git a/modules/bip39.ts b/src/modules/bip39.ts similarity index 100% rename from modules/bip39.ts rename to src/modules/bip39.ts diff --git a/modules/checksumWords.ts b/src/modules/checksumWords.ts similarity index 100% rename from modules/checksumWords.ts rename to src/modules/checksumWords.ts diff --git a/modules/clipboard.ts b/src/modules/clipboard.ts similarity index 100% rename from modules/clipboard.ts rename to src/modules/clipboard.ts diff --git a/modules/constants.ts b/src/modules/constants.ts similarity index 100% rename from modules/constants.ts rename to src/modules/constants.ts diff --git a/modules/currency.ts b/src/modules/currency.ts similarity index 100% rename from modules/currency.ts rename to src/modules/currency.ts diff --git a/modules/debounce.ts b/src/modules/debounce.ts similarity index 100% rename from modules/debounce.ts rename to src/modules/debounce.ts diff --git a/modules/encryption.ts b/src/modules/encryption.ts similarity index 100% rename from modules/encryption.ts rename to src/modules/encryption.ts diff --git a/modules/environment.ts b/src/modules/environment.ts similarity index 100% rename from modules/environment.ts rename to src/modules/environment.ts diff --git a/modules/fs.ts b/src/modules/fs.ts similarity index 100% rename from modules/fs.ts rename to src/modules/fs.ts diff --git a/modules/hapticFeedback.ts b/src/modules/hapticFeedback.ts similarity index 100% rename from modules/hapticFeedback.ts rename to src/modules/hapticFeedback.ts diff --git a/modules/noble_ecc.ts b/src/modules/noble_ecc.ts similarity index 100% rename from modules/noble_ecc.ts rename to src/modules/noble_ecc.ts diff --git a/modules/notifications.ts b/src/modules/notifications.ts similarity index 99% rename from modules/notifications.ts rename to src/modules/notifications.ts index 537a2f199..8298fbb0c 100644 --- a/modules/notifications.ts +++ b/src/modules/notifications.ts @@ -5,7 +5,7 @@ import * as Application from 'expo-application'; import * as Device from 'expo-device'; import loc from '../loc'; import { groundControlUri } from './constants'; -import { fetch } from '../util/fetch'; +import { fetch } from '../utils/fetch'; const PUSH_TOKEN = 'PUSH_TOKEN'; const GROUNDCONTROL_BASE_URI = 'GROUNDCONTROL_BASE_URI'; diff --git a/modules/react-native-bw-file-access/.gitignore b/src/modules/react-native-bw-file-access/.gitignore similarity index 100% rename from modules/react-native-bw-file-access/.gitignore rename to src/modules/react-native-bw-file-access/.gitignore diff --git a/modules/react-native-bw-file-access/README.md b/src/modules/react-native-bw-file-access/README.md similarity index 100% rename from modules/react-native-bw-file-access/README.md rename to src/modules/react-native-bw-file-access/README.md diff --git a/modules/react-native-bw-file-access/index.ts b/src/modules/react-native-bw-file-access/index.ts similarity index 100% rename from modules/react-native-bw-file-access/index.ts rename to src/modules/react-native-bw-file-access/index.ts diff --git a/modules/react-native-bw-file-access/ios/BwFileAccess.h b/src/modules/react-native-bw-file-access/ios/BwFileAccess.h similarity index 100% rename from modules/react-native-bw-file-access/ios/BwFileAccess.h rename to src/modules/react-native-bw-file-access/ios/BwFileAccess.h diff --git a/modules/react-native-bw-file-access/ios/BwFileAccess.m b/src/modules/react-native-bw-file-access/ios/BwFileAccess.m similarity index 100% rename from modules/react-native-bw-file-access/ios/BwFileAccess.m rename to src/modules/react-native-bw-file-access/ios/BwFileAccess.m diff --git a/modules/react-native-bw-file-access/ios/BwFileAccess.xcodeproj/project.pbxproj b/src/modules/react-native-bw-file-access/ios/BwFileAccess.xcodeproj/project.pbxproj similarity index 100% rename from modules/react-native-bw-file-access/ios/BwFileAccess.xcodeproj/project.pbxproj rename to src/modules/react-native-bw-file-access/ios/BwFileAccess.xcodeproj/project.pbxproj diff --git a/modules/react-native-bw-file-access/ios/BwFileAccess.xcworkspace/contents.xcworkspacedata b/src/modules/react-native-bw-file-access/ios/BwFileAccess.xcworkspace/contents.xcworkspacedata similarity index 100% rename from modules/react-native-bw-file-access/ios/BwFileAccess.xcworkspace/contents.xcworkspacedata rename to src/modules/react-native-bw-file-access/ios/BwFileAccess.xcworkspace/contents.xcworkspacedata diff --git a/modules/react-native-bw-file-access/package.json b/src/modules/react-native-bw-file-access/package.json similarity index 100% rename from modules/react-native-bw-file-access/package.json rename to src/modules/react-native-bw-file-access/package.json diff --git a/modules/react-native-bw-file-access/react-native-bw-file-access.podspec b/src/modules/react-native-bw-file-access/react-native-bw-file-access.podspec similarity index 100% rename from modules/react-native-bw-file-access/react-native-bw-file-access.podspec rename to src/modules/react-native-bw-file-access/react-native-bw-file-access.podspec diff --git a/modules/sizeClass.ts b/src/modules/sizeClass.ts similarity index 100% rename from modules/sizeClass.ts rename to src/modules/sizeClass.ts diff --git a/modules/start-and-decrypt.ts b/src/modules/start-and-decrypt.ts similarity index 100% rename from modules/start-and-decrypt.ts rename to src/modules/start-and-decrypt.ts diff --git a/modules/uint8array-extras/index.d.ts b/src/modules/uint8array-extras/index.d.ts similarity index 100% rename from modules/uint8array-extras/index.d.ts rename to src/modules/uint8array-extras/index.d.ts diff --git a/modules/uint8array-extras/index.js b/src/modules/uint8array-extras/index.js similarity index 100% rename from modules/uint8array-extras/index.js rename to src/modules/uint8array-extras/index.js diff --git a/modules/ur/index.js b/src/modules/ur/index.js similarity index 100% rename from modules/ur/index.js rename to src/modules/ur/index.js diff --git a/navigation/AddWalletStack.tsx b/src/navigation/AddWalletStack.tsx similarity index 100% rename from navigation/AddWalletStack.tsx rename to src/navigation/AddWalletStack.tsx diff --git a/navigation/DetailViewScreensStack.tsx b/src/navigation/DetailViewScreensStack.tsx similarity index 81% rename from navigation/DetailViewScreensStack.tsx rename to src/navigation/DetailViewScreensStack.tsx index ac365aa0e..20f8ef0fe 100644 --- a/navigation/DetailViewScreensStack.tsx +++ b/src/navigation/DetailViewScreensStack.tsx @@ -4,44 +4,44 @@ import HeaderRightButton from '../components/HeaderRightButton'; import navigationStyle, { CloseButtonPosition } from '../components/navigationStyle'; import { useTheme } from '../components/themes'; import loc from '../loc'; -import Broadcast from '../screen/send/Broadcast'; -import IsItMyAddress from '../screen/settings/IsItMyAddress'; -import Success from '../screen/send/success'; -import CPFP from '../screen/transactions/CPFP'; -import TransactionDetails from '../screen/transactions/TransactionDetails'; -import RBFBumpFee from '../screen/transactions/RBFBumpFee'; -import RBFCancel from '../screen/transactions/RBFCancel'; -import TransactionStatus from '../screen/transactions/TransactionStatus'; -import WalletAddresses from '../screen/wallets/WalletAddresses'; -import WalletDetails from '../screen/wallets/WalletDetails'; -import GenerateWord from '../screen/wallets/generateWord'; -import WalletsList from '../screen/wallets/WalletsList'; +import Broadcast from '../screens/send/Broadcast'; +import IsItMyAddress from '../screens/settings/IsItMyAddress'; +import Success from '../screens/send/success'; +import CPFP from '../screens/transactions/CPFP'; +import TransactionDetails from '../screens/transactions/TransactionDetails'; +import RBFBumpFee from '../screens/transactions/RBFBumpFee'; +import RBFCancel from '../screens/transactions/RBFCancel'; +import TransactionStatus from '../screens/transactions/TransactionStatus'; +import WalletAddresses from '../screens/wallets/WalletAddresses'; +import WalletDetails from '../screens/wallets/WalletDetails'; +import GenerateWord from '../screens/wallets/generateWord'; +import WalletsList from '../screens/wallets/WalletsList'; import { DetailViewStack } from './index'; import SettingsButton from '../components/icons/SettingsButton'; import { useStorage } from '../hooks/context/useStorage'; -import WalletTransactions from '../screen/wallets/WalletTransactions'; -import Settings from '../screen/settings/Settings'; -import Currency from '../screen/settings/Currency'; -import GeneralSettings from '../screen/settings/GeneralSettings'; -import PlausibleDeniability from '../screen/PlausibleDeniability'; -import Licensing from '../screen/settings/Licensing'; -import NetworkSettings from '../screen/settings/NetworkSettings'; -import SettingsBlockExplorer from '../screen/settings/SettingsBlockExplorer'; -import About from '../screen/settings/About'; -import DefaultView from '../screen/settings/DefaultView'; -import ElectrumSettings from '../screen/settings/ElectrumSettings'; -import EncryptStorage from '../screen/settings/EncryptStorage'; -import Language from '../screen/settings/Language'; -import NotificationSettings from '../screen/settings/NotificationSettings'; -import SelfTest from '../screen/settings/SelfTest'; -import ReleaseNotes from '../screen/settings/ReleaseNotes'; -import ToolsScreen from '../screen/settings/tools'; -import SettingsPrivacy from '../screen/settings/SettingsPrivacy'; +import WalletTransactions from '../screens/wallets/WalletTransactions'; +import Settings from '../screens/settings/Settings'; +import Currency from '../screens/settings/Currency'; +import GeneralSettings from '../screens/settings/GeneralSettings'; +import PlausibleDeniability from '../screens/PlausibleDeniability'; +import Licensing from '../screens/settings/Licensing'; +import NetworkSettings from '../screens/settings/NetworkSettings'; +import SettingsBlockExplorer from '../screens/settings/SettingsBlockExplorer'; +import About from '../screens/settings/About'; +import DefaultView from '../screens/settings/DefaultView'; +import ElectrumSettings from '../screens/settings/ElectrumSettings'; +import EncryptStorage from '../screens/settings/EncryptStorage'; +import Language from '../screens/settings/Language'; +import NotificationSettings from '../screens/settings/NotificationSettings'; +import SelfTest from '../screens/settings/SelfTest'; +import ReleaseNotes from '../screens/settings/ReleaseNotes'; +import ToolsScreen from '../screens/settings/tools'; +import SettingsPrivacy from '../screens/settings/SettingsPrivacy'; import getWalletTransactionsOptions from './helpers/getWalletTransactionsOptions'; import { useSizeClass, SizeClass } from '../modules/sizeClass'; import { isDesktop } from '../modules/environment'; -import ReceiveDetails from '../screen/receive/ReceiveDetails'; +import ReceiveDetails from '../screens/receive/ReceiveDetails'; import OnboardingStack from './OnboardingStack'; const DetailViewStackScreensStack = () => { diff --git a/navigation/DetailViewStackParamList.ts b/src/navigation/DetailViewStackParamList.ts similarity index 96% rename from navigation/DetailViewStackParamList.ts rename to src/navigation/DetailViewStackParamList.ts index 05681f5f3..b5f67f43e 100644 --- a/navigation/DetailViewStackParamList.ts +++ b/src/navigation/DetailViewStackParamList.ts @@ -1,5 +1,5 @@ import { Transaction, TWallet } from '../class/wallets/types'; -import { ElectrumServerItem } from '../screen/settings/ElectrumSettings'; +import { ElectrumServerItem } from '../screens/settings/ElectrumSettings'; import { SendDetailsParams } from './SendDetailsStackParamList'; import { AddWalletStackParamList } from './AddWalletStack'; diff --git a/navigation/DrawerParamList.ts b/src/navigation/DrawerParamList.ts similarity index 100% rename from navigation/DrawerParamList.ts rename to src/navigation/DrawerParamList.ts diff --git a/navigation/DrawerRoot.tsx b/src/navigation/DrawerRoot.tsx similarity index 97% rename from navigation/DrawerRoot.tsx rename to src/navigation/DrawerRoot.tsx index e9855ec0d..b5ed429a4 100644 --- a/navigation/DrawerRoot.tsx +++ b/src/navigation/DrawerRoot.tsx @@ -4,7 +4,7 @@ import React, { useEffect, useMemo } from 'react'; import { Animated, Easing } from 'react-native'; import { useSizeClass, SizeClass } from '../modules/sizeClass'; import useCompanionListeners from '../hooks/useCompanionListeners'; -import DrawerList from '../screen/wallets/DrawerList'; +import DrawerList from '../screens/wallets/DrawerList'; import DetailViewStackScreensStack from './DetailViewScreensStack'; import { DrawerParamList } from './DrawerParamList'; diff --git a/navigation/LazyLoadAddWalletStack.tsx b/src/navigation/LazyLoadAddWalletStack.tsx similarity index 69% rename from navigation/LazyLoadAddWalletStack.tsx rename to src/navigation/LazyLoadAddWalletStack.tsx index 6f22a6837..7370411c5 100644 --- a/navigation/LazyLoadAddWalletStack.tsx +++ b/src/navigation/LazyLoadAddWalletStack.tsx @@ -3,11 +3,11 @@ import React, { lazy, Suspense } from 'react'; import { LazyLoadingIndicator } from './LazyLoadingIndicator'; // Define lazy imports with more reliable loading patterns -const WalletsAdd = lazy(() => import('../screen/wallets/Add')); -const ImportSpeed = lazy(() => import('../screen/wallets/ImportSpeed')); -const ImportWallet = lazy(() => import('../screen/wallets/ImportWallet')); -const PleaseBackup = lazy(() => import('../screen/wallets/PleaseBackup')); -const ProvideEntropy = lazy(() => import('../screen/wallets/ProvideEntropy')); +const WalletsAdd = lazy(() => import('../screens/wallets/Add')); +const ImportSpeed = lazy(() => import('../screens/wallets/ImportSpeed')); +const ImportWallet = lazy(() => import('../screens/wallets/ImportWallet')); +const PleaseBackup = lazy(() => import('../screens/wallets/PleaseBackup')); +const ProvideEntropy = lazy(() => import('../screens/wallets/ProvideEntropy')); export const AddComponent: React.FC = () => ( }> diff --git a/navigation/LazyLoadScanQRCodeStack.tsx b/src/navigation/LazyLoadScanQRCodeStack.tsx similarity index 77% rename from navigation/LazyLoadScanQRCodeStack.tsx rename to src/navigation/LazyLoadScanQRCodeStack.tsx index 2db1fa743..ddd426434 100644 --- a/navigation/LazyLoadScanQRCodeStack.tsx +++ b/src/navigation/LazyLoadScanQRCodeStack.tsx @@ -2,7 +2,7 @@ import React, { lazy, Suspense } from 'react'; import { LazyLoadingIndicator } from './LazyLoadingIndicator'; -const ScanQRCode = lazy(() => import('../screen/send/ScanQRCode')); +const ScanQRCode = lazy(() => import('../screens/send/ScanQRCode')); export const ScanQRCodeComponent = () => ( }> diff --git a/navigation/LazyLoadSendDetailsStack.tsx b/src/navigation/LazyLoadSendDetailsStack.tsx similarity index 69% rename from navigation/LazyLoadSendDetailsStack.tsx rename to src/navigation/LazyLoadSendDetailsStack.tsx index 9e4b534aa..50b1b30d0 100644 --- a/navigation/LazyLoadSendDetailsStack.tsx +++ b/src/navigation/LazyLoadSendDetailsStack.tsx @@ -2,12 +2,12 @@ import React, { lazy, Suspense } from 'react'; import { LazyLoadingIndicator } from './LazyLoadingIndicator'; -const SendDetails = lazy(() => import('../screen/send/SendDetails')); -const Confirm = lazy(() => import('../screen/send/Confirm')); -const PsbtWithHardwareWallet = lazy(() => import('../screen/send/psbtWithHardwareWallet')); -const CreateTransaction = lazy(() => import('../screen/send/create')); -const Success = lazy(() => import('../screen/send/success')); -const CoinControl = lazy(() => import('../screen/send/CoinControl')); +const SendDetails = lazy(() => import('../screens/send/SendDetails')); +const Confirm = lazy(() => import('../screens/send/Confirm')); +const PsbtWithHardwareWallet = lazy(() => import('../screens/send/psbtWithHardwareWallet')); +const CreateTransaction = lazy(() => import('../screens/send/create')); +const Success = lazy(() => import('../screens/send/success')); +const CoinControl = lazy(() => import('../screens/send/CoinControl')); // Export each component with its lazy loader and optional configurations export const SendDetailsComponent = () => ( diff --git a/navigation/LazyLoadSignVerifyStack.tsx b/src/navigation/LazyLoadSignVerifyStack.tsx similarity index 76% rename from navigation/LazyLoadSignVerifyStack.tsx rename to src/navigation/LazyLoadSignVerifyStack.tsx index 50b74a43a..0b0873d47 100644 --- a/navigation/LazyLoadSignVerifyStack.tsx +++ b/src/navigation/LazyLoadSignVerifyStack.tsx @@ -2,7 +2,7 @@ import React, { lazy, Suspense } from 'react'; import { LazyLoadingIndicator } from './LazyLoadingIndicator'; -const SignVerify = lazy(() => import('../screen/wallets/signVerify')); +const SignVerify = lazy(() => import('../screens/wallets/signVerify')); export const SignVerifyComponent = () => ( }> diff --git a/navigation/LazyLoadWalletExportStack.tsx b/src/navigation/LazyLoadWalletExportStack.tsx similarity index 77% rename from navigation/LazyLoadWalletExportStack.tsx rename to src/navigation/LazyLoadWalletExportStack.tsx index a71ca8bfa..105a97dfb 100644 --- a/navigation/LazyLoadWalletExportStack.tsx +++ b/src/navigation/LazyLoadWalletExportStack.tsx @@ -3,7 +3,7 @@ import React, { lazy, Suspense } from 'react'; import { LazyLoadingIndicator } from './LazyLoadingIndicator'; // Define lazy imports -const WalletExport = lazy(() => import('../screen/wallets/WalletExport')); +const WalletExport = lazy(() => import('../screens/wallets/WalletExport')); export const WalletExportComponent = () => ( }> diff --git a/navigation/LazyLoadWalletXpubStack.tsx b/src/navigation/LazyLoadWalletXpubStack.tsx similarity index 78% rename from navigation/LazyLoadWalletXpubStack.tsx rename to src/navigation/LazyLoadWalletXpubStack.tsx index 279aa87aa..fdc8902dc 100644 --- a/navigation/LazyLoadWalletXpubStack.tsx +++ b/src/navigation/LazyLoadWalletXpubStack.tsx @@ -2,7 +2,7 @@ import React, { lazy, Suspense } from 'react'; import { LazyLoadingIndicator } from './LazyLoadingIndicator'; -const WalletXpub = lazy(() => import('../screen/wallets/xpub')); +const WalletXpub = lazy(() => import('../screens/wallets/xpub')); export const WalletXpubComponent = () => ( }> diff --git a/navigation/LazyLoadingIndicator.tsx b/src/navigation/LazyLoadingIndicator.tsx similarity index 100% rename from navigation/LazyLoadingIndicator.tsx rename to src/navigation/LazyLoadingIndicator.tsx diff --git a/navigation/MasterView.tsx b/src/navigation/MasterView.tsx similarity index 100% rename from navigation/MasterView.tsx rename to src/navigation/MasterView.tsx diff --git a/NavigationService.ts b/src/navigation/NavigationService.ts similarity index 100% rename from NavigationService.ts rename to src/navigation/NavigationService.ts diff --git a/navigation/OnboardingStack.tsx b/src/navigation/OnboardingStack.tsx similarity index 84% rename from navigation/OnboardingStack.tsx rename to src/navigation/OnboardingStack.tsx index ed68b3165..a14352f92 100644 --- a/navigation/OnboardingStack.tsx +++ b/src/navigation/OnboardingStack.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { createNativeStackNavigator } from '@react-navigation/native-stack'; -import OnboardingScreen from '../screen/wallets/OnboardingScreen'; -import CreateWalletScreen from '../screen/wallets/CreateWalletScreen'; -import PleaseBackup from '../screen/wallets/PleaseBackup'; +import OnboardingScreen from '../screens/wallets/OnboardingScreen'; +import CreateWalletScreen from '../screens/wallets/CreateWalletScreen'; +import PleaseBackup from '../screens/wallets/PleaseBackup'; import { RouteProp } from '@react-navigation/native'; export type OnboardingStackParamList = { diff --git a/navigation/ReceiveDetailsStackParamList.ts b/src/navigation/ReceiveDetailsStackParamList.ts similarity index 100% rename from navigation/ReceiveDetailsStackParamList.ts rename to src/navigation/ReceiveDetailsStackParamList.ts diff --git a/navigation/SendDetailsStack.tsx b/src/navigation/SendDetailsStack.tsx similarity index 98% rename from navigation/SendDetailsStack.tsx rename to src/navigation/SendDetailsStack.tsx index 3a4a01601..3e2d68af6 100644 --- a/navigation/SendDetailsStack.tsx +++ b/src/navigation/SendDetailsStack.tsx @@ -15,7 +15,7 @@ import { SendDetailsStackParamList } from './SendDetailsStackParamList'; import HeaderRightButton from '../components/HeaderRightButton'; import { BitcoinUnit } from '../models/bitcoinUnits'; import { ScanQRCodeComponent } from './LazyLoadScanQRCodeStack'; -import SelectFeeScreen from '../screen/SelectFeeScreen'; +import SelectFeeScreen from '../screens/SelectFeeScreen'; import { Platform } from 'react-native'; const Stack = createNativeStackNavigator(); diff --git a/navigation/SendDetailsStackParamList.ts b/src/navigation/SendDetailsStackParamList.ts similarity index 97% rename from navigation/SendDetailsStackParamList.ts rename to src/navigation/SendDetailsStackParamList.ts index a2ae92a47..eaa813ecd 100644 --- a/navigation/SendDetailsStackParamList.ts +++ b/src/navigation/SendDetailsStackParamList.ts @@ -2,7 +2,7 @@ import { Psbt } from 'bitcoinjs-lib'; import { CreateTransactionTarget, CreateTransactionUtxo } from '../class/wallets/types'; import { BitcoinUnit } from '../models/bitcoinUnits'; import { ScanQRCodeParamList } from './DetailViewStackParamList'; -import { IFee } from '../screen/send/SendDetails'; +import { IFee } from '../screens/send/SendDetails'; import { NetworkTransactionFeeType } from '../models/networkTransactionFees'; export type SendDetailsParams = { diff --git a/navigation/SignVerifyStack.tsx b/src/navigation/SignVerifyStack.tsx similarity index 100% rename from navigation/SignVerifyStack.tsx rename to src/navigation/SignVerifyStack.tsx diff --git a/navigation/WalletExportStack.tsx b/src/navigation/WalletExportStack.tsx similarity index 100% rename from navigation/WalletExportStack.tsx rename to src/navigation/WalletExportStack.tsx diff --git a/navigation/WalletXpubStack.tsx b/src/navigation/WalletXpubStack.tsx similarity index 100% rename from navigation/WalletXpubStack.tsx rename to src/navigation/WalletXpubStack.tsx diff --git a/navigation/helpers/getWalletTransactionsOptions.tsx b/src/navigation/helpers/getWalletTransactionsOptions.tsx similarity index 95% rename from navigation/helpers/getWalletTransactionsOptions.tsx rename to src/navigation/helpers/getWalletTransactionsOptions.tsx index c4501d9a6..59fc1e05b 100644 --- a/navigation/helpers/getWalletTransactionsOptions.tsx +++ b/src/navigation/helpers/getWalletTransactionsOptions.tsx @@ -4,7 +4,7 @@ import { Icon } from '@rneui/themed'; import WalletGradient from '../../class/wallet-gradient'; import { NativeStackNavigationOptions } from '@react-navigation/native-stack'; import { DetailViewStackParamList } from '../DetailViewStackParamList'; -import { navigationRef } from '../../NavigationService'; +import { navigationRef } from '../../navigation/NavigationService'; import { RouteProp } from '@react-navigation/native'; export type WalletTransactionsRouteProps = RouteProp; diff --git a/navigation/index.tsx b/src/navigation/index.tsx similarity index 97% rename from navigation/index.tsx rename to src/navigation/index.tsx index 5cbab8062..efaf1f807 100644 --- a/navigation/index.tsx +++ b/src/navigation/index.tsx @@ -1,6 +1,6 @@ import { createNativeStackNavigator, NativeStackNavigationOptions } from '@react-navigation/native-stack'; import React, { lazy, Suspense } from 'react'; -import UnlockWith from '../screen/UnlockWith'; +import UnlockWith from '../screens/UnlockWith'; import { LazyLoadingIndicator } from './LazyLoadingIndicator'; import { DetailViewStackParamList } from './DetailViewStackParamList'; import { useStorage } from '../hooks/context/useStorage'; @@ -12,7 +12,7 @@ const SendDetailsStack = lazy(() => import('./SendDetailsStack')); const WalletExportStack = lazy(() => import('./WalletExportStack')); const WalletXpubStackRoot = lazy(() => import('./WalletXpubStack')); const SignVerifyStackRoot = lazy(() => import('./SignVerifyStack')); -const ScanQRCode = lazy(() => import('../screen/send/ScanQRCode')); +const ScanQRCode = lazy(() => import('../screens/send/ScanQRCode')); export const NavigationDefaultOptions: NativeStackNavigationOptions = { headerShown: false, diff --git a/screen/ActionSheet.common.ts b/src/screens/ActionSheet.common.ts similarity index 100% rename from screen/ActionSheet.common.ts rename to src/screens/ActionSheet.common.ts diff --git a/screen/ActionSheet.ts b/src/screens/ActionSheet.ts similarity index 100% rename from screen/ActionSheet.ts rename to src/screens/ActionSheet.ts diff --git a/screen/PlausibleDeniability.tsx b/src/screens/PlausibleDeniability.tsx similarity index 98% rename from screen/PlausibleDeniability.tsx rename to src/screens/PlausibleDeniability.tsx index e964d8fb8..1fac0400d 100644 --- a/screen/PlausibleDeniability.tsx +++ b/src/screens/PlausibleDeniability.tsx @@ -1,6 +1,6 @@ import React, { useReducer, useRef } from 'react'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../modules/hapticFeedback'; -import { ShroudCard, ShroudText } from '../ShroudComponents'; +import { ShroudCard, ShroudText } from '../components/ShroudComponents'; import presentAlert from '../components/Alert'; import Button from '../components/Button'; import loc from '../loc'; diff --git a/screen/SelectFeeScreen.tsx b/src/screens/SelectFeeScreen.tsx similarity index 100% rename from screen/SelectFeeScreen.tsx rename to src/screens/SelectFeeScreen.tsx diff --git a/screen/UnlockWith.tsx b/src/screens/UnlockWith.tsx similarity index 98% rename from screen/UnlockWith.tsx rename to src/screens/UnlockWith.tsx index a014fdb6d..53ddbd25d 100644 --- a/screen/UnlockWith.tsx +++ b/src/screens/UnlockWith.tsx @@ -1,7 +1,7 @@ import React, { useCallback, useEffect, useReducer, useRef } from 'react'; import { ActivityIndicator, Image, StyleSheet, View } from 'react-native'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../modules/hapticFeedback'; -import { ShroudTextCentered } from '../ShroudComponents'; +import { ShroudTextCentered } from '../components/ShroudComponents'; import Button from '../components/Button'; import SafeArea from '../components/SafeArea'; import { BiometricType, unlockWithBiometrics, useBiometrics } from '../hooks/useBiometrics'; diff --git a/screen/receive/ReceiveDetails.tsx b/src/screens/receive/ReceiveDetails.tsx similarity index 99% rename from screen/receive/ReceiveDetails.tsx rename to src/screens/receive/ReceiveDetails.tsx index 6399ea806..5d59e3c67 100644 --- a/screen/receive/ReceiveDetails.tsx +++ b/src/screens/receive/ReceiveDetails.tsx @@ -6,7 +6,7 @@ import Share from 'react-native-share'; import * as Electrum from '../../modules/Electrum'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; import { majorTomToGroundControl, tryToObtainPermissions } from '../../modules/notifications'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import DeeplinkSchemaMatch from '../../class/deeplink-schema-match'; import presentAlert from '../../components/Alert'; import Button from '../../components/Button'; diff --git a/screen/send/Broadcast.tsx b/src/screens/send/Broadcast.tsx similarity index 99% rename from screen/send/Broadcast.tsx rename to src/screens/send/Broadcast.tsx index 62681c972..448420bc9 100644 --- a/screen/send/Broadcast.tsx +++ b/src/screens/send/Broadcast.tsx @@ -4,7 +4,7 @@ import { ActivityIndicator, Keyboard, Linking, StyleSheet, TextInput, View } fro import * as Electrum from '../../modules/Electrum'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudButtonLink, ShroudCard, ShroudFormLabel, ShroudTextCentered } from '../../ShroudComponents'; +import { ShroudButtonLink, ShroudCard, ShroudFormLabel, ShroudTextCentered } from '../../components/ShroudComponents'; import presentAlert from '../../components/Alert'; import Button from '../../components/Button'; import SafeArea from '../../components/SafeArea'; diff --git a/screen/send/CoinControl.tsx b/src/screens/send/CoinControl.tsx similarity index 100% rename from screen/send/CoinControl.tsx rename to src/screens/send/CoinControl.tsx diff --git a/screen/send/Confirm.tsx b/src/screens/send/Confirm.tsx similarity index 99% rename from screen/send/Confirm.tsx rename to src/screens/send/Confirm.tsx index 83f2bf6c5..1a5a1950d 100644 --- a/screen/send/Confirm.tsx +++ b/src/screens/send/Confirm.tsx @@ -3,7 +3,7 @@ import { ActivityIndicator, FlatList, TouchableOpacity, StyleSheet, View } from import { Text } from '@rneui/themed'; import BigNumber from 'bignumber.js'; import * as bitcoin from 'bitcoinjs-lib'; -import { ShroudText, ShroudCard } from '../../ShroudComponents'; +import { ShroudText, ShroudCard } from '../../components/ShroudComponents'; import { BitcoinUnit } from '../../models/bitcoinUnits'; import loc, { formatBalance, formatBalanceWithoutSuffix } from '../../loc'; import { useRoute, RouteProp } from '@react-navigation/native'; diff --git a/screen/send/ScanQRCode.tsx b/src/screens/send/ScanQRCode.tsx similarity index 99% rename from screen/send/ScanQRCode.tsx rename to src/screens/send/ScanQRCode.tsx index e22b80071..4efdee138 100644 --- a/screen/send/ScanQRCode.tsx +++ b/src/screens/send/ScanQRCode.tsx @@ -6,7 +6,7 @@ import { Platform, StyleSheet, TextInput, TouchableOpacity, View } from 'react-n import Base43 from '../../modules/base43'; import * as fs from '../../modules/fs'; import { BlueURDecoder, decodeUR, extractSingleWorkload } from '../../modules/ur'; -import { ShroudText } from '../../ShroudComponents'; +import { ShroudText } from '../../components/ShroudComponents'; import { openPrivacyDesktopSettings } from '../../class/camera'; import Button from '../../components/Button'; import { useTheme } from '../../components/themes'; diff --git a/screen/send/SendDetails.tsx b/src/screens/send/SendDetails.tsx similarity index 99% rename from screen/send/SendDetails.tsx rename to src/screens/send/SendDetails.tsx index 692337c10..06be24aee 100644 --- a/screen/send/SendDetails.tsx +++ b/src/screens/send/SendDetails.tsx @@ -26,7 +26,7 @@ import { import { SilentPayment } from 'silent-payments'; import { btcToSatoshi, fiatToBTC } from '../../modules/currency'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudText } from '../../ShroudComponents'; +import { ShroudText } from '../../components/ShroudComponents'; import DeeplinkSchemaMatch from '../../class/deeplink-schema-match'; import { HDSilentPaymentsWallet } from '../../class/wallets/hd-bip352-wallet'; import { CreateTransactionTarget, CreateTransactionUtxo, TWallet } from '../../class/wallets/types'; diff --git a/screen/send/create.js b/src/screens/send/create.js similarity index 99% rename from screen/send/create.js rename to src/screens/send/create.js index a1da48260..de1c172ad 100644 --- a/screen/send/create.js +++ b/src/screens/send/create.js @@ -11,7 +11,7 @@ import * as FileSystem from 'expo-file-system'; import Share from 'react-native-share'; import { satoshiToBTC } from '../../modules/currency'; import { isDesktop } from '../../modules/environment'; -import { ShroudText } from '../../ShroudComponents'; +import { ShroudText } from '../../components/ShroudComponents'; import presentAlert from '../../components/Alert'; import { DynamicQRCode } from '../../components/DynamicQRCode'; import { useTheme } from '../../components/themes'; diff --git a/screen/send/psbtWithHardwareWallet.js b/src/screens/send/psbtWithHardwareWallet.js similarity index 99% rename from screen/send/psbtWithHardwareWallet.js rename to src/screens/send/psbtWithHardwareWallet.js index 916015471..8e6c62c3b 100644 --- a/screen/send/psbtWithHardwareWallet.js +++ b/src/screens/send/psbtWithHardwareWallet.js @@ -5,7 +5,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { ActivityIndicator, Linking, ScrollView, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native'; import * as Electrum from '../../modules/Electrum'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import presentAlert from '../../components/Alert'; import CopyToClipboardButton from '../../components/CopyToClipboardButton'; import { DynamicQRCode } from '../../components/DynamicQRCode'; diff --git a/screen/send/success.tsx b/src/screens/send/success.tsx similarity index 98% rename from screen/send/success.tsx rename to src/screens/send/success.tsx index 08b2687f0..a53708fed 100644 --- a/screen/send/success.tsx +++ b/src/screens/send/success.tsx @@ -4,7 +4,7 @@ import BigNumber from 'bignumber.js'; import LottieView from 'lottie-react-native'; import { StyleSheet, View } from 'react-native'; import { Text } from '@rneui/themed'; -import { ShroudCard } from '../../ShroudComponents'; +import { ShroudCard } from '../../components/ShroudComponents'; import Button from '../../components/Button'; import SafeArea from '../../components/SafeArea'; import { useTheme } from '../../components/themes'; diff --git a/screen/settings/About.tsx b/src/screens/settings/About.tsx similarity index 97% rename from screen/settings/About.tsx rename to src/screens/settings/About.tsx index 8d9224fcf..5eafdb925 100644 --- a/screen/settings/About.tsx +++ b/src/screens/settings/About.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { Image, Linking, StyleSheet, Text, View } from 'react-native'; -import { ShroudCard } from '../../ShroudComponents'; +import { ShroudCard } from '../../components/ShroudComponents'; import ListItem from '../../components/ListItem'; import { useTheme } from '../../components/themes'; import loc, { formatStringAddTwoWhiteSpaces } from '../../loc'; diff --git a/screen/settings/Currency.tsx b/src/screens/settings/Currency.tsx similarity index 98% rename from screen/settings/Currency.tsx rename to src/screens/settings/Currency.tsx index 230b1eb26..04a53b9e7 100644 --- a/screen/settings/Currency.tsx +++ b/src/screens/settings/Currency.tsx @@ -10,7 +10,7 @@ import { mostRecentFetchedRate, setPreferredCurrency, } from '../../modules/currency'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import presentAlert from '../../components/Alert'; import ListItem from '../../components/ListItem'; import { useTheme } from '../../components/themes'; diff --git a/screen/settings/DefaultView.tsx b/src/screens/settings/DefaultView.tsx similarity index 100% rename from screen/settings/DefaultView.tsx rename to src/screens/settings/DefaultView.tsx diff --git a/screen/settings/DeleteWallet.tsx b/src/screens/settings/DeleteWallet.tsx similarity index 100% rename from screen/settings/DeleteWallet.tsx rename to src/screens/settings/DeleteWallet.tsx diff --git a/screen/settings/ElectrumSettings.tsx b/src/screens/settings/ElectrumSettings.tsx similarity index 99% rename from screen/settings/ElectrumSettings.tsx rename to src/screens/settings/ElectrumSettings.tsx index 5cd185d6e..0d83e883a 100644 --- a/screen/settings/ElectrumSettings.tsx +++ b/src/screens/settings/ElectrumSettings.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect, useMemo, useCallback } from 'react'; import { Alert, Keyboard, LayoutAnimation, Platform, StyleSheet, Switch, TextInput, View } from 'react-native'; import * as Electrum from '../../modules/Electrum'; import triggerHapticFeedback, { HapticFeedbackTypes, triggerSelectionHapticFeedback } from '../../modules/hapticFeedback'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import DeeplinkSchemaMatch from '../../class/deeplink-schema-match'; import presentAlert from '../../components/Alert'; import Button from '../../components/Button'; diff --git a/screen/settings/EncryptStorage.tsx b/src/screens/settings/EncryptStorage.tsx similarity index 100% rename from screen/settings/EncryptStorage.tsx rename to src/screens/settings/EncryptStorage.tsx diff --git a/screen/settings/GeneralSettings.tsx b/src/screens/settings/GeneralSettings.tsx similarity index 100% rename from screen/settings/GeneralSettings.tsx rename to src/screens/settings/GeneralSettings.tsx diff --git a/screen/settings/IsItMyAddress.tsx b/src/screens/settings/IsItMyAddress.tsx similarity index 99% rename from screen/settings/IsItMyAddress.tsx rename to src/screens/settings/IsItMyAddress.tsx index 43ff19d31..d3536c4d0 100644 --- a/screen/settings/IsItMyAddress.tsx +++ b/src/screens/settings/IsItMyAddress.tsx @@ -1,6 +1,6 @@ import React, { useRef, useState, useEffect } from 'react'; import { Keyboard, StyleSheet, TextInput, View, ScrollView, Pressable, Text } from 'react-native'; -import { ShroudButtonLink, ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudButtonLink, ShroudCard, ShroudText } from '../../components/ShroudComponents'; import Button from '../../components/Button'; import { useTheme } from '../../components/themes'; import loc from '../../loc'; diff --git a/screen/settings/Language.tsx b/src/screens/settings/Language.tsx similarity index 100% rename from screen/settings/Language.tsx rename to src/screens/settings/Language.tsx diff --git a/screen/settings/Licensing.tsx b/src/screens/settings/Licensing.tsx similarity index 95% rename from screen/settings/Licensing.tsx rename to src/screens/settings/Licensing.tsx index 24e25aa3b..54faf7410 100644 --- a/screen/settings/Licensing.tsx +++ b/src/screens/settings/Licensing.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { ScrollView } from 'react-native'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import { Spacing20 } from '../../components/Spacing'; const Licensing = () => { diff --git a/screen/settings/NetworkSettings.tsx b/src/screens/settings/NetworkSettings.tsx similarity index 100% rename from screen/settings/NetworkSettings.tsx rename to src/screens/settings/NetworkSettings.tsx diff --git a/screen/settings/NotificationSettings.tsx b/src/screens/settings/NotificationSettings.tsx similarity index 99% rename from screen/settings/NotificationSettings.tsx rename to src/screens/settings/NotificationSettings.tsx index da46076bc..95ee4de4b 100644 --- a/screen/settings/NotificationSettings.tsx +++ b/src/screens/settings/NotificationSettings.tsx @@ -16,7 +16,7 @@ import { checkNotificationPermissionStatus, NOTIFICATIONS_NO_AND_DONT_ASK_FLAG, } from '../../modules/notifications'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import presentAlert from '../../components/Alert'; import { Button } from '../../components/Button'; import CopyToClipboardButton from '../../components/CopyToClipboardButton'; diff --git a/screen/settings/ReleaseNotes.tsx b/src/screens/settings/ReleaseNotes.tsx similarity index 73% rename from screen/settings/ReleaseNotes.tsx rename to src/screens/settings/ReleaseNotes.tsx index f097d31e6..1e6eccf16 100644 --- a/screen/settings/ReleaseNotes.tsx +++ b/src/screens/settings/ReleaseNotes.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { ScrollView } from 'react-native'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; const ReleaseNotes: React.FC = () => { - const notes = require('../../release-notes'); + const notes = require('../../../release-notes'); return ( diff --git a/screen/settings/SelfTest.tsx b/src/screens/settings/SelfTest.tsx similarity index 98% rename from screen/settings/SelfTest.tsx rename to src/screens/settings/SelfTest.tsx index 7f6cc8120..e479f0ac4 100644 --- a/screen/settings/SelfTest.tsx +++ b/src/screens/settings/SelfTest.tsx @@ -8,7 +8,7 @@ import * as Electrum from '../../modules/Electrum'; import * as encryption from '../../modules/encryption'; import * as fs from '../../modules/fs'; import ecc from '../../modules/noble_ecc'; -import { ShroudText } from '../../ShroudComponents'; +import { ShroudText } from '../../components/ShroudComponents'; import presentAlert from '../../components/Alert'; import Button from '../../components/Button'; import SaveFileButton from '../../components/SaveFileButton'; diff --git a/screen/settings/Settings.tsx b/src/screens/settings/Settings.tsx similarity index 100% rename from screen/settings/Settings.tsx rename to src/screens/settings/Settings.tsx diff --git a/screen/settings/SettingsBlockExplorer.tsx b/src/screens/settings/SettingsBlockExplorer.tsx similarity index 100% rename from screen/settings/SettingsBlockExplorer.tsx rename to src/screens/settings/SettingsBlockExplorer.tsx diff --git a/screen/settings/SettingsPrivacy.tsx b/src/screens/settings/SettingsPrivacy.tsx similarity index 100% rename from screen/settings/SettingsPrivacy.tsx rename to src/screens/settings/SettingsPrivacy.tsx diff --git a/screen/settings/tools.tsx b/src/screens/settings/tools.tsx similarity index 100% rename from screen/settings/tools.tsx rename to src/screens/settings/tools.tsx diff --git a/screen/transactions/CPFP.js b/src/screens/transactions/CPFP.js similarity index 99% rename from screen/transactions/CPFP.js rename to src/screens/transactions/CPFP.js index 86dee66e2..ab94bf753 100644 --- a/screen/transactions/CPFP.js +++ b/src/screens/transactions/CPFP.js @@ -5,7 +5,7 @@ import PropTypes from 'prop-types'; import { Text } from '@rneui/themed'; import * as Electrum from '../../modules/Electrum'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import { HDSegwitBech32Transaction, HDSilentPaymentsWallet } from '../../class'; import presentAlert, { AlertType } from '../../components/Alert'; import Button from '../../components/Button'; diff --git a/screen/transactions/RBFBumpFee.js b/src/screens/transactions/RBFBumpFee.js similarity index 98% rename from screen/transactions/RBFBumpFee.js rename to src/screens/transactions/RBFBumpFee.js index fd6d95a8b..bac8bb683 100644 --- a/screen/transactions/RBFBumpFee.js +++ b/src/screens/transactions/RBFBumpFee.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { ActivityIndicator, ScrollView, StyleSheet, View } from 'react-native'; -import { ShroudText } from '../../ShroudComponents'; +import { ShroudText } from '../../components/ShroudComponents'; import { HDSegwitBech32Transaction, HDSilentPaymentsWallet } from '../../class'; import presentAlert from '../../components/Alert'; import SafeArea from '../../components/SafeArea'; diff --git a/screen/transactions/RBFCancel.js b/src/screens/transactions/RBFCancel.js similarity index 98% rename from screen/transactions/RBFCancel.js rename to src/screens/transactions/RBFCancel.js index ed51ed154..0d677ded1 100644 --- a/screen/transactions/RBFCancel.js +++ b/src/screens/transactions/RBFCancel.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { ActivityIndicator, ScrollView, View } from 'react-native'; -import { ShroudText } from '../../ShroudComponents'; +import { ShroudText } from '../../components/ShroudComponents'; import { HDSegwitBech32Transaction, HDSilentPaymentsWallet } from '../../class'; import presentAlert from '../../components/Alert'; import SafeArea from '../../components/SafeArea'; diff --git a/screen/transactions/TransactionDetails.tsx b/src/screens/transactions/TransactionDetails.tsx similarity index 99% rename from screen/transactions/TransactionDetails.tsx rename to src/screens/transactions/TransactionDetails.tsx index 149ce41df..c290bb639 100644 --- a/screen/transactions/TransactionDetails.tsx +++ b/src/screens/transactions/TransactionDetails.tsx @@ -6,7 +6,7 @@ import assert from 'assert'; import dayjs from 'dayjs'; import { InteractionManager, Linking, StyleSheet, Text, TextInput, View } from 'react-native'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import { Transaction, TWallet } from '../../class/wallets/types'; import presentAlert from '../../components/Alert'; import CopyToClipboardButton from '../../components/CopyToClipboardButton'; diff --git a/screen/transactions/TransactionStatus.tsx b/src/screens/transactions/TransactionStatus.tsx similarity index 99% rename from screen/transactions/TransactionStatus.tsx rename to src/screens/transactions/TransactionStatus.tsx index bab70b7b3..f32311fad 100644 --- a/screen/transactions/TransactionStatus.tsx +++ b/src/screens/transactions/TransactionStatus.tsx @@ -5,7 +5,7 @@ import { ActivityIndicator, BackHandler, StyleSheet, Text, TouchableOpacity, Vie import { Icon } from '@rneui/themed'; import * as Electrum from '../../modules/Electrum'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import { HDSegwitBech32Transaction } from '../../class'; import { HDSilentPaymentsWallet } from '../../class/wallets/hd-bip352-wallet'; import { Transaction, TWallet } from '../../class/wallets/types'; diff --git a/screen/wallets/Add.tsx b/src/screens/wallets/Add.tsx similarity index 99% rename from screen/wallets/Add.tsx rename to src/screens/wallets/Add.tsx index db1d33206..26edec454 100644 --- a/screen/wallets/Add.tsx +++ b/src/screens/wallets/Add.tsx @@ -4,7 +4,7 @@ import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { RouteProp, useRoute } from '@react-navigation/native'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudButtonLink, ShroudFormLabel, ShroudText } from '../../ShroudComponents'; +import { ShroudButtonLink, ShroudFormLabel, ShroudText } from '../../components/ShroudComponents'; import presentAlert from '../../components/Alert'; import Button from '../../components/Button'; import HeaderMenuButton from '../../components/HeaderMenuButton'; diff --git a/screen/wallets/CreateWalletScreen.tsx b/src/screens/wallets/CreateWalletScreen.tsx similarity index 100% rename from screen/wallets/CreateWalletScreen.tsx rename to src/screens/wallets/CreateWalletScreen.tsx diff --git a/screen/wallets/DrawerList.tsx b/src/screens/wallets/DrawerList.tsx similarity index 100% rename from screen/wallets/DrawerList.tsx rename to src/screens/wallets/DrawerList.tsx diff --git a/screen/wallets/ImportSpeed.tsx b/src/screens/wallets/ImportSpeed.tsx similarity index 97% rename from screen/wallets/ImportSpeed.tsx rename to src/screens/wallets/ImportSpeed.tsx index 9c7d27398..1e374aedf 100644 --- a/screen/wallets/ImportSpeed.tsx +++ b/src/screens/wallets/ImportSpeed.tsx @@ -2,7 +2,7 @@ import { useExtendedNavigation } from '../../hooks/useExtendedNavigation'; import React, { useState } from 'react'; import { ActivityIndicator, StyleSheet, TextInput, View } from 'react-native'; import { NativeStackNavigationProp } from '@react-navigation/native-stack'; -import { ShroudFormLabel, ShroudFormMultiInput } from '../../ShroudComponents'; +import { ShroudFormLabel, ShroudFormMultiInput } from '../../components/ShroudComponents'; import presentAlert from '../../components/Alert'; import Button from '../../components/Button'; import SafeArea from '../../components/SafeArea'; diff --git a/screen/wallets/ImportWallet.tsx b/src/screens/wallets/ImportWallet.tsx similarity index 99% rename from screen/wallets/ImportWallet.tsx rename to src/screens/wallets/ImportWallet.tsx index 1a8cfb713..41edb56a4 100644 --- a/screen/wallets/ImportWallet.tsx +++ b/src/screens/wallets/ImportWallet.tsx @@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react'; import { RouteProp, useRoute } from '@react-navigation/native'; import * as Clipboard from 'expo-clipboard'; import { ActivityIndicator, Keyboard, Platform, StyleSheet, TouchableWithoutFeedback, View, TouchableOpacity, Image } from 'react-native'; -import { ShroudFormLabel, ShroudFormMultiInput } from '../../ShroudComponents'; +import { ShroudFormLabel, ShroudFormMultiInput } from '../../components/ShroudComponents'; import Button from '../../components/Button'; import { DoneAndDismissKeyboardInputAccessory, diff --git a/screen/wallets/OnboardingScreen.tsx b/src/screens/wallets/OnboardingScreen.tsx similarity index 100% rename from screen/wallets/OnboardingScreen.tsx rename to src/screens/wallets/OnboardingScreen.tsx diff --git a/screen/wallets/PleaseBackup.tsx b/src/screens/wallets/PleaseBackup.tsx similarity index 100% rename from screen/wallets/PleaseBackup.tsx rename to src/screens/wallets/PleaseBackup.tsx diff --git a/screen/wallets/ProvideEntropy.tsx b/src/screens/wallets/ProvideEntropy.tsx similarity index 100% rename from screen/wallets/ProvideEntropy.tsx rename to src/screens/wallets/ProvideEntropy.tsx diff --git a/screen/wallets/WalletAddresses.tsx b/src/screens/wallets/WalletAddresses.tsx similarity index 100% rename from screen/wallets/WalletAddresses.tsx rename to src/screens/wallets/WalletAddresses.tsx diff --git a/screen/wallets/WalletDetails.tsx b/src/screens/wallets/WalletDetails.tsx similarity index 99% rename from screen/wallets/WalletDetails.tsx rename to src/screens/wallets/WalletDetails.tsx index 29258d7e9..7243fd9ce 100644 --- a/screen/wallets/WalletDetails.tsx +++ b/src/screens/wallets/WalletDetails.tsx @@ -12,7 +12,7 @@ import { } from 'react-native'; import { writeFileAndExport } from '../../modules/fs'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import { AbstractHDElectrumWallet } from '../../class/wallets/abstract-hd-electrum-wallet'; import presentAlert from '../../components/Alert'; import Button from '../../components/Button'; diff --git a/screen/wallets/WalletExport.tsx b/src/screens/wallets/WalletExport.tsx similarity index 99% rename from screen/wallets/WalletExport.tsx rename to src/screens/wallets/WalletExport.tsx index 883490c57..07666f3f5 100644 --- a/screen/wallets/WalletExport.tsx +++ b/src/screens/wallets/WalletExport.tsx @@ -6,7 +6,7 @@ import { LayoutChangeEvent, ScrollView, StyleSheet, Pressable, View } from 'reac import { useScreenProtect } from '../../hooks/useScreenProtect'; import { validateMnemonic } from '../../modules/bip39'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudText } from '../../ShroudComponents'; +import { ShroudText } from '../../components/ShroudComponents'; import QRCodeComponent from '../../components/QRCodeComponent'; import SeedWords from '../../components/SeedWords'; import { useTheme } from '../../components/themes'; diff --git a/screen/wallets/WalletTransactions.tsx b/src/screens/wallets/WalletTransactions.tsx similarity index 100% rename from screen/wallets/WalletTransactions.tsx rename to src/screens/wallets/WalletTransactions.tsx diff --git a/screen/wallets/WalletsList.tsx b/src/screens/wallets/WalletsList.tsx similarity index 100% rename from screen/wallets/WalletsList.tsx rename to src/screens/wallets/WalletsList.tsx diff --git a/screen/wallets/generateWord.js b/src/screens/wallets/generateWord.js similarity index 97% rename from screen/wallets/generateWord.js rename to src/screens/wallets/generateWord.js index 322a626d5..e74174861 100644 --- a/screen/wallets/generateWord.js +++ b/src/screens/wallets/generateWord.js @@ -3,7 +3,7 @@ import React, { useState } from 'react'; import { Keyboard, StyleSheet, TextInput, View } from 'react-native'; import { generateChecksumWords } from '../../modules/checksumWords'; -import { ShroudCard, ShroudText } from '../../ShroudComponents'; +import { ShroudCard, ShroudText } from '../../components/ShroudComponents'; import { randomBytes } from '../../class/rng'; import Button from '../../components/Button'; import loc from '../../loc'; diff --git a/screen/wallets/signVerify.js b/src/screens/wallets/signVerify.js similarity index 99% rename from screen/wallets/signVerify.js rename to src/screens/wallets/signVerify.js index 1e68e10b7..96c1909a9 100644 --- a/screen/wallets/signVerify.js +++ b/src/screens/wallets/signVerify.js @@ -4,7 +4,7 @@ import { ActivityIndicator, Keyboard, LayoutAnimation, Platform, ScrollView, Sty import { Icon } from '@rneui/themed'; import Share from 'react-native-share'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../modules/hapticFeedback'; -import { ShroudFormLabel } from '../../ShroudComponents'; +import { ShroudFormLabel } from '../../components/ShroudComponents'; import presentAlert from '../../components/Alert'; import { FButton, FContainer } from '../../components/FloatButtons'; import { useTheme } from '../../components/themes'; diff --git a/screen/wallets/xpub.styles.ts b/src/screens/wallets/xpub.styles.ts similarity index 100% rename from screen/wallets/xpub.styles.ts rename to src/screens/wallets/xpub.styles.ts diff --git a/screen/wallets/xpub.tsx b/src/screens/wallets/xpub.tsx similarity index 98% rename from screen/wallets/xpub.tsx rename to src/screens/wallets/xpub.tsx index a6c41cbf1..2ea50a044 100644 --- a/screen/wallets/xpub.tsx +++ b/src/screens/wallets/xpub.tsx @@ -2,7 +2,7 @@ import { NavigationProp, RouteProp, useFocusEffect, useNavigation, useRoute } fr import React, { useCallback, useEffect, useRef, useState } from 'react'; import { ActivityIndicator, InteractionManager, View } from 'react-native'; import Share from 'react-native-share'; -import { ShroudText } from '../../ShroudComponents'; +import { ShroudText } from '../../components/ShroudComponents'; import Button from '../../components/Button'; import CopyTextToClipboard from '../../components/CopyTextToClipboard'; import QRCodeComponent from '../../components/QRCodeComponent'; diff --git a/tests/.eslintrc b/src/tests/.eslintrc similarity index 100% rename from tests/.eslintrc rename to src/tests/.eslintrc diff --git a/tests/custom-environment.js b/src/tests/custom-environment.js similarity index 100% rename from tests/custom-environment.js rename to src/tests/custom-environment.js diff --git a/tests/custom-reporter.js b/src/tests/custom-reporter.js similarity index 100% rename from tests/custom-reporter.js rename to src/tests/custom-reporter.js diff --git a/tests/e2e/detox-build-release-apk.sh b/src/tests/e2e/detox-build-release-apk.sh similarity index 100% rename from tests/e2e/detox-build-release-apk.sh rename to src/tests/e2e/detox-build-release-apk.sh diff --git a/tests/e2e/detox-prepare-android-emu.sh b/src/tests/e2e/detox-prepare-android-emu.sh similarity index 100% rename from tests/e2e/detox-prepare-android-emu.sh rename to src/tests/e2e/detox-prepare-android-emu.sh diff --git a/tests/e2e/helperz.js b/src/tests/e2e/helperz.js similarity index 100% rename from tests/e2e/helperz.js rename to src/tests/e2e/helperz.js diff --git a/tests/e2e/jest.config.js b/src/tests/e2e/jest.config.js similarity index 100% rename from tests/e2e/jest.config.js rename to src/tests/e2e/jest.config.js diff --git a/tests/e2e/shroud.spec.js b/src/tests/e2e/shroud.spec.js similarity index 100% rename from tests/e2e/shroud.spec.js rename to src/tests/e2e/shroud.spec.js diff --git a/tests/e2e/shroud2.spec.js b/src/tests/e2e/shroud2.spec.js similarity index 100% rename from tests/e2e/shroud2.spec.js rename to src/tests/e2e/shroud2.spec.js diff --git a/tests/e2e/shroud3.spec.js b/src/tests/e2e/shroud3.spec.js similarity index 100% rename from tests/e2e/shroud3.spec.js rename to src/tests/e2e/shroud3.spec.js diff --git a/tests/integration/App.test.js b/src/tests/integration/App.test.js similarity index 90% rename from tests/integration/App.test.js rename to src/tests/integration/App.test.js index c9e5cb116..b56de5f9e 100644 --- a/tests/integration/App.test.js +++ b/src/tests/integration/App.test.js @@ -3,8 +3,8 @@ import React from 'react'; import { render } from '@testing-library/react-native'; import { NavigationContainer } from '@react-navigation/native'; import { Header } from '../../components/Header'; -import SelfTest from '../../screen/settings/SelfTest'; -import Settings from '../../screen/settings/Settings'; +import SelfTest from '../../screens/settings/SelfTest'; +import Settings from '../../screens/settings/Settings'; import { BlueDefaultTheme } from '../../components/themes'; jest.mock('../../modules/Electrum', () => { diff --git a/tests/integration/Currency.test.js b/src/tests/integration/Currency.test.js similarity index 100% rename from tests/integration/Currency.test.js rename to src/tests/integration/Currency.test.js diff --git a/tests/integration/Electrum.test.js b/src/tests/integration/Electrum.test.js similarity index 100% rename from tests/integration/Electrum.test.js rename to src/tests/integration/Electrum.test.js diff --git a/tests/integration/ElectrumClient.test.js b/src/tests/integration/ElectrumClient.test.js similarity index 100% rename from tests/integration/ElectrumClient.test.js rename to src/tests/integration/ElectrumClient.test.js diff --git a/tests/integration/notifications.test.js b/src/tests/integration/notifications.test.js similarity index 100% rename from tests/integration/notifications.test.js rename to src/tests/integration/notifications.test.js diff --git a/tests/setup.js b/src/tests/setup.js similarity index 100% rename from tests/setup.js rename to src/tests/setup.js diff --git a/tests/unit/addresses.test.ts b/src/tests/unit/addresses.test.ts similarity index 98% rename from tests/unit/addresses.test.ts rename to src/tests/unit/addresses.test.ts index 87cc310cd..2e7b3d522 100644 --- a/tests/unit/addresses.test.ts +++ b/src/tests/unit/addresses.test.ts @@ -1,5 +1,5 @@ import assert from 'assert'; -import { TABS, filterByAddressType, getAddress, sortByAddressIndex, totalBalance } from '../../screen/wallets/WalletAddresses'; +import { TABS, filterByAddressType, getAddress, sortByAddressIndex, totalBalance } from '../../screens/wallets/WalletAddresses'; jest.mock('../../modules/currency', () => { return { diff --git a/tests/unit/bip352.test.ts b/src/tests/unit/bip352.test.ts similarity index 100% rename from tests/unit/bip352.test.ts rename to src/tests/unit/bip352.test.ts diff --git a/tests/unit/checksumWords.test.ts b/src/tests/unit/checksumWords.test.ts similarity index 100% rename from tests/unit/checksumWords.test.ts rename to src/tests/unit/checksumWords.test.ts diff --git a/tests/unit/currency.test.ts b/src/tests/unit/currency.test.ts similarity index 100% rename from tests/unit/currency.test.ts rename to src/tests/unit/currency.test.ts diff --git a/tests/unit/deeplink-schema-match.test.js b/src/tests/unit/deeplink-schema-match.test.js similarity index 100% rename from tests/unit/deeplink-schema-match.test.js rename to src/tests/unit/deeplink-schema-match.test.js diff --git a/tests/unit/ecc.test.ts b/src/tests/unit/ecc.test.ts similarity index 100% rename from tests/unit/ecc.test.ts rename to src/tests/unit/ecc.test.ts diff --git a/tests/unit/encryption.test.ts b/src/tests/unit/encryption.test.ts similarity index 100% rename from tests/unit/encryption.test.ts rename to src/tests/unit/encryption.test.ts diff --git a/tests/unit/fixtures/caravan-multisig.json b/src/tests/unit/fixtures/caravan-multisig.json similarity index 100% rename from tests/unit/fixtures/caravan-multisig.json rename to src/tests/unit/fixtures/caravan-multisig.json diff --git a/tests/unit/fixtures/coldcardmk4/descriptor.txt b/src/tests/unit/fixtures/coldcardmk4/descriptor.txt similarity index 100% rename from tests/unit/fixtures/coldcardmk4/descriptor.txt rename to src/tests/unit/fixtures/coldcardmk4/descriptor.txt diff --git a/tests/unit/fixtures/coldcardmk4/new-wasabi.json b/src/tests/unit/fixtures/coldcardmk4/new-wasabi.json similarity index 100% rename from tests/unit/fixtures/coldcardmk4/new-wasabi.json rename to src/tests/unit/fixtures/coldcardmk4/new-wasabi.json diff --git a/tests/unit/fixtures/coldcardmk4/sparrow-export.json b/src/tests/unit/fixtures/coldcardmk4/sparrow-export.json similarity index 100% rename from tests/unit/fixtures/coldcardmk4/sparrow-export.json rename to src/tests/unit/fixtures/coldcardmk4/sparrow-export.json diff --git a/tests/unit/fixtures/electrum-multisig-wallet-with-seed-and-passphrase.json b/src/tests/unit/fixtures/electrum-multisig-wallet-with-seed-and-passphrase.json similarity index 100% rename from tests/unit/fixtures/electrum-multisig-wallet-with-seed-and-passphrase.json rename to src/tests/unit/fixtures/electrum-multisig-wallet-with-seed-and-passphrase.json diff --git a/tests/unit/fixtures/electrum-multisig-wallet-with-seed.json b/src/tests/unit/fixtures/electrum-multisig-wallet-with-seed.json similarity index 100% rename from tests/unit/fixtures/electrum-multisig-wallet-with-seed.json rename to src/tests/unit/fixtures/electrum-multisig-wallet-with-seed.json diff --git a/tests/unit/fixtures/fromsparrow-coldcard.txt b/src/tests/unit/fixtures/fromsparrow-coldcard.txt similarity index 100% rename from tests/unit/fixtures/fromsparrow-coldcard.txt rename to src/tests/unit/fixtures/fromsparrow-coldcard.txt diff --git a/tests/unit/fixtures/fromsparrow-electrum.json b/src/tests/unit/fixtures/fromsparrow-electrum.json similarity index 100% rename from tests/unit/fixtures/fromsparrow-electrum.json rename to src/tests/unit/fixtures/fromsparrow-electrum.json diff --git a/tests/unit/fixtures/fromsparrow-specter.json b/src/tests/unit/fixtures/fromsparrow-specter.json similarity index 100% rename from tests/unit/fixtures/fromsparrow-specter.json rename to src/tests/unit/fixtures/fromsparrow-specter.json diff --git a/tests/unit/fixtures/nunchuck-bsms.txt b/src/tests/unit/fixtures/nunchuck-bsms.txt similarity index 100% rename from tests/unit/fixtures/nunchuck-bsms.txt rename to src/tests/unit/fixtures/nunchuck-bsms.txt diff --git a/tests/unit/fixtures/skeleton-cobo.txt b/src/tests/unit/fixtures/skeleton-cobo.txt similarity index 100% rename from tests/unit/fixtures/skeleton-cobo.txt rename to src/tests/unit/fixtures/skeleton-cobo.txt diff --git a/tests/unit/fixtures/skeleton-coldcard.txt b/src/tests/unit/fixtures/skeleton-coldcard.txt similarity index 100% rename from tests/unit/fixtures/skeleton-coldcard.txt rename to src/tests/unit/fixtures/skeleton-coldcard.txt diff --git a/tests/unit/fixtures/skeleton-electrum-hex-only.txt b/src/tests/unit/fixtures/skeleton-electrum-hex-only.txt similarity index 100% rename from tests/unit/fixtures/skeleton-electrum-hex-only.txt rename to src/tests/unit/fixtures/skeleton-electrum-hex-only.txt diff --git a/tests/unit/fixtures/skeleton-electrum.txt b/src/tests/unit/fixtures/skeleton-electrum.txt similarity index 100% rename from tests/unit/fixtures/skeleton-electrum.txt rename to src/tests/unit/fixtures/skeleton-electrum.txt diff --git a/tests/unit/fixtures/skeleton-walletdescriptor.txt b/src/tests/unit/fixtures/skeleton-walletdescriptor.txt similarity index 100% rename from tests/unit/fixtures/skeleton-walletdescriptor.txt rename to src/tests/unit/fixtures/skeleton-walletdescriptor.txt diff --git a/tests/unit/hd-taproot-wallet.test.ts b/src/tests/unit/hd-taproot-wallet.test.ts similarity index 100% rename from tests/unit/hd-taproot-wallet.test.ts rename to src/tests/unit/hd-taproot-wallet.test.ts diff --git a/tests/unit/isValidBech32Address.test.ts b/src/tests/unit/isValidBech32Address.test.ts similarity index 100% rename from tests/unit/isValidBech32Address.test.ts rename to src/tests/unit/isValidBech32Address.test.ts diff --git a/tests/unit/loc.test.js b/src/tests/unit/loc.test.js similarity index 100% rename from tests/unit/loc.test.js rename to src/tests/unit/loc.test.js diff --git a/tests/unit/provide-entropy.test.ts b/src/tests/unit/provide-entropy.test.ts similarity index 99% rename from tests/unit/provide-entropy.test.ts rename to src/tests/unit/provide-entropy.test.ts index 8e108938f..be17fcfa0 100644 --- a/tests/unit/provide-entropy.test.ts +++ b/src/tests/unit/provide-entropy.test.ts @@ -1,6 +1,6 @@ import assert from 'assert'; -import { convertToBuffer, EActionType, entropyToHex, eReducer, getEntropy } from '../../screen/wallets/ProvideEntropy'; +import { convertToBuffer, EActionType, entropyToHex, eReducer, getEntropy } from '../../screens/wallets/ProvideEntropy'; describe('Entropy reducer and format', () => { it('handles push and pop correctly', () => { diff --git a/typings/ActionIcons.ts b/src/typings/ActionIcons.ts similarity index 100% rename from typings/ActionIcons.ts rename to src/typings/ActionIcons.ts diff --git a/typings/CommonToolTipActions.ts b/src/typings/CommonToolTipActions.ts similarity index 100% rename from typings/CommonToolTipActions.ts rename to src/typings/CommonToolTipActions.ts diff --git a/typings/bip21.d.ts b/src/typings/bip21.d.ts similarity index 100% rename from typings/bip21.d.ts rename to src/typings/bip21.d.ts diff --git a/typings/coinselect.d.ts b/src/typings/coinselect.d.ts similarity index 100% rename from typings/coinselect.d.ts rename to src/typings/coinselect.d.ts diff --git a/typings/globals.d.ts b/src/typings/globals.d.ts similarity index 100% rename from typings/globals.d.ts rename to src/typings/globals.d.ts diff --git a/typings/react-native-passcode-auth.d.ts b/src/typings/react-native-passcode-auth.d.ts similarity index 100% rename from typings/react-native-passcode-auth.d.ts rename to src/typings/react-native-passcode-auth.d.ts diff --git a/typings/react-native-prompt-android.d.ts b/src/typings/react-native-prompt-android.d.ts similarity index 100% rename from typings/react-native-prompt-android.d.ts rename to src/typings/react-native-prompt-android.d.ts diff --git a/typings/tiny-secp256k1.d.ts b/src/typings/tiny-secp256k1.d.ts similarity index 100% rename from typings/tiny-secp256k1.d.ts rename to src/typings/tiny-secp256k1.d.ts diff --git a/util/fetch.ts b/src/utils/fetch.ts similarity index 100% rename from util/fetch.ts rename to src/utils/fetch.ts diff --git a/utils/isValidBech32Address.ts b/src/utils/isValidBech32Address.ts similarity index 100% rename from utils/isValidBech32Address.ts rename to src/utils/isValidBech32Address.ts diff --git a/utils/transactionHelpers.ts b/src/utils/transactionHelpers.ts similarity index 100% rename from utils/transactionHelpers.ts rename to src/utils/transactionHelpers.ts diff --git a/tsconfig.json b/tsconfig.json index 66cd8834d..14cc15cf4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,5 +16,5 @@ } }, "extends": "@react-native/typescript-config/tsconfig.json", - "exclude": ["node_modules", "babel.config.js", "jest.config.js", "components/react-native-draggable-flatlist", "scripts/maccatalystpatches"], + "exclude": ["node_modules", "babel.config.js", "jest.config.js", "src/components/react-native-draggable-flatlist", "scripts/maccatalystpatches"], } \ No newline at end of file From 56ae9f4a54e5ade0265ef6d71eacd638b5a3a25b Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 19 May 2026 01:16:18 +0530 Subject: [PATCH 34/40] Fix: Update react-native-bw-file-access path in ios/Podfile to src/ --- ios/Podfile | 2 +- ios/Podfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index 10eb44308..90767f097 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -39,7 +39,7 @@ def configure_target() :app_path => "#{Pod::Config.instance.installation_root}/.." ) - pod 'react-native-bw-file-access', :path => '../modules/react-native-bw-file-access' + pod 'react-native-bw-file-access', :path => '../src/modules/react-native-bw-file-access' pod 'RustJsiBridge', :path => '.' end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d106fcf6c..5a3e7f8c5 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3464,7 +3464,7 @@ DEPENDENCIES: - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - react-native-biometrics (from `../node_modules/react-native-biometrics`) - - react-native-bw-file-access (from `../modules/react-native-bw-file-access`) + - react-native-bw-file-access (from `../src/modules/react-native-bw-file-access`) - react-native-capture-protection (from `../node_modules/react-native-capture-protection`) - react-native-get-random-values (from `../node_modules/react-native-get-random-values`) - "react-native-menu (from `../node_modules/@react-native-menu/menu`)" @@ -3681,7 +3681,7 @@ EXTERNAL SOURCES: react-native-biometrics: :path: "../node_modules/react-native-biometrics" react-native-bw-file-access: - :path: "../modules/react-native-bw-file-access" + :path: "../src/modules/react-native-bw-file-access" react-native-capture-protection: :path: "../node_modules/react-native-capture-protection" react-native-get-random-values: @@ -3930,6 +3930,6 @@ SPEC CHECKSUMS: Yoga: cf2a67aa1c8a225f0cb98a5f531d6f305d3f12e5 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 -PODFILE CHECKSUM: 7fa516f1878bc797481133c6a11254daf899e303 +PODFILE CHECKSUM: 3b6ae82641bd75add3220d9a9c08518644915cee COCOAPODS: 1.16.2 From 0888c8e997aee7d60320049d7a3dc7aac98ce3d7 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Tue, 19 May 2026 01:41:47 +0530 Subject: [PATCH 35/40] Fix: Update fiatUnits.json relative paths in Xcode project and Android gradle task to src/ --- android/app/build.gradle | 2 +- ios/Shroud.xcodeproj/project.pbxproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 7d5f1dea2..e2e0b252a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -150,7 +150,7 @@ android { } task copyFiatUnits(type: Copy) { - from '../../models/fiatUnits.json' + from '../../src/models/fiatUnits.json' into 'src/main/assets' } diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index 93e9fd927..302ec0961 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -205,7 +205,7 @@ B44033F32BCC377F00162242 /* WidgetData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetData.swift; sourceTree = ""; }; B44033F82BCC379200162242 /* WidgetDataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetDataStore.swift; sourceTree = ""; }; B44033FF2BCC37F800162242 /* Bundle+decode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+decode.swift"; sourceTree = ""; }; - B440340E2BCC40A400162242 /* fiatUnits.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = fiatUnits.json; path = ../../../models/fiatUnits.json; sourceTree = ""; }; + B440340E2BCC40A400162242 /* fiatUnits.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = fiatUnits.json; path = ../../../src/models/fiatUnits.json; sourceTree = ""; }; B450109B2C0FCD8A00619044 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; B4549F352B82B10D002E3153 /* ci_post_clone.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = ci_post_clone.sh; sourceTree = ""; }; B461B851299599F800E431AA /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Shroud/AppDelegate.swift; sourceTree = ""; }; From 080a7d7603d0edd926d6ff0742d8827c3b1c5ac4 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Wed, 27 May 2026 23:14:07 +0530 Subject: [PATCH 36/40] refactor: restore Shroud target/scheme names and migrate clipboard imports to expo-clipboard --- eas.json | 6 +- ios/Podfile | 2 +- ios/Podfile.lock | 2 +- ios/Shroud.xcodeproj/project.pbxproj | 90 ++++++++++--------- .../xcschemes/MarketWidget.xcscheme | 12 +-- .../xcschemes/PriceWidget.xcscheme | 12 +-- .../xcshareddata/xcschemes/Shroud.xcscheme | 14 +-- .../WalletInformationAndMarketWidget.xcscheme | 12 +-- .../WalletInformationWidget.xcscheme | 12 +-- ios/Shroud/ShroudWallet.entitlements | 8 -- src/screens/wallets/NoPaymentFound.tsx | 4 +- src/screens/wallets/TrackPayment.tsx | 4 +- 12 files changed, 87 insertions(+), 91 deletions(-) delete mode 100644 ios/Shroud/ShroudWallet.entitlements diff --git a/eas.json b/eas.json index 4bdcbefd9..e133ba645 100644 --- a/eas.json +++ b/eas.json @@ -21,7 +21,8 @@ "buildType": "apk" }, "ios": { - "simulator": false + "simulator": false, + "scheme": "Shroud" } }, "production": { @@ -29,7 +30,8 @@ "buildType": "app-bundle" }, "ios": { - "simulator": false + "simulator": false, + "scheme": "Shroud" } } }, diff --git a/ios/Podfile b/ios/Podfile index 90767f097..a2456566c 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -44,7 +44,7 @@ def configure_target() end -target 'BlueWallet' do +target 'Shroud' do configure_target() end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 5a3e7f8c5..902500085 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3930,6 +3930,6 @@ SPEC CHECKSUMS: Yoga: cf2a67aa1c8a225f0cb98a5f531d6f305d3f12e5 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 -PODFILE CHECKSUM: 3b6ae82641bd75add3220d9a9c08518644915cee +PODFILE CHECKSUM: dab8a6989b5473be9fb51852924cf5ebdbcb851f COCOAPODS: 1.16.2 diff --git a/ios/Shroud.xcodeproj/project.pbxproj b/ios/Shroud.xcodeproj/project.pbxproj index 302ec0961..1d94c8081 100644 --- a/ios/Shroud.xcodeproj/project.pbxproj +++ b/ios/Shroud.xcodeproj/project.pbxproj @@ -8,12 +8,12 @@ /* Begin PBXBuildFile section */ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 17CDA0718F42DB2CE856C872 /* libPods-BlueWallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 040819EDF8BD9C50A9C83E24 /* libPods-BlueWallet.a */; }; 32B5A32A2334450100F8D608 /* Bridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B5A3292334450100F8D608 /* Bridge.swift */; }; 6DF25A9F249DB97E001D06F5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DF25A9E249DB97E001D06F5 /* LaunchScreen.storyboard */; }; 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B468CC34D5B41F3950078EF /* libsqlite3.0.tbd */; }; 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B9D9B3A7B2CB4255876B67AF /* libz.tbd */; }; 84E05A842721191B001A0D3A /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 84E05A832721191B001A0D3A /* Settings.bundle */; }; + 9254C2BA762086F79B3A560B /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD4B40711709664792653305 /* ExpoModulesProvider.swift */; }; B409AB062D71E07500BA06F8 /* MenuElementsEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B409AB052D71E07500BA06F8 /* MenuElementsEmitter.swift */; }; B41C2E562BB3DCB8000FE097 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B41C2E552BB3DCB8000FE097 /* PrivacyInfo.xcprivacy */; }; B44033BF2BCC32F800162242 /* BitcoinUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B44033BE2BCC32F800162242 /* BitcoinUnit.swift */; }; @@ -55,8 +55,7 @@ B4B3EC222D69FF6C00327F3D /* CustomSegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B3EC202D69FF6C00327F3D /* CustomSegmentedControl.swift */; }; B4B3EC252D69FF8700327F3D /* EventEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B3EC232D69FF8700327F3D /* EventEmitter.swift */; }; B4D899942DCAE67700B959AA /* CustomSegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = B4D899932DCAE67700B959AA /* CustomSegmentedControl.m */; }; - C978A716948AB7DEC5B6F677 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; - E3D89ABA85DFC3B782B1A9C2 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8FEE6B2DC250032D610A48 /* ExpoModulesProvider.swift */; }; + ED8FEB0E8E342C42D6EE1FE9 /* libPods-Shroud.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 48084EED5CF121A8C9D5678D /* libPods-Shroud.a */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -84,13 +83,11 @@ /* Begin PBXFileReference section */ 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 040819EDF8BD9C50A9C83E24 /* libPods-BlueWallet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BlueWallet.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07F961A680F5B00A75B9A /* BlueWallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07F961A680F5B00A75B9A /* Shroud.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Shroud.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Shroud/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Shroud/Info.plist; sourceTree = ""; }; 1AE7FA8B4A18928E917F42D1 /* Pods-BlueWallet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BlueWallet.debug.xcconfig"; path = "Target Support Files/Pods-BlueWallet/Pods-BlueWallet.debug.xcconfig"; sourceTree = ""; }; 1DD63E4B5C8344BB9880C9EC /* libReactNativePermissions.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libReactNativePermissions.a; sourceTree = ""; }; - 1F8FEE6B2DC250032D610A48 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-BlueWallet/ExpoModulesProvider.swift"; sourceTree = ""; }; 253243E162CE4822BF3A3B7D /* libRNRandomBytes-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNRandomBytes-tvOS.a"; sourceTree = ""; }; 2654894D4DE44A4C8F71773D /* CoreData.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -101,8 +98,11 @@ 32F0A2992311DBB20095C559 /* ComplicationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = ""; }; 334051161886419EA186F4BA /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; 3703B10AAB374CF896CCC2EA /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = ""; }; + 3B91A6043606F8072F31878B /* Pods-Shroud.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Shroud.debug.xcconfig"; path = "Target Support Files/Pods-Shroud/Pods-Shroud.debug.xcconfig"; sourceTree = ""; }; + 3F2D775EA0D4AFF53304BF71 /* Pods-Shroud.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Shroud.release.xcconfig"; path = "Target Support Files/Pods-Shroud/Pods-Shroud.release.xcconfig"; sourceTree = ""; }; 44BC9E3EE0E9476A830CCCB9 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; 47564776A7A3427DB36C087D /* FontAwesome5_Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Regular.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf"; sourceTree = ""; }; + 48084EED5CF121A8C9D5678D /* libPods-Shroud.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Shroud.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 4F12F501B686459183E0BE0D /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; 5A8F67CF29564E41882ECEF8 /* FontAwesome5_Brands.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Brands.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf"; sourceTree = ""; }; 6A65D81712444D37BA152B06 /* libRNRandomBytes.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRandomBytes.a; sourceTree = ""; }; @@ -172,6 +172,7 @@ 9F1F51A83D044F3BB26A35FC /* libRNSVG-tvOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = "libRNSVG-tvOS.a"; sourceTree = ""; }; A7C4B1FDAD264618BAF8C335 /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCWebView.a; sourceTree = ""; }; AB2325650CE04F018697ACFE /* libRNReactNativeHapticFeedback.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNReactNativeHapticFeedback.a; sourceTree = ""; }; + AD4B40711709664792653305 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Shroud/ExpoModulesProvider.swift"; sourceTree = ""; }; B409AB052D71E07500BA06F8 /* MenuElementsEmitter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MenuElementsEmitter.swift; path = MenuElementsEmitter/MenuElementsEmitter.swift; sourceTree = SOURCE_ROOT; }; B40D4E30225841EC00428FCC /* BlueWalletWatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueWalletWatch.app; sourceTree = BUILT_PRODUCTS_DIR; }; B40D4E33225841EC00428FCC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; @@ -264,8 +265,7 @@ files = ( 782F075B5DD048449E2DECE9 /* libz.tbd in Frameworks */, 764B49B1420D4AEB8109BF62 /* libsqlite3.0.tbd in Frameworks */, - C978A716948AB7DEC5B6F677 /* BuildFile in Frameworks */, - 17CDA0718F42DB2CE856C872 /* libPods-BlueWallet.a in Frameworks */, + ED8FEB0E8E342C42D6EE1FE9 /* libPods-Shroud.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -290,6 +290,14 @@ name = "Supporting Files"; sourceTree = ""; }; + 01ECEC4423962151D39B41FF /* Shroud */ = { + isa = PBXGroup; + children = ( + AD4B40711709664792653305 /* ExpoModulesProvider.swift */, + ); + name = Shroud; + sourceTree = ""; + }; 13B07FAE1A68108700A75B9A /* BlueWallet */ = { isa = PBXGroup; children = ( @@ -310,7 +318,7 @@ 1DFE8D29A7045CA05D6D5799 /* ExpoModulesProviders */ = { isa = PBXGroup; children = ( - 45C0511849669DAF4DC9FACC /* BlueWallet */, + 01ECEC4423962151D39B41FF /* Shroud */, ); name = ExpoModulesProviders; sourceTree = ""; @@ -330,19 +338,11 @@ 3271B0AA236E2E0700DA766F /* NotificationCenter.framework */, 6D333B3A252FE1A3004D72DF /* WidgetKit.framework */, 6D333B3C252FE1A3004D72DF /* SwiftUI.framework */, - 040819EDF8BD9C50A9C83E24 /* libPods-BlueWallet.a */, + 48084EED5CF121A8C9D5678D /* libPods-Shroud.a */, ); name = Frameworks; sourceTree = ""; }; - 45C0511849669DAF4DC9FACC /* BlueWallet */ = { - isa = PBXGroup; - children = ( - 1F8FEE6B2DC250032D610A48 /* ExpoModulesProvider.swift */, - ); - name = BlueWallet; - sourceTree = ""; - }; 4B0CACE36C3348E1BCEA92C8 /* Resources */ = { isa = PBXGroup; children = ( @@ -481,7 +481,7 @@ 83CBBA001A601CBA00E9B192 /* Products */ = { isa = PBXGroup; children = ( - 13B07F961A680F5B00A75B9A /* BlueWallet.app */, + 13B07F961A680F5B00A75B9A /* Shroud.app */, B40D4E30225841EC00428FCC /* BlueWalletWatch.app */, 6D2A6461258BA92C0092292B /* Stickers.appex */, 6DD4109C266CADF10087DE03 /* WidgetsExtension.appex */, @@ -634,6 +634,8 @@ children = ( 1AE7FA8B4A18928E917F42D1 /* Pods-BlueWallet.debug.xcconfig */, 93D74F9C8EE7B4443A49594C /* Pods-BlueWallet.release.xcconfig */, + 3B91A6043606F8072F31878B /* Pods-Shroud.debug.xcconfig */, + 3F2D775EA0D4AFF53304BF71 /* Pods-Shroud.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -641,9 +643,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 13B07F861A680F5B00A75B9A /* BlueWallet */ = { + 13B07F861A680F5B00A75B9A /* Shroud */ = { isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "BlueWallet" */; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Shroud" */; buildPhases = ( 3B467A525D105B531AB91B81 /* [CP] Check Pods Manifest.lock */, B1220DEFC1B8A3B1FEDDCD23 /* [Expo] Configure project */, @@ -662,9 +664,9 @@ ); dependencies = ( ); - name = BlueWallet; + name = Shroud; productName = "Hello World"; - productReference = 13B07F961A680F5B00A75B9A /* BlueWallet.app */; + productReference = 13B07F961A680F5B00A75B9A /* Shroud.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -676,7 +678,7 @@ BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1500; LastUpgradeCheck = 1620; - ORGANIZATIONNAME = BlueWallet; + ORGANIZATIONNAME = Shroud; TargetAttributes = { 13B07F861A680F5B00A75B9A = { LastSwiftMigration = 1030; @@ -740,7 +742,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 13B07F861A680F5B00A75B9A /* BlueWallet */, + 13B07F861A680F5B00A75B9A /* Shroud */, ); }; /* End PBXProject section */ @@ -796,7 +798,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-BlueWallet-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Shroud-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -853,18 +855,18 @@ inputPaths = ( "$(SRCROOT)/.xcode.env", "$(SRCROOT)/.xcode.env.local", - "$(SRCROOT)/Shroud/ShroudWallet.entitlements", - "$(SRCROOT)/Pods/Target Support Files/Pods-BlueWallet/expo-configure-project.sh", + "$(SRCROOT)/Shroud/Shroud.entitlements", + "$(SRCROOT)/Pods/Target Support Files/Pods-Shroud/expo-configure-project.sh", ); name = "[Expo] Configure project"; outputFileListPaths = ( ); outputPaths = ( - "$(SRCROOT)/Pods/Target Support Files/Pods-BlueWallet/ExpoModulesProvider.swift", + "$(SRCROOT)/Pods/Target Support Files/Pods-Shroud/ExpoModulesProvider.swift", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-BlueWallet/expo-configure-project.sh\"\n"; + shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Shroud/expo-configure-project.sh\"\n"; }; BFE56A9A22A21E360BF7A1EC /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -872,15 +874,15 @@ files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-Shroud/Pods-Shroud-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-Shroud/Pods-Shroud-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Shroud/Pods-Shroud-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; D0E81659D2FBFDD27024CF05 /* [CP] Copy Pods Resources */ = { @@ -889,15 +891,15 @@ files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-resources-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-Shroud/Pods-Shroud-resources-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-resources-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-Shroud/Pods-Shroud-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BlueWallet/Pods-BlueWallet-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Shroud/Pods-Shroud-resources.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -945,7 +947,7 @@ B44034052BCC389200162242 /* XMLParserDelegate.swift in Sources */, B48630DD2CCEE7AC00A8425C /* PriceWidgetEntry.swift in Sources */, B44033F92BCC379200162242 /* WidgetDataStore.swift in Sources */, - E3D89ABA85DFC3B782B1A9C2 /* ExpoModulesProvider.swift in Sources */, + 9254C2BA762086F79B3A560B /* ExpoModulesProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -989,11 +991,11 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1AE7FA8B4A18928E917F42D1 /* Pods-BlueWallet.debug.xcconfig */; + baseConfigurationReference = 3B91A6043606F8072F31878B /* Pods-Shroud.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Shroud/ShroudWallet.entitlements; + CODE_SIGN_ENTITLEMENTS = Shroud/Shroud.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; @@ -1034,7 +1036,7 @@ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud; - PRODUCT_NAME = ShroudWallet; + PRODUCT_NAME = Shroud; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.bitshala.shroud"; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match Development org.bitshala.shroud catalyst"; @@ -1052,11 +1054,11 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 93D74F9C8EE7B4443A49594C /* Pods-BlueWallet.release.xcconfig */; + baseConfigurationReference = 3F2D775EA0D4AFF53304BF71 /* Pods-Shroud.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Shroud/ShroudWallet.entitlements; + CODE_SIGN_ENTITLEMENTS = Shroud/ShroudRelease.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Distribution"; @@ -1092,7 +1094,7 @@ OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; PRODUCT_BUNDLE_IDENTIFIER = org.bitshala.shroud; - PRODUCT_NAME = ShroudWallet; + PRODUCT_NAME = Shroud; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.bitshala.shroud"; "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore org.bitshala.shroud catalyst"; @@ -1246,7 +1248,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "BlueWallet" */ = { + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Shroud" */ = { isa = XCConfigurationList; buildConfigurations = ( 13B07F941A680F5B00A75B9A /* Debug */, diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/MarketWidget.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/MarketWidget.xcscheme index 77f8521f2..603f0c6b6 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/MarketWidget.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/MarketWidget.xcscheme @@ -30,8 +30,8 @@ @@ -84,8 +84,8 @@ @@ -120,8 +120,8 @@ diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/PriceWidget.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/PriceWidget.xcscheme index 9a44c70e8..a22614847 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/PriceWidget.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/PriceWidget.xcscheme @@ -30,8 +30,8 @@ @@ -84,8 +84,8 @@ @@ -120,8 +120,8 @@ diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/Shroud.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/Shroud.xcscheme index 528f104f6..910d6878a 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/Shroud.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/Shroud.xcscheme @@ -15,9 +15,9 @@ + BuildableName = "Shroud.app" + BlueprintName = "Shroud" + ReferencedContainer = "container:Shroud.xcodeproj"> @@ -56,8 +56,8 @@ @@ -72,8 +72,8 @@ diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidget.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidget.xcscheme index 433c7ebb8..0273703d4 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidget.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationAndMarketWidget.xcscheme @@ -30,8 +30,8 @@ @@ -84,8 +84,8 @@ @@ -120,8 +120,8 @@ diff --git a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationWidget.xcscheme b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationWidget.xcscheme index dcb6589e9..8f2a25ffa 100644 --- a/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationWidget.xcscheme +++ b/ios/Shroud.xcodeproj/xcshareddata/xcschemes/WalletInformationWidget.xcscheme @@ -30,8 +30,8 @@ @@ -84,8 +84,8 @@ @@ -120,8 +120,8 @@ diff --git a/ios/Shroud/ShroudWallet.entitlements b/ios/Shroud/ShroudWallet.entitlements deleted file mode 100644 index 018a6e20c..000000000 --- a/ios/Shroud/ShroudWallet.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - - aps-environment - development - - \ No newline at end of file diff --git a/src/screens/wallets/NoPaymentFound.tsx b/src/screens/wallets/NoPaymentFound.tsx index 420f6cb08..fa8080e0d 100644 --- a/src/screens/wallets/NoPaymentFound.tsx +++ b/src/screens/wallets/NoPaymentFound.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useMemo } from 'react'; import { ScrollView, StyleSheet, Text, View } from 'react-native'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import { Icon } from '@rneui/themed'; import SafeArea from '../../components/SafeArea'; import { useTheme } from '../../components/themes'; @@ -31,7 +31,7 @@ const NoPaymentFound: React.FC = () => { const handleCopyAddress = useCallback(() => { if (!spAddress) return; - Clipboard.setString(spAddress); + Clipboard.setStringAsync(spAddress); triggerHapticFeedback(HapticFeedbackTypes.NotificationSuccess); }, [spAddress]); diff --git a/src/screens/wallets/TrackPayment.tsx b/src/screens/wallets/TrackPayment.tsx index 4b1c2bd4f..eeefa67e3 100644 --- a/src/screens/wallets/TrackPayment.tsx +++ b/src/screens/wallets/TrackPayment.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useState } from 'react'; import { ActivityIndicator, Keyboard, Pressable, StyleSheet, Text, TextInput, View } from 'react-native'; -import Clipboard from '@react-native-clipboard/clipboard'; +import * as Clipboard from 'expo-clipboard'; import { Icon } from '@rneui/themed'; import { NativeStackScreenProps } from '@react-navigation/native-stack'; @@ -56,7 +56,7 @@ const TrackPayment: React.FC = () => { }); const handlePasteFromClipboard = useCallback(async () => { - const clipboard = await Clipboard.getString(); + const clipboard = await Clipboard.getStringAsync(); if (clipboard) { setTxid(clipboard.trim()); } From 690770d25f5ac2aafbd5b3e6df3bb73366e16495 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Wed, 27 May 2026 23:46:02 +0530 Subject: [PATCH 37/40] Create build.yml --- .eas/workflows/build.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .eas/workflows/build.yml diff --git a/.eas/workflows/build.yml b/.eas/workflows/build.yml new file mode 100644 index 000000000..ad706e608 --- /dev/null +++ b/.eas/workflows/build.yml @@ -0,0 +1,22 @@ +name: Build App +on: + push: + branches: + - master + - project-migration + pull_request: + branches: + - master +jobs: + build_android: + name: Build Android App + type: build + params: + platform: android + profile: preview + build_ios: + name: Build iOS App + type: build + params: + platform: ios + profile: preview From ba41bd291744f82e618b84de31b54b69f9093efc Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Mon, 1 Jun 2026 20:39:36 +0530 Subject: [PATCH 38/40] fix: resolve quick-actions bridging header issue and TypeScript compilation errors --- App.tsx | 2 +- ios/Podfile.lock | 14 +------------- ios/Shroud-Bridging-Header.h | 2 -- src/components/TransactionListItem.tsx | 4 ++-- src/components/addresses/AddressItem.tsx | 2 +- 5 files changed, 5 insertions(+), 19 deletions(-) diff --git a/App.tsx b/App.tsx index 1a53f9604..c1f98ff3e 100644 --- a/App.tsx +++ b/App.tsx @@ -22,7 +22,7 @@ const App = () => { timeout: 100000, // 100 seconds for blockchain scanning operations (increased for slower connections) }); - useLogger(navigationRef); + useLogger(navigationRef as any); return ( diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 902500085..6d63adf48 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2243,8 +2243,6 @@ PODS: - SocketRocket - react-native-biometrics (3.0.1): - React-Core - - react-native-bw-file-access (1.0.0): - - React-Core - react-native-capture-protection (2.0.7): - RCT-Folly - RCTRequired @@ -3047,8 +3045,6 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - RNQuickAction (0.3.13): - - React - RNRate (1.2.12): - React-Core - RNReanimated (4.2.1): @@ -3464,7 +3460,6 @@ DEPENDENCIES: - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - react-native-biometrics (from `../node_modules/react-native-biometrics`) - - react-native-bw-file-access (from `../src/modules/react-native-bw-file-access`) - react-native-capture-protection (from `../node_modules/react-native-capture-protection`) - react-native-get-random-values (from `../node_modules/react-native-get-random-values`) - "react-native-menu (from `../node_modules/@react-native-menu/menu`)" @@ -3510,7 +3505,6 @@ DEPENDENCIES: - RNDefaultPreference (from `../node_modules/react-native-default-preference`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNKeychain (from `../node_modules/react-native-keychain`) - - RNQuickAction (from `../node_modules/react-native-quick-actions`) - RNRate (from `../node_modules/react-native-rate`) - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) @@ -3680,8 +3674,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" react-native-biometrics: :path: "../node_modules/react-native-biometrics" - react-native-bw-file-access: - :path: "../src/modules/react-native-bw-file-access" react-native-capture-protection: :path: "../node_modules/react-native-capture-protection" react-native-get-random-values: @@ -3772,8 +3764,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-gesture-handler" RNKeychain: :path: "../node_modules/react-native-keychain" - RNQuickAction: - :path: "../node_modules/react-native-quick-actions" RNRate: :path: "../node_modules/react-native-rate" RNReanimated: @@ -3871,7 +3861,6 @@ SPEC CHECKSUMS: React-Mapbuffer: ceeccd6570db88ba4bc04278073392adf96a0fc1 React-microtasksnativemodule: c71eb8a79998c20dd13de58a7525eb32d200d9c8 react-native-biometrics: 43ed5b828646a7862dbc7945556446be00798e7d - react-native-bw-file-access: fe925b77dbf48500df0b294c6851f8c84607a203 react-native-capture-protection: 9bcc879e5d577b55050dc12ff0f283595c9e5873 react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba react-native-menu: d3cbac7d7bd6ae1c283f4f3c9993f69d209a61b4 @@ -3917,7 +3906,6 @@ SPEC CHECKSUMS: RNDefaultPreference: 8a089ee8ce829a66c5453e3c5434f0785499d1c3 RNGestureHandler: b407c25a3f51d22dd7430e6b530f753f112b7e77 RNKeychain: 6ade38fa11cde4337b5fe2e6c13c11550082f03b - RNQuickAction: c2c8f379e614428be0babe4d53a575739667744d RNRate: 7641919330e0d6688ad885a985b4bd697ed7d14c RNReanimated: 292cd58688552a22b3fc1cefcfbc49b336dfed68 RNScreens: afaf526a9c804c3b4503f950cf3e67ed81e29ada @@ -3930,6 +3918,6 @@ SPEC CHECKSUMS: Yoga: cf2a67aa1c8a225f0cb98a5f531d6f305d3f12e5 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 -PODFILE CHECKSUM: dab8a6989b5473be9fb51852924cf5ebdbcb851f +PODFILE CHECKSUM: a124329d884372ff165711cea36f493cd70cda36 COCOAPODS: 1.16.2 diff --git a/ios/Shroud-Bridging-Header.h b/ios/Shroud-Bridging-Header.h index 7eeb80545..9ad2faa24 100644 --- a/ios/Shroud-Bridging-Header.h +++ b/ios/Shroud-Bridging-Header.h @@ -5,5 +5,3 @@ // Created by Marcos Rodriguez on 4/4/25. // Copyright Β© 2026 Shroud contributors. All rights reserved. // - -#import "RNQuickActionManager.h" diff --git a/src/components/TransactionListItem.tsx b/src/components/TransactionListItem.tsx index 555e18592..f8275a05e 100644 --- a/src/components/TransactionListItem.tsx +++ b/src/components/TransactionListItem.tsx @@ -41,7 +41,7 @@ interface TransactionListItemProps { item: Transaction; searchQuery?: string; style?: ViewStyle; - renderHighlightedText?: (text: string, query: string) => JSX.Element; + renderHighlightedText?: (text: string, query: string) => React.JSX.Element; onPress?: () => void; } @@ -60,7 +60,7 @@ export const TransactionListItem: React.FC = memo( const [subtitleNumberOfLines, setSubtitleNumberOfLines] = useState(1); const { colors } = useTheme(); const { navigate } = useExtendedNavigation(); - const menuRef = useRef(); + const menuRef = useRef(undefined); const { txMetadata } = useStorage(); const insets = useSafeAreaInsets(); const containerStyle = useMemo( diff --git a/src/components/addresses/AddressItem.tsx b/src/components/addresses/AddressItem.tsx index 3fe984ab9..17b0d6c88 100644 --- a/src/components/addresses/AddressItem.tsx +++ b/src/components/addresses/AddressItem.tsx @@ -21,7 +21,7 @@ interface AddressItemProps { walletID: string; onPress?: () => void; searchQuery?: string; - renderHighlightedText?: (text: string, query: string) => JSX.Element; + renderHighlightedText?: (text: string, query: string) => React.JSX.Element; } type NavigationProps = NativeStackNavigationProp; From 5eebf5724d9b408837ab3aea965d4557c9e218c1 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:08:29 +0530 Subject: [PATCH 39/40] refactor: disable quick action handling in AppDelegate --- ios/Shroud/AppDelegate.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ios/Shroud/AppDelegate.swift b/ios/Shroud/AppDelegate.swift index 3fe450461..365770e95 100644 --- a/ios/Shroud/AppDelegate.swift +++ b/ios/Shroud/AppDelegate.swift @@ -328,7 +328,8 @@ class AppDelegate: RCTAppDelegate, UNUserNotificationCenterDelegate { } override func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { - RNQuickActionManager.onQuickActionPress(shortcutItem, completionHandler: completionHandler) + // Quick actions (3D Touch shortcuts) are not implemented in this app + completionHandler(false) } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { From e898ef9d0ce8c26dc6529f52a0b20be8561a7303 Mon Sep 17 00:00:00 2001 From: Kapil Dadhich <39085540+kapildadhich075@users.noreply.github.com> Date: Mon, 1 Jun 2026 22:18:55 +0530 Subject: [PATCH 40/40] refactor: make indexer initialization optional and remove unsafe environment and crypto shim assignments --- App.tsx | 14 ++++++++------ shim.js | 8 +++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/App.tsx b/App.tsx index c1f98ff3e..9587da737 100644 --- a/App.tsx +++ b/App.tsx @@ -15,12 +15,14 @@ import { INDEXER_BASE_URL } from '@env'; const App = () => { initializeRustJsiBridge(); - if (!INDEXER_BASE_URL) throw new Error('INDEXER_BASE_URL is not set'); - - initializeIndexer({ - baseUrl: INDEXER_BASE_URL, - timeout: 100000, // 100 seconds for blockchain scanning operations (increased for slower connections) - }); + if (!INDEXER_BASE_URL) { + console.warn('[App] INDEXER_BASE_URL is not set β€” silent payment scanning will not work. Set it in your .env file.'); + } else { + initializeIndexer({ + baseUrl: INDEXER_BASE_URL, + timeout: 100000, // 100 seconds for blockchain scanning operations (increased for slower connections) + }); + } useLogger(navigationRef as any); diff --git a/shim.js b/shim.js index 16c1196b5..4e42f45f9 100644 --- a/shim.js +++ b/shim.js @@ -25,11 +25,9 @@ process.nextTick = function (callback, ...args) { // global.location = global.location || { port: 80 } const isDev = typeof __DEV__ === 'boolean' && __DEV__; -process.env.NODE_ENV = isDev ? 'development' : 'production'; +// NOTE: Do not assign process.env.NODE_ENV here β€” babel-preset-expo/react-native-dotenv +// replaces process.env.* references with string literals (even on the left side of +// assignments), which produces invalid JS like: 'production' = isDev ? ... if (typeof localStorage !== 'undefined') { localStorage.debug = isDev ? '*' : ''; } - -// If using the crypto shim, uncomment the following line to ensure -// crypto is loaded first, so it can populate global.crypto -require('crypto');