From 4ebfe57c1fd39e86ce8081583d5ce58e7cb722ba Mon Sep 17 00:00:00 2001 From: peachbits Date: Thu, 25 Jun 2026 12:12:05 -0700 Subject: [PATCH 01/37] Remove reanimated v3/v4 split; enable new architecture on Android Android ran reanimated 3 via the local `r3-hack` package on the old architecture while iOS ran reanimated 4 on Fabric. Reanimated 4 requires the new architecture, so route both platforms through reanimated 4 / worklets and enable the new architecture on Android: - babel.config.js: always use react-native-worklets/plugin; add api.cache(true) now that the config is static (no platform branch configuring the cache). - metro.config.js: drop the r3-hack Android resolver. - react-native.config.js: drop the reanimated sourceDir override and the worklets Android disable. - package.json: remove the r3-hack dependency; delete scripts/r3-hack. - android/gradle.properties: newArchEnabled=true. - useCarouselGesture: unify the withSpring config to the reanimated-4 algorithm on both platforms (Android previously used the reanimated-3 damping). Also dedupe yaob to ^0.4.0, fixing the nativeIo collision that crashed ZEC/Pirate wallet creation. Co-Authored-By: Claude Opus 4.8 --- android/gradle.properties | 2 +- babel.config.js | 9 ++------ metro.config.js | 25 -------------------- package-lock.json | 41 +-------------------------------- package.json | 2 +- react-native.config.js | 17 -------------- scripts/r3-hack/README.md | 17 -------------- scripts/r3-hack/index.js | 14 ----------- scripts/r3-hack/package.json | 12 ---------- src/hooks/useCarouselGesture.ts | 16 ++++--------- 10 files changed, 10 insertions(+), 145 deletions(-) delete mode 100644 scripts/r3-hack/README.md delete mode 100644 scripts/r3-hack/index.js delete mode 100644 scripts/r3-hack/package.json diff --git a/android/gradle.properties b/android/gradle.properties index 9f2db46dfb1..3d5def77fc2 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -37,7 +37,7 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a # your application. You should enable this flag either if you want # to write custom TurboModules/Fabric components OR use libraries that # are providing them. -newArchEnabled=false +newArchEnabled=true # Use this property to enable or disable the Hermes JS engine. # If set to false, you will be using JSC instead. diff --git a/babel.config.js b/babel.config.js index 9adf2e4f163..44e02aa732a 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,12 +1,7 @@ module.exports = function (api) { - const isAndroid = api.caller(c => c.platform === 'android') - + api.cache(true) return { presets: ['module:@react-native/babel-preset'], - plugins: [ - isAndroid - ? './node_modules/r3-hack/node_modules/react-native-reanimated/plugin' - : 'react-native-worklets/plugin' - ] + plugins: ['react-native-worklets/plugin'] } } diff --git a/metro.config.js b/metro.config.js index 95fff748522..d28168ed44f 100644 --- a/metro.config.js +++ b/metro.config.js @@ -2,7 +2,6 @@ const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config') const { wrapWithReanimatedMetroConfig } = require('react-native-reanimated/metro-config') -const r3Paths = require('r3-hack') const defaultConfig = getDefaultConfig(__dirname) const { assetExts, sourceExts } = defaultConfig.resolver @@ -20,30 +19,6 @@ const config = { ) }, resolver: { - resolveRequest(context, moduleName, platform) { - if (platform === 'android') { - // Use Reanimated 3 on Android: - const filePath = r3Paths[moduleName] - if (filePath != null) { - return { type: 'sourceFile', filePath } - } - - // Ensure we aren't missing any reanimated 3 -> 4 mappings: - if ( - moduleName.startsWith('react-native-reanimated') || - moduleName.startsWith('react-native-worklets') - ) { - console.log( - `Could not find "${moduleName}". Please update r3-hack to include it.` - ) - return { type: 'empty' } - } - } - - // Otherwise use the normal Metro resolution: - return context.resolveRequest(context, moduleName, platform) - }, - // From react-native-svg-transformer: assetExts: assetExts.filter(ext => ext !== 'svg'), sourceExts: [...sourceExts, 'svg'] diff --git a/package-lock.json b/package-lock.json index a78c2afdca1..5660c619ccb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,6 @@ "posthog-react-native": "^2.8.1", "prompts": "^2.4.2", "qrcode-generator": "^1.4.4", - "r3-hack": "./scripts/r3-hack", "react": "19.0.0", "react-native": "0.79.2", "react-native-airship": "^0.3.0", @@ -23709,10 +23708,6 @@ "version": "4.0.4", "license": "MIT" }, - "node_modules/r3-hack": { - "resolved": "scripts/r3-hack", - "link": true - }, "node_modules/radix3": { "version": "1.1.0", "license": "MIT" @@ -28400,44 +28395,10 @@ }, "scripts/r3-hack": { "version": "0.0.1", + "extraneous": true, "dependencies": { "react-native-reanimated": "^3.19.1" } - }, - "scripts/r3-hack/node_modules/react-native-is-edge-to-edge": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.7.tgz", - "integrity": "sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "scripts/r3-hack/node_modules/react-native-reanimated": { - "version": "3.19.5", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.19.5.tgz", - "integrity": "sha512-bd4AwIkBAaY4BjrgpSoKjEaRG/tXD756F5nGuiH5IMBSKN8tRdUEA8hWZCyIo/R6/kha/tVSoCqodVUACh7ZWw==", - "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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0", - "react": "*", - "react-native": "*" - } } } } diff --git a/package.json b/package.json index d607d2c2f3b..4def728a958 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "*.{js,jsx,ts,tsx}": "eslint" }, "overrides": { + "yaob": "^0.4.0", "bip39": "3.0.4" }, "dependencies": { @@ -122,7 +123,6 @@ "posthog-react-native": "^2.8.1", "prompts": "^2.4.2", "qrcode-generator": "^1.4.4", - "r3-hack": "./scripts/r3-hack", "react": "19.0.0", "react-native": "0.79.2", "react-native-airship": "^0.3.0", diff --git a/react-native.config.js b/react-native.config.js index 10ca5143757..a1348c7ef4b 100644 --- a/react-native.config.js +++ b/react-native.config.js @@ -4,23 +4,6 @@ module.exports = { platforms: { ios: null } - }, - - // We want Reanimated 3 on Android: - 'react-native-reanimated': { - platforms: { - android: { - sourceDir: - '../node_modules/r3-hack/node_modules/react-native-reanimated/android' - } - } - }, - - // We don't want Reanimated 4 worklets on Android: - 'react-native-worklets': { - platforms: { - android: null - } } } } diff --git a/scripts/r3-hack/README.md b/scripts/r3-hack/README.md deleted file mode 100644 index dcda549350c..00000000000 --- a/scripts/r3-hack/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Reanimated Hack - -Here is the problem: - -- iOS: We need to run Reanimated 4 on the new achitecture to get decent performance. -- Android: We cannot use the new architecture yet (there are unsolved performance problems), so we need to use Reanimated 3. - -How can we have two versions of a native library at once? Well... - -- Require Reanimated 4 normally through package.json. -- Require Reanimated 3 indirectly through this r3-hack shim package. -- Use react-native.config.js to override the native module with Reanimated 3. -- Tell babel.config.js to use the right plugin based on platform. -- Hack metro.config.js to resolve 'react-native-reanimated' to - this package's exported paths on Android. - -Super sketchy, but it works! diff --git a/scripts/r3-hack/index.js b/scripts/r3-hack/index.js deleted file mode 100644 index 2ecc6710b0c..00000000000 --- a/scripts/r3-hack/index.js +++ /dev/null @@ -1,14 +0,0 @@ -// The various react-native-reanimated entry points the app uses, -// but resolved to our internal copy of Reanimated 3: -module.exports = { - // Reanimated itself: - 'react-native-reanimated': require.resolve('react-native-reanimated'), - - // react-native-keyboard-controller reaches into our internals: - 'react-native-reanimated/src/core': require.resolve( - 'react-native-reanimated/src/core.ts' - ), - - // Some functions like `runOnJs` have moved, so put them back: - 'react-native-worklets': require.resolve('react-native-reanimated') -} diff --git a/scripts/r3-hack/package.json b/scripts/r3-hack/package.json deleted file mode 100644 index 8dcec0a2ac5..00000000000 --- a/scripts/r3-hack/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "r3-hack", - "version": "0.0.1", - "description": "Makes it possible to have Reanimated 3 alongside Reanimated 4", - "main": "index.js", - "files": [ - "index.js" - ], - "dependencies": { - "react-native-reanimated": "^3.19.1" - } -} diff --git a/src/hooks/useCarouselGesture.ts b/src/hooks/useCarouselGesture.ts index f72109948e4..24ea17b8c90 100644 --- a/src/hooks/useCarouselGesture.ts +++ b/src/hooks/useCarouselGesture.ts @@ -1,4 +1,3 @@ -import { Platform } from 'react-native' import { Gesture, type PanGesture } from 'react-native-gesture-handler' import { type SharedValue, @@ -51,16 +50,11 @@ export const useCarouselGesture = ( 0, Math.min(itemCount - 1, startIndex.value + delta) ) - scrollIndex.value = withSpring( - destValue, - Platform.OS === 'android' - ? { damping: 12 } // Old Reanimated 3 algorithm - : { - velocity: -itemScale * event.velocityX, - stiffness: 900, - damping: 100 - } - ) + scrollIndex.value = withSpring(destValue, { + velocity: -itemScale * event.velocityX, + stiffness: 900, + damping: 100 + }) if (onGestureEnd != null) runOnJS(onGestureEnd)(destValue) }) From 7f84e1e5cd5b3c3cbb54d9ed42eb470193f80596 Mon Sep 17 00:00:00 2001 From: peachbits Date: Fri, 3 Jul 2026 10:53:34 -0700 Subject: [PATCH 02/37] Upgrade to React Native 0.86 and Expo SDK 57 Move the app from React Native 0.79 to 0.86.0 / Expo SDK 57, with both platforms on reanimated v4 and the new architecture. Expo SDK 57 is the release paired with RN 0.86, with React at 19.2. Bumps the RN-ecosystem dependencies together (reanimated 4.5, worklets 0.10, gesture-handler 2.32 per the SDK 57 pin set; TypeScript deliberately held at 5.8.3) and updates the jest preset, worklets resolver, and test snapshots. Co-Authored-By: Claude Opus 4.8 --- app.json | 6 +- eslint.config.mjs | 12 +- jest.config.js | 5 +- jestSetup.js | 16 + package-lock.json | 8408 +++++++++-------- package.json | 63 +- patches/react-native+0.79.2.patch | 133 - patches/react-native-securerandom+1.0.1.patch | 13 + .../react-native-vision-camera+4.7.2.patch | 12 - scripts/jestResolver.js | 35 + .../AccountSyncBar.test.tsx.snap | 3 +- .../__snapshots__/BalanceCard.test.tsx.snap | 5 +- .../FilledTextInput.test.tsx.snap | 23 +- .../__snapshots__/MenuTabs.test.tsx.snap | 5 +- .../AccelerateTxModal.test.tsx.snap | 5 +- .../__snapshots__/AddressModal.test.tsx.snap | 18 +- .../AutoLogoutModal.test.tsx.snap | 3 +- .../__snapshots__/CategoryModal.test.tsx.snap | 34 +- .../CountryListModal.test.tsx.snap | 18 +- .../__snapshots__/HelpModal.test.tsx.snap | 3 +- .../__snapshots__/LogsModal.test.tsx.snap | 19 +- .../PasswordReminderModal.test.tsx.snap | 23 +- .../TextInputModal.test.tsx.snap | 22 +- .../WalletListModal.test.tsx.snap | 22 +- .../WalletListSortModal.test.tsx.snap | 15 +- ...reateWalletAccountSetupScene.test.tsx.snap | 19 +- .../CreateWalletImportScene.test.tsx.snap | 17 +- ...reateWalletSelectCryptoScene.test.tsx.snap | 39 +- .../CurrencyNotificationScene.test.tsx.snap | 13 +- .../CurrencySettings.ui.test.tsx.snap | 9 +- .../DefaultFiatSettingScene.test.tsx.snap | 22 +- .../EdgeLoginScene.test.tsx.snap | 3 +- .../FioAddressDetailsScene.test.tsx.snap | 4 +- .../FioAddressRegisterScene.test.tsx.snap | 3 +- .../FioAddressSettingsScene.test.tsx.snap | 3 +- ...FioConnectWalletConfirmScene.test.tsx.snap | 3 +- .../FioDomainRegisterScene.test.tsx.snap | 3 +- .../__snapshots__/RequestScene.test.tsx.snap | 20 +- .../__snapshots__/SendScene2.ui.test.tsx.snap | 101 +- .../__snapshots__/SettingsScene.test.tsx.snap | 69 +- .../SwapConfirmationScene.test.tsx.snap | 12 +- .../SwapCreateScene.test.tsx.snap | 9 +- .../SwapSuccessScene.test.tsx.snap | 3 +- .../TransactionDetailsScene.test.tsx.snap | 24 +- src/actions/SettingsActions.tsx | 1 - src/components/buttons/EdgeButton.tsx | 4 +- src/components/buttons/PillButton.tsx | 2 +- src/components/cards/EdgeCard.tsx | 4 +- src/components/common/BlurBackground.tsx | 6 +- src/components/common/EdgeAnim.tsx | 16 +- src/components/common/SceneWrapper.tsx | 3 +- src/components/hoc/styled.tsx | 27 +- src/components/icons/BestRateBadge.tsx | 2 +- .../navigation/HeaderBackground.tsx | 4 +- src/components/scenes/GiftCardMarketScene.tsx | 2 +- src/components/themed/FioRequestRow.tsx | 33 +- src/components/themed/MenuTabs.tsx | 10 +- src/components/themed/SafeSlider.tsx | 2 +- src/util/borrowUtils.ts | 1 - tsconfig.json | 2 +- 60 files changed, 4935 insertions(+), 4481 deletions(-) delete mode 100644 patches/react-native+0.79.2.patch create mode 100644 patches/react-native-securerandom+1.0.1.patch delete mode 100644 patches/react-native-vision-camera+4.7.2.patch create mode 100644 scripts/jestResolver.js diff --git a/app.json b/app.json index e4b57563ab3..6fcb36f1907 100644 --- a/app.json +++ b/app.json @@ -1,4 +1,8 @@ { "name": "edge", - "displayName": "edge" + "displayName": "edge", + "plugins": [ + "@react-native-community/datetimepicker", + "@sentry/react-native" + ] } diff --git a/eslint.config.mjs b/eslint.config.mjs index a818fa26926..4b286bc245a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -168,7 +168,7 @@ export default [ 'src/components/charts/SwipeChart.tsx', 'src/components/common/AnimatedNumber.tsx', - 'src/components/common/BlurBackground.tsx', + 'src/components/common/CrossFade.tsx', 'src/components/common/DotsBackground.tsx', @@ -182,7 +182,7 @@ export default [ 'src/components/FioAddress/FioActionSubmit.tsx', 'src/components/FioAddress/FioName.tsx', 'src/components/hoc/maybeComponent.tsx', - 'src/components/hoc/styled.tsx', + 'src/components/hoc/withExtendedTouchable.tsx', 'src/components/icons/FiatIcon.tsx', @@ -234,7 +234,7 @@ export default [ 'src/components/navigation/EdgeLogoHeader.tsx', 'src/components/navigation/FlashNotification.tsx', 'src/components/navigation/GuiPluginBackButton.tsx', - 'src/components/navigation/HeaderBackground.tsx', + 'src/components/navigation/HeaderTextButton.tsx', 'src/components/navigation/HeaderTitle.tsx', 'src/components/navigation/NavigationButton.tsx', @@ -353,12 +353,10 @@ export default [ 'src/components/themed/ExplorerCard.tsx', 'src/components/themed/Fade.tsx', - 'src/components/themed/FioRequestRow.tsx', - 'src/components/themed/LineTextDivider.tsx', 'src/components/themed/MainButton.tsx', 'src/components/themed/ManageTokensRow.tsx', - 'src/components/themed/MenuTabs.tsx', + 'src/components/themed/ModalParts.tsx', 'src/components/themed/PinDots.tsx', @@ -483,7 +481,7 @@ export default [ 'src/styles/common/textStyles.tsx', 'src/styles/common/textStylesThemed.ts', 'src/types/reactRedux.ts', - 'src/util/borrowUtils.ts', + 'src/util/cleaners.ts', 'src/util/crypto.ts', diff --git a/jest.config.js b/jest.config.js index b04a05bf1b3..236fcb4b397 100644 --- a/jest.config.js +++ b/jest.config.js @@ -8,7 +8,10 @@ module.exports = { // We want the Node.js version of edge-core-js, not the RN one: 'edge-core-js': require.resolve('edge-core-js') }, - preset: 'react-native', + preset: '@react-native/jest-preset', + // Custom resolver: worklets -> non-native build (reanimated 4 jest crash), and + // msw -> node export conditions (the RN preset's react-native condition nulls them). + resolver: './scripts/jestResolver.js', setupFilesAfterEnv: ['./jestSetup.js'], transformIgnorePatterns: [ '/node_modules/(?!(@react-native|react-native|@react-navigation|zcashname-sdk|@noble/ed25519))' diff --git a/jestSetup.js b/jestSetup.js index 2bae801fbaf..25b412cba60 100644 --- a/jestSetup.js +++ b/jestSetup.js @@ -12,6 +12,18 @@ import mockSafeAreaContext from 'react-native-safe-area-context/jest/mock' jest.mock('@react-native-clipboard/clipboard', () => mockClipboard) jest.mock('react-native-permissions', () => mockPermissions) jest.mock('react-native-safe-area-context', () => mockSafeAreaContext) +// Firebase 25 instantiates a native event emitter on import, which crashes in +// jest. Mock messaging (the only firebase module the app imports) to the methods +// the app uses. +jest.mock('@react-native-firebase/messaging', () => { + const messaging = () => ({ + getToken: jest.fn(async () => 'mock-device-token'), + getInitialNotification: jest.fn(async () => null), + onMessage: jest.fn(() => () => {}), + onNotificationOpenedApp: jest.fn(() => () => {}) + }) + return { __esModule: true, default: messaging } +}) require('react-native-reanimated').setUpTests() // -------------------------------------------------------------------- @@ -20,6 +32,10 @@ require('react-native-reanimated').setUpTests() jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter') +// The RN 0.85 jest preset returns undefined from Keyboard.addListener; return a +// removable subscription so effect cleanups (showListener.remove()) don't throw. +require('react-native').Keyboard.addListener = () => ({ remove: () => {} }) + for (const log in global.console) { global.console[log] = jest.fn() } diff --git a/package-lock.json b/package-lock.json index 5660c619ccb..4620ef0efdc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,19 +15,19 @@ "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0", "@paraswap/sdk": "^6.12.0", - "@react-native-async-storage/async-storage": "^1.19.4", + "@react-native-async-storage/async-storage": "2.2.0", "@react-native-clipboard/clipboard": "^1.16.3", - "@react-native-community/datetimepicker": "^8.4.2", - "@react-native-community/netinfo": "^11.4.1", - "@react-native-firebase/app": "^20.5.0", - "@react-native-firebase/messaging": "^20.5.0", - "@react-native-picker/picker": "^2.11.2", + "@react-native-community/datetimepicker": "9.1.0", + "@react-native-community/netinfo": "12.0.1", + "@react-native-firebase/app": "^25.1.0", + "@react-native-firebase/messaging": "^25.1.0", + "@react-native-picker/picker": "2.11.4", "@react-navigation/bottom-tabs": "^6.5.4", "@react-navigation/drawer": "^6.7.2", "@react-navigation/elements": "^1.3.14", "@react-navigation/native": "^6.1.3", "@react-navigation/stack": "^6.3.12", - "@sentry/react-native": "^7.12.0", + "@sentry/react-native": "~7.11.0", "@tanstack/react-query": "^5.84.2", "@types/jsrsasign": "^10.5.13", "@unstoppabledomains/resolution": "^9.3.0", @@ -54,7 +54,7 @@ "edge-info-server": "^3.12.0", "edge-login-ui-rn": "^3.37.2", "ethers": "^5.7.2", - "expo": "^53.0.0", + "expo": "^57.0.7", "expo-quick-actions": "^5.0.0", "jsrsasign": "^11.1.0", "marked": "^15.0.9", @@ -63,11 +63,11 @@ "posthog-react-native": "^2.8.1", "prompts": "^2.4.2", "qrcode-generator": "^1.4.4", - "react": "19.0.0", - "react-native": "0.79.2", + "react": "19.2.3", + "react-native": "0.86.0", "react-native-airship": "^0.3.0", "react-native-battery-optimization-check": "^1.0.8", - "react-native-bootsplash": "^6.3.8", + "react-native-bootsplash": "^6.3.10", "react-native-confetti-cannon": "^1.5.2", "react-native-contacts": "^8.0.10", "react-native-custom-tabs": "https://github.com/adminphoeniixx/react-native-custom-tabs#develop", @@ -77,7 +77,7 @@ "react-native-fast-shadow": "^0.1.0", "react-native-file-access": "^3.1.1", "react-native-fs": "^2.19.0", - "react-native-gesture-handler": "^2.28.0", + "react-native-gesture-handler": "~2.32.0", "react-native-get-random-values": "^1.11.0", "react-native-gifted-charts": "1.4.63", "react-native-gradle-plugin": "^0.71.19", @@ -86,7 +86,7 @@ "react-native-image-picker": "^8.2.1", "react-native-in-app-review": "^4.3.5", "react-native-keyboard-aware-scroll-view": "^0.9.5", - "react-native-keyboard-controller": "^1.19.0", + "react-native-keyboard-controller": "1.21.9", "react-native-linear-gradient": "^2.8.3", "react-native-localize": "^3.4.2", "react-native-mail": "^6.1.1", @@ -95,22 +95,22 @@ "react-native-performance": "^5.1.4", "react-native-permissions": "^4.1.5", "react-native-piratechain": "0.6.3", - "react-native-reanimated": "^4.1.3", + "react-native-reanimated": "4.5.0", "react-native-render-html": "^6.3.4", "react-native-reorderable-list": "^0.5.0", "react-native-safari-view": "^2.1.0", - "react-native-safe-area-context": "^5.6.1", - "react-native-screens": "^4.16.0", + "react-native-safe-area-context": "~5.7.0", + "react-native-screens": "4.25.2", "react-native-securerandom": "^1.0.1", "react-native-share": "^12.0.11", "react-native-sound": "^0.12.0", "react-native-store-review": "https://github.com/EdgeApp/react-native-store-review#b0a3379829056e7328b550d5b135271f7a777083", - "react-native-svg": "^15.12.1", + "react-native-svg": "15.15.4", "react-native-vector-icons": "^10.1.0", - "react-native-vision-camera": "^4.7.2", - "react-native-webview": "^13.15.0", + "react-native-vision-camera": "^4.7.3", + "react-native-webview": "13.16.1", "react-native-wheel-picker-android": "^2.0.6", - "react-native-worklets": "^0.6.1", + "react-native-worklets": "0.10.0", "react-native-zano": "^0.5.1", "react-native-zcash": "0.13.4", "react-redux": "^8.1.1", @@ -130,17 +130,18 @@ "zcashname-sdk": "^0.7.2" }, "devDependencies": { - "@babel/core": "^7.25.2", + "@babel/core": "^7.29.0", "@babel/plugin-transform-export-namespace-from": "^7.23.3", "@babel/preset-env": "^7.25.3", "@babel/preset-typescript": "^7.18.6", "@babel/runtime": "^7.25.0", - "@react-native-community/cli": "18.0.0", - "@react-native-community/cli-platform-android": "18.0.0", - "@react-native-community/cli-platform-ios": "18.0.0", - "@react-native/babel-preset": "0.79.2", - "@react-native/metro-config": "0.79.2", - "@react-native/typescript-config": "0.79.2", + "@react-native-community/cli": "20.1.0", + "@react-native-community/cli-platform-android": "20.1.0", + "@react-native-community/cli-platform-ios": "20.1.0", + "@react-native/babel-preset": "0.86.0", + "@react-native/jest-preset": "^0.85.3", + "@react-native/metro-config": "0.86.0", + "@react-native/typescript-config": "0.86.0", "@rollup/plugin-babel": "^6.0.3", "@stakekit/api-hooks": "^0.0.93", "@testing-library/react-native": "^13.2.0", @@ -155,7 +156,7 @@ "@types/lodash": "^4.14.149", "@types/node-fetch": "^2.6.2", "@types/prompts": "^2.0.14", - "@types/react": "^19.0.0", + "@types/react": "^19.2.0", "@types/react-native": "^0.71.1", "@types/react-native-custom-tabs": "^0.1.2", "@types/react-native-safari-view": "^2.0.5", @@ -179,7 +180,7 @@ "fs-extra": "^10.1.0", "https-browserify": "^1.0.0", "husky": "^7.0.0", - "jest": "^30.0.0", + "jest": "~29.7.0", "jetifier": "^1.6.5", "lint-staged": "^10.5.3", "msw": "^2.8.4", @@ -191,7 +192,7 @@ "prettier": "2.8.8", "process": "^0.11.10", "react-native-svg-transformer": "^1.5.1", - "react-test-renderer": "19.0.0", + "react-test-renderer": "19.2.3", "readable-stream": "^3.6.2", "rollup": "^3.20.6", "rollup-plugin-node-resolve": "4.0.0", @@ -200,7 +201,7 @@ "string_decoder": "^1.3.0", "sucrase": "^3.35.0", "typechain": "^8.3.2", - "typescript": "5.0.4", + "typescript": "~5.8.3", "updot": "^1.2.0", "vm-browserify": "^1.1.2", "xcode": "^3.0.1" @@ -233,22 +234,13 @@ "typescript": "^5.0.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -257,26 +249,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.0", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -299,11 +295,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -313,21 +311,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -351,15 +353,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", "semver": "^6.3.1" }, "engines": { @@ -413,41 +417,49 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -457,17 +469,21 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -489,12 +505,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -504,32 +522,40 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -548,11 +574,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.2", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -629,10 +657,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -716,12 +746,14 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.24.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz", + "integrity": "sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-decorators": "^7.24.1" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-decorators": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -756,6 +788,7 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -766,6 +799,7 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -776,6 +810,7 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" @@ -786,6 +821,7 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -798,10 +834,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.24.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz", + "integrity": "sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -862,6 +900,7 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -875,6 +914,7 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -885,6 +925,7 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -894,10 +935,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -908,6 +951,7 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -928,6 +972,7 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -938,6 +983,7 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -948,6 +994,7 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -968,6 +1015,7 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -981,6 +1029,7 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -993,10 +1042,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1091,11 +1142,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1106,7 +1159,6 @@ }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.27.1", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", @@ -1120,15 +1172,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", "license": "MIT", "dependencies": { - "@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.28.0" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1139,6 +1193,7 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1295,6 +1350,7 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", @@ -1324,6 +1380,7 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1378,11 +1435,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1452,10 +1511,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1466,6 +1527,7 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1523,11 +1585,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1606,14 +1670,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz", + "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1623,10 +1689,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz", + "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" + "@babel/plugin-transform-react-jsx": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1637,6 +1705,7 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1650,6 +1719,7 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1662,11 +1732,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz", + "integrity": "sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1677,6 +1749,7 @@ }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.28.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1757,6 +1830,7 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", @@ -1771,6 +1845,7 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.27.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1810,14 +1885,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1988,33 +2065,17 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/preset-react": { - "version": "7.27.1", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.27.1", - "@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.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", "license": "MIT", "dependencies": { - "@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" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2031,44 +2092,31 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -2076,11 +2124,13 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2088,6 +2138,8 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, @@ -2474,40 +2526,6 @@ "integrity": "sha512-UE2x9N7XD/1qqtXA+4CZPD1RQAlM0lEdXdy09CJ/wNR+mgGKqwLRH4BGGfOAWwwz06pIT3c2tC4gvXbntGAeMA==", "license": "MIT" }, - "node_modules/@emnapi/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.0.tgz", - "integrity": "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.0.tgz", - "integrity": "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emurgo/cardano-serialization-lib-nodejs": { "version": "14.1.2", "license": "MIT" @@ -3576,32 +3594,37 @@ } }, "node_modules/@expo/cli": { - "version": "0.24.20", - "license": "MIT", - "dependencies": { - "@0no-co/graphql.web": "^1.0.8", - "@babel/runtime": "^7.20.0", - "@expo/code-signing-certificates": "^0.0.5", - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/devcert": "^1.1.2", - "@expo/env": "~1.0.7", - "@expo/image-utils": "^0.7.6", - "@expo/json-file": "^9.1.5", - "@expo/metro-config": "~0.20.17", - "@expo/osascript": "^2.2.5", - "@expo/package-manager": "^1.8.6", - "@expo/plist": "^0.3.5", - "@expo/prebuild-config": "^9.0.11", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.79.5", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", + "version": "57.0.9", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-57.0.9.tgz", + "integrity": "sha512-41z9z68SynNXasZOjuT1si5Sq5OKL6SLf40ZjikbtZgDuvBO8HaUsaDzsJ0c1UZJ3N+vMzYCc1JUIDyRkVBjkA==", + "license": "MIT", + "dependencies": { + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~57.0.5", + "@expo/config-plugins": "~57.0.5", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.4.2", + "@expo/image-utils": "^0.11.3", + "@expo/inline-modules": "^0.1.3", + "@expo/json-file": "^11.0.1", + "@expo/log-box": "^57.0.1", + "@expo/metro": "~56.0.0", + "@expo/metro-config": "~57.0.6", + "@expo/metro-file-map": "^57.0.1", + "@expo/osascript": "^2.7.1", + "@expo/package-manager": "^1.13.1", + "@expo/plist": "^0.8.1", + "@expo/prebuild-config": "^57.0.8", + "@expo/require-utils": "^57.0.3", + "@expo/router-server": "^57.0.3", + "@expo/schema-utils": "^57.0.2", + "@expo/spawn-async": "^1.8.0", + "@expo/ws-tunnel": "^2.0.0", + "@expo/xcpretty": "^4.4.4", + "@react-native/dev-middleware": "0.86.0", "accepts": "^1.3.8", + "agent-cli-detector": "^0.1.2", "arg": "^5.0.2", - "better-opn": "~3.0.2", "bplist-creator": "0.1.0", "bplist-parser": "^0.3.1", "chalk": "^4.0.0", @@ -3609,165 +3632,392 @@ "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", - "env-editor": "^0.4.1", - "freeport-async": "^2.0.0", + "dnssd-advertise": "^1.1.4", + "expo-server": "^57.0.1", + "fetch-nodeshim": "^0.4.10", "getenv": "^2.0.0", - "glob": "^10.4.2", - "lan-network": "^0.1.6", - "minimatch": "^9.0.0", - "node-forge": "^1.3.1", + "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": "^3.0.1", - "pretty-bytes": "^5.6.0", + "picomatch": "^4.0.4", "pretty-format": "^29.7.0", "progress": "^2.0.3", "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", "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", - "tar": "^7.4.3", "terminal-link": "^2.1.1", - "undici": "^6.18.2", + "toqr": "^0.1.1", "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" + "ws": "^8.12.1", + "zod": "^3.25.76" }, "bin": { - "expo-internal": "build/bin/cli" + "expo-internal": "main.js" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true + } } }, - "node_modules/@expo/cli/node_modules/@react-native/debugger-frontend": { - "version": "0.79.5", - "license": "BSD-3-Clause", - "engines": { - "node": ">=18" + "node_modules/@expo/cli/node_modules/@expo/config-plugins": { + "version": "57.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.5.tgz", + "integrity": "sha512-xhUGgzpFWRghDUH98+Wl4RDakYhTsbyMg6aOYiBjRzPO/THH8tKMw3vlksgFYlU2PkiAdABJN3tNPf5qmvOQhA==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^57.0.2", + "@expo/json-file": "~11.0.1", + "@expo/plist": "^0.8.1", + "@expo/require-utils": "^57.0.3", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "semver": "^7.5.4", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" } }, - "node_modules/@expo/cli/node_modules/@react-native/dev-middleware": { - "version": "0.79.5", + "node_modules/@expo/cli/node_modules/@expo/config-types": { + "version": "57.0.2", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.2.tgz", + "integrity": "sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==", + "license": "MIT" + }, + "node_modules/@expo/cli/node_modules/@expo/image-utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.11.3.tgz", + "integrity": "sha512-yMVjkndhXm9mct0uMq+ndxqT6FgAnhucdUfmXuQ6V6uE021GOiYCACO+KZ0MB4vearPSvbWTGfi32QQr2qocfQ==", "license": "MIT", "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.79.5", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" - }, - "engines": { - "node": ">=18" + "@expo/require-utils": "^57.0.3", + "@expo/spawn-async": "^1.8.0", + "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/cli/node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", + "node_modules/@expo/cli/node_modules/@expo/json-file": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz", + "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==", "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" } }, - "node_modules/@expo/cli/node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@expo/cli/node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.3", + "node_modules/@expo/cli/node_modules/@expo/plist": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.1.tgz", + "integrity": "sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==", "license": "MIT", "dependencies": { - "async-limiter": "~1.0.0" + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" } }, - "node_modules/@expo/cli/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/@expo/cli/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6" } }, - "node_modules/@expo/cli/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/@expo/cli/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": { - "balanced-match": "^1.0.0" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@expo/cli/node_modules/ci-info": { - "version": "3.9.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "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": ">=8" + "node": "18 || 20 || >=22" } }, - "node_modules/@expo/cli/node_modules/encodeurl": { - "version": "2.0.0", + "node_modules/@expo/cli/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, "engines": { - "node": ">= 0.8" + "node": "18 || 20 || >=22" } }, - "node_modules/@expo/cli/node_modules/minimatch": { - "version": "9.0.5", - "license": "ISC", + "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": { - "brace-expansion": "^2.0.1" + "restore-cursor": "^2.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/@expo/cli/node_modules/picomatch": { - "version": "3.0.1", + "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": { + "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/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.8" + } + }, + "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": ">=0.8.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": "18 || 20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/cli/node_modules/pretty-format": { - "version": "29.7.0", + "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": ">=4" + } + }, + "node_modules/@expo/cli/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@expo/cli/node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" + "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": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "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": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/cli/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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", + "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/@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": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/cli/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/@expo/cli/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } }, "node_modules/@expo/cli/node_modules/send": { - "version": "0.19.1", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -3776,13 +4026,13 @@ "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -3790,6 +4040,8 @@ }, "node_modules/@expo/cli/node_modules/send/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" @@ -3797,40 +4049,77 @@ }, "node_modules/@expo/cli/node_modules/send/node_modules/debug/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/@expo/cli/node_modules/undici": { - "version": "6.21.3", + "node_modules/@expo/cli/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@expo/cli/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", "engines": { - "node": ">=18.17" + "node": ">=8.0" } }, "node_modules/@expo/code-signing-certificates": { - "version": "0.0.5", + "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": { - "node-forge": "^1.2.1", - "nullthrows": "^1.1.1" + "node-forge": "^1.3.3" } }, "node_modules/@expo/config": { - "version": "11.0.13", + "version": "57.0.5", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-57.0.5.tgz", + "integrity": "sha512-XqveHQzr6PTqHGnv6NVVZ1CFgB/TgR2mKtHsJA/gYS/76pe2cP1yK/O820xGW2RTnDGTmyhOdagmK6khcN46vg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~10.1.2", - "@expo/config-types": "^53.0.5", - "@expo/json-file": "^9.1.5", + "@expo/config-plugins": "~57.0.5", + "@expo/config-types": "^57.0.2", + "@expo/json-file": "^11.0.1", + "@expo/require-utils": "^57.0.3", "deepmerge": "^4.3.1", "getenv": "^2.0.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0", + "glob": "^13.0.0", "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "3.35.0" + "slugify": "^1.3.4" } }, "node_modules/@expo/config-plugins": { @@ -3857,87 +4146,318 @@ "version": "53.0.5", "license": "MIT" }, - "node_modules/@expo/config/node_modules/@babel/code-frame": { - "version": "7.10.4", + "node_modules/@expo/config/node_modules/@expo/config-plugins": { + "version": "57.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.5.tgz", + "integrity": "sha512-xhUGgzpFWRghDUH98+Wl4RDakYhTsbyMg6aOYiBjRzPO/THH8tKMw3vlksgFYlU2PkiAdABJN3tNPf5qmvOQhA==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.10.4" + "@expo/config-types": "^57.0.2", + "@expo/json-file": "~11.0.1", + "@expo/plist": "^0.8.1", + "@expo/require-utils": "^57.0.3", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "semver": "^7.5.4", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" } }, - "node_modules/@expo/devcert": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "@expo/sudo-prompt": "^9.3.1", - "debug": "^3.1.0", - "glob": "^10.4.2" - } + "node_modules/@expo/config/node_modules/@expo/config-types": { + "version": "57.0.2", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.2.tgz", + "integrity": "sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==", + "license": "MIT" }, - "node_modules/@expo/devcert/node_modules/debug": { - "version": "3.2.7", + "node_modules/@expo/config/node_modules/@expo/json-file": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz", + "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" } }, - "node_modules/@expo/env": { - "version": "1.0.7", + "node_modules/@expo/config/node_modules/@expo/plist": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.1.tgz", + "integrity": "sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==", "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0" + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" } }, - "node_modules/@expo/fingerprint": { - "version": "0.13.4", + "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", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "arg": "^5.0.2", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "find-up": "^5.0.0", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "ignore": "^5.3.1", - "minimatch": "^9.0.0", - "p-limit": "^3.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" - }, - "bin": { - "fingerprint": "bin/cli.js" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@expo/fingerprint/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/@expo/config/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@expo/fingerprint/node_modules/minimatch": { - "version": "9.0.5", - "license": "ISC", + "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": { - "brace-expansion": "^2.0.1" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/image-utils": { - "version": "0.7.6", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", + "node_modules/@expo/config/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config/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/@expo/config/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/@expo/devcert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", + "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", + "license": "MIT", + "dependencies": { + "@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": "57.0.1", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-57.0.1.tgz", + "integrity": "sha512-GyUf+wFNkbttaX0jR7MZa9bm77U0IrLg6d2AjpxdyoXw/w4abHoXG0oFufwLMgP9zLTd5+Ct4X/ffNUTnlzZgg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@expo/dom-webview": { + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-57.0.1.tgz", + "integrity": "sha512-lAKsME4SAq+8sf56oN0DX5TBYyruupoRxbWbD2xf9RnKY8y6x8eb9LCE5pxSN0qyWdqnp+0wmyWzDkKboThKAw==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/@expo/env": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.4.2.tgz", + "integrity": "sha512-28pqaEqwnmLduZ00Pq9HkSzE5wbj1MTwp5/n8nm8rD8MCjR9eUnVOwmNksPI3Be2ReAPO/DbPn1puy0mvoocsQ==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "getenv": "^2.0.0" + }, + "engines": { + "node": ">=20.12.0" + } + }, + "node_modules/@expo/expo-modules-macros-plugin": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@expo/expo-modules-macros-plugin/-/expo-modules-macros-plugin-0.6.1.tgz", + "integrity": "sha512-cpsLZE4rqkc1Y3eZTkxB98jrqY1YXgetmtxFt8q89jBRmk3quRuk1BZo+VcnCSObZardjg99r1k5xijEMONFGA==", + "license": "MIT" + }, + "node_modules/@expo/fingerprint": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.20.5.tgz", + "integrity": "sha512-XCDfmbkTpTsYVq1xvvUJvXjfFQs2Hj+icQACBrc6BZmA91YPr2H3uw8sUX13d+1ij6E8lgVCtsK9jh3J2cN/SQ==", + "license": "MIT", + "dependencies": { + "@expo/env": "^2.4.2", + "@expo/spawn-async": "^1.8.0", + "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": "18 || 20 || >=22" + } + }, + "node_modules/@expo/fingerprint/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "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": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/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/@expo/image-utils": { + "version": "0.7.6", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", "getenv": "^2.0.0", "jimp-compact": "0.16.1", "parse-png": "^2.1.0", @@ -3947,87 +4467,582 @@ "unique-string": "~2.0.0" } }, - "node_modules/@expo/json-file": { - "version": "9.1.5", + "node_modules/@expo/inline-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@expo/inline-modules/-/inline-modules-0.1.3.tgz", + "integrity": "sha512-eHSxWYfgq65mP3Qz8PclVjUkSrDIlGl3va9U7PMcTpGItOvee/i0ZzGinH5A25oARR5ouD64eESBKwtT/CwdHg==", + "license": "MIT", + "dependencies": { + "@expo/config-plugins": "~57.0.5" + } + }, + "node_modules/@expo/inline-modules/node_modules/@expo/config-plugins": { + "version": "57.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.5.tgz", + "integrity": "sha512-xhUGgzpFWRghDUH98+Wl4RDakYhTsbyMg6aOYiBjRzPO/THH8tKMw3vlksgFYlU2PkiAdABJN3tNPf5qmvOQhA==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^57.0.2", + "@expo/json-file": "~11.0.1", + "@expo/plist": "^0.8.1", + "@expo/require-utils": "^57.0.3", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "semver": "^7.5.4", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/inline-modules/node_modules/@expo/config-types": { + "version": "57.0.2", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.2.tgz", + "integrity": "sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==", + "license": "MIT" + }, + "node_modules/@expo/inline-modules/node_modules/@expo/json-file": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz", + "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/inline-modules/node_modules/@expo/plist": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.1.tgz", + "integrity": "sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + } + }, + "node_modules/@expo/inline-modules/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/@expo/inline-modules/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@expo/inline-modules/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": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/inline-modules/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/inline-modules/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/inline-modules/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/@expo/inline-modules/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/@expo/json-file": { + "version": "9.1.5", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/local-build-cache-provider": { + "version": "57.0.4", + "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-57.0.4.tgz", + "integrity": "sha512-B/cI73shkLSYBYuFyh+zCbS+WhqJgawWPW4MPdMiNLJKv9RmV4dv1FGjsidiIiG2k4kYKerBDLK4bLbC7qERQQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~57.0.5", + "chalk": "^4.1.2" + } + }, + "node_modules/@expo/log-box": { + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-57.0.1.tgz", + "integrity": "sha512-fuVNHhOerdRWtpq27gD6JTSVYESsfRu+SMdrNCWxW+gFnusS6dGKfx3lKGBZ4ZkMNiLWn8maBHo39YKzJNXFYQ==", + "license": "MIT", + "dependencies": { + "@expo/dom-webview": "^57.0.1", + "anser": "^1.4.9", + "stacktrace-parser": "^0.1.10" + }, + "peerDependencies": { + "@expo/dom-webview": "^57.0.1", + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/@expo/metro": { + "version": "56.0.0", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-56.0.0.tgz", + "integrity": "sha512-5gIgQHtEpjjvsjKfVtIv23a98LLRV0/y07PDShEwYSytAMlE3FSF8RHXqtHc1sUJL6dn7hnuIBpIbrLXXuVi0A==", + "license": "MIT", + "dependencies": { + "metro": "0.84.4", + "metro-babel-transformer": "0.84.4", + "metro-cache": "0.84.4", + "metro-cache-key": "0.84.4", + "metro-config": "0.84.4", + "metro-core": "0.84.4", + "metro-file-map": "0.84.4", + "metro-minify-terser": "0.84.4", + "metro-resolver": "0.84.4", + "metro-runtime": "0.84.4", + "metro-source-map": "0.84.4", + "metro-symbolicate": "0.84.4", + "metro-transform-plugins": "0.84.4", + "metro-transform-worker": "0.84.4" + } + }, + "node_modules/@expo/metro-config": { + "version": "57.0.6", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-57.0.6.tgz", + "integrity": "sha512-liXA9axM3aykAdil4qdHOYKmQqTDdXYkAoT3Eny+SQEo3btERJCbOk8VH48/G0sVbXCj82AbSS8s3XNEQNqbDQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~57.0.5", + "@expo/env": "~2.4.2", + "@expo/json-file": "~11.0.1", + "@expo/metro": "~56.0.0", + "@expo/require-utils": "^57.0.3", + "@expo/spawn-async": "^1.8.0", + "@jridgewell/gen-mapping": "^0.3.13", + "@jridgewell/remapping": "^2.3.5", + "@jridgewell/sourcemap-codec": "^1.5.5", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.36.0", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "picomatch": "^4.0.4", + "postcss": "^8.5.14", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-config/node_modules/@expo/json-file": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz", + "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "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": "18 || 20 || >=22" + } + }, + "node_modules/@expo/metro-config/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "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": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/metro-config/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "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/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/@expo/metro-config/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@expo/metro-file-map": { + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/@expo/metro-file-map/-/metro-file-map-57.0.1.tgz", + "integrity": "sha512-8JXfVstZN7QnP4NianZZnlTVboOWR0sG8trUDNajOjnbGlPln29vponXM84tY+3tAHapz5/TxE53L0ixUwqPtA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "fb-watchman": "^2.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "node_modules/@expo/osascript": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.7.1.tgz", + "integrity": "sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.8.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/package-manager": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.13.1.tgz", + "integrity": "sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg==", + "license": "MIT", + "dependencies": { + "@expo/json-file": "^11.0.1", + "@expo/spawn-async": "^1.8.0", + "chalk": "^4.0.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0" + } + }, + "node_modules/@expo/package-manager/node_modules/@expo/json-file": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz", + "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/package-manager/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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": ">=4" + } + }, + "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": ">=4" + } + }, + "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": { + "color-name": "1.1.3" + } + }, + "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/@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", + "engines": { + "node": ">=0.8.0" + } + }, + "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", - "dependencies": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.3" + "engines": { + "node": ">=4" } }, - "node_modules/@expo/json-file/node_modules/@babel/code-frame": { - "version": "7.10.4", + "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": { - "@babel/highlight": "^7.10.4" + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@expo/metro-config": { - "version": "0.20.17", + "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", "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "@expo/config": "~11.0.12", - "@expo/env": "~1.0.7", - "@expo/json-file": "~9.1.5", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "jsc-safe-url": "^0.2.4", - "lightningcss": "~1.27.0", - "minimatch": "^9.0.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@expo/metro-config/node_modules/brace-expansion": { + "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", + "engines": { + "node": ">=4" + } + }, + "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": { - "balanced-match": "^1.0.0" + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@expo/metro-config/node_modules/minimatch": { - "version": "9.0.5", - "license": "ISC", + "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", "dependencies": { - "brace-expansion": "^2.0.1" + "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": ">=16 || 14 >=14.17" + "node": ">=6" + } + }, + "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": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=4" } }, - "node_modules/@expo/osascript": { - "version": "2.2.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": { - "@expo/spawn-async": "^1.7.2", - "exec-async": "^2.2.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/@expo/package-manager": { - "version": "1.8.6", + "node_modules/@expo/package-manager/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "license": "MIT", "dependencies": { - "@expo/json-file": "^9.1.5", - "@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" + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/@expo/plist": { @@ -4047,81 +5062,275 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "9.0.11", + "version": "57.0.8", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-57.0.8.tgz", + "integrity": "sha512-NQjRuTLvxUnggK57pKTHLtzS8YYtjrQSGYu+CjgWaO8lNlqdoBbvHrxGYtc9tBuOI3xVPaTfuIvjikxX1r+UhQ==", "license": "MIT", "dependencies": { - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/config-types": "^53.0.5", - "@expo/image-utils": "^0.7.6", - "@expo/json-file": "^9.1.5", - "@react-native/normalize-colors": "0.79.5", + "@expo/config": "~57.0.5", + "@expo/config-plugins": "~57.0.5", + "@expo/config-types": "^57.0.2", + "@expo/image-utils": "^0.11.3", + "@expo/json-file": "^11.0.1", + "@react-native/normalize-colors": "0.86.0", "debug": "^4.3.1", + "expo-modules-autolinking": "~57.0.8", "resolve-from": "^5.0.0", - "semver": "^7.6.0", + "semver": "^7.6.0" + } + }, + "node_modules/@expo/prebuild-config/node_modules/@expo/config-plugins": { + "version": "57.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.5.tgz", + "integrity": "sha512-xhUGgzpFWRghDUH98+Wl4RDakYhTsbyMg6aOYiBjRzPO/THH8tKMw3vlksgFYlU2PkiAdABJN3tNPf5qmvOQhA==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^57.0.2", + "@expo/json-file": "~11.0.1", + "@expo/plist": "^0.8.1", + "@expo/require-utils": "^57.0.3", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "semver": "^7.5.4", + "slugify": "^1.6.6", + "xcode": "^3.0.1", "xml2js": "0.6.0" } }, - "node_modules/@expo/prebuild-config/node_modules/@react-native/normalize-colors": { - "version": "0.79.5", + "node_modules/@expo/prebuild-config/node_modules/@expo/config-types": { + "version": "57.0.2", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.2.tgz", + "integrity": "sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==", "license": "MIT" }, - "node_modules/@expo/sdk-runtime-versions": { - "version": "1.0.0", - "license": "MIT" + "node_modules/@expo/prebuild-config/node_modules/@expo/image-utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.11.3.tgz", + "integrity": "sha512-yMVjkndhXm9mct0uMq+ndxqT6FgAnhucdUfmXuQ6V6uE021GOiYCACO+KZ0MB4vearPSvbWTGfi32QQr2qocfQ==", + "license": "MIT", + "dependencies": { + "@expo/require-utils": "^57.0.3", + "@expo/spawn-async": "^1.8.0", + "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/spawn-async": { - "version": "1.7.2", + "node_modules/@expo/prebuild-config/node_modules/@expo/json-file": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz", + "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/prebuild-config/node_modules/@expo/plist": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.1.tgz", + "integrity": "sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + } + }, + "node_modules/@expo/prebuild-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": "18 || 20 || >=22" + } + }, + "node_modules/@expo/prebuild-config/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=12" + "node": "18 || 20 || >=22" } }, - "node_modules/@expo/sudo-prompt": { - "version": "9.3.2", - "license": "MIT" + "node_modules/@expo/prebuild-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": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/prebuild-config/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@expo/prebuild-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/prebuild-config/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/@expo/prebuild-config/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/@expo/require-utils": { + "version": "57.0.3", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-57.0.3.tgz", + "integrity": "sha512-ns05X1K8tM+Qtzp6dNloUFOopSdh3J+HC61BtOR8WHhgtPFyX8TKuO2diqZUqVg9K8yfkWug7g8tBS0qRniSTA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8" + }, + "peerDependencies": { + "typescript": "^5.0.0 || ^5.0.0-0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/@expo/vector-icons": { - "version": "14.1.0", + "node_modules/@expo/router-server": { + "version": "57.0.3", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-57.0.3.tgz", + "integrity": "sha512-gkboMZUv+eAK4XSBGSIQ6at3dSa/QYARm+8PKj8pMEhGnt08vgcXpWAW5rYJMoLukaDD/bUDX/JU2Iz1Azwziw==", "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, "peerDependencies": { - "expo-font": "*", + "@expo/metro-runtime": "^57.0.5", + "expo": "*", + "expo-constants": "^57.0.5", + "expo-font": "^57.0.1", + "expo-router": "*", + "expo-server": "^57.0.1", "react": "*", - "react-native": "*" + "react-dom": "*", + "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" + }, + "peerDependenciesMeta": { + "@expo/metro-runtime": { + "optional": true + }, + "expo-router": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } } }, - "node_modules/@expo/ws-tunnel": { - "version": "1.0.6", + "node_modules/@expo/schema-utils": { + "version": "57.0.2", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-57.0.2.tgz", + "integrity": "sha512-fMu/jyN0l1Wzv7XkeWR4IYCx1M8ryui3FdBNGrWwbRgJ7EhxXxK8E2jxP2W3pbgUwUY0V3hG8+GyfCZwny+Lxw==", "license": "MIT" }, - "node_modules/@expo/xcpretty": { - "version": "4.3.2", - "license": "BSD-3-Clause", + "node_modules/@expo/sdk-runtime-versions": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/@expo/spawn-async": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.8.0.tgz", + "integrity": "sha512-eb9xxd/LbuEGSdua4NumCu/McVB9EM+F/JxB9pWgnERw4HQ9XyTNH1KapG6oqLWR8TuRK2LQfzJlmNi94CVobw==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "7.10.4", - "chalk": "^4.1.0", - "find-up": "^5.0.0", - "js-yaml": "^4.1.0" + "cross-spawn": "^7.0.6" }, - "bin": { - "excpretty": "build/cli.js" + "engines": { + "node": ">=12" } }, - "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { - "version": "7.10.4", + "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/ws-tunnel": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-2.0.0.tgz", + "integrity": "sha512-j+JfTRdCk820J9dU0sA2SqshQIKFOMo7ED84w9MJFcebfbNQgsLztEY/SABDkGnjatrW4xGqnUhVRxSBVyCkXw==", "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" + "peerDependencies": { + "ws": "^8.0.0" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=14" + "node_modules/@expo/xcpretty": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.4.tgz", + "integrity": "sha512-4aQzz9vgxcNXFfo/iyNgDDYfsU5XGKKxWxZopw0cVotHiW+U8IJbIxMaxsINs6bHhtkG3StKNPcOrn3eBuxKPw==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "chalk": "^4.1.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "excpretty": "build/cli.js" } }, "node_modules/@fioprotocol/fiojs": { @@ -4182,14 +5391,36 @@ "url": "https://opencollective.com/bigjs" } }, + "node_modules/@firebase/ai": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.13.1.tgz", + "integrity": "sha512-RhT/VViTPBSplhQSuEp62HhLvfsV+LowMh8ZUo5MMRDzG7oFtSget4Kmg5oHP50hDVyWQuQj6to9iPFEZk08Tw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.4", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, "node_modules/@firebase/analytics": { - "version": "0.10.4", + "version": "0.10.22", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.22.tgz", + "integrity": "sha512-8BSaq/QRGU1+xyi8L2PTLTJU7MH9aMA72RQdIxrbhWFauOZY9OXo8f2YDN/972xA8d588tlnNVEQ2Mo69pT9Ow==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -4197,13 +5428,15 @@ } }, "node_modules/@firebase/analytics-compat": { - "version": "0.2.10", + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.28.tgz", + "integrity": "sha512-lIAlqUUbBu93FJMlQfslryQtBwwzdzvp23ePC6FNgymXk6Ook5v4Uvc0vdutvoIeqmyA3LfP0ZeRFK8+11kOOQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/analytics": "0.10.4", - "@firebase/analytics-types": "0.8.2", - "@firebase/component": "0.6.7", - "@firebase/util": "1.9.6", + "@firebase/analytics": "0.10.22", + "@firebase/analytics-types": "0.8.4", + "@firebase/component": "0.7.3", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -4211,84 +5444,119 @@ } }, "node_modules/@firebase/analytics-types": { - "version": "0.8.2", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.4.tgz", + "integrity": "sha512-zQ+XTgkwH6CY/eUSHJRP7e4LxM30RCxlCmob5sy2axs25GE3Ny0XdgpDscMTHHQIGqWkxPXad4w2Mw9sCgT8zQ==", "license": "Apache-2.0" }, "node_modules/@firebase/app": { - "version": "0.10.5", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.15.0.tgz", + "integrity": "sha512-soIskolmGgbpi0K/MfrjtdpO1220qRCbXA4Z8Qx3lM+fVwA3q40m+OM+7zBHd2nuQCrLXb33L6Oc1aBH3Y26AQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", "idb": "7.1.1", "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@firebase/app-check": { - "version": "0.8.4", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.12.0.tgz", + "integrity": "sha512-wMeT6HLWRAuW7Cp/5UjWBGKgjPNxWNOoNf4PRIv0weljoGMZVeqbUY7wNBWTI2/31cX1NlXx8gQruDLsUShB3Q==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, + "engines": { + "node": ">=20.0.0" + }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/app-check-compat": { - "version": "0.3.11", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.5.tgz", + "integrity": "sha512-JI17mVcZs34zO6ZeSCrw4U2iohqy+n6GIzkbmsA+TbVjmvFLkUKt3bs5M+qRBteQm/0IWzqSHYFzEQLzDTQebg==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-check": "0.8.4", - "@firebase/app-check-types": "0.5.2", - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/app-check": "0.12.0", + "@firebase/app-check-types": "0.5.4", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, + "engines": { + "node": ">=20.0.0" + }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.2", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.4.tgz", + "integrity": "sha512-zz3i6e13B8BfWiLy8MABtTh8aGIACgKbf9UVnyHcWs+yQzJXgQcl8A46b0zfaiJHdQ+niF0ouAfcpuf+3LMPQg==", "license": "Apache-2.0" }, "node_modules/@firebase/app-check-types": { - "version": "0.5.2", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.4.tgz", + "integrity": "sha512-xV7JsIyzVr15aA7f3Pi0rB9gdBuVubs89FGA8VkRYA4g0l78poADgdfrScgf7NndSg9mm7cR7PJyY0+t22KaGw==", "license": "Apache-2.0" }, "node_modules/@firebase/app-compat": { - "version": "0.2.35", + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.14.tgz", + "integrity": "sha512-rgFmiofYsdS9ZG/Bht3OBxJtPD3zWE1cffShWubEm+4+qZeyzCbmtb1q6jOEjN9fB7uufe4rQmWOPXouR3758Q==", "license": "Apache-2.0", "dependencies": { - "@firebase/app": "0.10.5", - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/app": "0.15.0", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@firebase/app-types": { - "version": "0.9.2", - "license": "Apache-2.0" + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.5.tgz", + "integrity": "sha512-YevqTjvo7Iujsa9Dwowmd6dSoElhzmD63ZSrq6bzjvQ6POjYgNjOFHLmNIgJs48eNO093NCERibuFnxbfOvU7A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/logger": "0.5.1" + } }, "node_modules/@firebase/auth": { - "version": "1.7.4", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.13.3.tgz", + "integrity": "sha512-bqiq4uubDN2YyQkdvSWPQeJyXAv2O76ImF41En9b6UhV5JuBVYDoHYrrrE3NzIuGkpFMKagfhMRP4Vz6t+yQSQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", - "tslib": "^2.1.0", - "undici": "5.28.4" + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" }, "peerDependencies": { "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" + "@react-native-async-storage/async-storage": "^2.2.0 || ^3.0.0" }, "peerDependenciesMeta": { "@react-native-async-storage/async-storage": { @@ -4297,26 +5565,34 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.5.9", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.8.tgz", + "integrity": "sha512-llcBREUC4iSNKZ6rvwud7Oz9Q7aAWU6KuQLa6pdu7Q+QAQsy4JLw6yFgxwtmzabsgznHmmcsX2UjHLLzqUxi3Q==", "license": "Apache-2.0", "dependencies": { - "@firebase/auth": "1.7.4", - "@firebase/auth-types": "0.12.2", - "@firebase/component": "0.6.7", - "@firebase/util": "1.9.6", - "tslib": "^2.1.0", - "undici": "5.28.4" + "@firebase/auth": "1.13.3", + "@firebase/auth-types": "0.13.1", + "@firebase/component": "0.7.3", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/auth-interop-types": { - "version": "0.2.3", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.5.tgz", + "integrity": "sha512-1Li/YuBDBAXcKv7BzY4U28gontUmAaw53sYiqbaVOMCFb2lFKK/c3CGMUWqtwe7+TXrl3poWnTCL5umYBg85Eg==", "license": "Apache-2.0" }, "node_modules/@firebase/auth-types": { - "version": "0.12.2", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.1.tgz", + "integrity": "sha512-0c1Mnid0uMDfGJHeUS4zfvBa4/CedJXotGy/n/NZJnBjwiJawt0ZYU+wH2VAVLiRCEfG2ncCkAX3yd1/2nrB7g==", "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", @@ -4324,82 +5600,124 @@ } }, "node_modules/@firebase/component": { - "version": "0.6.7", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.3.tgz", + "integrity": "sha512-wFofIaa2879ogD/WvkjYXJxRmfnL0scen6ORgaC3na1FNOR9ASIUANQdhqQcmWu/h77/pVHY7ch5flewa5Bcew==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/data-connect": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.7.1.tgz", + "integrity": "sha512-2LbUU8mmSA63HknxQMmWHjpzuNLBKflvVwQc2tpoVKg0biWleNEJX031ELks0vzFs+dDjOUkCJR72RP6mQHFOg==", "license": "Apache-2.0", "dependencies": { - "@firebase/util": "1.9.6", + "@firebase/auth-interop-types": "0.2.5", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" } }, "node_modules/@firebase/database": { - "version": "1.0.5", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.3.tgz", + "integrity": "sha512-XwWCa+E4TvNGpGwXrycLRNfdogADwFcvuhyow6wDWma9W54roaQIhe+4PM0KiLsIftBdSCGI7OKCXrdSRHbIhw==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-check-interop-types": "0.3.2", - "@firebase/auth-interop-types": "0.2.3", - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/app-check-interop-types": "0.3.4", + "@firebase/auth-interop-types": "0.2.5", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", "faye-websocket": "0.11.4", "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@firebase/database-compat": { - "version": "1.0.5", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.4.tgz", + "integrity": "sha512-3pK35F1MAgmqFJQlf2nhQl44vtAXQO1uaCaQOEUI9kCRtLFqi7N+QRKR7lFZPg+xIZIyubgxQaxY69YgfZRZWg==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/database": "1.0.5", - "@firebase/database-types": "1.0.3", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/database": "1.1.3", + "@firebase/database-types": "1.0.20", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@firebase/database-types": { - "version": "1.0.3", + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.20.tgz", + "integrity": "sha512-kegbOk/w8iU64pr0q6k2ItyNGjnQBMHFhwS7ohdWI4W+pc0/zhhdGXTdFj6X1oxItRjPoYOsSQmERgBkn/ihxw==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-types": "0.9.2", - "@firebase/util": "1.9.6" + "@firebase/app-types": "0.9.5", + "@firebase/util": "1.15.1" } }, "node_modules/@firebase/firestore": { - "version": "4.6.3", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.16.0.tgz", + "integrity": "sha512-qdHMHMvMr0nRMuZyWNR/ArWa0YlPE3C4eAbmxTASJMYXAesKPL0Y54p70moggrNPzaK7MSIIq5RDJJyntQyIYA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", - "@firebase/webchannel-wrapper": "1.0.0", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "@firebase/webchannel-wrapper": "1.0.6", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", - "tslib": "^2.1.0", - "undici": "5.28.4" + "re2js": "^0.4.2", + "tslib": "^2.1.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=20.0.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/firestore-compat": { - "version": "0.3.32", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.11.tgz", + "integrity": "sha512-W7o1WdwWq5aABK5Up2ncSvTQs/QGLR/fy7cVpFBNqhsXtxoMtflHf2xBIG6+aoptcuGAobddq4g2Sq27wqHaYw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/firestore": "4.6.3", - "@firebase/firestore-types": "3.0.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/firestore": "4.16.0", + "@firebase/firestore-types": "3.0.4", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, + "engines": { + "node": ">=20.0.0" + }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/firestore-types": { - "version": "3.0.2", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.4.tgz", + "integrity": "sha512-jGn+JSS4X9zZsrfu7Yw66v5YRdOLD1oyQh4USR0xWl4CUqV/DA6bNIXRPpxH/cUl3iVTNiP6MN7g+EL42A4qfA==", "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", @@ -4407,7 +5725,9 @@ } }, "node_modules/@firebase/firestore/node_modules/@grpc/grpc-js": { - "version": "1.9.15", + "version": "1.9.16", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.16.tgz", + "integrity": "sha512-wE4Ut/olIzfKqp631XrG+wbF0v1vWFN4YL9FyXC2LJiG33DsV7PLzURjrCvY/6je2ntdRkeLpPDluzSRGaVltQ==", "license": "Apache-2.0", "dependencies": { "@grpc/proto-loader": "^0.7.8", @@ -4418,45 +5738,58 @@ } }, "node_modules/@firebase/functions": { - "version": "0.11.5", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.13.5.tgz", + "integrity": "sha512-bWCx713f4kE/uFV7gdFOLBS7lDoiZj48MRkbAqe35gkXcCeWF4QjRNO07Jhmve7EJIoQOBczL29y2r8VRuN1kw==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-check-interop-types": "0.3.2", - "@firebase/auth-interop-types": "0.2.3", - "@firebase/component": "0.6.7", - "@firebase/messaging-interop-types": "0.2.2", - "@firebase/util": "1.9.6", - "tslib": "^2.1.0", - "undici": "5.28.4" + "@firebase/app-check-interop-types": "0.3.4", + "@firebase/auth-interop-types": "0.2.5", + "@firebase/component": "0.7.3", + "@firebase/messaging-interop-types": "0.2.5", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/functions-compat": { - "version": "0.3.11", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.4.5.tgz", + "integrity": "sha512-10qlUXGY25G5/1g9UihqksPp2po+ZqSE7LEizsrdUP7vrTmkysXxGSZCDyojSEp6mQe/ecRDdDDI+z4XRdb4wQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/functions": "0.11.5", - "@firebase/functions-types": "0.6.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/functions": "0.13.5", + "@firebase/functions-types": "0.6.4", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, + "engines": { + "node": ">=20.0.0" + }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/functions-types": { - "version": "0.6.2", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.4.tgz", + "integrity": "sha512-zV6kgqtduR4rUAdC/ilS7kmb93XD7bEZoJDlVBZqlOw2uGGGCNBQBuleww2rr0Ulr3L9o2TDjumEt68/l1f9DQ==", "license": "Apache-2.0" }, "node_modules/@firebase/installations": { - "version": "0.6.7", + "version": "0.6.22", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.22.tgz", + "integrity": "sha512-ef6nn3GGQTdReCfotRMG77PJZu8CqEbiK5pEoBnM0gTu/Z9v0i/az2p3HABsa/1beQmmyh1OsOjf7P5+pgwdZw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/util": "1.15.1", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -4465,13 +5798,15 @@ } }, "node_modules/@firebase/installations-compat": { - "version": "0.2.7", + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.22.tgz", + "integrity": "sha512-C/zpAuTP5S9OgKSPvXRupw3hoY/JZSlA1wFjD/Sb7LIQE0FNbcMdO8Y4KXVEkjVzma/DDDDIAzxEXqKMAzc88w==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", - "@firebase/installations-types": "0.5.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/installations-types": "0.5.4", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -4479,27 +5814,36 @@ } }, "node_modules/@firebase/installations-types": { - "version": "0.5.2", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.4.tgz", + "integrity": "sha512-U2eFapdHwjb43Vx9o+Pmj4dFfvcHEK1IirEFLqMtWrTHvmdrS3gBpBD1kmJk/9HjsOtoHZxJ2Paoe79e+L1ZPg==", "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x" } }, "node_modules/@firebase/logger": { - "version": "0.4.2", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.1.tgz", + "integrity": "sha512-vZKLsqE1ABOy8OjQiE7cUTFn4gvaqlk88yp8N94Pk/sDpq61YqZGqmVFZTvOyflTwuYFcWirBdYGoJgbDaXKYQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" } }, "node_modules/@firebase/messaging": { - "version": "0.12.9", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.13.0.tgz", + "integrity": "sha512-GZoo0uGRvEbszo83xcgbjJp4FpkmBEr4l8Z4hi8gl+P1Spn/MTK3HapanMzSX4yUHuTEiF5hasWRxOaz+o5sxQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", - "@firebase/messaging-interop-types": "0.2.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/messaging-interop-types": "0.2.5", + "@firebase/util": "1.15.1", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -4508,12 +5852,14 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.9", + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.27.tgz", + "integrity": "sha512-JNOiu1PPgdHzEPEtoFiNxQuu0x9bm4bfETSQCpGfcTlgWkhlSK7uh7nlsjC10TQLUNgYetLmuutaYTh8aeYLVA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/messaging": "0.12.9", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/messaging": "0.13.0", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -4521,32 +5867,39 @@ } }, "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.2", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.5.tgz", + "integrity": "sha512-tUEKnaAP2Y/MNIqgnriPpV6e5l13Vs/+p2yrd6NGlncPJT9O3a8muYZtdnWe+IJ4fgKLHJVC79n/asxk/N5Msw==", "license": "Apache-2.0" }, "node_modules/@firebase/performance": { - "version": "0.6.7", + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.12.tgz", + "integrity": "sha512-fe7nV8teUU3OBHlMUZ9Lw4gLhCW2k4m5Uc3pfWGV+fl8uwJQBGp9Q3lqsJ+HSrFu3Q2pJyLAgrClPGSKyDeYgQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", - "tslib": "^2.1.0" + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0", + "web-vitals": "^4.2.4" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/performance-compat": { - "version": "0.2.7", + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.25.tgz", + "integrity": "sha512-q6NjTXpIPoFuUmCmMN/maCdTgzT6aExs9xZo+PxfVLj6uLVGvpyAD6XWjmcrb7jChsFBYbq7E5dyNDF7Zhy9kA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/performance": "0.6.7", - "@firebase/performance-types": "0.2.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/performance": "0.7.12", + "@firebase/performance-types": "0.2.4", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -4554,17 +5907,21 @@ } }, "node_modules/@firebase/performance-types": { - "version": "0.2.2", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.4.tgz", + "integrity": "sha512-kJSEk7b0uhpcPRyL4SQ/GPujLqk52XNKcXlnsKDbWGAb9vugcLvOU3u6zfEdwd+d8hWJb5S5ZizV1JFFI0nkKg==", "license": "Apache-2.0" }, "node_modules/@firebase/remote-config": { - "version": "0.4.7", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.8.5.tgz", + "integrity": "sha512-zb+7CDGFP2wYVF1LXQoYIFdoESIQM3p0+uiW1welw8+zvDxAL50K75PKTXXtunJADUrksTVpV7mD0pn54vzJRA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/installations": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/installations": "0.6.22", + "@firebase/logger": "0.5.1", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -4572,14 +5929,16 @@ } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.2.7", + "version": "0.2.26", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.26.tgz", + "integrity": "sha512-uC57Tc7GYYOCnMgLkGIVf999XlaYaPDONoa54c93YTKDctlvCZI89z0zQ2RbhGR8Zf+QuCbQHs/99vqoE84a7g==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/remote-config": "0.4.7", - "@firebase/remote-config-types": "0.3.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/logger": "0.5.1", + "@firebase/remote-config": "0.8.5", + "@firebase/remote-config-types": "0.5.1", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, "peerDependencies": { @@ -4587,38 +5946,51 @@ } }, "node_modules/@firebase/remote-config-types": { - "version": "0.3.2", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.5.1.tgz", + "integrity": "sha512-cX/1LT6KQwkXzck2eSzeKnuvXZCyr8qaPpDcikoJs7jmI+oBOXixpDLeDtWj1U6GNMkIoXrEDNoyT2Ypcyp5/A==", "license": "Apache-2.0" }, "node_modules/@firebase/storage": { - "version": "0.12.5", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.3.tgz", + "integrity": "sha512-YX4/YL6P6/fufSSeGnVhjWddcIXbFq2cWIhMKFTZo1E/Rtcl2mJj/BYUQTwJfcE1Tl8un1FOya4L05jcSLN/Eg==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/util": "1.9.6", - "tslib": "^2.1.0", - "undici": "5.28.4" + "@firebase/component": "0.7.3", + "@firebase/util": "1.15.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, "node_modules/@firebase/storage-compat": { - "version": "0.3.8", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.3.tgz", + "integrity": "sha512-gruVqjtUGX8tEoeNbaWXZm0Zfcfcb7fvmDmBxV8yPAbWvExRnZYLO2+qw9idxNE7BvPXt5csyjSYHy//dAizxw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.6.7", - "@firebase/storage": "0.12.5", - "@firebase/storage-types": "0.8.2", - "@firebase/util": "1.9.6", + "@firebase/component": "0.7.3", + "@firebase/storage": "0.14.3", + "@firebase/storage-types": "0.8.4", + "@firebase/util": "1.15.1", "tslib": "^2.1.0" }, + "engines": { + "node": ">=20.0.0" + }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/storage-types": { - "version": "0.8.2", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.4.tgz", + "integrity": "sha512-BT7cwxJOx8SWwlQfrlC+bD/Sk3Cw+1odCi8UZNFNWTVZoPsBnA5W+mqtZzVnvsdJpXCFGSGQ7R7vOR6dtM/BRA==", "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", @@ -4626,32 +5998,22 @@ } }, "node_modules/@firebase/util": { - "version": "1.9.6", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/vertexai-preview": { - "version": "0.0.2", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.15.1.tgz", + "integrity": "sha512-LUdM4Wg7YM9Pq/49nGYySJA0CSQEKnGffFzWV8+6gXN7mGxn+FL1IqvFbuZUtAQcfZgHYDwCE1wwlK7rB7gl2g==", + "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@firebase/app-check-interop-types": "0.3.2", - "@firebase/component": "0.6.7", - "@firebase/logger": "0.4.2", - "@firebase/util": "1.9.6", "tslib": "^2.1.0" }, "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@firebase/app-types": "0.x" + "node": ">=20.0.0" } }, "node_modules/@firebase/webchannel-wrapper": { - "version": "1.0.0", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.6.tgz", + "integrity": "sha512-Vr/Mqu79dMwGRAyGbJ4uN4+BtXB3/mRTdzetD1daWNeG8QaWuzhhbG77GltO5c0yYmYls8i250iX73624GJd7Q==", "license": "Apache-2.0" }, "node_modules/@glennsl/bs-json": { @@ -4768,12 +6130,16 @@ "license": "Apache-2.0" }, "node_modules/@hapi/hoek": { - "version": "9.2.0", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@hapi/topo": { - "version": "5.0.0", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5776,18 +7142,10 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, "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" @@ -5795,6 +7153,7 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "dev": true, "license": "ISC", "dependencies": { "camelcase": "^5.3.1", @@ -5809,6 +7168,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", + "dev": true, "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" @@ -5816,6 +7176,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5823,6 +7184,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -5834,6 +7196,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.13.1", + "dev": true, "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -5845,6 +7208,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", + "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -5855,6 +7219,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", + "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -5868,6 +7233,7 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -5878,67 +7244,73 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { "version": "1.0.3", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/console": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.0.0", - "jest-util": "30.0.0", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.0", - "@jest/pattern": "30.0.0", - "@jest/reporters": "30.0.0", - "@jest/test-result": "30.0.0", - "@jest/transform": "30.0.0", - "@jest/types": "30.0.0", + "@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.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.0.0", - "jest-config": "30.0.0", - "jest-haste-map": "30.0.0", - "jest-message-util": "30.0.0", - "jest-regex-util": "30.0.0", - "jest-resolve": "30.0.0", - "jest-resolve-dependencies": "30.0.0", - "jest-runner": "30.0.0", - "jest-runtime": "30.0.0", - "jest-snapshot": "30.0.0", - "jest-util": "30.0.0", - "jest-validate": "30.0.0", - "jest-watcher": "30.0.0", - "micromatch": "^4.0.8", - "pretty-format": "30.0.0", - "slash": "^3.0.0" + "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -5951,6 +7323,9 @@ }, "node_modules/@jest/create-cache-key-function": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3" @@ -5959,184 +7334,147 @@ "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/diff-sequences": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/@jest/environment": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.0.0", - "@jest/types": "30.0.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "30.0.0" + "jest-mock": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.0.0", - "jest-snapshot": "30.0.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.0" + "jest-get-type": "^29.6.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.0", - "@sinonjs/fake-timers": "^13.0.0", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "30.0.0", - "jest-mock": "30.0.0", - "jest-util": "30.0.0" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.0.0", - "@jest/expect": "30.0.0", - "@jest/types": "30.0.0", - "jest-mock": "30.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/pattern": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.0.0", - "@jest/test-result": "30.0.0", - "@jest/transform": "30.0.0", - "@jest/types": "30.0.0", - "@jridgewell/trace-mapping": "^0.3.25", + "@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.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", + "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": "^5.0.0", + "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.0.0", - "jest-util": "30.0.0", - "jest-worker": "30.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", - "string-length": "^4.0.2", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "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/reporters/node_modules/jest-worker": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": "MIT", + "license": "ISC", "dependencies": { - "has-flag": "^4.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "*" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@jest/schemas": { @@ -6149,134 +7487,97 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/snapshot-utils": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/@jest/source-map": { - "version": "30.0.0", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.0", - "@jest/types": "30.0.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" + "@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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.0", + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.0.0", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.0", - "chalk": "^4.1.2", + "@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.11", - "jest-haste-map": "30.0.0", - "jest-regex-util": "30.0.0", - "jest-util": "30.0.0", - "micromatch": "^4.0.8", - "pirates": "^4.0.7", + "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": "^5.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform/node_modules/babel-plugin-istanbul": { - "version": "7.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" + "write-file-atomic": "^4.0.2" }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types": { - "version": "30.0.0", - "dev": true, + "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/pattern": "30.0.0", - "@jest/schemas": "30.0.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/types/node_modules/@jest/schemas": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/node_modules/@sinclair/typebox": { - "version": "0.34.35", - "dev": true, - "license": "MIT" - }, "node_modules/@jimp/bmp": { "version": "0.16.13", "license": "MIT", @@ -6420,13 +7721,25 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", + "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/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "license": "MIT", @@ -6435,15 +7748,19 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -6611,19 +7928,6 @@ "node": ">=18" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, "node_modules/@native-html/css-processor": { "version": "1.11.0", "license": "MIT", @@ -6715,8 +8019,6 @@ }, "node_modules/@nymproject/mix-fetch": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@nymproject/mix-fetch/-/mix-fetch-1.4.4.tgz", - "integrity": "sha512-sdyXXJG7sYv2OFOEf6FYm7HglKfMvJmJjrQC3Rbusy5rH5C2ajg2KyuBbZReLgIIbkkx3mK8sc5WRUOKTcKt2Q==", "license": "Apache-2.0" }, "node_modules/@open-draft/deferred-promise": { @@ -7693,13 +8995,15 @@ "license": "BSD-3-Clause" }, "node_modules/@react-native-async-storage/async-storage": { - "version": "1.19.4", + "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.60 - 0.72 || 1000.0.0" + "react-native": "^0.0.0-0 || >=0.65 <1.0" } }, "node_modules/@react-native-clipboard/clipboard": { @@ -7724,23 +9028,25 @@ } }, "node_modules/@react-native-community/cli": { - "version": "18.0.0", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-20.1.0.tgz", + "integrity": "sha512-441WsVtRe4nGJ9OzA+QMU1+22lA6Q2hRWqqIMKD0wjEMLqcSfOZyu2UL9a/yRpL/dRpyUsU4n7AxqKfTKO/Csg==", "dev": true, "license": "MIT", "dependencies": { - "@react-native-community/cli-clean": "18.0.0", - "@react-native-community/cli-config": "18.0.0", - "@react-native-community/cli-doctor": "18.0.0", - "@react-native-community/cli-server-api": "18.0.0", - "@react-native-community/cli-tools": "18.0.0", - "@react-native-community/cli-types": "18.0.0", - "chalk": "^4.1.2", + "@react-native-community/cli-clean": "20.1.0", + "@react-native-community/cli-config": "20.1.0", + "@react-native-community/cli-doctor": "20.1.0", + "@react-native-community/cli-server-api": "20.1.0", + "@react-native-community/cli-tools": "20.1.0", + "@react-native-community/cli-types": "20.1.0", "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", + "picocolors": "^1.1.1", "prompts": "^2.4.2", "semver": "^7.5.2" }, @@ -7748,31 +9054,67 @@ "rnc-cli": "build/bin.js" }, "engines": { - "node": ">=18" + "node": ">=20.19.4" } }, "node_modules/@react-native-community/cli-clean": { - "version": "18.0.0", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-20.1.0.tgz", + "integrity": "sha512-77L4DifWfxAT8ByHnkypge7GBMYpbJAjBGV+toowt5FQSGaTBDcBHCX+FFqFRukD5fH6i8sZ41Gtw+nbfCTTIA==", "dev": true, "license": "MIT", "dependencies": { - "@react-native-community/cli-tools": "18.0.0", - "chalk": "^4.1.2", + "@react-native-community/cli-tools": "20.1.0", "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "fast-glob": "^3.3.2", + "picocolors": "^1.1.1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/@react-native-community/cli-tools": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-20.1.0.tgz", + "integrity": "sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vscode/sudo-prompt": "^9.0.0", + "appdirsjs": "^1.2.4", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "launch-editor": "^2.9.1", + "mime": "^2.4.1", + "ora": "^5.4.1", + "picocolors": "^1.1.1", + "prompts": "^2.4.2", + "semver": "^7.5.2" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" } }, "node_modules/@react-native-community/cli-config": { - "version": "18.0.0", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-20.1.0.tgz", + "integrity": "sha512-1x9rhLLR/dKKb92Lb5O0l0EmUG08FHf+ZVyVEf9M+tX+p5QIm52MRiy43R0UAZ2jJnFApxRk+N3sxoYK4Dtnag==", "dev": true, "license": "MIT", "dependencies": { - "@react-native-community/cli-tools": "18.0.0", - "chalk": "^4.1.2", + "@react-native-community/cli-tools": "20.1.0", "cosmiconfig": "^9.0.0", "deepmerge": "^4.3.0", "fast-glob": "^3.3.2", - "joi": "^17.2.1" + "joi": "^17.2.1", + "picocolors": "^1.1.1" } }, "node_modules/@react-native-community/cli-config-android": { @@ -7792,201 +9134,346 @@ "@react-native-community/cli-tools": "18.0.0", "chalk": "^4.1.2", "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "fast-glob": "^3.3.2" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/@react-native-community/cli-tools": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-20.1.0.tgz", + "integrity": "sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vscode/sudo-prompt": "^9.0.0", + "appdirsjs": "^1.2.4", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "launch-editor": "^2.9.1", + "mime": "^2.4.1", + "ora": "^5.4.1", + "picocolors": "^1.1.1", + "prompts": "^2.4.2", + "semver": "^7.5.2" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@react-native-community/cli-config/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-20.1.0.tgz", + "integrity": "sha512-QfJF1GVjA4PBrIT3SJ0vFFIu0km1vwOmLDlOYVqfojajZJ+Dnvl0f94GN1il/jT7fITAxom///XH3/URvi7YTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@react-native-community/cli-config": "20.1.0", + "@react-native-community/cli-platform-android": "20.1.0", + "@react-native-community/cli-platform-apple": "20.1.0", + "@react-native-community/cli-platform-ios": "20.1.0", + "@react-native-community/cli-tools": "20.1.0", + "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", + "picocolors": "^1.1.1", + "semver": "^7.5.2", + "wcwidth": "^1.0.1", + "yaml": "^2.2.1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/@react-native-community/cli-tools": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-20.1.0.tgz", + "integrity": "sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vscode/sudo-prompt": "^9.0.0", + "appdirsjs": "^1.2.4", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "launch-editor": "^2.9.1", + "mime": "^2.4.1", + "ora": "^5.4.1", + "picocolors": "^1.1.1", + "prompts": "^2.4.2", + "semver": "^7.5.2" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-20.1.0.tgz", + "integrity": "sha512-TeHPDThOwDppQRpndm9kCdRCBI8AMy3HSIQ+iy7VYQXL5BtZ5LfmGdusoj7nVN/ZGn0Lc6Gwts5qowyupXdeKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@react-native-community/cli-config-android": "20.1.0", + "@react-native-community/cli-tools": "20.1.0", + "execa": "^5.0.0", + "logkitty": "^0.7.1", + "picocolors": "^1.1.1" } }, - "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { - "version": "9.0.0", + "node_modules/@react-native-community/cli-platform-android/node_modules/@react-native-community/cli-config-android": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config-android/-/cli-config-android-20.1.0.tgz", + "integrity": "sha512-3A01ZDyFeCALzzPcwP/fleHoP3sGNq1UX7FzxkTrOFX8RRL9ntXNXQd27E56VU4BBxGAjAJT4Utw8pcOjJceIA==", "dev": true, "license": "MIT", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@react-native-community/cli-tools": "20.1.0", + "fast-glob": "^3.3.2", + "fast-xml-parser": "^4.4.1", + "picocolors": "^1.1.1" } }, - "node_modules/@react-native-community/cli-doctor": { - "version": "18.0.0", + "node_modules/@react-native-community/cli-platform-android/node_modules/@react-native-community/cli-tools": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-20.1.0.tgz", + "integrity": "sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==", "dev": true, "license": "MIT", "dependencies": { - "@react-native-community/cli-config": "18.0.0", - "@react-native-community/cli-platform-android": "18.0.0", - "@react-native-community/cli-platform-apple": "18.0.0", - "@react-native-community/cli-platform-ios": "18.0.0", - "@react-native-community/cli-tools": "18.0.0", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.13.0", + "@vscode/sudo-prompt": "^9.0.0", + "appdirsjs": "^1.2.4", "execa": "^5.0.0", - "node-stream-zip": "^1.9.1", + "find-up": "^5.0.0", + "launch-editor": "^2.9.1", + "mime": "^2.4.1", "ora": "^5.4.1", - "semver": "^7.5.2", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" + "picocolors": "^1.1.1", + "prompts": "^2.4.2", + "semver": "^7.5.2" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/ora": { - "version": "5.4.1", + "node_modules/@react-native-community/cli-platform-android/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0.0" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/yaml": { - "version": "2.8.0", + "node_modules/@react-native-community/cli-platform-apple": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-20.1.0.tgz", + "integrity": "sha512-0ih1hrYezSM2cuOlVnwBEFtMwtd8YgpTLmZauDJCv50rIumtkI1cQoOgLoS4tbPCj9U/Vn2a9BFH0DLFOOIacg==", "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" + "license": "MIT", + "dependencies": { + "@react-native-community/cli-config-apple": "20.1.0", + "@react-native-community/cli-tools": "20.1.0", + "execa": "^5.0.0", + "fast-xml-parser": "^4.4.1", + "picocolors": "^1.1.1" } }, - "node_modules/@react-native-community/cli-platform-android": { - "version": "18.0.0", + "node_modules/@react-native-community/cli-platform-apple/node_modules/@react-native-community/cli-config-apple": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config-apple/-/cli-config-apple-20.1.0.tgz", + "integrity": "sha512-n6JVs8Q3yxRbtZQOy05ofeb1kGtspGN3SgwPmuaqvURF9fsuS7c4/9up2Kp9C+1D2J1remPJXiZLNGOcJvfpOA==", "dev": true, "license": "MIT", "dependencies": { - "@react-native-community/cli-config-android": "18.0.0", - "@react-native-community/cli-tools": "18.0.0", - "chalk": "^4.1.2", + "@react-native-community/cli-tools": "20.1.0", "execa": "^5.0.0", - "logkitty": "^0.7.1" + "fast-glob": "^3.3.2", + "picocolors": "^1.1.1" } }, - "node_modules/@react-native-community/cli-platform-apple": { - "version": "18.0.0", + "node_modules/@react-native-community/cli-platform-apple/node_modules/@react-native-community/cli-tools": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-20.1.0.tgz", + "integrity": "sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==", "dev": true, "license": "MIT", "dependencies": { - "@react-native-community/cli-config-apple": "18.0.0", - "@react-native-community/cli-tools": "18.0.0", - "chalk": "^4.1.2", + "@vscode/sudo-prompt": "^9.0.0", + "appdirsjs": "^1.2.4", "execa": "^5.0.0", - "fast-xml-parser": "^4.4.1" + "find-up": "^5.0.0", + "launch-editor": "^2.9.1", + "mime": "^2.4.1", + "ora": "^5.4.1", + "picocolors": "^1.1.1", + "prompts": "^2.4.2", + "semver": "^7.5.2" + } + }, + "node_modules/@react-native-community/cli-platform-apple/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" } }, "node_modules/@react-native-community/cli-platform-ios": { - "version": "18.0.0", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-20.1.0.tgz", + "integrity": "sha512-XN7Da9z4WsJxtqVtEzY8q2bv22OsvzaFP5zy5+phMWNoJlU4lf7IvBSxqGYMpQ9XhYP7arDw5vmW4W34s06rnA==", "dev": true, "license": "MIT", "dependencies": { - "@react-native-community/cli-platform-apple": "18.0.0" + "@react-native-community/cli-platform-apple": "20.1.0" } }, "node_modules/@react-native-community/cli-server-api": { - "version": "18.0.0", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-20.1.0.tgz", + "integrity": "sha512-Tb415Oh8syXNT2zOzLzFkBXznzGaqKCiaichxKzGCDKg6JGHp3jSuCmcTcaPeYC7oc32n/S3Psw7798r4Q/7lA==", "dev": true, "license": "MIT", "dependencies": { - "@react-native-community/cli-tools": "18.0.0", + "@react-native-community/cli-tools": "20.1.0", "body-parser": "^1.20.3", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.1", "nocache": "^3.0.1", "open": "^6.2.0", - "pretty-format": "^26.6.2", + "pretty-format": "^29.7.0", "serve-static": "^1.13.1", "ws": "^6.2.3" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { - "version": "26.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { - "version": "15.0.13", + "node_modules/@react-native-community/cli-server-api/node_modules/@react-native-community/cli-tools": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-20.1.0.tgz", + "integrity": "sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@vscode/sudo-prompt": "^9.0.0", + "appdirsjs": "^1.2.4", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "launch-editor": "^2.9.1", + "mime": "^2.4.1", + "ora": "^5.4.1", + "picocolors": "^1.1.1", + "prompts": "^2.4.2", + "semver": "^7.5.2" } }, "node_modules/@react-native-community/cli-server-api/node_modules/is-wsl": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/open": { - "version": "6.4.0", + "node_modules/@react-native-community/cli-server-api/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "license": "MIT", - "dependencies": { - "is-wsl": "^1.1.0" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { - "version": "26.6.2", + "node_modules/@react-native-community/cli-server-api/node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "is-wsl": "^1.1.0" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { - "version": "17.0.2", - "dev": true, - "license": "MIT" - }, "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "6.2.3", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.4.tgz", + "integrity": "sha512-PNIUUyLI5YpkJZj60YBzX1o0ByQ4ovvfmq9N/Kig/PAYbVlGyz4R6G0SEWrD0O9acc0sT2+IdMBVLFv8FSi0Nw==", "dev": true, "license": "MIT", "dependencies": { @@ -8019,33 +9506,33 @@ "node": ">=4.0.0" } }, - "node_modules/@react-native-community/cli-tools/node_modules/ora": { - "version": "5.4.1", + "node_modules/@react-native-community/cli-types": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-20.1.0.tgz", + "integrity": "sha512-D0kDspcwgbVXyNjwicT7Bb1JgXjijTw1JJd+qxyF/a9+sHv7TU4IchV+gN38QegeXqVyM4Ym7YZIvXMFBmyJqA==", + "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "joi": "^17.2.1" } }, - "node_modules/@react-native-community/cli-types": { - "version": "18.0.0", + "node_modules/@react-native-community/cli/node_modules/@react-native-community/cli-tools": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-20.1.0.tgz", + "integrity": "sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==", "dev": true, "license": "MIT", "dependencies": { - "joi": "^17.2.1" + "@vscode/sudo-prompt": "^9.0.0", + "appdirsjs": "^1.2.4", + "execa": "^5.0.0", + "find-up": "^5.0.0", + "launch-editor": "^2.9.1", + "mime": "^2.4.1", + "ora": "^5.4.1", + "picocolors": "^1.1.1", + "prompts": "^2.4.2", + "semver": "^7.5.2" } }, "node_modules/@react-native-community/cli/node_modules/commander": { @@ -8069,8 +9556,23 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/@react-native-community/cli/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@react-native-community/datetimepicker": { - "version": "8.4.2", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@react-native-community/datetimepicker/-/datetimepicker-9.1.0.tgz", + "integrity": "sha512-eadbnk+I2vxvW30iTAsm/qlCnMMAadkifIMYNEB2lzhxN/SvlKc7S2V4k5DyrwjdCbqdcMk3t9K6fnUMcAV34w==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" @@ -8091,18 +9593,22 @@ } }, "node_modules/@react-native-community/netinfo": { - "version": "11.4.1", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-12.0.1.tgz", + "integrity": "sha512-P/3caXIvfYSJG8AWJVefukg+ZGRPs+M4Lp3pNJtgcTYoJxCjWrKQGNnCkj/Cz//zWa/avGed0i/wzm0T8vV2IQ==", "license": "MIT", "peerDependencies": { + "react": "*", "react-native": ">=0.59" } }, "node_modules/@react-native-firebase/app": { - "version": "20.5.0", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@react-native-firebase/app/-/app-25.1.0.tgz", + "integrity": "sha512-IRBM0Uwrs1O+SkUF8D9g7FgC8WI5b/3xEbt3JzFTTsHWvQyXxvTflKd4rNFNegV+2mFrM53XC9cS1BNVjWSSSg==", "license": "Apache-2.0", "dependencies": { - "firebase": "10.12.2", - "superstruct": "^0.6.2" + "firebase": "12.15.0" }, "peerDependencies": { "expo": ">=47.0.0", @@ -8116,10 +9622,12 @@ } }, "node_modules/@react-native-firebase/messaging": { - "version": "20.5.0", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@react-native-firebase/messaging/-/messaging-25.1.0.tgz", + "integrity": "sha512-YVhGWr6uthySTNHqnXsDh6DX4WtK4AittU9oDeKaBSjN4uoMDOe2X74TYnBFEUdcCQxOAsUavFNAexQx/o8dsw==", "license": "Apache-2.0", "peerDependencies": { - "@react-native-firebase/app": "20.5.0", + "@react-native-firebase/app": "25.1.0", "expo": ">=47.0.0" }, "peerDependenciesMeta": { @@ -8129,7 +9637,9 @@ } }, "node_modules/@react-native-picker/picker": { - "version": "2.11.2", + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/@react-native-picker/picker/-/picker-2.11.4.tgz", + "integrity": "sha512-Kf8h1AMnBo54b1fdiVylP2P/iFcZqzpMYcglC28EEFB1DEnOjsNr6Ucqc+3R9e91vHxEDnhZFbYDmAe79P2gjA==", "license": "MIT", "workspaces": [ "example" @@ -8140,26 +9650,31 @@ } }, "node_modules/@react-native/assets-registry": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.86.0.tgz", + "integrity": "sha512-nIaXbm2jX1OTYp0qbviJ3O6KZivoE8z3BnhUQ2LsqfZSWRoOK/n1qsiAr6oALiNKWnXY3j2KPwtYORnZzp8xew==", "license": "MIT", "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.79.2", - "dev": true, + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.86.0.tgz", + "integrity": "sha512-qdsABWNW7uTll90l4Vh03gjeyu3WVDi2CyiiyvYGMRDcoYbjbQi6df3BMAm9lQI2yslZ1T14LlDDAsgTwNxplA==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.79.2" + "@babel/traverse": "^7.29.0", + "@react-native/codegen": "0.86.0" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/@react-native/babel-preset": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.86.0.tgz", + "integrity": "sha512-bYQcWiPySNvF4dns9Ls9gMmwgq66ohvM9Fwc/Kn8r85t66UNHxch3p1QwPiSorDelFauZwJbgo9+ReibTgvpbA==", "dev": true, "license": "MIT", "dependencies": { @@ -8169,27 +9684,19 @@ "@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", @@ -8198,208 +9705,251 @@ "@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.79.2", - "babel-plugin-syntax-hermes-parser": "0.25.1", + "@react-native/babel-plugin-codegen": "0.86.0", + "babel-plugin-syntax-hermes-parser": "0.36.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "peerDependencies": { "@babel/core": "*" } }, "node_modules/@react-native/codegen": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.86.0.tgz", + "integrity": "sha512-uTs9DBo3+/lUqinsGZK0FKJRBVClrwMXoZToaDxE1Q2SL2e55vs2GwyZfIKzPl5uJnbu4PfFMIp0/mLXLWUMuA==", "license": "MIT", "dependencies": { - "glob": "^7.1.1", - "hermes-parser": "0.25.1", + "@babel/core": "^7.25.2", + "@babel/parser": "^7.29.0", + "hermes-parser": "0.36.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", + "tinyglobby": "^0.2.15", "yargs": "^17.6.2" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "peerDependencies": { "@babel/core": "*" } }, - "node_modules/@react-native/codegen/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.86.0.tgz", + "integrity": "sha512-Jv8p1ebEPfTzs8gmrjsdT2XMXFfeAg45Pman+XPLFGaSeGAZkutRFRyX9Cs9aGTSOyIA9YPJ6vDNb1ayTf1FKQ==", "license": "MIT", "dependencies": { - "@react-native/dev-middleware": "0.79.2", - "chalk": "^4.0.0", - "debug": "^2.2.0", + "@react-native/dev-middleware": "0.86.0", + "debug": "^4.4.0", "invariant": "^2.2.4", - "metro": "^0.82.0", - "metro-config": "^0.82.0", - "metro-core": "^0.82.0", + "metro": "^0.84.3", + "metro-config": "^0.84.3", + "metro-core": "^0.84.3", "semver": "^7.1.3" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "peerDependencies": { - "@react-native-community/cli": "*" + "@react-native-community/cli": "*", + "@react-native/metro-config": "0.86.0" }, "peerDependenciesMeta": { "@react-native-community/cli": { "optional": true + }, + "@react-native/metro-config": { + "optional": true } } }, - "node_modules/@react-native/community-cli-plugin/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, "node_modules/@react-native/debugger-frontend": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.86.0.tgz", + "integrity": "sha512-7Mb3nDfyJeys+ELF75Ageu7VKERlnIMoO+aNPoXqTXvz+b41L6l2CqMyLpDHxkBSlenij6gEepPNgaIyWHbJZw==", "license": "BSD-3-Clause", "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, + "node_modules/@react-native/debugger-shell": { + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.86.0.tgz", + "integrity": "sha512-Y0zEkZzLz8ou6o/VLml1A31X/rMgc6DRjwxwzPMa94qRTMY070WeBCNTITQo4kKTBAUgbxh07oXPQqp0Tpja8w==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "debug": "^4.4.0", + "fb-dotslash": "0.5.8" + }, + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/@react-native/dev-middleware": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.86.0.tgz", + "integrity": "sha512-20pTO6yTybmvXvro520H6C7jydIQnLKOl5qFtVEcHSdFrY63r3OGei+Rx9bILgSRmH6jgnfEcijcMx7pwWuQtw==", "license": "MIT", "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.79.2", + "@react-native/debugger-frontend": "0.86.0", + "@react-native/debugger-shell": "0.86.0", "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", + "chromium-edge-launcher": "^0.3.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", "serve-static": "^1.16.2", - "ws": "^6.2.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "ws": "^7.5.10" + }, + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.3", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", + "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==", "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" + "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/gradle-plugin": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.86.0.tgz", + "integrity": "sha512-a1RcfaEDqWExCGfCwadIxt4l8FvKYgFqeMf2uzeKyAOnb+vTGNIeCvifFL2MqvgaeYxlER437HbMIajGcuJ1pQ==", "license": "MIT", "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, + "node_modules/@react-native/jest-preset": { + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/jest-preset/-/jest-preset-0.85.3.tgz", + "integrity": "sha512-ALPSrM0q2fU+5AXcOXzDKx7rxVKPMvygAZfsTWLdrGRVWIqf/HEfM0R8euQqIKUqmEuQ1TxMWN+px3h6gc4vow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^29.7.0", + "@react-native/js-polyfills": "0.85.3", + "babel-jest": "^29.7.0", + "jest-environment-node": "^29.7.0", + "regenerator-runtime": "^0.13.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "react": "^19.2.3" } }, "node_modules/@react-native/js-polyfills": { - "version": "0.79.2", + "version": "0.85.3", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.85.3.tgz", + "integrity": "sha512-U2+aMshIXf1uFn77tpBb/xhHWB9vkVrMpt7kkucAugF8hJKYTDGB587X7WwelHduK2KBfhl4giSv0rzZGoef9A==", + "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/@react-native/metro-babel-transformer": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.86.0.tgz", + "integrity": "sha512-SjKej3E5qIahqo/G+rSOrmJUQM44RyKtWtO+VfmKAAMoJWkBFomM22hTLKCIS5cdbIAJ9COAmU+KAi2wVSO0wQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.79.2", - "hermes-parser": "0.25.1", + "@react-native/babel-preset": "0.86.0", + "hermes-parser": "0.36.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "peerDependencies": { "@babel/core": "*" } }, "node_modules/@react-native/metro-config": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.86.0.tgz", + "integrity": "sha512-7v+xbTeEci9ZcQ/Z1OqI4RXcqN69wSMDYL5BAMvOReZ7U04+aDQ0/SQhClYPn6x2/RxM4WzMKSAuNyLKqvYVtw==", "dev": true, "license": "MIT", "dependencies": { - "@react-native/js-polyfills": "0.79.2", - "@react-native/metro-babel-transformer": "0.79.2", - "metro-config": "^0.82.0", - "metro-runtime": "^0.82.0" + "@react-native/js-polyfills": "0.86.0", + "@react-native/metro-babel-transformer": "0.86.0", + "metro-config": "^0.84.3", + "metro-runtime": "^0.84.3" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, + "node_modules/@react-native/metro-config/node_modules/@react-native/js-polyfills": { + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.0.tgz", + "integrity": "sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/@react-native/normalize-colors": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.86.0.tgz", + "integrity": "sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==", "license": "MIT" }, "node_modules/@react-native/typescript-config": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/typescript-config/-/typescript-config-0.86.0.tgz", + "integrity": "sha512-oSuFIEMVAVEXdIvDnrdXsWmIF4fYdgtvAEr2ofn8OY534m7XWm9QAqHHpGUzoK0iwDPlPZ5n2Rb25gqF1SZ0rg==", "dev": true, "license": "MIT" }, "node_modules/@react-native/virtualized-lists": { - "version": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.86.0.tgz", + "integrity": "sha512-4/ZLXdf/OSpPDVO0AsQ1SJdRIzt5t9BNQ46QwGgxvX7/cirYR5k8KXctNGGgW8lQo2gZChEfY2zFCZg9nM/jiw==", "license": "MIT", "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "peerDependencies": { - "@types/react": "^19.0.0", + "@types/react": "^19.2.0", "react": "*", - "react-native": "*" + "react-native": "0.86.0" }, "peerDependenciesMeta": { "@types/react": { @@ -8619,63 +10169,75 @@ } }, "node_modules/@sentry-internal/browser-utils": { - "version": "10.38.0", + "version": "10.37.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.37.0.tgz", + "integrity": "sha512-rqdESYaVio9Ktz55lhUhtBsBUCF3wvvJuWia5YqoHDd+egyIfwWxITTAa0TSEyZl7283A4WNHNl0hyeEMblmfA==", "license": "MIT", "dependencies": { - "@sentry/core": "10.38.0" + "@sentry/core": "10.37.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/feedback": { - "version": "10.38.0", + "version": "10.37.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.37.0.tgz", + "integrity": "sha512-P0PVlfrDvfvCYg2KPIS7YUG/4i6ZPf8z1MicXx09C9Cz9W9UhSBh/nii13eBdDtLav2BFMKhvaFMcghXHX03Hw==", "license": "MIT", "dependencies": { - "@sentry/core": "10.38.0" + "@sentry/core": "10.37.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay": { - "version": "10.38.0", + "version": "10.37.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.37.0.tgz", + "integrity": "sha512-snuk12ZaDerxesSnetNIwKoth/51R0y/h3eXD/bGtXp+hnSkeXN5HanI/RJl297llRjn4zJYRShW9Nx86Ay0Dw==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "10.38.0", - "@sentry/core": "10.38.0" + "@sentry-internal/browser-utils": "10.37.0", + "@sentry/core": "10.37.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "10.38.0", + "version": "10.37.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.37.0.tgz", + "integrity": "sha512-PyIYSbjLs+L5essYV0MyIsh4n5xfv2eV7l0nhUoPJv9Bak3kattQY3tholOj0EP3SgKgb+8HSZnmazgF++Hbog==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "10.38.0", - "@sentry/core": "10.38.0" + "@sentry-internal/replay": "10.37.0", + "@sentry/core": "10.37.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "4.9.0", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.8.0.tgz", + "integrity": "sha512-cy/9Eipkv23MsEJ4IuB4dNlVwS9UqOzI3Eu+QPake5BVFgPYCX0uP0Tr3Z43Ime6Rb+BiDnWC51AJK9i9afHYw==", "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/@sentry/browser": { - "version": "10.38.0", + "version": "10.37.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.37.0.tgz", + "integrity": "sha512-kheqJNqGZP5TSBCPv4Vienv1sfZwXKHQDYR+xrdHHYdZqwWuZMJJW/cLO9XjYAe+B9NnJ4UwJOoY4fPvU+HQ1Q==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "10.38.0", - "@sentry-internal/feedback": "10.38.0", - "@sentry-internal/replay": "10.38.0", - "@sentry-internal/replay-canvas": "10.38.0", - "@sentry/core": "10.38.0" + "@sentry-internal/browser-utils": "10.37.0", + "@sentry-internal/feedback": "10.37.0", + "@sentry-internal/replay": "10.37.0", + "@sentry-internal/replay-canvas": "10.37.0", + "@sentry/core": "10.37.0" }, "engines": { "node": ">=18" @@ -8843,18 +10405,22 @@ } }, "node_modules/@sentry/core": { - "version": "10.38.0", + "version": "10.37.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.37.0.tgz", + "integrity": "sha512-hkRz7S4gkKLgPf+p3XgVjVm7tAfvcEPZxeACCC6jmoeKhGkzN44nXwLiqqshJ25RMcSrhfFvJa/FlBg6zupz7g==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@sentry/react": { - "version": "10.38.0", + "version": "10.37.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.37.0.tgz", + "integrity": "sha512-XLnXJOHgsCeVAVBbO+9AuGlZWnCxLQHLOmKxpIr8wjE3g7dHibtug6cv8JLx78O4dd7aoCqv2TTyyKY9FLJ2EQ==", "license": "MIT", "dependencies": { - "@sentry/browser": "10.38.0", - "@sentry/core": "10.38.0" + "@sentry/browser": "10.37.0", + "@sentry/core": "10.37.0" }, "engines": { "node": ">=18" @@ -8864,15 +10430,17 @@ } }, "node_modules/@sentry/react-native": { - "version": "7.12.0", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-7.11.0.tgz", + "integrity": "sha512-OiDaLCAGpRN18YG/o7IIwLhU0Xpb0tYKQ5QxkGHiwb+L3VHn+MqGCGfITYNdhqr06HHMvu9Lysm+UJxaNmGaJg==", "license": "MIT", "dependencies": { - "@sentry/babel-plugin-component-annotate": "4.9.0", - "@sentry/browser": "10.38.0", + "@sentry/babel-plugin-component-annotate": "4.8.0", + "@sentry/browser": "10.37.0", "@sentry/cli": "2.58.4", - "@sentry/core": "10.38.0", - "@sentry/react": "10.38.0", - "@sentry/types": "10.38.0" + "@sentry/core": "10.37.0", + "@sentry/react": "10.37.0", + "@sentry/types": "10.37.0" }, "bin": { "sentry-expo-upload-sourcemaps": "scripts/expo-upload-sourcemaps.js" @@ -8889,17 +10457,21 @@ } }, "node_modules/@sentry/types": { - "version": "10.38.0", + "version": "10.37.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-10.37.0.tgz", + "integrity": "sha512-umpnUKRC0AAbJrADg6SlFtqN2yzf7NHciCF9lkHau+ax2PIZ/NDmoG4RQujFVflVaVoD60Ly2t+CcPnYIWMPlw==", "license": "MIT", "dependencies": { - "@sentry/core": "10.38.0" + "@sentry/core": "10.37.0" }, "engines": { "node": ">=18" } }, "node_modules/@sideway/address": { - "version": "4.1.2", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8907,12 +10479,16 @@ } }, "node_modules/@sideway/formula": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true, "license": "BSD-3-Clause" }, @@ -8926,17 +10502,22 @@ }, "node_modules/@sinonjs/commons": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^3.0.1" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@solana/buffer-layout": { @@ -9897,63 +11478,6 @@ } } }, - "node_modules/@testing-library/react-native/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/@testing-library/react-native/node_modules/jest-diff": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@testing-library/react-native/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@testing-library/react-native/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/@testing-library/react-native/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/@tokenizer/token": { "version": "0.3.0", "license": "MIT" @@ -10013,17 +11537,6 @@ "node": ">=10.13.0" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@typechain/ethers-v5": { "version": "11.1.2", "dev": true, @@ -10055,6 +11568,7 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", @@ -10066,6 +11580,7 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.2", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" @@ -10073,6 +11588,7 @@ }, "node_modules/@types/babel__template": { "version": "7.4.0", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", @@ -10081,6 +11597,7 @@ }, "node_modules/@types/babel__traverse": { "version": "7.11.1", + "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.3.0" @@ -10186,7 +11703,10 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -10234,155 +11754,7 @@ "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/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/@types/jest/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/@types/jest/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/@types/jest/node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@types/jest/node_modules/expect": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-diff": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/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/@types/jest/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/@types/jest/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/@types/jest/node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" + } }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -10465,10 +11837,12 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.1.9", + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", "license": "MIT", "dependencies": { - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-native": { @@ -10528,6 +11902,15 @@ "redux": "^4.0.0" } }, + "node_modules/@types/react-test-renderer": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-19.1.0.tgz", + "integrity": "sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/secp256k1": { "version": "4.0.3", "license": "MIT", @@ -10577,6 +11960,7 @@ }, "node_modules/@types/stack-utils": { "version": "2.0.3", + "dev": true, "license": "MIT" }, "node_modules/@types/statuses": { @@ -10757,381 +12141,113 @@ "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.38.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.38.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.38.0", - "@typescript-eslint/tsconfig-utils": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.38.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.38.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.38.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@unizen-io/unizen-contract-addresses": { - "version": "0.0.15", - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.0.tgz", - "integrity": "sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.0.tgz", - "integrity": "sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.9.0", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.0.tgz", - "integrity": "sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.0.tgz", - "integrity": "sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.0.tgz", - "integrity": "sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.0.tgz", - "integrity": "sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.0.tgz", - "integrity": "sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.0.tgz", - "integrity": "sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.0.tgz", - "integrity": "sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.0.tgz", - "integrity": "sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.0.tgz", - "integrity": "sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.0.tgz", - "integrity": "sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.0.tgz", - "integrity": "sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.0.tgz", - "integrity": "sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==", - "cpu": [ - "x64" - ], + }, + "node_modules/@typescript-eslint/types": { + "version": "8.38.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.0.tgz", - "integrity": "sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==", - "cpu": [ - "wasm32" - ], + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.38.0", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">=14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.0.tgz", - "integrity": "sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==", - "cpu": [ - "arm64" - ], + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "balanced-match": "^1.0.0" + } }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.0.tgz", - "integrity": "sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==", - "cpu": [ - "ia32" - ], + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.38.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.0.tgz", - "integrity": "sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==", - "cpu": [ - "x64" - ], + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.38.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/@unizen-io/unizen-contract-addresses": { + "version": "0.0.15", + "license": "ISC" }, "node_modules/@unstoppabledomains/resolution": { "version": "9.3.0", @@ -11156,25 +12272,6 @@ "node-fetch": "^2.6.12" } }, - "node_modules/@urql/core": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "@0no-co/graphql.web": "^1.0.13", - "wonka": "^6.3.2" - } - }, - "node_modules/@urql/exchange-retry": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "@urql/core": "^5.1.2", - "wonka": "^6.3.2" - }, - "peerDependencies": { - "@urql/core": "^5.0.0" - } - }, "node_modules/@vscode/sudo-prompt": { "version": "9.3.1", "license": "MIT" @@ -11682,6 +12779,18 @@ "node": ">= 6.0.0" } }, + "node_modules/agent-cli-detector": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/agent-cli-detector/-/agent-cli-detector-0.1.4.tgz", + "integrity": "sha512-qPgevFvpaQoBaRJVKzr8R7h1WPvV3DtbgRIQlne4le66KBzXx5hNBwo/+NTw67LgkKBlhCzksrdautpUdlls0Q==", + "license": "MIT", + "bin": { + "agent-cli-detector": "dist/cli.js" + }, + "engines": { + "node": ">=18.18" + } + }, "node_modules/agentkeepalive": { "version": "4.5.0", "license": "MIT", @@ -11863,6 +12972,8 @@ }, "node_modules/ansi-fragments": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", "dev": true, "license": "MIT", "dependencies": { @@ -11872,7 +12983,9 @@ } }, "node_modules/ansi-fragments/node_modules/ansi-regex": { - "version": "4.1.0", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", "engines": { @@ -11881,6 +12994,8 @@ }, "node_modules/ansi-fragments/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==", "dev": true, "license": "MIT", "dependencies": { @@ -11892,6 +13007,8 @@ }, "node_modules/ansi-fragments/node_modules/astral-regex": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true, "license": "MIT", "engines": { @@ -11900,6 +13017,8 @@ }, "node_modules/ansi-fragments/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==", "dev": true, "license": "MIT", "dependencies": { @@ -11908,16 +13027,22 @@ }, "node_modules/ansi-fragments/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==", "dev": true, "license": "MIT" }, "node_modules/ansi-fragments/node_modules/colorette": { - "version": "1.3.0", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true, "license": "MIT" }, "node_modules/ansi-fragments/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, "license": "MIT", "engines": { @@ -11926,6 +13051,8 @@ }, "node_modules/ansi-fragments/node_modules/slice-ansi": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11939,6 +13066,8 @@ }, "node_modules/ansi-fragments/node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", "dependencies": { @@ -11993,6 +13122,8 @@ }, "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": { @@ -12212,7 +13343,10 @@ } }, "node_modules/async-limiter": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true, "license": "MIT" }, "node_modules/async-lock": { @@ -12284,164 +13418,58 @@ }, "node_modules/b4a": { "version": "1.6.7", - "license": "Apache-2.0" - }, - "node_modules/babel-eslint": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "eslint": ">= 4.12.1" - } - }, - "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/@jest/transform": { - "version": "29.7.0", - "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/babel-jest/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/babel-jest/node_modules/ci-info": { - "version": "3.9.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/jest-haste-map": { - "version": "29.7.0", - "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" + "license": "Apache-2.0" + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "peerDependencies": { + "eslint": ">= 4.12.1" } }, - "node_modules/babel-jest/node_modules/jest-regex-util": { - "version": "29.6.3", - "license": "MIT", + "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/babel-jest/node_modules/jest-util": { + "node_modules/babel-jest": { "version": "29.7.0", + "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", - "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-jest/node_modules/write-file-atomic": { - "version": "4.0.2", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "peerDependencies": { + "@babel/core": "^7.8.0" } }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -12456,6 +13484,7 @@ }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.1.0", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", @@ -12470,6 +13499,7 @@ }, "node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -12477,6 +13507,7 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", + "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", @@ -12528,15 +13559,28 @@ "@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.19.13", + "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", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.36.0.tgz", + "integrity": "sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==", "license": "MIT", "dependencies": { - "hermes-parser": "0.25.1" + "hermes-parser": "0.36.0" } }, "node_modules/babel-plugin-transform-flow-enums": { @@ -12548,6 +13592,7 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -12571,78 +13616,33 @@ } }, "node_modules/babel-preset-expo": { - "version": "13.2.3", + "version": "57.0.3", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-57.0.3.tgz", + "integrity": "sha512-JuTLwC4dt30GF3L8sY7EBwh5iD7L3dSWumfg+i99bFK2SIXWyfn01UHxu+azfKXFU/ufim9oUt9KUoJ9AvyOPA==", "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-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.79.5", - "babel-plugin-react-native-web": "~0.19.13", - "babel-plugin-syntax-hermes-parser": "^0.25.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "react-refresh": "^0.14.2", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "babel-plugin-react-compiler": "^19.0.0-beta-e993439-20250405" - }, - "peerDependenciesMeta": { - "babel-plugin-react-compiler": { - "optional": true - } - } - }, - "node_modules/babel-preset-expo/node_modules/@react-native/babel-plugin-codegen": { - "version": "0.79.5", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.79.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/babel-preset-expo/node_modules/@react-native/babel-preset": { - "version": "0.79.5", - "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-class-static-block": "^7.27.1", "@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-export-namespace-from": "^7.25.9", "@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", @@ -12650,66 +13650,41 @@ "@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-react-jsx": "^7.28.6", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1", "@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.79.5", - "babel-plugin-syntax-hermes-parser": "0.25.1", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-plugin-codegen": "0.86.0", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.36.0", "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/babel-preset-expo/node_modules/@react-native/codegen": { - "version": "0.79.5", - "license": "MIT", - "dependencies": { - "glob": "^7.1.1", - "hermes-parser": "0.25.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">=18" + "debug": "^4.3.4" }, "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/babel-preset-expo/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "@babel/runtime": "^7.20.0", + "expo": "*", + "expo-widgets": "^57.0.5", + "react-refresh": ">=0.14.0 <1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + }, + "expo-widgets": { + "optional": true + } } }, "node_modules/babel-preset-jest": { "version": "29.6.3", + "dev": true, "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", @@ -12907,31 +13882,6 @@ "version": "2.0.0", "license": "MIT" }, - "node_modules/better-opn": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/better-opn/node_modules/open": { - "version": "8.4.2", - "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/bfs-path": { "version": "1.0.2", "license": "MIT" @@ -13231,6 +14181,8 @@ }, "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" @@ -13493,7 +14445,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -13540,33 +14491,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/callsites": { "version": "3.1.0", "dev": true, @@ -13662,6 +14586,8 @@ }, "node_modules/char-regex": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { @@ -13716,15 +14642,10 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "3.0.0", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/chrome-launcher": { "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "license": "Apache-2.0", "dependencies": { "@types/node": "*", @@ -13740,19 +14661,22 @@ } }, "node_modules/chromium-edge-launcher": { - "version": "0.2.0", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz", + "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==", "license": "Apache-2.0", "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "mkdirp": "^1.0.4" } }, "node_modules/chromium-edge-launcher/node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -13762,8 +14686,9 @@ } }, "node_modules/ci-info": { - "version": "4.2.0", - "dev": true, + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ { "type": "github", @@ -13851,7 +14776,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "2.1.0", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, "license": "MIT" }, @@ -14087,19 +15014,6 @@ "node": ">=0.8" } }, - "node_modules/clone-deep": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cluster-key-slot": { "version": "1.1.2", "license": "Apache-2.0", @@ -14109,6 +15023,8 @@ }, "node_modules/co": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { @@ -14117,7 +15033,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, @@ -14170,6 +15088,8 @@ }, "node_modules/command-exists": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", "dev": true, "license": "MIT" }, @@ -14296,6 +15216,8 @@ }, "node_modules/compressible": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" @@ -14305,30 +15227,27 @@ } }, "node_modules/compression": { - "version": "1.7.4", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/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" @@ -14336,11 +15255,18 @@ }, "node_modules/compression/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/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "license": "MIT" + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -14348,6 +15274,8 @@ }, "node_modules/connect": { "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -14361,6 +15289,8 @@ }, "node_modules/connect/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" @@ -14368,6 +15298,8 @@ }, "node_modules/connect/node_modules/finalhandler": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -14384,10 +15316,14 @@ }, "node_modules/connect/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/connect/node_modules/on-finished": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -14398,6 +15334,8 @@ }, "node_modules/connect/node_modules/statuses": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -14556,6 +15494,28 @@ "sha.js": "^2.4.8" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-fetch": { "version": "3.1.5", "license": "MIT", @@ -14865,7 +15825,9 @@ } }, "node_modules/dayjs": { - "version": "1.10.4", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", "dev": true, "license": "MIT" }, @@ -14886,6 +15848,8 @@ }, "node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "license": "MIT", "engines": { @@ -14956,17 +15920,10 @@ "gopd": "^1.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -15085,6 +16042,8 @@ }, "node_modules/detect-newline": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { @@ -15093,6 +16052,8 @@ }, "node_modules/diff-sequences": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { @@ -15118,6 +16079,12 @@ "rfc4648": "^1.3.0" } }, + "node_modules/dnssd-advertise": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.6.tgz", + "integrity": "sha512-Ndrrf6BMPalkQPd/zubL+4YghH2J9NspapQ09uDXwYbvOPkP0oaqf5CkcwJ0b50kS2O3ul6yVu+jz+RY62Cejg==", + "license": "MIT" + }, "node_modules/doctrine": { "version": "2.1.0", "dev": true, @@ -15195,39 +16162,6 @@ "tslib": "^2.0.3" } }, - "node_modules/dotenv": { - "version": "16.4.7", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand/node_modules/dotenv": { - "version": "16.6.1", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/dprint-node": { "version": "1.0.8", "license": "MIT", @@ -15851,6 +16785,8 @@ }, "node_modules/emittery": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { @@ -15912,15 +16848,10 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-editor": { - "version": "0.4.2", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", "engines": { @@ -15928,7 +16859,9 @@ } }, "node_modules/envinfo": { - "version": "7.14.0", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, "license": "MIT", "bin": { @@ -15940,28 +16873,37 @@ }, "node_modules/error-ex": { "version": "1.3.2", + "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/error-stack-parser": { - "version": "2.0.6", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "license": "MIT", "dependencies": { - "stackframe": "^1.1.1" + "stackframe": "^1.3.4" } }, "node_modules/errorhandler": { - "version": "1.5.1", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.2.tgz", + "integrity": "sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "escape-html": "~1.0.3" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/es-abstract": { @@ -16640,6 +17582,7 @@ }, "node_modules/esprima": { "version": "4.0.1", + "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -16915,10 +17858,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/exec-async": { - "version": "2.2.0", - "license": "MIT" - }, "node_modules/execa": { "version": "5.1.1", "license": "MIT", @@ -16943,10 +17882,11 @@ "node_modules/exif-parser": { "version": "0.1.12" }, - "node_modules/exit-x": { - "version": "0.2.2", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -16959,42 +17899,51 @@ } }, "node_modules/expect": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.0.0", - "@jest/get-type": "30.0.0", - "jest-matcher-utils": "30.0.0", - "jest-message-util": "30.0.0", - "jest-mock": "30.0.0", - "jest-util": "30.0.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expo": { - "version": "53.0.20", + "version": "57.0.7", + "resolved": "https://registry.npmjs.org/expo/-/expo-57.0.7.tgz", + "integrity": "sha512-PJdE0EjoX878OqClmsigVKdT0jCNOAQDRLcvFkeBakxaVyEDhjcQ8baKq2YysYH2g0YNB1rEIpHUiKtluO918A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.24.20", - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/fingerprint": "0.13.4", - "@expo/metro-config": "0.20.17", - "@expo/vector-icons": "^14.0.0", - "babel-preset-expo": "~13.2.3", - "expo-asset": "~11.1.7", - "expo-constants": "~17.1.7", - "expo-file-system": "~18.1.11", - "expo-font": "~13.3.2", - "expo-keep-awake": "~14.1.4", - "expo-modules-autolinking": "2.1.14", - "expo-modules-core": "2.5.0", - "react-native-edge-to-edge": "1.6.0", - "whatwg-url-without-unicode": "8.0.0-3" + "@expo/cli": "^57.0.9", + "@expo/config": "~57.0.5", + "@expo/config-plugins": "~57.0.5", + "@expo/devtools": "~57.0.1", + "@expo/dom-webview": "~57.0.1", + "@expo/fingerprint": "^0.20.5", + "@expo/local-build-cache-provider": "^57.0.4", + "@expo/log-box": "^57.0.1", + "@expo/metro": "~56.0.0", + "@expo/metro-config": "~57.0.6", + "@ungap/structured-clone": "^1.3.0", + "babel-preset-expo": "~57.0.3", + "expo-asset": "~57.0.6", + "expo-constants": "~57.0.6", + "expo-file-system": "~57.0.1", + "expo-font": "~57.0.1", + "expo-keep-awake": "~57.0.1", + "expo-modules-autolinking": "~57.0.8", + "expo-modules-core": "~57.0.6", + "pretty-format": "^29.7.0", + "react-refresh": "^0.14.2", + "whatwg-url-minimum": "^0.1.2" }, "bin": { "expo": "bin/cli", @@ -17005,7 +17954,9 @@ "@expo/dom-webview": "*", "@expo/metro-runtime": "*", "react": "*", + "react-dom": "*", "react-native": "*", + "react-native-web": "*", "react-native-webview": "*" }, "peerDependenciesMeta": { @@ -17015,17 +17966,25 @@ "@expo/metro-runtime": { "optional": true }, + "react-dom": { + "optional": true + }, + "react-native-web": { + "optional": true + }, "react-native-webview": { "optional": true } } }, "node_modules/expo-asset": { - "version": "11.1.7", + "version": "57.0.6", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-57.0.6.tgz", + "integrity": "sha512-n3Yb1VxcP+BMRTyC4R1x2It4+m5EDkNXiVCHGWbnIREQUUkMs2Yeul7D5qfFWAYtIn2Z3hbGMndwU6Az1FPSEg==", "license": "MIT", "dependencies": { - "@expo/image-utils": "^0.7.6", - "expo-constants": "~17.1.7" + "@expo/image-utils": "^0.11.3", + "expo-constants": "~57.0.6" }, "peerDependencies": { "expo": "*", @@ -17033,12 +17992,28 @@ "react-native": "*" } }, + "node_modules/expo-asset/node_modules/@expo/image-utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.11.3.tgz", + "integrity": "sha512-yMVjkndhXm9mct0uMq+ndxqT6FgAnhucdUfmXuQ6V6uE021GOiYCACO+KZ0MB4vearPSvbWTGfi32QQr2qocfQ==", + "license": "MIT", + "dependencies": { + "@expo/require-utils": "^57.0.3", + "@expo/spawn-async": "^1.8.0", + "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-constants": { - "version": "17.1.7", + "version": "57.0.6", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-57.0.6.tgz", + "integrity": "sha512-OV+4XUshdO18TKNlo1cxUkXeJWgUOPgalvl8ofmc7kmPPHoyfz2hGJ94tyY/RND/GG5RREE+me9YHClNEzo+Ow==", "license": "MIT", "dependencies": { - "@expo/config": "~11.0.12", - "@expo/env": "~1.0.7" + "@expo/env": "~2.4.2" }, "peerDependencies": { "expo": "*", @@ -17046,7 +18021,9 @@ } }, "node_modules/expo-file-system": { - "version": "18.1.11", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-57.0.1.tgz", + "integrity": "sha512-w7/ERvQFrGP2apTO9lDtZ+O6JQIhfakL7+Xqzh+rfMO9B4LB4qwrz+YvLgir8KFRVX64JHBnRuYBVLY1oQZcqw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -17054,18 +18031,23 @@ } }, "node_modules/expo-font": { - "version": "13.3.2", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-57.0.1.tgz", + "integrity": "sha512-QyS9L1Kh9sKJg4gfU6rdbpxpmH+DyzBX8z6jVvXMUDoqLr1GqmkO/Wu379KCXjL///kWbhpNlbi7AgBuj4VdIQ==", "license": "MIT", "dependencies": { "fontfaceobserver": "^2.1.0" }, "peerDependencies": { "expo": "*", - "react": "*" + "react": "*", + "react-native": "*" } }, "node_modules/expo-keep-awake": { - "version": "14.1.4", + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-57.0.1.tgz", + "integrity": "sha512-28lkFImeXTS+bhAjuCFV7w7tW5bXg27BJVrxv+nC/nyYa86qEa0oFeHwqol6ha5k4pdVDQgBF09GM4A1k76Ssg==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -17073,16 +18055,15 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "2.1.14", + "version": "57.0.8", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-57.0.8.tgz", + "integrity": "sha512-YBDgbJHlhhhr3JaKErW6znsIL8zQsh206LaDpWrLHV/WluRwhYfZuF/fhkVN7b/DsRxIu0UeCPExaEPMxlC2Hw==", "license": "MIT", "dependencies": { - "@expo/spawn-async": "^1.7.2", + "@expo/require-utils": "^57.0.3", + "@expo/spawn-async": "^1.8.0", "chalk": "^4.1.0", - "commander": "^7.2.0", - "find-up": "^5.0.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" + "commander": "^7.2.0" }, "bin": { "expo-modules-autolinking": "bin/expo-modules-autolinking.js" @@ -17090,16 +18071,41 @@ }, "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": "2.5.0", + "version": "57.0.6", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-57.0.6.tgz", + "integrity": "sha512-hePwOh2+i+EpWrVnv95sQeQ0OD5PYuEuIhmglVLzQVaVBV3zHcRvLAc1rV8ROqUL6YtAQUXjPkoSx1ly2ZdTuQ==", "license": "MIT", "dependencies": { + "@expo/expo-modules-macros-plugin": "0.6.1", + "expo-modules-jsi": "~57.0.3", "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-worklets": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0" + }, + "peerDependenciesMeta": { + "react-native-worklets": { + "optional": true + } + } + }, + "node_modules/expo-modules-jsi": { + "version": "57.0.3", + "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-57.0.3.tgz", + "integrity": "sha512-B+iXJCC5OIXjFKkLLSY2DZ8BGS+hC3PBTrALpV43pHqhXqqZrRH3uTEylZgsoKQO8N8tjmjAua2ucTFHtr1o0w==", + "license": "MIT", + "peerDependencies": { + "react-native": "*" } }, "node_modules/expo-quick-actions": { @@ -17169,8 +18175,154 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/expo-server": { + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-57.0.1.tgz", + "integrity": "sha512-sBfVDH6dmKVHZxqUxbfkzS00PZELMZt1IpnHKxcOTMZtR/t7CtRAFrbXcisG+EyzeqHSVDacZT+1tbYfZt5D8w==", + "license": "MIT", + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/expo/node_modules/@expo/config-plugins": { + "version": "57.0.5", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-57.0.5.tgz", + "integrity": "sha512-xhUGgzpFWRghDUH98+Wl4RDakYhTsbyMg6aOYiBjRzPO/THH8tKMw3vlksgFYlU2PkiAdABJN3tNPf5qmvOQhA==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^57.0.2", + "@expo/json-file": "~11.0.1", + "@expo/plist": "^0.8.1", + "@expo/require-utils": "^57.0.3", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "semver": "^7.5.4", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/expo/node_modules/@expo/config-types": { + "version": "57.0.2", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-57.0.2.tgz", + "integrity": "sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==", + "license": "MIT" + }, + "node_modules/expo/node_modules/@expo/json-file": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-11.0.1.tgz", + "integrity": "sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "json5": "^2.2.3" + } + }, + "node_modules/expo/node_modules/@expo/plist": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.8.1.tgz", + "integrity": "sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + } + }, + "node_modules/expo/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/expo/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/expo/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": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/expo/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/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/expo/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/exponential-backoff": { - "version": "3.1.2", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "license": "Apache-2.0" }, "node_modules/express": { @@ -17382,6 +18534,8 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" @@ -17390,6 +18544,18 @@ "node": ">=0.8.0" } }, + "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", @@ -17397,6 +18563,23 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/feaxios": { "version": "0.0.23", "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz", @@ -17427,6 +18610,12 @@ "node": "^12.20 || >= 14.13" } }, + "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/fflate": { "version": "0.4.8", "license": "MIT" @@ -17564,36 +18753,39 @@ } }, "node_modules/firebase": { - "version": "10.12.2", + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.15.0.tgz", + "integrity": "sha512-p0YTLcRSTiBXMx9sGr4ZNSfLjc/RVBEw4C/TXjVMtw65+6E1Pbm47UY3F4/AqRoDobEcNX3gsbPGy7jPjxbgSQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/analytics": "0.10.4", - "@firebase/analytics-compat": "0.2.10", - "@firebase/app": "0.10.5", - "@firebase/app-check": "0.8.4", - "@firebase/app-check-compat": "0.3.11", - "@firebase/app-compat": "0.2.35", - "@firebase/app-types": "0.9.2", - "@firebase/auth": "1.7.4", - "@firebase/auth-compat": "0.5.9", - "@firebase/database": "1.0.5", - "@firebase/database-compat": "1.0.5", - "@firebase/firestore": "4.6.3", - "@firebase/firestore-compat": "0.3.32", - "@firebase/functions": "0.11.5", - "@firebase/functions-compat": "0.3.11", - "@firebase/installations": "0.6.7", - "@firebase/installations-compat": "0.2.7", - "@firebase/messaging": "0.12.9", - "@firebase/messaging-compat": "0.2.9", - "@firebase/performance": "0.6.7", - "@firebase/performance-compat": "0.2.7", - "@firebase/remote-config": "0.4.7", - "@firebase/remote-config-compat": "0.2.7", - "@firebase/storage": "0.12.5", - "@firebase/storage-compat": "0.3.8", - "@firebase/util": "1.9.6", - "@firebase/vertexai-preview": "0.0.2" + "@firebase/ai": "2.13.1", + "@firebase/analytics": "0.10.22", + "@firebase/analytics-compat": "0.2.28", + "@firebase/app": "0.15.0", + "@firebase/app-check": "0.12.0", + "@firebase/app-check-compat": "0.4.5", + "@firebase/app-compat": "0.5.14", + "@firebase/app-types": "0.9.5", + "@firebase/auth": "1.13.3", + "@firebase/auth-compat": "0.6.8", + "@firebase/data-connect": "0.7.1", + "@firebase/database": "1.1.3", + "@firebase/database-compat": "2.1.4", + "@firebase/firestore": "4.16.0", + "@firebase/firestore-compat": "0.4.11", + "@firebase/functions": "0.13.5", + "@firebase/functions-compat": "0.4.5", + "@firebase/installations": "0.6.22", + "@firebase/installations-compat": "0.2.22", + "@firebase/messaging": "0.13.0", + "@firebase/messaging-compat": "0.2.27", + "@firebase/performance": "0.7.12", + "@firebase/performance-compat": "0.2.25", + "@firebase/remote-config": "0.8.5", + "@firebase/remote-config-compat": "0.2.26", + "@firebase/storage": "0.14.3", + "@firebase/storage-compat": "0.4.3", + "@firebase/util": "1.15.1" } }, "node_modules/first-match": { @@ -17619,6 +18811,8 @@ }, "node_modules/flow-enums-runtime": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "license": "MIT" }, "node_modules/follow-redirects": { @@ -17641,6 +18835,8 @@ }, "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": { @@ -17656,23 +18852,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/for-in": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/foreground-child": { "version": "3.3.1", "license": "ISC", @@ -17737,13 +18916,6 @@ "node": ">= 0.6" } }, - "node_modules/freeport-async": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/fresh": { "version": "0.5.2", "license": "MIT", @@ -17877,6 +19049,7 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8.0.0" @@ -18279,15 +19452,25 @@ "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", "license": "MIT" }, + "node_modules/hermes-compiler": { + "version": "250829098.0.14", + "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.14.tgz", + "integrity": "sha512-5meXwsZxgiqFaJjNzwjzI9IyUkuGGBisu+z9BvQWmGVpjH6nz11hgqkyxe4dl8UAdyIV4lTbz91+Dlnjz0VxqA==", + "license": "MIT" + }, "node_modules/hermes-estree": { - "version": "0.25.1", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.36.0.tgz", + "integrity": "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==", "license": "MIT" }, "node_modules/hermes-parser": { - "version": "0.25.1", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.36.0.tgz", + "integrity": "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==", "license": "MIT", "dependencies": { - "hermes-estree": "0.25.1" + "hermes-estree": "0.36.0" } }, "node_modules/hi-base32": { @@ -18312,6 +19495,8 @@ }, "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" @@ -18322,6 +19507,8 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, @@ -18354,6 +19541,7 @@ }, "node_modules/http-errors": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -18367,7 +19555,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.5", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "license": "MIT" }, "node_modules/http-shutdown": { @@ -18435,6 +19625,8 @@ }, "node_modules/idb": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", "license": "ISC" }, "node_modules/idb-keyval": { @@ -18479,6 +19671,8 @@ }, "node_modules/image-size": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "license": "MIT", "dependencies": { "queue": "6.0.2" @@ -18515,6 +19709,8 @@ }, "node_modules/import-local": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -18533,6 +19729,7 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -18638,6 +19835,7 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", + "dev": true, "license": "MIT" }, "node_modules/is-async-function": { @@ -18746,13 +19944,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-directory": { - "version": "0.3.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "license": "MIT", @@ -18766,13 +19957,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "license": "MIT", @@ -18806,6 +19990,8 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { @@ -18962,16 +20148,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.2.1", "license": "MIT", @@ -19158,15 +20334,8 @@ "license": "MIT" }, "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "version": "2.0.0", + "license": "ISC" }, "node_modules/isomorphic-fetch": { "version": "3.0.0", @@ -19195,6 +20364,7 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=8" @@ -19202,6 +20372,8 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -19216,33 +20388,39 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-reports": { - "version": "3.1.3", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -19351,20 +20529,22 @@ } }, "node_modules/jest": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.0.0", - "@jest/types": "30.0.0", - "import-local": "^3.2.0", - "jest-cli": "30.0.0" + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -19376,50 +20556,56 @@ } }, "node_modules/jest-changed-files": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.0.0", + "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.0", - "@jest/expect": "30.0.0", - "@jest/test-result": "30.0.0", - "@jest/types": "30.0.0", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "chalk": "^4.1.2", + "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.0.0", - "jest-matcher-utils": "30.0.0", - "jest-message-util": "30.0.0", - "jest-runtime": "30.0.0", - "jest-snapshot": "30.0.0", - "jest-util": "30.0.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "30.0.0", - "pure-rand": "^7.0.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "stack-utils": "^2.0.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/dedent": { - "version": "1.6.0", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -19432,26 +20618,29 @@ } }, "node_modules/jest-cli": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.0.0", - "@jest/test-result": "30.0.0", - "@jest/types": "30.0.0", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.0.0", - "jest-util": "30.0.0", - "jest-validate": "30.0.0", - "yargs": "^17.7.2" + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -19463,173 +20652,135 @@ } }, "node_modules/jest-config": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.0.0", - "@jest/pattern": "30.0.0", - "@jest/test-sequencer": "30.0.0", - "@jest/types": "30.0.0", - "babel-jest": "30.0.0", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-circus": "30.0.0", - "jest-docblock": "30.0.0", - "jest-environment-node": "30.0.0", - "jest-regex-util": "30.0.0", - "jest-resolve": "30.0.0", - "jest-runner": "30.0.0", - "jest-util": "30.0.0", - "jest-validate": "30.0.0", - "micromatch": "^4.0.8", + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "30.0.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", - "esbuild-register": ">=3.4.0", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "esbuild-register": { - "optional": true - }, "ts-node": { "optional": true } } }, - "node_modules/jest-config/node_modules/babel-jest": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "30.0.0", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.0", - "babel-preset-jest": "30.0.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0" - } - }, - "node_modules/jest-config/node_modules/babel-plugin-istanbul": { - "version": "7.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-config/node_modules/babel-plugin-jest-hoist": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "@types/babel__core": "^7.20.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-config/node_modules/babel-preset-jest": { - "version": "30.0.0", + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": "MIT", + "license": "ISC", "dependencies": { - "babel-plugin-jest-hoist": "30.0.0", - "babel-preset-current-node-syntax": "^1.1.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "*" }, - "peerDependencies": { - "@babel/core": "^7.11.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/jest-diff": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.0.0", - "@jest/get-type": "30.0.0", - "chalk": "^4.1.2", - "pretty-format": "30.0.0" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { - "detect-newline": "^3.1.0" + "detect-newline": "^3.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.0", - "@jest/types": "30.0.0", - "chalk": "^4.1.2", - "jest-util": "30.0.0", - "pretty-format": "30.0.0" + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.0.0", - "@jest/fake-timers": "30.0.0", - "@jest/types": "30.0.0", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "30.0.0", - "jest-util": "30.0.0", - "jest-validate": "30.0.0" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { @@ -19640,117 +20791,101 @@ } }, "node_modules/jest-haste-map": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.0", + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.0", - "jest-util": "30.0.0", - "jest-worker": "30.0.0", - "micromatch": "^4.0.8", + "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { - "fsevents": "^2.3.3" - } - }, - "node_modules/jest-haste-map/node_modules/jest-worker": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-haste-map/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" + "fsevents": "^2.3.2" } }, "node_modules/jest-leak-detector": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.0", - "pretty-format": "30.0.0" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.0", - "chalk": "^4.1.2", - "jest-diff": "30.0.0", - "pretty-format": "30.0.0" + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.0.0", + "@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.6" + "stack-utils": "^2.0.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "30.0.0" + "jest-util": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { @@ -19766,92 +20901,87 @@ } }, "node_modules/jest-regex-util": { - "version": "30.0.0", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.0", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.0.0", - "jest-validate": "30.0.0", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" + "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": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "30.0.0", - "jest-snapshot": "30.0.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.0.0", - "@jest/environment": "30.0.0", - "@jest/test-result": "30.0.0", - "@jest/transform": "30.0.0", - "@jest/types": "30.0.0", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "chalk": "^4.1.2", + "chalk": "^4.0.0", "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.0.0", - "jest-environment-node": "30.0.0", - "jest-haste-map": "30.0.0", - "jest-leak-detector": "30.0.0", - "jest-message-util": "30.0.0", - "jest-resolve": "30.0.0", - "jest-runtime": "30.0.0", - "jest-util": "30.0.0", - "jest-watcher": "30.0.0", - "jest-worker": "30.0.0", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-worker": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { @@ -19859,54 +20989,66 @@ "source-map": "^0.6.0" } }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime": { - "version": "30.0.0", + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": "MIT", + "license": "ISC", "dependencies": { - "@jest/environment": "30.0.0", - "@jest/fake-timers": "30.0.0", - "@jest/globals": "30.0.0", - "@jest/source-map": "30.0.0", - "@jest/test-result": "30.0.0", - "@jest/transform": "30.0.0", - "@jest/types": "30.0.0", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.0", - "jest-message-util": "30.0.0", - "jest-mock": "30.0.0", - "jest-regex-util": "30.0.0", - "jest-resolve": "30.0.0", - "jest-snapshot": "30.0.0", - "jest-util": "30.0.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/jest-runtime/node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -19914,95 +21056,89 @@ } }, "node_modules/jest-snapshot": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.0.0", - "@jest/get-type": "30.0.0", - "@jest/snapshot-utils": "30.0.0", - "@jest/transform": "30.0.0", - "@jest/types": "30.0.0", - "babel-preset-current-node-syntax": "^1.1.0", - "chalk": "^4.1.2", - "expect": "30.0.0", - "graceful-fs": "^4.2.11", - "jest-diff": "30.0.0", - "jest-matcher-utils": "30.0.0", - "jest-message-util": "30.0.0", - "jest-util": "30.0.0", - "pretty-format": "30.0.0", - "semver": "^7.7.2", - "synckit": "^0.11.8" + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util": { - "version": "30.0.0", - "dev": true, + "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": "30.0.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { - "version": "30.0.0", - "dev": true, + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.0", - "@jest/types": "30.0.0", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "30.0.0" + "pretty-format": "^29.7.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-watcher": { - "version": "30.0.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.0.0", - "@jest/types": "30.0.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "30.0.0", - "string-length": "^4.0.2" + "jest-util": "^29.7.0", + "string-length": "^4.0.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker": { @@ -20018,49 +21154,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-worker/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-worker/node_modules/ci-info": { - "version": "3.9.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/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-worker/node_modules/supports-color": { "version": "8.1.1", "license": "MIT", @@ -20096,14 +21189,16 @@ } }, "node_modules/joi": { - "version": "17.4.0", + "version": "17.13.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.4.tgz", + "integrity": "sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.0", - "@sideway/formula": "^3.0.0", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, @@ -20163,6 +21258,8 @@ }, "node_modules/jsc-safe-url": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "license": "0BSD" }, "node_modules/jsesc": { @@ -20187,10 +21284,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, @@ -20316,13 +21409,6 @@ "version": "1.0.0", "license": "MIT" }, - "node_modules/kind-of": { - "version": "6.0.3", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/klaw-sync": { "version": "6.0.0", "dev": true, @@ -20339,7 +21425,9 @@ } }, "node_modules/lan-network": { - "version": "0.1.7", + "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" @@ -20401,6 +21489,8 @@ }, "node_modules/lighthouse-logger": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "license": "Apache-2.0", "dependencies": { "debug": "^2.6.9", @@ -20409,6 +21499,8 @@ }, "node_modules/lighthouse-logger/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" @@ -20416,13 +21508,17 @@ }, "node_modules/lighthouse-logger/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/lightningcss": { - "version": "1.27.0", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "license": "MPL-2.0", "dependencies": { - "detect-libc": "^1.0.3" + "detect-libc": "^2.0.3" }, "engines": { "node": ">= 12.0.0" @@ -20432,20 +21528,43 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.27.0", - "lightningcss-darwin-x64": "1.27.0", - "lightningcss-freebsd-x64": "1.27.0", - "lightningcss-linux-arm-gnueabihf": "1.27.0", - "lightningcss-linux-arm64-gnu": "1.27.0", - "lightningcss-linux-arm64-musl": "1.27.0", - "lightningcss-linux-x64-gnu": "1.27.0", - "lightningcss-linux-x64-musl": "1.27.0", - "lightningcss-win32-arm64-msvc": "1.27.0", - "lightningcss-win32-x64-msvc": "1.27.0" + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "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.27.0", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", "cpu": [ "arm64" ], @@ -20463,9 +21582,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", - "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", "cpu": [ "x64" ], @@ -20483,9 +21602,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", - "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", "cpu": [ "x64" ], @@ -20503,9 +21622,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", - "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", "cpu": [ "arm" ], @@ -20523,12 +21642,15 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", - "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -20543,12 +21665,15 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", - "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -20563,12 +21688,15 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", - "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -20583,12 +21711,15 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", - "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -20603,9 +21734,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", - "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", "cpu": [ "arm64" ], @@ -20623,9 +21754,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", - "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "cpu": [ "x64" ], @@ -20642,6 +21773,15 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/lines-and-columns": { "version": "1.1.6", "license": "MIT" @@ -20869,6 +22009,8 @@ }, "node_modules/lodash.throttle": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "license": "MIT" }, "node_modules/log-symbols": { @@ -20933,6 +22075,8 @@ }, "node_modules/logkitty": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20946,6 +22090,8 @@ }, "node_modules/logkitty/node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -20954,6 +22100,8 @@ }, "node_modules/logkitty/node_modules/cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "license": "ISC", "dependencies": { @@ -20964,6 +22112,8 @@ }, "node_modules/logkitty/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -20976,6 +22126,8 @@ }, "node_modules/logkitty/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -20987,6 +22139,8 @@ }, "node_modules/logkitty/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -21001,6 +22155,8 @@ }, "node_modules/logkitty/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -21012,6 +22168,8 @@ }, "node_modules/logkitty/node_modules/wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -21024,12 +22182,16 @@ } }, "node_modules/logkitty/node_modules/y18n": { - "version": "4.0.1", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, "license": "ISC" }, "node_modules/logkitty/node_modules/yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", "dependencies": { @@ -21051,6 +22213,8 @@ }, "node_modules/logkitty/node_modules/yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "license": "ISC", "dependencies": { @@ -21090,27 +22254,21 @@ "license": "ISC" }, "node_modules/make-dir": { - "version": "3.1.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/makeerror": { "version": "1.0.12", "license": "BSD-3-Clause", @@ -21130,6 +22288,8 @@ }, "node_modules/marky": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", + "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "license": "Apache-2.0" }, "node_modules/math-intrinsics": { @@ -21215,43 +22375,44 @@ } }, "node_modules/metro": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.4.tgz", + "integrity": "sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", + "@babel/code-frame": "^7.29.0", "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", + "@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.29.1", + "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.82.5", - "metro-cache": "0.82.5", - "metro-cache-key": "0.82.5", - "metro-config": "0.82.5", - "metro-core": "0.82.5", - "metro-file-map": "0.82.5", - "metro-resolver": "0.82.5", - "metro-runtime": "0.82.5", - "metro-source-map": "0.82.5", - "metro-symbolicate": "0.82.5", - "metro-transform-plugins": "0.82.5", - "metro-transform-worker": "0.82.5", - "mime-types": "^2.1.27", + "metro-babel-transformer": "0.84.4", + "metro-cache": "0.84.4", + "metro-cache-key": "0.84.4", + "metro-config": "0.84.4", + "metro-core": "0.84.4", + "metro-file-map": "0.84.4", + "metro-resolver": "0.84.4", + "metro-runtime": "0.84.4", + "metro-source-map": "0.84.4", + "metro-symbolicate": "0.84.4", + "metro-transform-plugins": "0.84.4", + "metro-transform-worker": "0.84.4", + "mime-types": "^3.0.1", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", "source-map": "^0.5.6", @@ -21263,225 +22424,141 @@ "metro": "src/cli.js" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-babel-transformer": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.4.tgz", + "integrity": "sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.29.1", + "hermes-parser": "0.35.0", + "metro-cache-key": "0.84.4", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.29.1", + "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/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.29.1", + "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.29.1" + "hermes-estree": "0.35.0" } }, "node_modules/metro-cache": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.4.tgz", + "integrity": "sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==", "license": "MIT", "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", - "metro-core": "0.82.5" + "metro-core": "0.84.4" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-cache-key": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.4.tgz", + "integrity": "sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-cache/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/metro-cache/node_modules/https-proxy-agent": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/metro-config": { - "version": "0.82.5", - "license": "MIT", - "dependencies": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.82.5", - "metro-cache": "0.82.5", - "metro-core": "0.82.5", - "metro-runtime": "0.82.5" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-config/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/metro-config/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/metro-config/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/metro-config/node_modules/cosmiconfig": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/import-fresh": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/metro-config/node_modules/jest-validate": { - "version": "29.7.0", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/metro-config/node_modules/js-yaml": { - "version": "3.13.1", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": ">= 14" } }, - "node_modules/metro-config/node_modules/parse-json": { - "version": "4.0.0", + "node_modules/metro-cache/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": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": ">=4" + "node": ">= 14" } }, - "node_modules/metro-config/node_modules/pretty-format": { - "version": "29.7.0", + "node_modules/metro-config": { + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.4.tgz", + "integrity": "sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "connect": "^3.6.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.7.0", + "metro": "0.84.4", + "metro-cache": "0.84.4", + "metro-core": "0.84.4", + "metro-runtime": "0.84.4", + "yaml": "^2.6.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, - "node_modules/metro-config/node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" - }, - "node_modules/metro-config/node_modules/resolve-from": { - "version": "3.0.0", - "license": "MIT", + "node_modules/metro-config/node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">=4" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, - "node_modules/metro-config/node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, "node_modules/metro-core": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.4.tgz", + "integrity": "sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.82.5" + "metro-resolver": "0.84.4" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-file-map": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.4.tgz", + "integrity": "sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -21495,74 +22572,85 @@ "walker": "^1.0.7" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-minify-terser": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.4.tgz", + "integrity": "sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-resolver": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.4.tgz", + "integrity": "sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-runtime": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.4.tgz", + "integrity": "sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-source-map": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.4.tgz", + "integrity": "sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-symbolicate": "0.82.5", + "metro-symbolicate": "0.84.4", "nullthrows": "^1.1.1", - "ob1": "0.82.5", + "ob1": "0.84.4", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-source-map/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/metro-symbolicate": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.4.tgz", + "integrity": "sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-source-map": "0.82.5", + "metro-source-map": "0.84.4", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" @@ -21571,77 +22659,140 @@ "metro-symbolicate": "src/index.js" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-symbolicate/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/metro-transform-plugins": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.4.tgz", + "integrity": "sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", + "@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": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/metro-transform-worker": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.4.tgz", + "integrity": "sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^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.82.5", - "metro-babel-transformer": "0.82.5", - "metro-cache": "0.82.5", - "metro-cache-key": "0.82.5", - "metro-minify-terser": "0.82.5", - "metro-source-map": "0.82.5", - "metro-transform-plugins": "0.82.5", + "metro": "0.84.4", + "metro-babel-transformer": "0.84.4", + "metro-cache": "0.84.4", + "metro-cache-key": "0.84.4", + "metro-minify-terser": "0.84.4", + "metro-source-map": "0.84.4", + "metro-transform-plugins": "0.84.4", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } + }, + "node_modules/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", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/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/metro/node_modules/hermes-estree": { - "version": "0.29.1", + "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/metro/node_modules/hermes-parser": { - "version": "0.29.1", + "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/metro/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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": { - "hermes-estree": "0.29.1" + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/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", + "engines": { + "node": ">= 0.6" } }, "node_modules/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/metro/node_modules/ws": { - "version": "7.5.10", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "license": "MIT", "engines": { "node": ">=8.3.0" @@ -21766,40 +22917,14 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "license": "ISC", + "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/minizlib": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mixin-object": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-object/node_modules/for-in": { - "version": "0.1.8", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "license": "MIT", @@ -21988,6 +23113,12 @@ "ieee754": "^1.1.13" } }, + "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/mute-stream": { "version": "2.0.0", "dev": true, @@ -22014,7 +23145,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "funding": [ { "type": "github", @@ -22033,20 +23166,6 @@ "version": "2.0.0", "license": "MIT" }, - "node_modules/napi-postinstall": { - "version": "0.2.4", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "dev": true, @@ -22059,10 +23178,6 @@ "node": ">= 0.6" } }, - "node_modules/nested-error-stacks": { - "version": "2.0.1", - "license": "MIT" - }, "node_modules/no-case": { "version": "3.0.4", "dev": true, @@ -22074,6 +23189,8 @@ }, "node_modules/nocache": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", + "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", "dev": true, "license": "MIT", "engines": { @@ -22146,7 +23263,9 @@ "license": "MIT" }, "node_modules/node-forge": { - "version": "1.3.1", + "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" @@ -22178,11 +23297,13 @@ "license": "MIT" }, "node_modules/node-stream-zip": { - "version": "1.13.4", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" }, "funding": { "type": "github", @@ -22215,6 +23336,8 @@ }, "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", @@ -22252,16 +23375,20 @@ }, "node_modules/nullthrows": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "license": "MIT" }, "node_modules/ob1": { - "version": "0.82.5", + "version": "0.84.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.4.tgz", + "integrity": "sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18.18" + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, "node_modules/object-assign": { @@ -22418,7 +23545,9 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -22458,157 +23587,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "3.4.0", - "license": "MIT", - "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/ora/node_modules/ansi-regex": { - "version": "4.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/ora/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ora/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/log-symbols": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/mimic-fn": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/onetime": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "5.2.0", + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^4.1.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/ora/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/os-browserify": { @@ -22685,6 +23700,7 @@ }, "node_modules/p-try": { "version": "2.2.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -22816,22 +23832,6 @@ "npm": ">5" } }, - "node_modules/patch-package/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/patch-package/node_modules/slash": { "version": "2.0.0", "dev": true, @@ -23070,6 +24070,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -23081,6 +24083,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -23093,6 +24097,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -23104,6 +24110,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -23118,6 +24126,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -23181,7 +24191,9 @@ } }, "node_modules/postcss": { - "version": "8.4.49", + "version": "8.5.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.21.tgz", + "integrity": "sha512-v4sDNP3fdNiWMfabO7OwOQdOX8TiQSztKyT1Wj0w+j7LDallJThJRBBBmzVGyYj0crMh7jlV4zepPkiNu9UwDQ==", "funding": [ { "type": "opencollective", @@ -23198,7 +24210,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -23385,48 +24397,24 @@ "node": ">=6.0.0" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-format": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.0", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/pretty-format/node_modules/@jest/schemas": { - "version": "30.0.0", - "dev": true, + "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": { - "@sinclair/typebox": "^0.34.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/pretty-format/node_modules/@sinclair/typebox": { - "version": "0.34.35", - "dev": true, - "license": "MIT" - }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "dev": true, + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", "engines": { "node": ">=10" @@ -23437,11 +24425,14 @@ }, "node_modules/pretty-format/node_modules/react-is": { "version": "18.3.1", - "dev": true, + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "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" @@ -23597,7 +24588,9 @@ } }, "node_modules/pure-rand": { - "version": "7.0.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -23633,12 +24626,6 @@ "version": "1.4.4", "license": "MIT" }, - "node_modules/qrcode-terminal": { - "version": "0.11.0", - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, "node_modules/qs": { "version": "6.10.3", "dev": true, @@ -23681,6 +24668,8 @@ }, "node_modules/queue": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "license": "MIT", "dependencies": { "inherits": "~2.0.3" @@ -23773,8 +24762,16 @@ "node": ">=0.10.0" } }, + "node_modules/re2js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/re2js/-/re2js-0.4.3.tgz", + "integrity": "sha512-EuNmh7jurhHEE8Ge/lBo9JuMLb3qf866Xjjfyovw3wPc7+hlqDkZq4LwhrCQMEI+ARWfrKrHozEndzlpNT0WDg==", + "license": "MIT" + }, "node_modules/react": { - "version": "19.0.0", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -23822,57 +24819,59 @@ "license": "MIT" }, "node_modules/react-native": { - "version": "0.79.2", - "license": "MIT", - "dependencies": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.79.2", - "@react-native/codegen": "0.79.2", - "@react-native/community-cli-plugin": "0.79.2", - "@react-native/gradle-plugin": "0.79.2", - "@react-native/js-polyfills": "0.79.2", - "@react-native/normalize-colors": "0.79.2", - "@react-native/virtualized-lists": "0.79.2", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.86.0.tgz", + "integrity": "sha512-17ALh/dd6AO4pgOVmOO5Axll5PbErEo3XFyLokyzW6usyi+OShIEPwUW26wLPlhVifgSOIfECCH0WN+0IqtJ1w==", + "license": "MIT", + "dependencies": { + "@react-native/assets-registry": "0.86.0", + "@react-native/codegen": "0.86.0", + "@react-native/community-cli-plugin": "0.86.0", + "@react-native/gradle-plugin": "0.86.0", + "@react-native/js-polyfills": "0.86.0", + "@react-native/normalize-colors": "0.86.0", + "@react-native/virtualized-lists": "0.86.0", "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.36.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": "250829098.0.14", "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.82.0", - "metro-source-map": "^0.82.0", + "metro-runtime": "^0.84.3", + "metro-source-map": "^0.84.3", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", - "react-devtools-core": "^6.1.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", + "tinyglobby": "^0.2.15", "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 || ^22.13.0 || ^24.3.0 || >= 25.0.0" }, "peerDependencies": { - "@types/react": "^19.0.0", - "react": "^19.0.0" + "@react-native/jest-preset": "0.86.0", + "@types/react": "^19.1.1", + "react": "^19.2.3" }, "peerDependenciesMeta": { + "@react-native/jest-preset": { + "optional": true + }, "@types/react": { "optional": true } @@ -23896,7 +24895,9 @@ } }, "node_modules/react-native-bootsplash": { - "version": "6.3.8", + "version": "6.3.12", + "resolved": "https://registry.npmjs.org/react-native-bootsplash/-/react-native-bootsplash-6.3.12.tgz", + "integrity": "sha512-o+3rj6fNJGMW2tcWIyB3P1Mps4O4yU3+qcHeLmd7FFzABVzez0To7bpeQ7rTApdb3bIg8s61R8PI7+fwkakGBQ==", "license": "MIT", "dependencies": { "@expo/config-plugins": "^9.0.0 || ^10.0.0", @@ -23909,7 +24910,7 @@ "node-html-parser": "^7.0.1", "picocolors": "^1.1.1", "prettier": "^3.5.3", - "react-native-is-edge-to-edge": "^1.1.7", + "react-native-is-edge-to-edge": "^1.2.1", "sharp": "^0.32.6", "ts-dedent": "^2.2.0", "xml-formatter": "^3.6.5" @@ -23998,14 +24999,6 @@ "react-native": "*" } }, - "node_modules/react-native-edge-to-edge": { - "version": "1.6.0", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/react-native-email-link": { "version": "1.14.5", "license": "MIT", @@ -24056,10 +25049,13 @@ } }, "node_modules/react-native-gesture-handler": { - "version": "2.28.0", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.32.0.tgz", + "integrity": "sha512-uYIMOKlKENORq2SABE+jIjbPU+h5I/sQKcq2v16zRq848nwEp1fWRVwML4QWqijc8UcXJC25o54S8GQd4Mf2OA==", "license": "MIT", "dependencies": { "@egjs/hammerjs": "^2.0.17", + "@types/react-test-renderer": "^19.1.0", "hoist-non-react-statics": "^3.3.0", "invariant": "^2.2.4" }, @@ -24162,7 +25158,9 @@ } }, "node_modules/react-native-keyboard-controller": { - "version": "1.19.0", + "version": "1.21.9", + "resolved": "https://registry.npmjs.org/react-native-keyboard-controller/-/react-native-keyboard-controller-1.21.9.tgz", + "integrity": "sha512-+TkkFldht4+AXBQeDy1hLE7iqiW8/NkY/ekhcFsKIiRdI9qC5JDzx0TfAg1iYZB2IeOXppmURIy2jFCUjOcV1w==", "license": "MIT", "dependencies": { "react-native-is-edge-to-edge": "^1.2.1" @@ -24251,17 +25249,28 @@ } }, "node_modules/react-native-reanimated": { - "version": "4.1.3", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.5.0.tgz", + "integrity": "sha512-+iPfvK34PKKYP/p/4TaBliFkbfvjGDIvXuiiaxvISP5ip7sWegvlacwU/uAV6zNDSSmX0tDyER7PurPMKGDipA==", "license": "MIT", "dependencies": { - "react-native-is-edge-to-edge": "^1.2.1", - "semver": "7.7.2" + "react-native-is-edge-to-edge": "^1.3.1", + "semver": "^7.7.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0", "react": "*", - "react-native": "*", - "react-native-worklets": ">=0.5.0" + "react-native": "0.83 - 0.86", + "react-native-worklets": "0.10.x" + } + }, + "node_modules/react-native-reanimated/node_modules/react-native-is-edge-to-edge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz", + "integrity": "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" } }, "node_modules/react-native-render-html": { @@ -24301,7 +25310,9 @@ "license": "ISC" }, "node_modules/react-native-safe-area-context": { - "version": "5.6.1", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.7.0.tgz", + "integrity": "sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ==", "license": "MIT", "peerDependencies": { "react": "*", @@ -24309,16 +25320,17 @@ } }, "node_modules/react-native-screens": { - "version": "4.16.0", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.25.2.tgz", + "integrity": "sha512-1Nj1fusFd+rIMKU/qC9yGKVG+3ofh11d3OdBQKL1iVvQfKvcB8vhvTGQf2TkfxW3bamxN+hCZIXmNuU0mRkyDg==", "license": "MIT", "dependencies": { "react-freeze": "^1.0.0", - "react-native-is-edge-to-edge": "^1.2.1", "warn-once": "^0.1.0" }, "peerDependencies": { "react": "*", - "react-native": "*" + "react-native": ">=0.82.0" } }, "node_modules/react-native-securerandom": { @@ -24353,7 +25365,9 @@ "license": "MIT" }, "node_modules/react-native-svg": { - "version": "15.14.0", + "version": "15.15.4", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.15.4.tgz", + "integrity": "sha512-boT/vIRgj6zZKBpfTPJJiYWMbZE9duBMOwPK6kCSTgxsS947IFMOq9OgIFkpWZTB7t229H24pDRkh3W9ZK/J1A==", "license": "MIT", "dependencies": { "css-select": "^5.1.0", @@ -24437,7 +25451,9 @@ } }, "node_modules/react-native-vision-camera": { - "version": "4.7.2", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/react-native-vision-camera/-/react-native-vision-camera-4.7.3.tgz", + "integrity": "sha512-g1/neOyjSqn1kaAa2FxI/qp5KzNvPcF0bnQw6NntfbxH6tm0+8WFZszlgb5OV+iYlB6lFUztCbDtyz5IpL47OA==", "license": "MIT", "peerDependencies": { "@shopify/react-native-skia": "*", @@ -24459,7 +25475,9 @@ } }, "node_modules/react-native-webview": { - "version": "13.15.0", + "version": "13.16.1", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.16.1.tgz", + "integrity": "sha512-If0eHhoEdOYDcHsX+xBFwHMbWBGK1BvGDQDQdVkwtSIXiq1uiqjkpWVP2uQ1as94J0CzvFE9PUNDuhiX0Z6ubw==", "license": "MIT", "dependencies": { "escape-string-regexp": "^4.0.0", @@ -24470,235 +25488,97 @@ "react-native": "*" } }, - "node_modules/react-native-wheel-picker-android": { - "version": "2.0.6", - "license": "MIT", - "dependencies": { - "moment": "^2.22.0" - } - }, - "node_modules/react-native-worklets": { - "version": "0.6.1", - "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", - "semver": "7.7.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0", - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-zano": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/react-native-zano/-/react-native-zano-0.5.1.tgz", - "integrity": "sha512-4kkr9fMJK4Q7BAQpmDe4aDRXfM9gEqQg3JQgp2LQf76i4Gzg+CTAXKEcgk1yU9Ww5gbaIMfk45dTzL6jU1Li6w==", - "license": "BSD-3-Clause", - "dependencies": { - "cleaners": "^0.3.17", - "rfc4648": "^1.5.4", - "tweetnacl": "^1.0.3" - } - }, - "node_modules/react-native-zcash": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/react-native-zcash/-/react-native-zcash-0.13.4.tgz", - "integrity": "sha512-WWMzbmIPme81ziEeVMGBgNcMpa7hy9Bfy84jNKCr13PUFcbP4WkeGVV+9AQkxRhZuXgAoNHqN0Fn6U6uF8FBQA==", - "license": "MIT", - "dependencies": { - "biggystring": "^4.2.3", - "rfc4648": "^1.3.0" - }, - "peerDependencies": { - "react-native": ">=0.47.0 <1.0.0" - } - }, - "node_modules/react-native/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/react-native/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/react-native/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/react-native/node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/react-native/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/react-native/node_modules/ci-info": { - "version": "3.9.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-native/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/react-native/node_modules/jest-environment-node": { - "version": "29.7.0", - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/react-native/node_modules/jest-message-util": { - "version": "29.7.0", + "node_modules/react-native-wheel-picker-android": { + "version": "2.0.6", "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" + "moment": "^2.22.0" } }, - "node_modules/react-native/node_modules/jest-mock": { - "version": "29.7.0", + "node_modules/react-native-worklets": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.10.0.tgz", + "integrity": "sha512-JhE6IxDf6iabC0qu3+TAKA4v9RlluXmoIngPQX7/QUByf75lfrsHZ6/dQhyjEWnp1EEQiwzz8Cpew140ZcewDw==", "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@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.28.5", + "@babel/types": "^7.27.1", + "convert-source-map": "^2.0.0", + "semver": "^7.7.4" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "@babel/core": "*", + "@react-native/metro-config": "*", + "react": "*", + "react-native": "0.83 - 0.86" } }, - "node_modules/react-native/node_modules/jest-util": { - "version": "29.7.0", - "license": "MIT", + "node_modules/react-native-zano": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/react-native-zano/-/react-native-zano-0.5.1.tgz", + "integrity": "sha512-4kkr9fMJK4Q7BAQpmDe4aDRXfM9gEqQg3JQgp2LQf76i4Gzg+CTAXKEcgk1yU9Ww5gbaIMfk45dTzL6jU1Li6w==", + "license": "BSD-3-Clause", "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" + "cleaners": "^0.3.17", + "rfc4648": "^1.5.4", + "tweetnacl": "^1.0.3" } }, - "node_modules/react-native/node_modules/pretty-format": { - "version": "29.7.0", + "node_modules/react-native-zcash": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/react-native-zcash/-/react-native-zcash-0.13.4.tgz", + "integrity": "sha512-WWMzbmIPme81ziEeVMGBgNcMpa7hy9Bfy84jNKCr13PUFcbP4WkeGVV+9AQkxRhZuXgAoNHqN0Fn6U6uF8FBQA==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "biggystring": "^4.2.3", + "rfc4648": "^1.3.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "peerDependencies": { + "react-native": ">=0.47.0 <1.0.0" } }, - "node_modules/react-native/node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" + "node_modules/react-native/node_modules/@react-native/js-polyfills": { + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.0.tgz", + "integrity": "sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==", + "license": "MIT", + "engines": { + "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" + } }, "node_modules/react-native/node_modules/scheduler": { - "version": "0.25.0", + "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/ws": { - "version": "6.2.3", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" + "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-redux": { @@ -24750,24 +25630,30 @@ } }, "node_modules/react-test-renderer": { - "version": "19.0.0", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.2.3.tgz", + "integrity": "sha512-TMR1LnSFiWZMJkCgNf5ATSvAheTT2NvKIwiVwdBPHxjBI7n/JbWd4gaZ16DVd9foAXdvDz+sB5yxZTwMjPRxpw==", "dev": true, "license": "MIT", "dependencies": { - "react-is": "^19.0.0", - "scheduler": "^0.25.0" + "react-is": "^19.2.3", + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.0.0" + "react": "^19.2.3" } }, "node_modules/react-test-renderer/node_modules/react-is": { - "version": "19.1.1", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", "dev": true, "license": "MIT" }, "node_modules/react-test-renderer/node_modules/scheduler": { - "version": "0.25.0", + "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==", "dev": true, "license": "MIT" }, @@ -24998,27 +25884,11 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true, "license": "ISC" }, - "node_modules/requireg": { - "version": "0.2.2", - "dependencies": { - "nested-error-stacks": "~2.0.1", - "rc": "~1.2.7", - "resolve": "~1.7.1" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/requireg/node_modules/resolve": { - "version": "1.7.1", - "license": "MIT", - "dependencies": { - "path-parse": "^1.0.5" - } - }, "node_modules/requires-port": { "version": "1.0.0", "license": "MIT" @@ -25043,6 +25913,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -25068,11 +25940,16 @@ } }, "node_modules/resolve-workspace-root": { - "version": "2.0.0", + "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": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -25103,6 +25980,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -25116,6 +25996,9 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -25458,7 +26341,9 @@ "license": "BSD-3-Clause" }, "node_modules/semver": { - "version": "7.7.2", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -25510,19 +26395,23 @@ }, "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/serve-static": { - "version": "1.16.2", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -25530,6 +26419,8 @@ }, "node_modules/serve-static/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" @@ -25537,39 +26428,67 @@ }, "node_modules/serve-static/node_modules/debug/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/serve-static/node_modules/encodeurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serve-static/node_modules/send": { - "version": "0.19.0", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", + "node_modules/serve-static/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -25581,6 +26500,8 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, @@ -25666,25 +26587,6 @@ "buffer": "6.0.3" } }, - "node_modules/shallow-clone": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shallow-clone/node_modules/kind-of": { - "version": "5.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sharp": { "version": "0.32.6", "hasInstallScript": true, @@ -25979,6 +26881,8 @@ }, "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", @@ -26009,6 +26913,7 @@ }, "node_modules/stack-utils": { "version": "2.0.6", + "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" @@ -26019,13 +26924,16 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/stackframe": { - "version": "1.2.0", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "license": "MIT" }, "node_modules/stacktrace-parser": { @@ -26051,6 +26959,7 @@ }, "node_modules/statuses": { "version": "2.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -26182,6 +27091,8 @@ }, "node_modules/string-length": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -26423,6 +27334,8 @@ }, "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/sucrase": { @@ -26452,14 +27365,6 @@ "node": ">= 6" } }, - "node_modules/superstruct": { - "version": "0.6.2", - "license": "MIT", - "dependencies": { - "clone-deep": "^2.0.1", - "kind-of": "^6.0.1" - } - }, "node_modules/supports-color": { "version": "7.2.0", "license": "MIT", @@ -26472,6 +27377,8 @@ }, "node_modules/supports-hyperlinks": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0", @@ -26610,21 +27517,6 @@ "node": ">=6" } }, - "node_modules/tar": { - "version": "7.4.3", - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/tar-fs": { "version": "3.0.9", "license": "MIT", @@ -26646,26 +27538,6 @@ "streamx": "^2.15.0" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "3.0.1", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/temp-dir": { "version": "2.0.0", "license": "MIT", @@ -26675,6 +27547,8 @@ }, "node_modules/terminal-link": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", @@ -26688,11 +27562,13 @@ } }, "node_modules/terser": { - "version": "5.18.2", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -26705,6 +27581,8 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/teslabot": { @@ -26713,6 +27591,7 @@ }, "node_modules/test-exclude": { "version": "6.0.0", + "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -26725,6 +27604,7 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -26793,6 +27673,8 @@ }, "node_modules/throat": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "license": "MIT" }, "node_modules/through": { @@ -26823,6 +27705,34 @@ "version": "1.6.0", "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmp": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", @@ -26918,6 +27828,12 @@ "node": ">=15" } }, + "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/tough-cookie": { "version": "4.1.4", "dev": true, @@ -27148,6 +28064,9 @@ }, "node_modules/type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -27337,7 +28256,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.0.4", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -27345,7 +28266,7 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/typical": { @@ -27391,16 +28312,6 @@ "version": "0.1.3", "license": "MIT" }, - "node_modules/undici": { - "version": "5.28.4", - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, "node_modules/undici-types": { "version": "6.20.0", "license": "MIT" @@ -27487,39 +28398,6 @@ "node": ">= 0.8" } }, - "node_modules/unrs-resolver": { - "version": "1.9.0", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.2.2" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.9.0", - "@unrs/resolver-binding-android-arm64": "1.9.0", - "@unrs/resolver-binding-darwin-arm64": "1.9.0", - "@unrs/resolver-binding-darwin-x64": "1.9.0", - "@unrs/resolver-binding-freebsd-x64": "1.9.0", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.0", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.0", - "@unrs/resolver-binding-linux-arm64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-arm64-musl": "1.9.0", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-riscv64-musl": "1.9.0", - "@unrs/resolver-binding-linux-s390x-gnu": "1.9.0", - "@unrs/resolver-binding-linux-x64-gnu": "1.9.0", - "@unrs/resolver-binding-linux-x64-musl": "1.9.0", - "@unrs/resolver-binding-wasm32-wasi": "1.9.0", - "@unrs/resolver-binding-win32-arm64-msvc": "1.9.0", - "@unrs/resolver-binding-win32-ia32-msvc": "1.9.0", - "@unrs/resolver-binding-win32-x64-msvc": "1.9.0" - } - }, "node_modules/unstorage": { "version": "1.10.1", "license": "MIT", @@ -27764,31 +28642,20 @@ } }, "node_modules/v8-to-istanbul": { - "version": "9.1.0", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/v8-to-istanbul/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, "node_modules/valibot": { "version": "0.36.0", "license": "MIT" @@ -27809,6 +28676,8 @@ }, "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" @@ -27841,6 +28710,8 @@ }, "node_modules/vlq": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "license": "MIT" }, "node_modules/vm-browserify": { @@ -27873,12 +28744,20 @@ "node": ">= 8" } }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "license": "BSD-2-Clause" }, "node_modules/websocket-driver": { - "version": "0.7.4", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz", + "integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==", "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", @@ -27891,6 +28770,8 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "license": "Apache-2.0", "engines": { "node": ">=0.8.0" @@ -27908,6 +28789,12 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/whatwg-url-minimum": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.2.tgz", + "integrity": "sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==", + "license": "MIT" + }, "node_modules/whatwg-url-without-unicode": { "version": "8.0.0-3", "license": "MIT", @@ -28021,7 +28908,9 @@ } }, "node_modules/which-module": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, "license": "ISC" }, @@ -28084,10 +28973,6 @@ "hashes-grs": "1.2.0" } }, - "node_modules/wonka": { - "version": "6.3.4", - "license": "MIT" - }, "node_modules/word-wrap": { "version": "1.2.5", "dev": true, @@ -28144,26 +29029,17 @@ "license": "ISC" }, "node_modules/write-file-atomic": { - "version": "5.0.1", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" + "signal-exit": "^3.0.7" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/ws": { @@ -28187,8 +29063,6 @@ }, "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", @@ -28383,7 +29257,9 @@ } }, "node_modules/zod": { - "version": "3.23.8", + "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 4def728a958..c2c6f24074f 100644 --- a/package.json +++ b/package.json @@ -75,19 +75,19 @@ "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0", "@paraswap/sdk": "^6.12.0", - "@react-native-async-storage/async-storage": "^1.19.4", + "@react-native-async-storage/async-storage": "2.2.0", "@react-native-clipboard/clipboard": "^1.16.3", - "@react-native-community/datetimepicker": "^8.4.2", - "@react-native-community/netinfo": "^11.4.1", - "@react-native-firebase/app": "^20.5.0", - "@react-native-firebase/messaging": "^20.5.0", - "@react-native-picker/picker": "^2.11.2", + "@react-native-community/datetimepicker": "9.1.0", + "@react-native-community/netinfo": "12.0.1", + "@react-native-firebase/app": "^25.1.0", + "@react-native-firebase/messaging": "^25.1.0", + "@react-native-picker/picker": "2.11.4", "@react-navigation/bottom-tabs": "^6.5.4", "@react-navigation/drawer": "^6.7.2", "@react-navigation/elements": "^1.3.14", "@react-navigation/native": "^6.1.3", "@react-navigation/stack": "^6.3.12", - "@sentry/react-native": "^7.12.0", + "@sentry/react-native": "~7.11.0", "@tanstack/react-query": "^5.84.2", "@types/jsrsasign": "^10.5.13", "@unstoppabledomains/resolution": "^9.3.0", @@ -114,7 +114,7 @@ "edge-info-server": "^3.12.0", "edge-login-ui-rn": "^3.37.2", "ethers": "^5.7.2", - "expo": "^53.0.0", + "expo": "^57.0.7", "expo-quick-actions": "^5.0.0", "jsrsasign": "^11.1.0", "marked": "^15.0.9", @@ -123,11 +123,11 @@ "posthog-react-native": "^2.8.1", "prompts": "^2.4.2", "qrcode-generator": "^1.4.4", - "react": "19.0.0", - "react-native": "0.79.2", + "react": "19.2.3", + "react-native": "0.86.0", "react-native-airship": "^0.3.0", "react-native-battery-optimization-check": "^1.0.8", - "react-native-bootsplash": "^6.3.8", + "react-native-bootsplash": "^6.3.10", "react-native-confetti-cannon": "^1.5.2", "react-native-contacts": "^8.0.10", "react-native-custom-tabs": "https://github.com/adminphoeniixx/react-native-custom-tabs#develop", @@ -137,7 +137,7 @@ "react-native-fast-shadow": "^0.1.0", "react-native-file-access": "^3.1.1", "react-native-fs": "^2.19.0", - "react-native-gesture-handler": "^2.28.0", + "react-native-gesture-handler": "~2.32.0", "react-native-get-random-values": "^1.11.0", "react-native-gifted-charts": "1.4.63", "react-native-gradle-plugin": "^0.71.19", @@ -146,7 +146,7 @@ "react-native-image-picker": "^8.2.1", "react-native-in-app-review": "^4.3.5", "react-native-keyboard-aware-scroll-view": "^0.9.5", - "react-native-keyboard-controller": "^1.19.0", + "react-native-keyboard-controller": "1.21.9", "react-native-linear-gradient": "^2.8.3", "react-native-localize": "^3.4.2", "react-native-mail": "^6.1.1", @@ -155,22 +155,22 @@ "react-native-performance": "^5.1.4", "react-native-permissions": "^4.1.5", "react-native-piratechain": "0.6.3", - "react-native-reanimated": "^4.1.3", + "react-native-reanimated": "4.5.0", "react-native-render-html": "^6.3.4", "react-native-reorderable-list": "^0.5.0", "react-native-safari-view": "^2.1.0", - "react-native-safe-area-context": "^5.6.1", - "react-native-screens": "^4.16.0", + "react-native-safe-area-context": "~5.7.0", + "react-native-screens": "4.25.2", "react-native-securerandom": "^1.0.1", "react-native-share": "^12.0.11", "react-native-sound": "^0.12.0", "react-native-store-review": "https://github.com/EdgeApp/react-native-store-review#b0a3379829056e7328b550d5b135271f7a777083", - "react-native-svg": "^15.12.1", + "react-native-svg": "15.15.4", "react-native-vector-icons": "^10.1.0", - "react-native-vision-camera": "^4.7.2", - "react-native-webview": "^13.15.0", + "react-native-vision-camera": "^4.7.3", + "react-native-webview": "13.16.1", "react-native-wheel-picker-android": "^2.0.6", - "react-native-worklets": "^0.6.1", + "react-native-worklets": "0.10.0", "react-native-zano": "^0.5.1", "react-native-zcash": "0.13.4", "react-redux": "^8.1.1", @@ -190,17 +190,18 @@ "zcashname-sdk": "^0.7.2" }, "devDependencies": { - "@babel/core": "^7.25.2", + "@babel/core": "^7.29.0", "@babel/plugin-transform-export-namespace-from": "^7.23.3", "@babel/preset-env": "^7.25.3", "@babel/preset-typescript": "^7.18.6", "@babel/runtime": "^7.25.0", - "@react-native-community/cli": "18.0.0", - "@react-native-community/cli-platform-android": "18.0.0", - "@react-native-community/cli-platform-ios": "18.0.0", - "@react-native/babel-preset": "0.79.2", - "@react-native/metro-config": "0.79.2", - "@react-native/typescript-config": "0.79.2", + "@react-native-community/cli": "20.1.0", + "@react-native-community/cli-platform-android": "20.1.0", + "@react-native-community/cli-platform-ios": "20.1.0", + "@react-native/babel-preset": "0.86.0", + "@react-native/jest-preset": "^0.85.3", + "@react-native/metro-config": "0.86.0", + "@react-native/typescript-config": "0.86.0", "@rollup/plugin-babel": "^6.0.3", "@stakekit/api-hooks": "^0.0.93", "@testing-library/react-native": "^13.2.0", @@ -215,7 +216,7 @@ "@types/lodash": "^4.14.149", "@types/node-fetch": "^2.6.2", "@types/prompts": "^2.0.14", - "@types/react": "^19.0.0", + "@types/react": "^19.2.0", "@types/react-native": "^0.71.1", "@types/react-native-custom-tabs": "^0.1.2", "@types/react-native-safari-view": "^2.0.5", @@ -239,7 +240,7 @@ "fs-extra": "^10.1.0", "https-browserify": "^1.0.0", "husky": "^7.0.0", - "jest": "^30.0.0", + "jest": "~29.7.0", "jetifier": "^1.6.5", "lint-staged": "^10.5.3", "msw": "^2.8.4", @@ -251,7 +252,7 @@ "prettier": "2.8.8", "process": "^0.11.10", "react-native-svg-transformer": "^1.5.1", - "react-test-renderer": "19.0.0", + "react-test-renderer": "19.2.3", "readable-stream": "^3.6.2", "rollup": "^3.20.6", "rollup-plugin-node-resolve": "4.0.0", @@ -260,7 +261,7 @@ "string_decoder": "^1.3.0", "sucrase": "^3.35.0", "typechain": "^8.3.2", - "typescript": "5.0.4", + "typescript": "~5.8.3", "updot": "^1.2.0", "vm-browserify": "^1.1.2", "xcode": "^3.0.1" diff --git a/patches/react-native+0.79.2.patch b/patches/react-native+0.79.2.patch deleted file mode 100644 index 69291f444fd..00000000000 --- a/patches/react-native+0.79.2.patch +++ /dev/null @@ -1,133 +0,0 @@ -diff --git a/node_modules/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp b/node_modules/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp -index 522ec57..e6ad1df 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp -+++ b/node_modules/react-native/ReactCommon/react/renderer/mounting/ShadowTree.cpp -@@ -22,6 +22,10 @@ - - namespace facebook::react { - -+namespace { -+const int MAX_COMMIT_ATTEMPTS_BEFORE_LOCKING = 3; -+} // namespace -+ - using CommitStatus = ShadowTree::CommitStatus; - using CommitMode = ShadowTree::CommitMode; - -@@ -207,7 +211,8 @@ void ShadowTree::setCommitMode(CommitMode commitMode) const { - auto revision = ShadowTreeRevision{}; - - { -- std::unique_lock lock(commitMutex_); -+ ShadowTree::UniqueLock lock = uniqueCommitLock(); -+ - if (commitMode_ == commitMode) { - return; - } -@@ -224,7 +229,7 @@ void ShadowTree::setCommitMode(CommitMode commitMode) const { - } - - CommitMode ShadowTree::getCommitMode() const { -- std::shared_lock lock(commitMutex_); -+ SharedLock lock = sharedCommitLock(); - return commitMode_; - } - -@@ -238,17 +243,17 @@ CommitStatus ShadowTree::commit( - const CommitOptions& commitOptions) const { - [[maybe_unused]] int attempts = 0; - -- while (true) { -- attempts++; -- -+ while (attempts < MAX_COMMIT_ATTEMPTS_BEFORE_LOCKING) { - auto status = tryCommit(transaction, commitOptions); - if (status != CommitStatus::Failed) { - return status; - } -+ attempts++; -+ } - -- // After multiple attempts, we failed to commit the transaction. -- // Something internally went terribly wrong. -- react_native_assert(attempts < 1024); -+ { -+ std::unique_lock lock(commitMutexRecursive_); -+ return tryCommit(transaction, commitOptions); - } - } - -@@ -266,7 +271,7 @@ CommitStatus ShadowTree::tryCommit( - - { - // Reading `currentRevision_` in shared manner. -- std::shared_lock lock(commitMutex_); -+ SharedLock lock = sharedCommitLock(); - commitMode = commitMode_; - oldRevision = currentRevision_; - } -@@ -307,7 +312,7 @@ CommitStatus ShadowTree::tryCommit( - - { - // Updating `currentRevision_` in unique manner if it hasn't changed. -- std::unique_lock lock(commitMutex_); -+ UniqueLock lock = uniqueCommitLock(); - - if (currentRevision_.number != oldRevision.number) { - return CommitStatus::Failed; -@@ -345,7 +350,7 @@ CommitStatus ShadowTree::tryCommit( - } - - ShadowTreeRevision ShadowTree::getCurrentRevision() const { -- std::shared_lock lock(commitMutex_); -+ SharedLock lock = sharedCommitLock(); - return currentRevision_; - } - -@@ -392,4 +397,12 @@ void ShadowTree::notifyDelegatesOfUpdates() const { - delegate_.shadowTreeDidFinishTransaction(mountingCoordinator_, true); - } - -+inline ShadowTree::UniqueLock ShadowTree::uniqueCommitLock() const { -+ return std::unique_lock{commitMutexRecursive_}; -+} -+ -+inline ShadowTree::SharedLock ShadowTree::sharedCommitLock() const { -+ return std::unique_lock{commitMutexRecursive_}; -+} -+ - } // namespace facebook::react -diff --git a/node_modules/react-native/ReactCommon/react/renderer/mounting/ShadowTree.h b/node_modules/react-native/ReactCommon/react/renderer/mounting/ShadowTree.h -index ae9d005..c3bef0b 100644 ---- a/node_modules/react-native/ReactCommon/react/renderer/mounting/ShadowTree.h -+++ b/node_modules/react-native/ReactCommon/react/renderer/mounting/ShadowTree.h -@@ -8,6 +8,8 @@ - #pragma once - - #include -+#include -+#include - - #include - #include -@@ -139,10 +141,21 @@ class ShadowTree final { - const SurfaceId surfaceId_; - const ShadowTreeDelegate& delegate_; - mutable std::shared_mutex commitMutex_; -+ mutable std::recursive_mutex commitMutexRecursive_; - mutable CommitMode commitMode_{ - CommitMode::Normal}; // Protected by `commitMutex_`. - mutable ShadowTreeRevision currentRevision_; // Protected by `commitMutex_`. - std::shared_ptr mountingCoordinator_; -+ -+ using UniqueLock = std::variant< -+ std::unique_lock, -+ std::unique_lock>; -+ using SharedLock = std::variant< -+ std::shared_lock, -+ std::unique_lock>; -+ -+ inline UniqueLock uniqueCommitLock() const; -+ inline SharedLock sharedCommitLock() const; - }; - - } // namespace facebook::react diff --git a/patches/react-native-securerandom+1.0.1.patch b/patches/react-native-securerandom+1.0.1.patch new file mode 100644 index 00000000000..123240cca50 --- /dev/null +++ b/patches/react-native-securerandom+1.0.1.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/react-native-securerandom/android/build.gradle b/node_modules/react-native-securerandom/android/build.gradle +index 4e725c3..bb212d2 100644 +--- a/node_modules/react-native-securerandom/android/build.gradle ++++ b/node_modules/react-native-securerandom/android/build.gradle +@@ -56,7 +56,7 @@ repositories { + excludeGroup "com.facebook.react" + } + } +- jcenter() ++ mavenCentral() + } + + dependencies { diff --git a/patches/react-native-vision-camera+4.7.2.patch b/patches/react-native-vision-camera+4.7.2.patch deleted file mode 100644 index c1de2480255..00000000000 --- a/patches/react-native-vision-camera+4.7.2.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/react/CameraDevicesManager.kt b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/react/CameraDevicesManager.kt -index 21ac2b2..b0b2254 100644 ---- a/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/react/CameraDevicesManager.kt -+++ b/node_modules/react-native-vision-camera/android/src/main/java/com/mrousavy/camera/react/CameraDevicesManager.kt -@@ -99,6 +99,7 @@ class CameraDevicesManager(private val reactContext: ReactApplicationContext) : - } - - fun sendAvailableDevicesChangedEvent() { -+ if (!reactContext.hasActiveCatalystInstance()) return; - val eventEmitter = reactContext.getJSModule(RCTDeviceEventEmitter::class.java) - val devices = getDevicesJson() - eventEmitter.emit("CameraDevicesChanged", devices) diff --git a/scripts/jestResolver.js b/scripts/jestResolver.js new file mode 100644 index 00000000000..76b20033c8a --- /dev/null +++ b/scripts/jestResolver.js @@ -0,0 +1,35 @@ +// Custom jest resolver handling two RN-0.85-ecosystem quirks: +// +// 1. Reanimated 4 splits out react-native-worklets, whose `.native` modules +// instantiate native code that crashes in jest. Resolve worklets to its +// non-native build (mirrors react-native-worklets/jest/resolver.js). +// +// 2. The React Native jest preset sets the `react-native` export condition. +// msw (and @mswjs/*) map their Node exports to `null` under that condition, +// so `msw/node` fails to resolve. Resolve anything msw-related with Node +// export conditions (preferring CommonJS) instead. +module.exports = (request, options) => { + const { defaultResolver } = options + + if ( + options.basedir.includes('react-native-worklets') || + request.includes('react-native-worklets') + ) { + options = { + ...options, + extensions: options.extensions?.filter(ext => !ext.includes('native')) + } + } + + const isMsw = + request === 'msw' || + request.startsWith('msw/') || + request.startsWith('@mswjs/') || + options.basedir.includes('/node_modules/msw') || + options.basedir.includes('/node_modules/@mswjs') + if (isMsw) { + options = { ...options, conditions: ['node', 'require', 'default'] } + } + + return defaultResolver(request, options) +} diff --git a/src/__tests__/components/__snapshots__/AccountSyncBar.test.tsx.snap b/src/__tests__/components/__snapshots__/AccountSyncBar.test.tsx.snap index 7c62619eca7..10b50e3f12e 100644 --- a/src/__tests__/components/__snapshots__/AccountSyncBar.test.tsx.snap +++ b/src/__tests__/components/__snapshots__/AccountSyncBar.test.tsx.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing +// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`ProgressBar should render with loading props 1`] = ` @@ -1571,7 +1564,6 @@ exports[`SendScene2 1 spendTarget 1`] = ` "reduceMotionV": "system", } } - nativeID="13" > @@ -3581,7 +3564,6 @@ exports[`SendScene2 1 spendTarget with info tiles 1`] = ` "reduceMotionV": "system", } } - nativeID="23" > @@ -5591,7 +5563,6 @@ exports[`SendScene2 2 spendTargets 1`] = ` "reduceMotionV": "system", } } - nativeID="34" > @@ -7182,7 +7144,6 @@ exports[`SendScene2 2 spendTargets hide tiles 1`] = ` "reduceMotionV": "system", } } - nativeID="44" > @@ -8753,7 +8705,6 @@ exports[`SendScene2 2 spendTargets hide tiles 2`] = ` "reduceMotionV": "system", } } - nativeID="54" > @@ -10091,7 +10034,6 @@ exports[`SendScene2 2 spendTargets hide tiles 3`] = ` "reduceMotionV": "system", } } - nativeID="63" > @@ -11842,7 +11774,6 @@ exports[`SendScene2 2 spendTargets lock tiles 1`] = ` "reduceMotionV": "system", } } - nativeID="75" > @@ -13544,7 +13465,6 @@ exports[`SendScene2 2 spendTargets lock tiles 2`] = ` "reduceMotionV": "system", } } - nativeID="86" > @@ -15173,7 +15083,6 @@ exports[`SendScene2 2 spendTargets lock tiles 3`] = ` "reduceMotionV": "system", } } - nativeID="97" > @@ -881,7 +875,6 @@ exports[`SwapCreateScene should render with loading props 1`] = ` }, ] } - nativeID="6" onLayout={[Function]} stackHeight={0} style={ diff --git a/src/__tests__/scenes/__snapshots__/SwapSuccessScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/SwapSuccessScene.test.tsx.snap index ab5452cd95f..cd75cc6bcac 100644 --- a/src/__tests__/scenes/__snapshots__/SwapSuccessScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/SwapSuccessScene.test.tsx.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing +// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SwapSuccessSceneComponent should render with loading props 1`] = ` [ @@ -361,7 +361,6 @@ exports[`SwapSuccessSceneComponent should render with loading props 1`] = ` }, ] } - nativeID="0" onLayout={[Function]} stackHeight={0} style={ diff --git a/src/__tests__/scenes/__snapshots__/TransactionDetailsScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/TransactionDetailsScene.test.tsx.snap index a2b1c44ad20..e4bc99d7eb9 100644 --- a/src/__tests__/scenes/__snapshots__/TransactionDetailsScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/TransactionDetailsScene.test.tsx.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing +// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`TransactionDetailsScene should render 1`] = ` [ @@ -196,7 +196,6 @@ exports[`TransactionDetailsScene should render 1`] = ` }, ] } - nativeID="0" onMomentumScrollBegin={[Function]} onMomentumScrollEnd={[Function]} onScroll={[Function]} @@ -272,7 +271,6 @@ exports[`TransactionDetailsScene should render 1`] = ` "reduceMotionV": "system", } } - nativeID="1" > { } const pillBackground: ViewStyle = { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, borderRadius: theme.rem(theme.buttonBorderRadiusRem) } @@ -282,7 +282,7 @@ const getStyles = cacheStyles((theme: Theme) => { fontSize: theme.rem(theme.escapeButtonFontSizeRem) }, spinnerOverlay: { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, alignItems: 'center', justifyContent: 'center' } diff --git a/src/components/buttons/PillButton.tsx b/src/components/buttons/PillButton.tsx index 33bbc421128..07994bc6faa 100644 --- a/src/components/buttons/PillButton.tsx +++ b/src/components/buttons/PillButton.tsx @@ -95,7 +95,7 @@ const getStyles = cacheStyles((theme: ReturnType) => ({ margin: theme.rem(0.5) }, gradient: { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, borderRadius: theme.rem(3) }, label: { diff --git a/src/components/cards/EdgeCard.tsx b/src/components/cards/EdgeCard.tsx index fa8cf216822..e8829d755c2 100644 --- a/src/components/cards/EdgeCard.tsx +++ b/src/components/cards/EdgeCard.tsx @@ -196,7 +196,7 @@ export const EdgeCard: React.FC = props => { const getStyles = cacheStyles((theme: Theme) => ({ backgroundFill: { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, borderRadius: theme.cardBorderRadius, backgroundColor: theme.cardBaseColor, overflow: 'hidden' @@ -212,7 +212,7 @@ const getStyles = cacheStyles((theme: Theme) => ({ position: 'absolute' }, overlayContainer: { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, alignItems: 'center', backgroundColor: theme.cardOverlayDisabled, borderRadius: theme.cardBorderRadius, diff --git a/src/components/common/BlurBackground.tsx b/src/components/common/BlurBackground.tsx index 6f3cf1cfbad..d4412147da2 100644 --- a/src/components/common/BlurBackground.tsx +++ b/src/components/common/BlurBackground.tsx @@ -7,7 +7,7 @@ import { cacheStyles, type Theme, useTheme } from '../services/ThemeContext' const isAndroid = Platform.OS === 'android' /** A blur background WITH rounded corners, used for most components */ -export const BlurBackground = () => { +export const BlurBackground: React.FC = () => { const theme = useTheme() const styles = getStyles(theme) @@ -21,7 +21,7 @@ export const BlurBackground = () => { } /** A blur background WITHOUT rounded corners. For the scene header/footer */ -export const BlurBackgroundNoRoundedCorners = () => { +export const BlurBackgroundNoRoundedCorners: React.FC = () => { const theme = useTheme() const styles = getStyles(theme) @@ -36,7 +36,7 @@ export const BlurBackgroundNoRoundedCorners = () => { const getStyles = cacheStyles((theme: Theme) => ({ blurView: { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, // We need this backgroundColor because Android applies an overlay to the // entire screen for the BlurView by default. We change this default // behavior with the transparent overlayColor, so we add this background diff --git a/src/components/common/EdgeAnim.tsx b/src/components/common/EdgeAnim.tsx index 78b72d4e3dd..9fa58dbaf6a 100644 --- a/src/components/common/EdgeAnim.tsx +++ b/src/components/common/EdgeAnim.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import type { ViewProps } from 'react-native' import Animated, { + type BaseAnimationBuilder, type ComplexAnimationBuilder, Easing, FadeIn, @@ -59,7 +60,13 @@ export const fadeInRight: Anim = { type: 'fadeInRight' } export const fadeOut: Anim = { type: 'fadeOut' } -type AnimBuilder = typeof ComplexAnimationBuilder +// reanimated 4.5 made ComplexAnimationBuilder generic and each preset extends +// it with its own value type, so the class sides no longer share a common +// `typeof` — describe just the static entry point the builder chain uses, +// matching reanimated's declared (widened) return type: +interface AnimBuilder { + delay: (durationMs: number) => BaseAnimationBuilder +} type AnimTypeFadeIns = | 'fadeIn' | 'fadeInDown' @@ -98,7 +105,7 @@ interface Props { * TODO: Remove default once we have audited all instances of EdgeAnim * explicitly enabling the default LAYOUT_ANIMATION for those instances. */ - layout?: ComplexAnimationBuilder + layout?: React.ComponentProps['layout'] /** TODO: This is a temporary way to disable the `layout` default * LAYOUT_ANIMATION. Remove this once we have audited all instances of @@ -138,8 +145,9 @@ const getAnimBuilder = (anim?: Anim): ComplexAnimationBuilder | undefined => { } = anim const animBuilder = builderMap[type] - let builder = animBuilder - .delay(delay) + // reanimated declares the preset statics as returning the base builder, but + // at runtime they return the preset instance with the full complex surface: + let builder = (animBuilder.delay(delay) as ComplexAnimationBuilder) .duration(duration) .easing(Easing.inOut(Easing.quad)) diff --git a/src/components/common/SceneWrapper.tsx b/src/components/common/SceneWrapper.tsx index a484d35d953..aa4d41a96c8 100644 --- a/src/components/common/SceneWrapper.tsx +++ b/src/components/common/SceneWrapper.tsx @@ -18,6 +18,7 @@ import { useReanimatedKeyboardAnimation } from 'react-native-keyboard-controller' import Reanimated, { + type AnimatedStyle, useAnimatedReaction, useAnimatedStyle, useSharedValue @@ -527,7 +528,7 @@ const styles = StyleSheet.create({ interface SceneWrapperScrollViewProps extends Pick { children: React.ReactNode - keyboardAwareStyle: ViewStyle + keyboardAwareStyle: AnimatedStyle insetStyle: InsetStyle layoutStyle: { height: number diff --git a/src/components/hoc/styled.tsx b/src/components/hoc/styled.tsx index efa641e7780..aab037a790c 100644 --- a/src/components/hoc/styled.tsx +++ b/src/components/hoc/styled.tsx @@ -6,6 +6,7 @@ import { type TextStyle, type ViewStyle } from 'react-native' +import type { AnimatedStyle } from 'react-native-reanimated' import { cacheStyles, @@ -20,11 +21,18 @@ interface StyleProps { type ValidStyles = ImageStyle | TextStyle | ViewStyle +// Reanimated 4 `useAnimatedStyle` returns an AnimatedStyleHandle (which +// AnimatedStyle includes). Only the dynamic `theme => props => style` path may +// return these; the cached `theme => style` and static-object paths stay plain. +type DynamicStyles = + | ValidStyles + | AnimatedStyle + type Styler = | ValidStyles | (( theme: Theme - ) => ValidStyles | ((props: Props) => ValidStyles | ValidStyles[])) + ) => ValidStyles | ((props: Props) => DynamicStyles | DynamicStyles[])) /** * Creates a styled component using a `styler` parameter. The `styler` can be the @@ -43,13 +51,15 @@ type Styler = */ export function styled( Component: React.ComponentType -) { +): ( + styler: Styler +) => React.ComponentType & Props> { function makeStyledComponent( styler: Styler ): React.ComponentType & Props> { function addName

& Props>( StyledComponent: React.ComponentType

- ) { + ): React.ComponentType

{ // Use optional chaining to handle circular dependencies where Component // may be undefined during module loading. StyledComponent.displayName = @@ -65,7 +75,7 @@ export function styled( if (typeof rv === 'function') { const stylerNarrowed = styler as ( theme: Theme - ) => (props: Props) => ValidStyles | ValidStyles[] + ) => (props: Props) => DynamicStyles | DynamicStyles[] return addName(function StyledComponent(props) { const theme = useTheme() const style = stylerNarrowed(theme)(props) @@ -110,7 +120,12 @@ export function styled( export function styledWithRef( Component: React.ComponentType -) { +): ( + styler: Styler +) => React.ForwardRefExoticComponent< + React.PropsWithoutRef & Props> & + React.RefAttributes +> { type RefAttribute = React.RefAttributes type PropsWithoutStyle = Omit @@ -138,7 +153,7 @@ export function styledWithRef( if (typeof rv === 'function') { const stylerNarrowed = styler as ( theme: Theme - ) => (props: Props) => ValidStyles | ValidStyles[] + ) => (props: Props) => DynamicStyles | DynamicStyles[] return addName( React.forwardRef( function StyledComponent(props, ref) { diff --git a/src/components/icons/BestRateBadge.tsx b/src/components/icons/BestRateBadge.tsx index 734baabc980..54b6010df90 100644 --- a/src/components/icons/BestRateBadge.tsx +++ b/src/components/icons/BestRateBadge.tsx @@ -56,7 +56,7 @@ export const BestRateBadge: React.FC = () => { height={svgHeight} viewBox={`0 0 ${svgWidth} ${svgHeight}`} style={[ - StyleSheet.absoluteFillObject, + StyleSheet.absoluteFill, { top: -theme.rem(0.75), left: -theme.rem(0.75), diff --git a/src/components/navigation/HeaderBackground.tsx b/src/components/navigation/HeaderBackground.tsx index 0b698cb62f4..fea8dea75aa 100644 --- a/src/components/navigation/HeaderBackground.tsx +++ b/src/components/navigation/HeaderBackground.tsx @@ -14,7 +14,7 @@ import { useTheme } from '../services/ThemeContext' import { DividerLine } from '../themed/DividerLine' import { MAX_TAB_BAR_HEIGHT } from '../themed/MenuTabs' -export const HeaderBackground = (props: any) => { +export const HeaderBackground = (props: any): React.JSX.Element => { const theme = useTheme() const scrollY = useSceneScrollContext(state => state.scrollY) @@ -36,7 +36,7 @@ const HeaderBackgroundContainerView = styled(Animated.View)<{ scrollY: SharedValue }>(() => ({ scrollY }) => [ { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, alignItems: 'stretch', justifyContent: 'flex-end', opacity: 0 diff --git a/src/components/scenes/GiftCardMarketScene.tsx b/src/components/scenes/GiftCardMarketScene.tsx index 54eec5f82cb..12baf7c1a47 100644 --- a/src/components/scenes/GiftCardMarketScene.tsx +++ b/src/components/scenes/GiftCardMarketScene.tsx @@ -661,7 +661,7 @@ const getStyles = cacheStyles((theme: Theme) => ({ flexShrink: 0 }, viewToggleGradient: { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, borderRadius: theme.rem(1) }, tileContainer: { diff --git a/src/components/themed/FioRequestRow.tsx b/src/components/themed/FioRequestRow.tsx index 0f54ab6052c..f0ff9d2eed4 100644 --- a/src/components/themed/FioRequestRow.tsx +++ b/src/components/themed/FioRequestRow.tsx @@ -52,38 +52,40 @@ type Props = OwnProps & StateProps & ThemeProps class FioRequestRowComponent extends React.PureComponent { rowRef = React.createRef() - closeRow = () => { + closeRow = (): void => { if (this.rowRef.current != null) this.rowRef.current.close() } - onPress = () => { + onPress = (): void => { const { onPress, fioRequest } = this.props - onPress(fioRequest)?.catch(err => { + onPress(fioRequest)?.catch((err: unknown) => { showError(err) }) this.closeRow() } - onSwipe = () => { + onSwipe = (): void => { const { onSwipe, fioRequest } = this.props onSwipe(fioRequest) - .catch(err => { + .catch((err: unknown) => { showError(err) }) .finally(this.closeRow) } - requestedField = () => { + requestedField = (): React.JSX.Element => { const { displayDenomination, fioRequest, theme } = this.props const styles = getStyles(theme) const name = - displayDenomination.name || fioRequest.content.token_code.toUpperCase() + displayDenomination.name !== '' + ? displayDenomination.name + : fioRequest.content.token_code.toUpperCase() const value = `${lstrings.title_fio_requested} ${name}` return {value} } - showStatus = (status: FioRequestStatus) => { + showStatus = (status: FioRequestStatus): React.JSX.Element => { const { theme } = this.props const styles = getStyles(theme) @@ -103,7 +105,7 @@ class FioRequestRowComponent extends React.PureComponent { ) } - render() { + render(): React.JSX.Element { const { displayDenomination, exchangeDenomination, @@ -132,7 +134,7 @@ class FioRequestRowComponent extends React.PureComponent { ? fioRequest.time_stamp : `${fioRequest.time_stamp}Z` const dateValue = `${formatTime(new Date(safeDate))} ${ - fioRequest.content.memo ? `- ${fioRequest.content.memo}` : '' + fioRequest.content.memo !== '' ? `- ${fioRequest.content.memo}` : '' }` return ( ({ color: theme.deactivatedText }, underlay: { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, backgroundColor: theme.sliderTabSend, flexDirection: 'row', justifyContent: 'flex-end' @@ -289,10 +291,11 @@ export const FioRequestRow = connect( } const fiatSymbol = getFiatSymbol(removeIsoPrefix(defaultIsoFiat)) - const fiatAmount = - formatNumber(mul(fiatPerCrypto, fioRequest.content.amount), { - toFixed: 2 - }) || '0' + const fiatAmountFormatted = formatNumber( + mul(fiatPerCrypto, fioRequest.content.amount), + { toFixed: 2 } + ) + const fiatAmount = fiatAmountFormatted !== '' ? fiatAmountFormatted : '0' return { exchangeDenomination, diff --git a/src/components/themed/MenuTabs.tsx b/src/components/themed/MenuTabs.tsx index 049b01201c9..2149f6d69f1 100644 --- a/src/components/themed/MenuTabs.tsx +++ b/src/components/themed/MenuTabs.tsx @@ -66,7 +66,7 @@ const title: Readonly> = { devTab: lstrings.title_dev_tab } -export const MenuTabs = (props: BottomTabBarProps) => { +export const MenuTabs = (props: BottomTabBarProps): React.JSX.Element => { const { navigation, state } = props const theme = useTheme() const activeTabFullIndex = state.index @@ -176,7 +176,7 @@ const Background = styled(Animated.View)<{ }>(() => ({ footerHeight: footerHeightRef, openRatio, tabLabelHeight }) => { return [ { - ...StyleSheet.absoluteFillObject + ...StyleSheet.absoluteFill }, useAnimatedStyle(() => { const openRatioInverted = interpolate(openRatio.value, [0, 1], [1, 0]) @@ -230,7 +230,7 @@ const Tab = ({ route: BottomTabBarProps['state']['routes'][number] footerOpenRatio: SharedValue navigation: NavigationHelpers -}) => { +}): React.JSX.Element => { const theme = useTheme() const insets = useSafeAreaInsets() const color = isActive ? theme.tabBarIconHighlighted : theme.tabBarIcon @@ -262,7 +262,7 @@ const Tab = ({ switch (route.name) { case 'home': setTimeout(() => { - writeDefaultScreen('home').catch(e => { + writeDefaultScreen('home').catch(() => { console.error('Failed to write defaultScreen setting: home') }) }, SAVE_DEFAULT_SCREEN_DELAY) @@ -270,7 +270,7 @@ const Tab = ({ return case 'walletsTab': setTimeout(() => { - writeDefaultScreen('assets').catch(e => { + writeDefaultScreen('assets').catch(() => { console.error('Failed to write defaultScreen setting: assets') }) }, SAVE_DEFAULT_SCREEN_DELAY) diff --git a/src/components/themed/SafeSlider.tsx b/src/components/themed/SafeSlider.tsx index 6d5cc5911ce..8e83f5c56ba 100644 --- a/src/components/themed/SafeSlider.tsx +++ b/src/components/themed/SafeSlider.tsx @@ -189,7 +189,7 @@ const getStyles = cacheStyles((theme: Theme) => ({ backgroundColor: theme.confirmationThumbDeactivated }, progress: { - ...StyleSheet.absoluteFillObject, + ...StyleSheet.absoluteFill, backgroundColor: theme.confirmationSlider, borderRadius: theme.confirmationSliderThumbWidth / 2 }, diff --git a/src/util/borrowUtils.ts b/src/util/borrowUtils.ts index 8c6f4d6b9bd..87774ea2066 100644 --- a/src/util/borrowUtils.ts +++ b/src/util/borrowUtils.ts @@ -25,7 +25,6 @@ export const useTotalFiatAmount = ( const defaultIsoFiat = useSelector(state => state.ui.settings.defaultIsoFiat) return React.useMemo(() => { - // @ts-expect-error return borrowArray.reduce((total, obj) => { const { currencyCode, denominations } = obj.tokenId == null ? currencyInfo : allTokens[obj.tokenId] ?? {} diff --git a/tsconfig.json b/tsconfig.json index 6aa28d2b17c..a3510044b94 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@react-native/typescript-config/tsconfig.json", + "extends": "@react-native/typescript-config", "compilerOptions": { "allowJs": false, "noEmit": true From f7cfbff3c78e82e59284d9b1a6a6db947b00e095 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 29 Jun 2026 15:18:13 -0700 Subject: [PATCH 03/37] Android: build under React Native 0.86 with the new architecture Enable newArchEnabled, bump compile/target SDK 35->36, and rewrite settings.gradle for Expo SDK 56 autolinking. Unwrap MainApplication from the ReactNativeHostWrapper removed in SDK 56. Co-Authored-By: Claude Opus 4.8 --- android/app/build.gradle | 8 ++++ .../java/co/edgesecure/app/MainApplication.kt | 32 ++++++-------- android/build.gradle | 2 +- android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 44 ++++++++++++++++--- 6 files changed, 62 insertions(+), 28 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index f9e22b0d811..c49ecdce0f0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -91,6 +91,14 @@ android { compileSdk rootProject.ext.compileSdkVersion namespace "co.edgesecure.app" + + lint { + // Release lint (lintVital) OOMs on this large project and isn't needed + // for benchmark/release APKs; CI runs lint separately. + checkReleaseBuilds false + abortOnError false + } + defaultConfig { applicationId "co.edgesecure.app" minSdkVersion rootProject.ext.minSdkVersion diff --git a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt index 28e44718e40..a4350bbde8d 100644 --- a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt +++ b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt @@ -15,7 +15,6 @@ import com.facebook.react.soloader.OpenSourceMergedSoMapping import com.facebook.soloader.SoLoader import expo.modules.ApplicationLifecycleDispatcher.onApplicationCreate import expo.modules.ApplicationLifecycleDispatcher.onConfigurationChanged -import expo.modules.ReactNativeHostWrapper import io.sentry.Hint import io.sentry.SentryEvent import io.sentry.SentryLevel @@ -27,26 +26,23 @@ class MainApplication : Application(), ReactApplication { override val reactNativeHost: ReactNativeHost = - ReactNativeHostWrapper( - this, - object : DefaultReactNativeHost(this) { - override fun getPackages(): List { - // Packages that cannot be autolinked yet can be added manually here, for - // example: - // packages.add(new MyReactNativePackage()); - val packages = PackageList(this).packages - packages.add(EdgeAttestationPackage()) - return packages - } + object : DefaultReactNativeHost(this) { + override fun getPackages(): List { + // Packages that cannot be autolinked yet can be added manually here, for + // example: + // packages.add(new MyReactNativePackage()); + val packages = PackageList(this).packages + packages.add(EdgeAttestationPackage()) + return packages + } - override fun getJSMainModuleName(): String = "index" + override fun getJSMainModuleName(): String = "index" - override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - }, - ) + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } override val reactHost: ReactHost get() = getDefaultReactHost(applicationContext, reactNativeHost) diff --git a/android/build.gradle b/android/build.gradle index 3c5b50cf44e..748981fd3d6 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - buildToolsVersion = "35.0.0" + buildToolsVersion = "36.1.0" minSdkVersion = 28 // Edge modified from 21 compileSdkVersion = 36 targetSdkVersion = 36 diff --git a/android/gradle.properties b/android/gradle.properties index 3d5def77fc2..8f810774c02 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -10,7 +10,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m +org.gradle.jvmargs=-Xmx6g -XX:MaxMetaspaceSize=1g # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 37f853b1c84..37f78a6af83 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/settings.gradle b/android/settings.gradle index f297a99f521..d0e2180cfdf 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,9 +1,39 @@ -pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } -plugins { id("com.facebook.react.settings") } -extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() } +pluginManagement { + def reactNativeGradlePlugin = new File( + providers.exec { + workingDir(rootDir) + commandLine("node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })") + }.standardOutput.asText.get().trim() + ).getParentFile().absolutePath + includeBuild(reactNativeGradlePlugin) + + def expoPluginsPath = new File( + providers.exec { + workingDir(rootDir) + commandLine("node", "--print", "require.resolve('expo-modules-autolinking/package.json', { paths: [require.resolve('expo/package.json')] })") + }.standardOutput.asText.get().trim(), + "../android/expo-gradle-plugin" + ).absolutePath + includeBuild(expoPluginsPath) +} + +plugins { + id("com.facebook.react.settings") + id("expo-autolinking-settings") +} + +extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> + if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') { + ex.autolinkLibrariesFromCommand() + } else { + ex.autolinkLibrariesFromCommand(expoAutolinking.rnConfigCommand) + } +} +expoAutolinking.useExpoModules() + rootProject.name = 'co.edgesecure.app' -include ':app' -includeBuild('../node_modules/@react-native/gradle-plugin') -apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle") -useExpoModules() +expoAutolinking.useExpoVersionCatalog() + +include ':app' +includeBuild(expoAutolinking.reactNativeGradlePlugin) From 245323a0eb7091f2dd4c56547f303136ba364cdb Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 29 Jun 2026 15:18:13 -0700 Subject: [PATCH 04/37] iOS: build and run under React Native 0.86 / Expo SDK 57 / Xcode 26 Expo autolinking + new-architecture Podfile (deployment target 16.4 - Expo SDK 57's floor; React Native 0.86 itself only needs 15.1), the ExpoReactNativeFactory AppDelegate, and RCTNewArchEnabled in Info.plist. Includes the build fixes needed under Xcode 26. Co-Authored-By: Claude Opus 4.8 --- ios/Podfile | 52 +- ios/Podfile.lock | 2112 +++++++++++++++------------- ios/edge.xcodeproj/project.pbxproj | 59 +- ios/edge/AppDelegate.swift | 14 +- ios/edge/Info.plist | 10 +- 5 files changed, 1214 insertions(+), 1033 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index b12c435ed45..5b095d72347 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -13,11 +13,21 @@ require_relative '../node_modules/react-native-permissions/scripts/setup' $RNFirebaseAnalyticsWithoutAdIdSupport = true $RNFirebaseAsStaticFramework = true -# The min_ios_version_supported is iOS 13.4 for RN 74: -# However any device that can use iOS 13.4 can also upgrade to iOS 15.6 which -# is still supported by the latest version of Xcode for debugging -ios_platform_version = '15.6' +# Expo SDK 57 requires a minimum deployment target of iOS 16.4 +# (React Native 0.86 itself only needs 15.1). +ios_platform_version = '16.4' platform :ios, ios_platform_version + +# Pin the React/Hermes pairing so pod install is deterministic regardless of +# the machine's environment: Hermes V1 (the RN/Expo default engine, and what +# Edge already ships) with React-Core built from source. Do NOT enable +# RCT_USE_PREBUILT_RNCORE: the 0.86.0 prebuilt React-Core binary is built +# against the non-V1 jsi ABI (jsi::Runtime vs V1's jsi::IRuntime), and pairing +# it with the V1 hermesvm artifact crashes at launch with +# "Symbol not found: facebook::jsi::Array::createWithElements". +ENV['RCT_USE_PREBUILT_RNCORE'] = '0' +ENV['RCT_HERMES_V1_ENABLED'] = '1' + prepare_react_native_project! # Edge addition: @@ -44,7 +54,25 @@ target 'edge' do Pod::UI.warn e end end - config = use_native_modules! + # Expo SDK 56 autolinking: feed expo's unified native-module config (which + # registers ExpoModulesCore + expo modules + RN community modules) into + # use_native_modules!. + if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1' + config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"] + else + config_command = [ + 'node', + '--no-warnings', + '--eval', + 'require(\'expo/bin/autolinking\')', + 'expo-modules-autolinking', + 'react-native-config', + '--json', + '--platform', + 'ios' + ] + end + config = use_native_modules!(config_command) use_react_native!( :path => config[:reactNativePath], @@ -61,6 +89,20 @@ target 'edge' do target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = ios_platform_version + # Allow non-modular includes (e.g. @react-native-firebase headers that + # include ) under use_frameworks! + Xcode 26's strict + # explicit-modules scanning, which otherwise errors on RNFBApp. + config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES' + + # @react-native-firebase wrappers import React/Firebase headers + # textually (#import, not @import). Under clang modules + use_frameworks + # on Xcode 26 this fails ("RCTPromiseRejectBlock must be imported from + # module RNFBApp.RNFBAppModule"). Build the RNFB pods without modules so + # their textual imports resolve directly. + if target.name.start_with?('RNFB') + config.build_settings['CLANG_ENABLE_MODULES'] = 'NO' + end + # Xcode 17+ / iOS 26 SDK workaround: Re-enable std::allocator # which was removed for stricter C++ standard compliance. # See: https://github.com/getsentry/sentry-cocoa/issues/5172 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index c3abca5d09a..edd5479c987 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,6 +1,5 @@ PODS: - _NIODataStructures (2.40.0) - - boost (1.84.0) - BVLinearGradient (2.8.3): - React-Core - CGRPCZlib (1.8.0) @@ -14,7 +13,6 @@ PODS: - CNIOWindows (2.40.0) - disklet (0.6.0): - React - - DoubleConversion (1.1.6) - edge-core-js (2.48.1): - React-Core - edge-currency-accountbased (4.90.1): @@ -25,14 +23,12 @@ PODS: - React-Core - edge-login-ui-rn (3.37.2): - React-Core - - EXConstants (17.1.7): + - EXConstants (57.0.6): - ExpoModulesCore - - Expo (53.0.20): - - DoubleConversion + - Expo (57.0.7): - ExpoModulesCore - - glog + - ExpoModulesJSI - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -40,7 +36,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -53,20 +48,23 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - ExpoAsset (11.1.7): + - ExpoAsset (57.0.6): + - ExpoModulesCore + - ExpoDomWebView (57.0.1): - ExpoModulesCore - - ExpoFileSystem (18.1.11): + - ExpoFileSystem (57.0.1): - ExpoModulesCore - - ExpoFont (13.3.2): + - ExpoFont (57.0.1): - ExpoModulesCore - - ExpoKeepAwake (14.1.4): + - ExpoKeepAwake (57.0.1): - ExpoModulesCore - - ExpoModulesCore (2.5.0): - - DoubleConversion - - glog + - ExpoLogBox (57.0.1): + - React-Core + - ExpoModulesCore (57.0.6): + - ExpoModulesJSI - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -74,7 +72,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-jsinspector @@ -86,67 +83,74 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga + - ExpoModulesJSI (57.0.3): + - React-Core + - ReactCommon + - ExpoModulesWorklets (57.0.6): + - ExpoModulesCore + - ExpoModulesJSI + - ExpoModulesWorkletsAdapter (57.0.6): + - ExpoModulesCore + - ExpoModulesJSI + - ExpoModulesWorklets + - RNWorklets - ExpoQuickActions (5.0.0): - ExpoModulesCore - - fast_float (6.1.4) - - FBLazyVector (0.79.2) - - Firebase/CoreOnly (10.29.0): - - FirebaseCore (= 10.29.0) - - Firebase/Messaging (10.29.0): + - FBLazyVector (0.86.0) + - Firebase/CoreOnly (12.15.0): + - FirebaseCore (~> 12.15.0) + - Firebase/Messaging (12.15.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 10.29.0) - - FirebaseCore (10.29.0): - - FirebaseCoreInternal (~> 10.0) - - GoogleUtilities/Environment (~> 7.12) - - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreExtension (10.29.0): - - FirebaseCore (~> 10.0) - - FirebaseCoreInternal (10.29.0): - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseInstallations (10.29.0): - - FirebaseCore (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - PromisesObjC (~> 2.1) - - FirebaseMessaging (10.29.0): - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleDataTransport (~> 9.3) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/Reachability (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - nanopb (< 2.30911.0, >= 2.30908.0) - - fmt (11.0.2) - - glog (0.3.5) - - GoogleDataTransport (9.4.1): - - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30911.0, >= 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.13.3): + - FirebaseMessaging (~> 12.15.0) + - FirebaseCore (12.15.0): + - FirebaseCoreInternal (~> 12.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (12.15.0): + - FirebaseCore (~> 12.15.0) + - FirebaseCoreInternal (12.15.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseInstallations (12.15.0): + - FirebaseCore (~> 12.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (12.15.0): + - FirebaseCore (~> 12.15.0) + - FirebaseInstallations (~> 12.15.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleUtilities/AppDelegateSwizzler (8.1.2): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - GoogleUtilities/Privacy - - GoogleUtilities/Environment (7.13.3): + - GoogleUtilities/Environment (8.1.2): - GoogleUtilities/Privacy - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.13.3): + - GoogleUtilities/Logger (8.1.2): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - GoogleUtilities/Network (7.13.3): + - GoogleUtilities/Network (8.1.2): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.13.3)": + - "GoogleUtilities/NSData+zlib (8.1.2)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (7.13.3) - - GoogleUtilities/Reachability (7.13.3): + - GoogleUtilities/Privacy (8.1.2) + - GoogleUtilities/Reachability (8.1.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (7.13.3): + - GoogleUtilities/UserDefaults (8.1.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - gRPC-Swift (1.8.0): @@ -158,9 +162,9 @@ PODS: - SwiftNIOSSL (< 3.0.0, >= 2.14.0) - SwiftNIOTransportServices (< 2.0.0, >= 1.11.1) - SwiftProtobuf (< 2.0.0, >= 1.19.0) - - hermes-engine (0.79.2): - - hermes-engine/Pre-built (= 0.79.2) - - hermes-engine/Pre-built (0.79.2) + - hermes-engine (250829098.0.14): + - hermes-engine/Pre-built (= 250829098.0.14) + - hermes-engine/Pre-built (250829098.0.14) - ImageColors (2.4.0): - ExpoModulesCore - libwebp (1.5.0): @@ -177,74 +181,56 @@ PODS: - libwebp/sharpyuv - Logging (1.4.0) - MnemonicSwift (2.2.4) - - nanopb (2.30910.0): - - nanopb/decode (= 2.30910.0) - - nanopb/encode (= 2.30910.0) - - nanopb/decode (2.30910.0) - - nanopb/encode (2.30910.0) - - OpenSSL-Universal (3.3.3001) - - PromisesObjC (2.4.0) - - 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.79.2) - - RCTRequired (0.79.2) - - RCTTypeSafety (0.79.2): - - FBLazyVector (= 0.79.2) - - RCTRequired (= 0.79.2) - - React-Core (= 0.79.2) - - React (0.79.2): - - React-Core (= 0.79.2) - - React-Core/DevSupport (= 0.79.2) - - React-Core/RCTWebSocket (= 0.79.2) - - React-RCTActionSheet (= 0.79.2) - - React-RCTAnimation (= 0.79.2) - - React-RCTBlob (= 0.79.2) - - React-RCTImage (= 0.79.2) - - React-RCTLinking (= 0.79.2) - - React-RCTNetwork (= 0.79.2) - - React-RCTSettings (= 0.79.2) - - React-RCTText (= 0.79.2) - - React-RCTVibration (= 0.79.2) - - React-callinvoker (0.79.2) - - React-Core (0.79.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - OpenSSL-Universal (3.6.2000) + - PromisesObjC (2.4.1) + - RCTDeprecation (0.86.0) + - RCTRequired (0.86.0) + - RCTSwiftUI (0.86.0) + - RCTSwiftUIWrapper (0.86.0): + - RCTSwiftUI + - RCTTypeSafety (0.86.0): + - FBLazyVector (= 0.86.0) + - RCTRequired (= 0.86.0) + - React-Core (= 0.86.0) + - React (0.86.0): + - React-Core (= 0.86.0) + - React-Core/DevSupport (= 0.86.0) + - React-Core/RCTWebSocket (= 0.86.0) + - React-RCTActionSheet (= 0.86.0) + - React-RCTAnimation (= 0.86.0) + - React-RCTBlob (= 0.86.0) + - React-RCTImage (= 0.86.0) + - React-RCTLinking (= 0.86.0) + - React-RCTNetwork (= 0.86.0) + - React-RCTSettings (= 0.86.0) + - React-RCTText (= 0.86.0) + - React-RCTVibration (= 0.86.0) + - React-callinvoker (0.86.0) + - React-Core (0.86.0): + - hermes-engine - RCTDeprecation - - React-Core/Default (= 0.79.2) + - React-Core/Default (= 0.86.0) - 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 (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/CoreModulesHeaders (0.79.2): - - glog + - React-Core/CoreModulesHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -253,16 +239,16 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/Default (0.79.2): - - glog + - React-Core/Default (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-cxxreact - React-featureflags @@ -270,35 +256,35 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/DevSupport (0.79.2): - - glog + - React-Core/DevSupport (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - - React-Core/Default (= 0.79.2) - - React-Core/RCTWebSocket (= 0.79.2) + - React-Core/Default (= 0.86.0) + - React-Core/RCTWebSocket (= 0.86.0) - 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 (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTActionSheetHeaders (0.79.2): - - glog + - React-Core/RCTActionSheetHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -307,16 +293,16 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTAnimationHeaders (0.79.2): - - glog + - React-Core/RCTAnimationHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -325,16 +311,16 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTBlobHeaders (0.79.2): - - glog + - React-Core/RCTBlobHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -343,16 +329,16 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTImageHeaders (0.79.2): - - glog + - React-Core/RCTImageHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -361,16 +347,16 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTLinkingHeaders (0.79.2): - - glog + - React-Core/RCTLinkingHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -379,16 +365,16 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTNetworkHeaders (0.79.2): - - glog + - React-Core/RCTNetworkHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -397,16 +383,16 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTSettingsHeaders (0.79.2): - - glog + - React-Core/RCTSettingsHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -415,16 +401,16 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTTextHeaders (0.79.2): - - glog + - React-Core/RCTTextHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -433,16 +419,16 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTVibrationHeaders (0.79.2): - - glog + - React-Core/RCTVibrationHeaders (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - React-Core/Default - React-cxxreact @@ -451,154 +437,154 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTWebSocket (0.79.2): - - glog + - React-Core/RCTWebSocket (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - - React-Core/Default (= 0.79.2) + - React-Core/Default (= 0.86.0) - 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 (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-CoreModules (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety (= 0.79.2) - - React-Core/CoreModulesHeaders (= 0.79.2) - - React-jsi (= 0.79.2) + - React-CoreModules (0.86.0): + - RCTTypeSafety (= 0.86.0) + - React-Core/CoreModulesHeaders (= 0.86.0) + - React-debug + - React-featureflags + - React-jsi (= 0.86.0) - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - React-NativeModulesApple - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.79.2) + - React-RCTImage (= 0.86.0) + - React-runtimeexecutor + - React-utils - ReactCommon - - SocketRocket (= 0.7.1) - - React-cxxreact (0.79.2): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.2) - - React-debug (= 0.79.2) - - React-jsi (= 0.79.2) + - ReactNativeDependencies + - React-cxxreact (0.86.0): + - hermes-engine + - React-callinvoker (= 0.86.0) + - React-debug (= 0.86.0) + - React-jsi (= 0.86.0) - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.79.2) - - React-perflogger (= 0.79.2) - - React-runtimeexecutor (= 0.79.2) - - React-timing (= 0.79.2) - - React-debug (0.79.2) - - React-defaultsnativemodule (0.79.2): - - hermes-engine - - RCT-Folly + - React-logger (= 0.86.0) + - React-perflogger (= 0.86.0) + - React-runtimeexecutor + - React-timing (= 0.86.0) + - React-utils + - ReactNativeDependencies + - React-debug (0.86.0): + - React-debug/redbox (= 0.86.0) + - React-debug/redbox (0.86.0) + - React-defaultsnativemodule (0.86.0): + - hermes-engine - React-domnativemodule + - React-Fabric/animated + - React-featureflags - React-featureflagsnativemodule - - React-hermes - React-idlecallbacksnativemodule + - React-intersectionobservernativemodule - React-jsi - React-jsiexecutor - React-microtasksnativemodule + - React-mutationobservernativemodule - React-RCTFBReactNativeSpec - - React-domnativemodule (0.79.2): + - React-viewtransitionnativemodule + - React-webperformancenativemodule + - ReactNativeDependencies + - Yoga + - React-domnativemodule (0.86.0): - hermes-engine - - RCT-Folly - React-Fabric + - React-Fabric/bridging - React-FabricComponents - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec + - React-runtimeexecutor - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-Fabric (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-Fabric (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug - - React-Fabric/animations (= 0.79.2) - - React-Fabric/attributedstring (= 0.79.2) - - React-Fabric/componentregistry (= 0.79.2) - - React-Fabric/componentregistrynative (= 0.79.2) - - React-Fabric/components (= 0.79.2) - - React-Fabric/consistency (= 0.79.2) - - React-Fabric/core (= 0.79.2) - - React-Fabric/dom (= 0.79.2) - - React-Fabric/imagemanager (= 0.79.2) - - React-Fabric/leakchecker (= 0.79.2) - - React-Fabric/mounting (= 0.79.2) - - React-Fabric/observers (= 0.79.2) - - React-Fabric/scheduler (= 0.79.2) - - React-Fabric/telemetry (= 0.79.2) - - React-Fabric/templateprocessor (= 0.79.2) - - React-Fabric/uimanager (= 0.79.2) + - React-Fabric/animated (= 0.86.0) + - React-Fabric/animationbackend (= 0.86.0) + - React-Fabric/animations (= 0.86.0) + - React-Fabric/attributedstring (= 0.86.0) + - React-Fabric/bridging (= 0.86.0) + - React-Fabric/componentregistry (= 0.86.0) + - React-Fabric/componentregistrynative (= 0.86.0) + - React-Fabric/components (= 0.86.0) + - React-Fabric/consistency (= 0.86.0) + - React-Fabric/core (= 0.86.0) + - React-Fabric/dom (= 0.86.0) + - React-Fabric/imagemanager (= 0.86.0) + - React-Fabric/leakchecker (= 0.86.0) + - React-Fabric/mounting (= 0.86.0) + - React-Fabric/observers (= 0.86.0) + - React-Fabric/scheduler (= 0.86.0) + - React-Fabric/telemetry (= 0.86.0) + - React-Fabric/uimanager (= 0.86.0) + - React-Fabric/viewtransition (= 0.86.0) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/animations (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/animated (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric/animationbackend - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/animationbackend (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -606,21 +592,17 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/animations (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -628,21 +610,17 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/attributedstring (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -650,47 +628,35 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/bridging (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.79.2) - - React-Fabric/components/root (= 0.79.2) - - React-Fabric/components/scrollview (= 0.79.2) - - React-Fabric/components/view (= 0.79.2) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/componentregistry (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -698,21 +664,17 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/componentregistrynative (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -720,43 +682,93 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/scrollview (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/components (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.86.0) + - React-Fabric/components/root (= 0.86.0) + - React-Fabric/components/scrollview (= 0.86.0) + - React-Fabric/components/view (= 0.86.0) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/components/legacyviewmanagerinterop (0.86.0): + - hermes-engine + - 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 + - ReactNativeDependencies + - React-Fabric/components/root (0.86.0): + - hermes-engine + - 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 + - ReactNativeDependencies + - React-Fabric/components/scrollview (0.86.0): + - hermes-engine + - 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 + - ReactNativeDependencies + - React-Fabric/components/view (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -764,23 +776,19 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-renderercss - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-Fabric/consistency (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-Fabric/consistency (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -788,21 +796,17 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/core (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/core (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -810,21 +814,17 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/dom (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/dom (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -832,21 +832,17 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/imagemanager (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -854,21 +850,17 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/leakchecker (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -876,21 +868,17 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/mounting (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -898,44 +886,75 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor + - React-jsinspectortracing - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/observers (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug - - React-Fabric/observers/events (= 0.79.2) + - React-Fabric/observers/events (= 0.86.0) + - React-Fabric/observers/intersection (= 0.86.0) + - React-Fabric/observers/mutation (= 0.86.0) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers/events (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/observers/events (0.86.0): + - hermes-engine + - 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 + - ReactNativeDependencies + - React-Fabric/observers/intersection (0.86.0): + - hermes-engine + - 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 + - ReactNativeDependencies + - React-Fabric/observers/mutation (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -943,45 +962,40 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/scheduler (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric/animationbackend - React-Fabric/observers/events + - React-Fabric/viewtransition - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-performancecdpmetrics - React-performancetimeline - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/telemetry (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -989,67 +1003,56 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/uimanager (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug + - React-Fabric/uimanager/consistency (= 0.86.0) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-rendererconsistency - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/uimanager/consistency (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.79.2) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererconsistency - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/viewtransition (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1057,81 +1060,70 @@ PODS: - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - - React-rendererconsistency - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-FabricComponents (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-FabricComponents (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components (= 0.79.2) - - React-FabricComponents/textlayoutmanager (= 0.79.2) + - React-FabricComponents/components (= 0.86.0) + - React-FabricComponents/textlayoutmanager (= 0.86.0) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.79.2) - - React-FabricComponents/components/iostextinput (= 0.79.2) - - React-FabricComponents/components/modal (= 0.79.2) - - React-FabricComponents/components/rncore (= 0.79.2) - - React-FabricComponents/components/safeareaview (= 0.79.2) - - React-FabricComponents/components/scrollview (= 0.79.2) - - React-FabricComponents/components/text (= 0.79.2) - - React-FabricComponents/components/textinput (= 0.79.2) - - React-FabricComponents/components/unimplementedview (= 0.79.2) + - React-FabricComponents/components/inputaccessory (= 0.86.0) + - React-FabricComponents/components/iostextinput (= 0.86.0) + - React-FabricComponents/components/modal (= 0.86.0) + - React-FabricComponents/components/rncore (= 0.86.0) + - React-FabricComponents/components/safeareaview (= 0.86.0) + - React-FabricComponents/components/scrollview (= 0.86.0) + - React-FabricComponents/components/switch (= 0.86.0) + - React-FabricComponents/components/text (= 0.86.0) + - React-FabricComponents/components/textinput (= 0.86.0) + - React-FabricComponents/components/unimplementedview (= 0.86.0) + - React-FabricComponents/components/virtualview (= 0.86.0) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/inputaccessory (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/inputaccessory (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1140,22 +1132,18 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/iostextinput (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/iostextinput (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1164,22 +1152,18 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/modal (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/modal (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1188,22 +1172,18 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/rncore (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/rncore (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1212,22 +1192,18 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/safeareaview (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/safeareaview (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1236,22 +1212,18 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/scrollview (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/scrollview (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1260,22 +1232,18 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/text (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/switch (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1284,22 +1252,18 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/textinput (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/text (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1308,22 +1272,18 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/unimplementedview (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/textinput (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1332,22 +1292,18 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/textlayoutmanager (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/unimplementedview (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1356,165 +1312,227 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricImage (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/virtualview (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired (= 0.79.2) - - RCTTypeSafety (= 0.79.2) + - 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 + - ReactNativeDependencies + - Yoga + - React-FabricComponents/textlayoutmanager (0.86.0): + - hermes-engine + - 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 + - ReactNativeDependencies + - Yoga + - React-FabricImage (0.86.0): + - hermes-engine + - RCTRequired (= 0.86.0) + - RCTTypeSafety (= 0.86.0) - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.79.2) + - React-jsiexecutor (= 0.86.0) - React-logger - React-rendererdebug - React-utils - ReactCommon + - ReactNativeDependencies - Yoga - - React-featureflags (0.79.2): - - RCT-Folly (= 2024.11.18.00) - - React-featureflagsnativemodule (0.79.2): + - React-featureflags (0.86.0): + - ReactNativeDependencies + - React-featureflagsnativemodule (0.86.0): - hermes-engine - - RCT-Folly - React-featureflags - - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - React-graphics (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-graphics (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-hermes + - React-featureflags - React-jsi - React-jsiexecutor + - React-rendererdebug - React-utils - - React-hermes (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-hermes (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.2) + - React-cxxreact (= 0.86.0) - React-jsi - - React-jsiexecutor (= 0.79.2) + - React-jsiexecutor (= 0.86.0) - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - - React-perflogger (= 0.79.2) + - React-jsitooling + - React-oscompat + - React-perflogger (= 0.86.0) - React-runtimeexecutor - - React-idlecallbacksnativemodule (0.79.2): - - glog + - ReactNativeDependencies + - React-idlecallbacksnativemodule (0.86.0): - hermes-engine - - RCT-Folly - - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec + - React-runtimeexecutor - React-runtimescheduler - ReactCommon/turbomodule/core - - React-ImageManager (0.79.2): - - glog - - RCT-Folly/Fabric + - ReactNativeDependencies + - React-ImageManager (0.86.0): - React-Core/Default - React-debug - React-Fabric - React-graphics - React-rendererdebug - React-utils - - React-jserrorhandler (0.79.2): - - glog + - ReactNativeDependencies + - React-intersectionobservernativemodule (0.86.0): + - hermes-engine + - React-cxxreact + - React-Fabric + - React-Fabric/bridging + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-jserrorhandler (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - React-cxxreact - React-debug - React-featureflags - React-jsi - ReactCommon/turbomodule/bridging - - React-jsi (0.79.2): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-jsiexecutor (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.2) - - React-jsi (= 0.79.2) + - ReactNativeDependencies + - React-jsi (0.86.0): + - hermes-engine + - ReactNativeDependencies + - React-jsiexecutor (0.86.0): + - hermes-engine + - React-cxxreact + - React-debug + - React-jserrorhandler + - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - - React-perflogger (= 0.79.2) - - React-jsinspector (0.79.2): - - DoubleConversion - - glog + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-jsinspector (0.86.0): - hermes-engine - - RCT-Folly - React-featureflags - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork - React-jsinspectortracing - - React-perflogger (= 0.79.2) - - React-runtimeexecutor (= 0.79.2) - - React-jsinspectortracing (0.79.2): - - RCT-Folly - React-oscompat - - React-jsitooling (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.2) - - React-jsi (= 0.79.2) + - React-perflogger (= 0.86.0) + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-jsinspectorcdp (0.86.0): + - ReactNativeDependencies + - React-jsinspectornetwork (0.86.0): + - React-jsinspectorcdp + - ReactNativeDependencies + - React-jsinspectortracing (0.86.0): + - hermes-engine + - React-jsi + - React-jsinspectornetwork + - React-oscompat + - React-timing + - React-utils + - ReactNativeDependencies + - React-jsitooling (0.86.0): + - hermes-engine + - React-cxxreact (= 0.86.0) + - React-debug + - React-jsi (= 0.86.0) - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - - React-jsitracing (0.79.2): + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-jsitracing (0.86.0): - React-jsi - - React-logger (0.79.2): - - glog - - React-Mapbuffer (0.79.2): - - glog + - React-logger (0.86.0): + - ReactNativeDependencies + - React-Mapbuffer (0.86.0): - React-debug - - React-microtasksnativemodule (0.79.2): + - ReactNativeDependencies + - React-microtasksnativemodule (0.86.0): - hermes-engine - - RCT-Folly - - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-mutationobservernativemodule (0.86.0): + - hermes-engine + - React-cxxreact + - React-Fabric + - React-Fabric/bridging + - React-Fabric/observers/mutation + - React-featureflags + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga - react-native-adservices (0.1.3): - React-Core - react-native-compat (2.21.6): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1522,7 +1540,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1533,12 +1550,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-contacts (8.0.10): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1546,7 +1561,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1557,14 +1571,12 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - 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 @@ -1572,7 +1584,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1583,14 +1594,12 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-in-app-review (4.3.5): - React-Core - - react-native-keyboard-controller (1.19.0): - - DoubleConversion - - glog + - react-native-keyboard-controller (1.22.2): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1598,10 +1607,9 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - - react-native-keyboard-controller/common (= 1.19.0) + - react-native-keyboard-controller/common (= 1.22.2) - React-NativeModulesApple - React-RCTFabric - React-renderercss @@ -1610,12 +1618,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-keyboard-controller/common (1.19.0): - - DoubleConversion - - glog + - react-native-keyboard-controller/common (1.22.2): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1623,7 +1629,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1634,18 +1639,35 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-mail (6.1.1): - React-Core - react-native-monero (0.5.0): - React-Core - - react-native-netinfo (11.4.1): + - react-native-netinfo (12.0.1): + - hermes-engine + - 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 + - ReactNativeDependencies + - Yoga - react-native-performance (5.1.4): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1653,7 +1675,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1664,6 +1685,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-piratechain (0.6.3): - gRPC-Swift (~> 1.8) @@ -1674,11 +1696,8 @@ PODS: - React-Core - react-native-safari-view (1.0.0): - React - - react-native-safe-area-context (5.6.1): - - DoubleConversion - - glog + - react-native-safe-area-context (5.7.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1686,11 +1705,10 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - - react-native-safe-area-context/common (= 5.6.1) - - react-native-safe-area-context/fabric (= 5.6.1) + - react-native-safe-area-context/common (= 5.7.0) + - react-native-safe-area-context/fabric (= 5.7.0) - React-NativeModulesApple - React-RCTFabric - React-renderercss @@ -1699,12 +1717,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-safe-area-context/common (5.6.1): - - DoubleConversion - - glog + - react-native-safe-area-context/common (5.7.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1712,7 +1728,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1723,12 +1738,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-safe-area-context/fabric (5.6.1): - - DoubleConversion - - glog + - react-native-safe-area-context/fabric (5.7.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1736,7 +1749,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - react-native-safe-area-context/common @@ -1748,12 +1760,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-webview (13.15.0): - - DoubleConversion - - glog + - react-native-webview (13.16.1): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1761,7 +1771,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1772,6 +1781,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-zano (0.5.1): - OpenSSL-Universal @@ -1781,43 +1791,57 @@ PODS: - MnemonicSwift (~> 2.2) - React-Core - SQLite.swift/standalone (~> 0.14) - - React-NativeModulesApple (0.79.2): - - glog + - React-NativeModulesApple (0.86.0): - hermes-engine - React-callinvoker - React-Core - React-cxxreact + - React-debug - React-featureflags - - React-hermes - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-runtimeexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-oscompat (0.79.2) - - React-perflogger (0.79.2): - - DoubleConversion - - RCT-Folly (= 2024.11.18.00) - - React-performancetimeline (0.79.2): - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact + - ReactNativeDependencies + - React-networking (0.86.0): + - React-jsinspectornetwork + - React-jsinspectortracing + - React-performancetimeline + - React-timing + - ReactNativeDependencies + - React-oscompat (0.86.0) + - React-perflogger (0.86.0): + - ReactNativeDependencies + - React-performancecdpmetrics (0.86.0): + - hermes-engine + - React-jsi + - React-performancetimeline + - React-runtimeexecutor + - React-timing + - ReactNativeDependencies + - React-performancetimeline (0.86.0): - React-featureflags + - React-jsinspector - React-jsinspectortracing - React-perflogger - React-timing - - React-RCTActionSheet (0.79.2): - - React-Core/RCTActionSheetHeaders (= 0.79.2) - - React-RCTAnimation (0.79.2): - - RCT-Folly (= 2024.11.18.00) + - ReactNativeDependencies + - React-RCTActionSheet (0.86.0): + - React-Core/RCTActionSheetHeaders (= 0.86.0) + - React-RCTAnimation (0.86.0): - RCTTypeSafety - React-Core/RCTAnimationHeaders + - React-debug + - React-featureflags - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTAppDelegate (0.79.2): + - ReactNativeDependencies + - React-RCTAppDelegate (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -1838,27 +1862,26 @@ PODS: - React-rendererdebug - React-RuntimeApple - React-RuntimeCore + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon - - React-RCTBlob (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) + - ReactNativeDependencies + - React-RCTBlob (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - React-Core/RCTBlobHeaders - React-Core/RCTWebSocket - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-NativeModulesApple - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - React-RCTFabric (0.79.2): - - glog + - ReactNativeDependencies + - React-RCTFabric (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTSwiftUIWrapper - React-Core - React-debug - React-Fabric @@ -1866,34 +1889,53 @@ PODS: - React-FabricImage - React-featureflags - React-graphics - - React-hermes - 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 + - ReactNativeDependencies - Yoga - - React-RCTFBReactNativeSpec (0.79.2): + - React-RCTFBReactNativeSpec (0.86.0): - hermes-engine - - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core - - React-hermes - React-jsi - - React-jsiexecutor - React-NativeModulesApple + - React-RCTFBReactNativeSpec/components (= 0.86.0) - ReactCommon - - React-RCTImage (0.79.2): - - RCT-Folly (= 2024.11.18.00) + - ReactNativeDependencies + - React-RCTFBReactNativeSpec/components (0.86.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon + - ReactNativeDependencies + - Yoga + - React-RCTImage (0.86.0): - RCTTypeSafety - React-Core/RCTImageHeaders - React-jsi @@ -1901,66 +1943,69 @@ PODS: - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - React-RCTLinking (0.79.2): - - React-Core/RCTLinkingHeaders (= 0.79.2) - - React-jsi (= 0.79.2) + - ReactNativeDependencies + - React-RCTLinking (0.86.0): + - React-Core/RCTLinkingHeaders (= 0.86.0) + - React-jsi (= 0.86.0) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.79.2) - - React-RCTNetwork (0.79.2): - - RCT-Folly (= 2024.11.18.00) + - ReactCommon/turbomodule/core (= 0.86.0) + - React-RCTNetwork (0.86.0): - RCTTypeSafety - React-Core/RCTNetworkHeaders + - React-debug + - React-featureflags - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork - React-NativeModulesApple + - React-networking - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTRuntime (0.79.2): - - glog + - ReactNativeDependencies + - React-RCTRuntime (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - React-Core - - React-hermes + - React-debug - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-RuntimeApple - React-RuntimeCore + - React-runtimeexecutor - React-RuntimeHermes - - React-RCTSettings (0.79.2): - - RCT-Folly (= 2024.11.18.00) + - React-utils + - ReactNativeDependencies + - React-RCTSettings (0.86.0): - RCTTypeSafety - React-Core/RCTSettingsHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTText (0.79.2): - - React-Core/RCTTextHeaders (= 0.79.2) + - ReactNativeDependencies + - React-RCTText (0.86.0): + - React-Core/RCTTextHeaders (= 0.86.0) - Yoga - - React-RCTVibration (0.79.2): - - RCT-Folly (= 2024.11.18.00) + - React-RCTVibration (0.86.0): - React-Core/RCTVibrationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-rendererconsistency (0.79.2) - - React-renderercss (0.79.2): + - ReactNativeDependencies + - React-rendererconsistency (0.86.0) + - React-renderercss (0.86.0): - React-debug - React-utils - - React-rendererdebug (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - RCT-Folly (= 2024.11.18.00) + - React-rendererdebug (0.86.0): - React-debug - - React-rncore (0.79.2) - - React-RuntimeApple (0.79.2): + - ReactNativeDependencies + - React-RuntimeApple (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - React-callinvoker - React-Core/Default - React-CoreModules @@ -1980,14 +2025,12 @@ PODS: - React-RuntimeHermes - React-runtimescheduler - React-utils - - React-RuntimeCore (0.79.2): - - glog + - ReactNativeDependencies + - React-RuntimeCore (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - React-cxxreact - React-Fabric - React-featureflags - - React-hermes - React-jserrorhandler - React-jsi - React-jsiexecutor @@ -1997,29 +2040,33 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - React-runtimeexecutor (0.79.2): - - React-jsi (= 0.79.2) - - React-RuntimeHermes (0.79.2): + - ReactNativeDependencies + - React-runtimeexecutor (0.86.0): + - React-debug + - React-featureflags + - React-jsi (= 0.86.0) + - React-utils + - ReactNativeDependencies + - React-RuntimeHermes (0.86.0): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - React-featureflags - React-hermes - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-jsitracing - React-RuntimeCore + - React-runtimeexecutor - React-utils - - React-runtimescheduler (0.79.2): - - glog + - ReactNativeDependencies + - React-runtimescheduler (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - React-callinvoker - React-cxxreact - React-debug - React-featureflags - - React-hermes - React-jsi - React-jsinspectortracing - React-performancetimeline @@ -2028,21 +2075,39 @@ PODS: - React-runtimeexecutor - React-timing - React-utils - - React-timing (0.79.2) - - React-utils (0.79.2): - - glog + - ReactNativeDependencies + - React-timing (0.86.0): + - React-debug + - React-utils (0.86.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - React-debug - - React-hermes - - React-jsi (= 0.79.2) - - ReactAppDependencyProvider (0.79.2): + - React-jsi (= 0.86.0) + - ReactNativeDependencies + - React-viewtransitionnativemodule (0.86.0): + - hermes-engine + - React-Fabric + - React-Fabric/bridging + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-webperformancenativemodule (0.86.0): + - hermes-engine + - React-cxxreact + - React-jsi + - React-jsiexecutor + - React-performancetimeline + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - ReactAppDependencyProvider (0.86.0): - ReactCodegen - - ReactCodegen (0.79.2): - - DoubleConversion - - glog + - ReactCodegen (0.86.0): - hermes-engine - - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core @@ -2051,7 +2116,6 @@ PODS: - React-FabricImage - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-NativeModulesApple @@ -2060,54 +2124,42 @@ PODS: - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactCommon (0.79.2): - - ReactCommon/turbomodule (= 0.79.2) - - ReactCommon/turbomodule (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.2) - - React-cxxreact (= 0.79.2) - - React-jsi (= 0.79.2) - - React-logger (= 0.79.2) - - React-perflogger (= 0.79.2) - - ReactCommon/turbomodule/bridging (= 0.79.2) - - ReactCommon/turbomodule/core (= 0.79.2) - - ReactCommon/turbomodule/bridging (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.2) - - React-cxxreact (= 0.79.2) - - React-jsi (= 0.79.2) - - React-logger (= 0.79.2) - - React-perflogger (= 0.79.2) - - ReactCommon/turbomodule/core (0.79.2): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.2) - - React-cxxreact (= 0.79.2) - - React-debug (= 0.79.2) - - React-featureflags (= 0.79.2) - - React-jsi (= 0.79.2) - - React-logger (= 0.79.2) - - React-perflogger (= 0.79.2) - - React-utils (= 0.79.2) + - ReactNativeDependencies + - ReactCommon (0.86.0): + - ReactCommon/turbomodule (= 0.86.0) + - ReactNativeDependencies + - ReactCommon/turbomodule (0.86.0): + - hermes-engine + - React-callinvoker (= 0.86.0) + - React-cxxreact (= 0.86.0) + - React-jsi (= 0.86.0) + - React-logger (= 0.86.0) + - React-perflogger (= 0.86.0) + - ReactCommon/turbomodule/bridging (= 0.86.0) + - ReactCommon/turbomodule/core (= 0.86.0) + - ReactNativeDependencies + - ReactCommon/turbomodule/bridging (0.86.0): + - hermes-engine + - React-callinvoker (= 0.86.0) + - React-cxxreact (= 0.86.0) + - React-jsi (= 0.86.0) + - React-logger (= 0.86.0) + - React-perflogger (= 0.86.0) + - ReactNativeDependencies + - ReactCommon/turbomodule/core (0.86.0): + - hermes-engine + - React-callinvoker (= 0.86.0) + - React-cxxreact (= 0.86.0) + - React-debug (= 0.86.0) + - React-featureflags (= 0.86.0) + - React-jsi (= 0.86.0) + - React-logger (= 0.86.0) + - React-perflogger (= 0.86.0) + - React-utils (= 0.86.0) + - ReactNativeDependencies + - ReactNativeDependencies (0.86.0) - ReactNativeFileAccess (3.1.1): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2115,7 +2167,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2126,15 +2177,13 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - ZIPFoundation - rn-id-blurview (1.2.1): - React - - RNBootSplash (6.3.8): - - DoubleConversion - - glog + - RNBootSplash (6.3.12): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2142,7 +2191,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2153,12 +2201,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNCAsyncStorage (1.19.4): - - DoubleConversion - - glog + - RNCAsyncStorage (2.2.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2166,7 +2212,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2177,12 +2222,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNCClipboard (1.16.3): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2190,7 +2233,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2201,12 +2243,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNCPicker (2.11.2): - - DoubleConversion - - glog + - RNCPicker (2.11.4): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2214,7 +2254,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2225,12 +2264,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNDateTimePicker (8.4.2): - - DoubleConversion - - glog + - RNDateTimePicker (9.1.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2238,7 +2275,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2249,6 +2285,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNDeviceInfo (13.2.0): - React-Core @@ -2256,21 +2293,56 @@ PODS: - React-Core - SDWebImage (~> 5.11.1) - SDWebImageWebPCoder (~> 0.8.4) - - RNFBApp (20.5.0): - - Firebase/CoreOnly (= 10.29.0) + - RNFBApp (25.1.0): + - Firebase/CoreOnly (= 12.15.0) + - hermes-engine + - RCTRequired + - RCTTypeSafety - React-Core - - RNFBMessaging (20.5.0): - - Firebase/Messaging (= 10.29.0) + - 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 + - ReactNativeDependencies + - Yoga + - RNFBMessaging (25.1.0): + - Firebase/Messaging (= 12.15.0) - FirebaseCoreExtension + - hermes-engine + - 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 + - ReactNativeDependencies - RNFBApp + - Yoga - RNFS (2.20.0): - React-Core - - RNGestureHandler (2.28.0): - - DoubleConversion - - glog + - RNGestureHandler (2.32.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2279,7 +2351,6 @@ PODS: - React-FabricComponents - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2290,12 +2361,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNLocalize (3.4.2): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2303,7 +2372,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2314,12 +2382,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNPermissions (4.1.5): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2327,7 +2393,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2338,17 +2403,15 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNQrGenerator (1.4.6): - React - ZXingObjC - RNReactNativeHapticFeedback (1.14.0): - React-Core - - RNReanimated (4.1.3): - - DoubleConversion - - glog + - RNReanimated (4.5.3): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2367,14 +2430,14 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 4.1.3) + - ReactNativeDependencies + - RNReanimated/apple (= 4.5.3) + - RNReanimated/common (= 4.5.3) + - RNReanimated/view (= 4.5.3) - RNWorklets - Yoga - - RNReanimated/reanimated (4.1.3): - - DoubleConversion - - glog + - RNReanimated/apple (4.5.3): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2393,14 +2456,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 4.1.3) + - ReactNativeDependencies - RNWorklets - Yoga - - RNReanimated/reanimated/apple (4.1.3): - - DoubleConversion - - glog + - RNReanimated/common (4.5.3): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2419,13 +2479,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - RNWorklets - Yoga - - RNScreens (4.16.0): - - DoubleConversion - - glog + - RNReanimated/view (4.5.3): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2438,6 +2496,28 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - RNWorklets + - Yoga + - RNScreens (4.25.2): + - hermes-engine + - 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 @@ -2445,13 +2525,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNScreens/common (= 4.16.0) + - ReactNativeDependencies + - RNScreens/common (= 4.25.2) - Yoga - - RNScreens/common (4.16.0): - - DoubleConversion - - glog + - RNScreens/common (4.25.2): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2459,7 +2537,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2471,14 +2548,12 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNSecureRandom (1.0.1): - React - - RNSentry (7.12.0): - - DoubleConversion - - glog + - RNSentry (7.11.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2497,13 +2572,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Sentry/HybridSDK (= 8.58.0) - Yoga - RNShare (12.0.11): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2511,7 +2584,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2522,12 +2594,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNSound (0.12.0): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2535,7 +2605,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2546,12 +2615,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNStoreReview (0.4.3): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2559,7 +2626,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2570,12 +2636,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNSVG (15.14.0): - - DoubleConversion - - glog + - RNSVG (15.15.4): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2583,7 +2647,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2594,13 +2657,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNSVG/common (= 15.14.0) + - ReactNativeDependencies + - RNSVG/common (= 15.15.4) - Yoga - - RNSVG/common (15.14.0): - - DoubleConversion - - glog + - RNSVG/common (15.15.4): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2608,7 +2669,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2619,12 +2679,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNVectorIcons (10.1.0): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2632,7 +2690,6 @@ PODS: - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2643,12 +2700,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNWorklets (0.6.1): - - DoubleConversion - - glog + - RNWorklets (0.10.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2667,13 +2722,12 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNWorklets/worklets (= 0.6.1) + - ReactNativeDependencies + - RNWorklets/apple (= 0.10.0) + - RNWorklets/common (= 0.10.0) - Yoga - - RNWorklets/worklets (0.6.1): - - DoubleConversion - - glog + - RNWorklets/apple (0.10.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2692,13 +2746,10 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNWorklets/worklets/apple (= 0.6.1) + - ReactNativeDependencies - Yoga - - RNWorklets/worklets/apple (0.6.1): - - DoubleConversion - - glog + - RNWorklets/common (0.10.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core @@ -2717,6 +2768,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - SDWebImage (5.11.1): - SDWebImage/Core (= 5.11.1) @@ -2725,12 +2777,11 @@ PODS: - libwebp (~> 1.0) - SDWebImage/Core (~> 5.10) - Sentry/HybridSDK (8.58.0) - - SocketRocket (0.7.1) - - SQLite.swift/standalone (0.15.4): + - SQLite.swift/standalone (0.16.0): - sqlite3 - - sqlite3 (3.51.1): - - sqlite3/common (= 3.51.1) - - sqlite3/common (3.51.1) + - sqlite3 (3.52.0): + - sqlite3/common (= 3.52.0) + - sqlite3/common (3.52.0) - SwiftNIO (2.40.0): - _NIODataStructures (= 2.40.0) - CNIOAtomics (= 2.40.0) @@ -2861,12 +2912,12 @@ PODS: - SwiftNIOFoundationCompat (< 3, >= 2.32.0) - SwiftNIOPosix (< 3, >= 2.32.0) - SwiftNIOTLS (< 3, >= 2.32.0) - - SwiftProtobuf (1.33.3) - - VisionCamera (4.7.2): - - VisionCamera/Core (= 4.7.2) - - VisionCamera/React (= 4.7.2) - - VisionCamera/Core (4.7.2) - - VisionCamera/React (4.7.2): + - SwiftProtobuf (1.38.1) + - VisionCamera (4.7.3): + - VisionCamera/Core (= 4.7.3) + - VisionCamera/React (= 4.7.3) + - VisionCamera/Core (4.7.3) + - VisionCamera/React (4.7.3): - React-Core - Yoga (0.0.0) - ZIPFoundation (0.9.20) @@ -2875,10 +2926,8 @@ PODS: - ZXingObjC/All (3.6.9) DEPENDENCIES: - - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - BVLinearGradient (from `../node_modules/react-native-linear-gradient`) - disklet (from `../node_modules/disklet`) - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - edge-core-js (from `../node_modules/edge-core-js`) - edge-currency-accountbased (from `../node_modules/edge-currency-accountbased`) - edge-currency-plugins (from `../node_modules/edge-currency-plugins`) @@ -2887,21 +2936,23 @@ DEPENDENCIES: - EXConstants (from `../node_modules/expo-constants/ios`) - Expo (from `../node_modules/expo`) - ExpoAsset (from `../node_modules/expo-asset/ios`) + - "ExpoDomWebView (from `../node_modules/@expo/dom-webview/ios`)" - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) - ExpoFont (from `../node_modules/expo-font/ios`) - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) + - "ExpoLogBox (from `../node_modules/@expo/log-box`)" - ExpoModulesCore (from `../node_modules/expo-modules-core`) + - ExpoModulesJSI (from `../node_modules/expo-modules-jsi/apple`) + - ExpoModulesWorklets (from `../node_modules/expo-modules-core`) + - ExpoModulesWorkletsAdapter (from `../node_modules/expo-modules-core`) - ExpoQuickActions (from `../node_modules/expo-quick-actions/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`) - ImageColors (from `../node_modules/react-native-image-colors/ios`) - - 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`) + - 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`) @@ -2921,16 +2972,20 @@ DEPENDENCIES: - 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-mutationobservernativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/mutationobserver`) - "react-native-adservices (from `../node_modules/@brigad/react-native-adservices`)" - "react-native-compat (from `../node_modules/@walletconnect/react-native-compat`)" - react-native-contacts (from `../node_modules/react-native-contacts`) @@ -2950,8 +3005,10 @@ DEPENDENCIES: - react-native-zano (from `../node_modules/react-native-zano`) - react-native-zcash (from `../node_modules/react-native-zcash`) - 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`) @@ -2969,7 +3026,6 @@ DEPENDENCIES: - 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-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`) @@ -2977,9 +3033,12 @@ DEPENDENCIES: - 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`) + - React-viewtransitionnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/viewtransition`) + - 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`) + - ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) - ReactNativeFileAccess (from `../node_modules/react-native-file-access`) - rn-id-blurview (from `../node_modules/rn-id-blurview`) - RNBootSplash (from `../node_modules/react-native-bootsplash`) @@ -3039,7 +3098,6 @@ SPEC REPOS: - SDWebImage - SDWebImageWebPCoder - Sentry - - SocketRocket - SQLite.swift - sqlite3 - SwiftNIO @@ -3060,14 +3118,10 @@ SPEC REPOS: - ZXingObjC EXTERNAL SOURCES: - boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" BVLinearGradient: :path: "../node_modules/react-native-linear-gradient" disklet: :path: "../node_modules/disklet" - DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" edge-core-js: :path: "../node_modules/edge-core-js" edge-currency-accountbased: @@ -3084,35 +3138,41 @@ EXTERNAL SOURCES: :path: "../node_modules/expo" ExpoAsset: :path: "../node_modules/expo-asset/ios" + ExpoDomWebView: + :path: "../node_modules/@expo/dom-webview/ios" ExpoFileSystem: :path: "../node_modules/expo-file-system/ios" ExpoFont: :path: "../node_modules/expo-font/ios" ExpoKeepAwake: :path: "../node_modules/expo-keep-awake/ios" + ExpoLogBox: + :path: "../node_modules/@expo/log-box" ExpoModulesCore: :path: "../node_modules/expo-modules-core" + ExpoModulesJSI: + :path: "../node_modules/expo-modules-jsi/apple" + ExpoModulesWorklets: + :path: "../node_modules/expo-modules-core" + ExpoModulesWorkletsAdapter: + :path: "../node_modules/expo-modules-core" ExpoQuickActions: :path: "../node_modules/expo-quick-actions/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-2025-03-03-RNv0.79.0-bc17d964d03743424823d7dd1a9f37633459c5c5 + :tag: hermes-v250829098.0.14 ImageColors: :path: "../node_modules/react-native-image-colors/ios" - 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: @@ -3149,6 +3209,8 @@ EXTERNAL SOURCES: :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: @@ -3157,6 +3219,10 @@ EXTERNAL SOURCES: :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: @@ -3169,6 +3235,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" React-microtasksnativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + React-mutationobservernativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/mutationobserver" react-native-adservices: :path: "../node_modules/@brigad/react-native-adservices" react-native-compat: @@ -3207,10 +3275,14 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-zcash" 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: @@ -3245,8 +3317,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/renderer/css" 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: @@ -3261,12 +3331,18 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/timing" React-utils: :path: "../node_modules/react-native/ReactCommon/react/utils" + React-viewtransitionnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/viewtransition" + React-webperformancenativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/webperformance" ReactAppDependencyProvider: - :path: build/generated/ios + :path: build/generated/ios/ReactAppDependencyProvider ReactCodegen: - :path: build/generated/ios + :path: build/generated/ios/ReactCodegen ReactCommon: :path: "../node_modules/react-native/ReactCommon" + ReactNativeDependencies: + :podspec: "../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" ReactNativeFileAccess: :path: "../node_modules/react-native-file-access" rn-id-blurview: @@ -3328,7 +3404,6 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: _NIODataStructures: 3d45d8e70a1d17a15b1dc59d102c63dbc0525ffd - boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 BVLinearGradient: cb006ba232a1f3e4f341bb62c42d1098c284da70 CGRPCZlib: 298dd3237ba4bd7b3eed109e7080ff3324b7d9c9 CNIOAtomics: 8edf08644e5e6fa0f021c239be9e8beb1cd9ef18 @@ -3339,154 +3414,163 @@ SPEC CHECKSUMS: CNIOLinux: 62e3505f50de558c393dc2f273dde71dcce518da CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: ef8ef081e35a73fbed579888d29e49edc2f327cc - DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb edge-core-js: 3685f5569441d36e98b148eae44baca1849d1874 edge-currency-accountbased: d8903dfd6b0ad2004c1b1a0eca192bfa3c602f30 edge-currency-plugins: 2b0de648624d46c0e32e4530f853673a3edfeaa6 edge-exchange-plugins: f130b52ca5d58d774bf51c851bbb38df5fbf9238 edge-login-ui-rn: 80979efda996608d927563cd770f69f7bfce80a9 - EXConstants: 98bcf0f22b820f9b28f9fee55ff2daededadd2f8 - Expo: 43d9e0c3108cc3a1c2739743e9b51086144ee4b0 - ExpoAsset: ef06e880126c375f580d4923fdd1cdf4ee6ee7d6 - ExpoFileSystem: 7f92f7be2f5c5ed40a7c9efc8fa30821181d9d63 - ExpoFont: cf508bc2e6b70871e05386d71cab927c8524cc8e - ExpoKeepAwake: bf0811570c8da182bfb879169437d4de298376e7 - ExpoModulesCore: 471ae18809dc8a5c9a623193a317eef6048a4f8a + EXConstants: 8641fb5fcb789b2bfc9d01c9206a6826ca9d49e6 + Expo: 9dca8652db31f31b9a6b748dfbca5818c044d61d + ExpoAsset: c270900c121a250ceabbf692dfecc2f1564ec82f + ExpoDomWebView: beaec034e51bd028428b98bb1f2633ab79c6d095 + ExpoFileSystem: e441dae0ae671fc451640517550973d9e024fdf0 + ExpoFont: 59e1faf66ba9bcd232ae1e2ce58d202a48b6f65e + ExpoKeepAwake: c26f14275017370cc8a4b7b43a0e23361f2053a5 + ExpoLogBox: 8a3cfa2897e088083cd49fc1ff7fdb2de4385547 + ExpoModulesCore: 1026f34fbae2bfe5f34bd9b7029abc9d683633ec + ExpoModulesJSI: 1abe88b923f2233ea75be46693611add7136b3a9 + ExpoModulesWorklets: 2ba73eabbbd0470e43f8998757f4cb8abff8355b + ExpoModulesWorkletsAdapter: f6e197437ec4b17cd455e8c307d793552250d348 ExpoQuickActions: fdbda7f5874aed3dd2b1d891ec00ab3300dc7541 - fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 - FBLazyVector: 84b955f7b4da8b895faf5946f73748267347c975 - Firebase: cec914dab6fd7b1bd8ab56ea07ce4e03dd251c2d - FirebaseCore: 30e9c1cbe3d38f5f5e75f48bfcea87d7c358ec16 - FirebaseCoreExtension: 705ca5b14bf71d2564a0ddc677df1fc86ffa600f - FirebaseCoreInternal: df84dd300b561c27d5571684f389bf60b0a5c934 - FirebaseInstallations: 913cf60d0400ebd5d6b63a28b290372ab44590dd - FirebaseMessaging: 7b5d8033e183ab59eb5b852a53201559e976d366 - fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd - glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 - GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a - GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 + FBLazyVector: 688bade2cc6ee3de2ba9a411c85c21fd908af3bc + Firebase: a8539b633d474fbeb654c7043f9c1649e274045b + FirebaseCore: 2e86a4ea1684d4381707069e4a6d89ac808e901e + FirebaseCoreExtension: 10d2a627977b39418759ad88ada80fbbd34f1c4f + FirebaseCoreInternal: 6ab6a02c94446c026d2cf35cf5383842ebaa4992 + FirebaseInstallations: eb29ccbf64eaedf86fd5b2ccc7fabde567660b52 + FirebaseMessaging: 40017d7bc8457ee295b0f41d480a80fdabc9994e + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleUtilities: 766ace00c6b10d8148408f329d10c4f051931850 gRPC-Swift: 74adcaaa62ac5e0a018938840328cb1fdfb09e7b - hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe + hermes-engine: 5b65c58cfd9a3cd3e0c02b408a0583df2d121180 ImageColors: 869f48b27ca2afb347fd0bada3257a5f698ee55e libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 Logging: beeb016c9c80cf77042d62e83495816847ef108b MnemonicSwift: 40ba76b951b75b32e2719df989b4d6da5798fe26 - nanopb: 438bc412db1928dac798aa6fd75726007be04262 - OpenSSL-Universal: 6082b0bf950e5636fe0d78def171184e2b3899c2 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 - RCTDeprecation: 83ffb90c23ee5cea353bd32008a7bca100908f8c - RCTRequired: eb7c0aba998009f47a540bec9e9d69a54f68136e - RCTTypeSafety: 659ae318c09de0477fd27bbc9e140071c7ea5c93 - React: c2d3aa44c49bb34e4dfd49d3ee92da5ebacc1c1c - React-callinvoker: 1bdfb7549b5af266d85757193b5069f60659ef9d - React-Core: 10597593fdbae06f0089881e025a172e51d4a769 - React-CoreModules: 6907b255529dd46895cf687daa67b24484a612c2 - React-cxxreact: a9f5b8180d6955bc3f6a3fcd657c4d9b4d95c1f6 - React-debug: a9861ea2196e886642887e29fd1d86c6eee93454 - React-defaultsnativemodule: 48bed05d5e7a6b90c63775bc042acba50f1ac46c - React-domnativemodule: 4603dc552b8f2b75cfd708b6175f0f3ab005d661 - React-Fabric: c48e870a557e39fc38c49bf2f43a62f837876318 - React-FabricComponents: d0c0029b9066819e736ee70ce8481fe52632ccad - React-FabricImage: a843d50c9d21f4a6255c3cd1654cdf16209ac76d - React-featureflags: 4ef61c283dfae8f327dbae70f41bb0399bd9e0fc - React-featureflagsnativemodule: 879cdf94179dc7395f28b9bf0fd340fd45c05ab7 - React-graphics: 4e247c50991de6e2c0abd25f8367cfa3113198c0 - React-hermes: 9116d4e6d07abeb519a2852672de087f44da8f12 - React-idlecallbacksnativemodule: 5fd6d838b045d3f5b630a6a0714635bc9c882fdc - React-ImageManager: ad3f561d76883d6f7f1cf3a97e823fa39ca1b132 - React-jserrorhandler: 35d127a39a5bc16d9ae97edce7ab4c06dc77e3a2 - React-jsi: 753ba30c902f3a41fa7f956aca8eea3317a44ee6 - React-jsiexecutor: 47520714aa7d9589c51c0f3713dfbfca4895d4f9 - React-jsinspector: ec984e95482ee98692ec74f78771447599ed9781 - React-jsinspectortracing: 7bd661f34f08b320bb797dc464d6002116fca145 - React-jsitooling: 90d7ecbb60f70d12f60a4964dfcad0e38d9d970d - React-jsitracing: a9de0d25bf430574dc01f1fe67f06fd50e8a578c - React-logger: 8edfcedc100544791cd82692ca5a574240a16219 - React-Mapbuffer: da73f30b000114058d6bc41490dcce204a8ede32 - React-microtasksnativemodule: 444c5701aece79629bb73bd9e7ad8937ae65238c + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + OpenSSL-Universal: ecee7b138fa75a74ecf00d7ffd248fb584739b9e + PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273 + RCTDeprecation: 8f1dc8057e54ea6fd01df47d0d29487adc92c1a9 + RCTRequired: 9d02105f758490fab48d77fead2599a449321ab7 + RCTSwiftUI: 714ca60953e8b7779821eea889ebdc891851682b + RCTSwiftUIWrapper: 0a79e3288397adb17aec2877e4c2b79d29b05079 + RCTTypeSafety: 922be6f90a3addd48f57f2066dd90aacec4768b6 + React: 2574546f2d017abd14d0c9b48cf2b6a0547c2591 + React-callinvoker: b997d4d109c92cae4bc7f1edb08dc6a7c11a1ca2 + React-Core: 1a489b1f2858bbb42350be7d93a5db5925cdc446 + React-CoreModules: 549d62c411dd9e4577b770fee27dc35a101ed486 + React-cxxreact: e64c7b969d63d2b848dbc41794058ebd20b76a57 + React-debug: 307f174c04c2e1f51b31c31efcc3e635b1e56453 + React-defaultsnativemodule: 74ae80f0ca6a1a789b5ffd11f3629d096c77feba + React-domnativemodule: f3028f1e7c8811c054cabb3390f6f3a975639125 + React-Fabric: dd311b5eba8fe95dfb17d09a8ebbe6c7010ce4fe + React-FabricComponents: a4b64a13a56647954e495640cc1ba98d1e2fe4e9 + React-FabricImage: e6cfbb40ae3179fee9b9bf17e38d99a225ba8102 + React-featureflags: e7c2807e23e08b58847001c151bda8b1157e4aa6 + React-featureflagsnativemodule: 4c2db597a10b6c50b315cf0cde013322d2bd23cf + React-graphics: 128e5550b022fb9c545a35fed448eecbacf30b31 + React-hermes: bac1148a3989d50675b2afda82c96055d4cd2499 + React-idlecallbacksnativemodule: b62c4214dde10c821c8d1d3663ace56eea31953d + React-ImageManager: f1d43756974c8b63834e4766d1baf02f40c81b3e + React-intersectionobservernativemodule: 223a2201d6c488d1470763085bb2f47a8ce2d241 + React-jserrorhandler: 90e69ab153bb27ae253f0ca3cdd5e007011910a1 + React-jsi: 2c4bdee01b2963c5444541bb75a082b5102e4234 + React-jsiexecutor: 7b47e6e56d6536e50dcacca4f1b7fb145d7b9d74 + React-jsinspector: ffa9c1ea2fed86f2dd4bc1910820628d21c06295 + React-jsinspectorcdp: f38486e5aacbb6a95b2aa99db129729dd607befd + React-jsinspectornetwork: 3ca15f7f6c78157e0bf34b769f8357c9c560ba70 + React-jsinspectortracing: 3a6d7bd296b3a4fcab57992a6f645be244f0a4bc + React-jsitooling: 1008a3d0d810a7dc3727c23b7f7df23a2e7cf91b + React-jsitracing: b8638e84899c9ee24db6a30c99f58e3ce1cdc787 + React-logger: 01568ff0b6737536ae3c15a0e02f88fe3a688fcc + React-Mapbuffer: af7ecd3505e1bd285a75d2145a181523a4cb625d + React-microtasksnativemodule: b8bf6f9f7363c42dabacd510f73432248b28078a + React-mutationobservernativemodule: 654a565d30cc8d2ba4f72212f26660e34364caf4 react-native-adservices: 18087a4a5106c5133b0cde73701bf875e3163cfc - react-native-compat: d39ea5df32baea7a806bb7246444eab86d1c7617 - react-native-contacts: b854a0fabc5d037bb344deb719a1aa03c9ffd88b + react-native-compat: c96954f6d5712dcccb9908805e35ce05c1ad645f + react-native-contacts: 59013da26b7f0f9ffc2dfcbeb0af1a6e209c6ce7 react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba - react-native-image-picker: f6ece66f251f4a17aab08f5add7be6eb9e7f5356 + react-native-image-picker: adb86d86135d8d31009d027db361445c5a3db863 react-native-in-app-review: 668f4c80d7f95945e0ad7833e98c466cb40d6808 - react-native-keyboard-controller: c8968215c7ecdfc43663cfaf9ca991aad4179815 + react-native-keyboard-controller: d85461d7782c025cde04ee265f48846843b2e99d react-native-mail: 6e83813066984b26403d3fdfe79ac7bb31857e3c react-native-monero: d2b0167fd79d8eeda80ad357f12e8fee8edf63a7 - react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187 - react-native-performance: f0471c84eda0f6625bd42a1f515b1b216f284b12 + react-native-netinfo: adec161a2fc40d327f2c1bab7d8c57a91943ab74 + react-native-performance: d673456bafde4fbf8170e0f267f77a899c3f507b react-native-piratechain: b8a42336b1f8e6ccfc3ee054d18ed79d68d42fa1 react-native-render-html: 5afc4751f1a98621b3009432ef84c47019dcb2bd react-native-safari-view: 07dc856a2663fef31eaca6beb79b111b8f6cf1f2 - react-native-safe-area-context: 83e0ac3d023997de1c2e035af907cc4dc05f718c - react-native-webview: 69c118d283fccfbc4fca0cd680e036ff3bf188fa + react-native-safe-area-context: 45435943d06e262f946fcc3f4c4de6bfd0c9cbe1 + react-native-webview: cac57e5c9caaac09627c910efb968bac54d5b4dd react-native-zano: d31c7ba542d1f407dd870ff431886e68d545239d react-native-zcash: e05fe0d56656702ae14c979736964e174775eb03 - React-NativeModulesApple: df8e5bc59e78ca3040ffbf41336889f3bd0fad68 - React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c - React-perflogger: 9a151e0b4c933c9205fd648c246506a83f31395d - React-performancetimeline: d6a5fd3640c873875badb33020ebe5af46ef2a12 - React-RCTActionSheet: a499b0d6d9793886b67ba3e16046a3fef2cdbbc3 - React-RCTAnimation: cc64adc259aabc3354b73065e2231d796dfce576 - React-RCTAppDelegate: 9d523da768f1c9e84c5f3b7e3624d097dfb0e16b - React-RCTBlob: e727f53eeefded7e6432eb76bd22b57bc880e5d1 - React-RCTFabric: a704a0eea3a9a32621ccc79261fe5b010bfcaccb - React-RCTFBReactNativeSpec: 9064c63d99e467a3893e328ba3612745c3c3a338 - React-RCTImage: 7159cbdbb18a09d97ba1a611416eced75b3ccb29 - React-RCTLinking: 46293afdb859bccc63e1d3dedc6901a3c04ef360 - React-RCTNetwork: 4a6cd18f5bcd0363657789c64043123a896b1170 - React-RCTRuntime: 4b47b6380420e9fbfb4bd3cc16d6ea988640ddc1 - React-RCTSettings: 61e361dc85136d1cb0e148b7541993d2ee950ea7 - React-RCTText: abd1e196c3167175e6baef18199c6d9d8ac54b4e - React-RCTVibration: 490e0dcb01a3fe4a0dfb7bc51ad5856d8b84f343 - React-rendererconsistency: 68db5a64f0c42b0337e25ba7b0e9513caae1389d - React-renderercss: 59c892b54a92f2f62b98c2700f5ff7592f0629cb - React-rendererdebug: f9dfe8ef736c98268f87114d05f49615f7f9af46 - React-rncore: 0f64cacb1becc6f89c99018ca920d012f9044ebd - React-RuntimeApple: f2bc2dc51b9b3c194c0eec4351ae99d033485792 - React-RuntimeCore: 4e5475d506e7f9c4b3f3c6e6a654b83cba7f1a42 - React-runtimeexecutor: d60846710facedd1edb70c08b738119b3ee2c6c2 - React-RuntimeHermes: 2b238368a56fc50e9372afde7a3f2eeb0cdc63a7 - React-runtimescheduler: c65050ab5c3911dd553bb9223c76543198c5854f - React-timing: beb0ba912f9ffc1a6758afa767ae5c03302dc9ee - React-utils: 4b32801a05eff845d316edd59b313a3e25c5fc08 - ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584 - ReactCodegen: 041559ba76d00f6680dfa0916b3c791f4babe5ea - ReactCommon: 1511ef100f1afa4c199fe52fe7a8d2529a41429a - ReactNativeFileAccess: 6c8f0b8a0079d90c524ac1b68c973c70e1293e8a + React-NativeModulesApple: 6f8a4b47b7561c796094a6b03ab570c63fb98548 + React-networking: 2fbe0ada4dd67c2c65656d5429f71a96df5eaa02 + React-oscompat: e3c95718adca6d0e7ca9e5b01a04d057f4aa8f72 + React-perflogger: 6956ae5fff5f3c5d8c0a2515a0c074d838d9878d + React-performancecdpmetrics: 6e3ad55d9210da51fea522900f8c82ef27795a03 + React-performancetimeline: f4f6eca5a06bc32c38786dde1769d89a6ba676d2 + React-RCTActionSheet: cbe921221b0ca00d2ea586efbaa494bc990260c1 + React-RCTAnimation: c02634834737cf4a0aeb51d5e2675fdc947d54e6 + React-RCTAppDelegate: 1b322abeff7adccb5262f21fc9fa04eddac67790 + React-RCTBlob: 0785fd2ef3668a40b7905e70a688ce2f8bf735ba + React-RCTFabric: fd9204864d3b158b79267df22eab5875d877c205 + React-RCTFBReactNativeSpec: c1e0b2582c78017be4a9355ebc6b6baf4f578a53 + React-RCTImage: a3d72e5484ea25ce3141e21df7457b83109436c4 + React-RCTLinking: 49e107939409c381e8c7d35655060579d3f855a3 + React-RCTNetwork: e07d28824e78bc544ccd16482045e919ea10bc4e + React-RCTRuntime: 37921f258529380874d7a1b0ba49327e1373322a + React-RCTSettings: 85bfeb46acf859d754f0cbcb570f3e54a9834433 + React-RCTText: 6bae9a5e52ebc012d7bc499542c42285f73d1e1d + React-RCTVibration: 53317edc4dbb7ef84b49ad7413339e9e1729995d + React-rendererconsistency: 8759d621ba9d2a3139c266d3462bf2e38ccc4b01 + React-renderercss: 7b56e138a3d800fa9e17e61cdb3b293d6b8622c6 + React-rendererdebug: 1355aabc6794c6c67673c587c270bbedf3cded69 + React-RuntimeApple: fc323e85f38e2ecf5edefa386971a1d2e390448f + React-RuntimeCore: 8eb8e699124b1869aa4659c8df665c22bf03d6a4 + React-runtimeexecutor: 370a4e864ba011a1dc142e25782e3a81a77d3d40 + React-RuntimeHermes: c53d246b77a1a9be40dd8a33951a36f68da1252e + React-runtimescheduler: e5f1ed2f62b6371122e7fd4700da08fb93611c41 + React-timing: e0fcc0610c5332a5d7c657be08f3f06d15046c08 + React-utils: 63eef0ee14f558fd0f9a63d864d0b220f61049c7 + React-viewtransitionnativemodule: ac5fb4151090f5b135b9e27878fbd20699b1e604 + React-webperformancenativemodule: 0e0d8d46696805b92ee4c6eff7d43966c34199ce + ReactAppDependencyProvider: dcdd0e1b9559a6d8d8aea05286f4ed085091978e + ReactCodegen: 999fc405f0951f19297974b3545d8f43b5f5f8d5 + ReactCommon: 8b52be35b7f65eb8c56c7ce5993c93e50f710cc9 + ReactNativeDependencies: fa0a54b3f5319ae0e3b9aff32bfee7a424b88e66 + ReactNativeFileAccess: 90b3cca6540a6eb135533d6295e3eacf38cf3d1e rn-id-blurview: 35bf4f960b8b108d12ed8a8ff14cbc22ed908081 - RNBootSplash: 1280eeb18d887de0a45bb4923d4fc56f25c8b99c - RNCAsyncStorage: 95c930ec966b842547968e370feced362d8f461c - RNCClipboard: 45b13251c8938aabfc25b9ecc35b5d42ab4eb0b0 - RNCPicker: e77e886fbfa88f62b3399195a192a24f7ffff709 - RNDateTimePicker: 0e6a0255c82d5ab6eb40a33dda0d8886f249ca9f + RNBootSplash: 6707708e83082515da71df02aa88821e5a336193 + RNCAsyncStorage: a455ed0edb854f0c8471b3049935680d5868796a + RNCClipboard: d73fd4b2ac59e792596e7cd615b6321d577c1a2b + RNCPicker: 47d8598233e5858a65f6d91a80505d5ca86bd5f0 + RNDateTimePicker: 2e1dc353ee0e3598f636928f7a8d180f12be7c16 RNDeviceInfo: ae26ae45db3f9937f038a284bcd0a1db8d70db96 RNFastImage: 462a183c4b0b6b26fdfd639e1ed6ba37536c3b87 - RNFBApp: 4e6da65e29a144d20bcb5bf264fc8e2055831bab - RNFBMessaging: fb5a9b0a3043d5d3e6e9fe7b27b78fcc3a0f753f + RNFBApp: fb7f711cbcd95385a6d889c8c22967b1e7e72308 + RNFBMessaging: a7322a4753f9b1c47dff7b6c09ec4d83bdab89c3 RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 - RNGestureHandler: c50b05a3941646c4e4098344033ca4609b42be85 - RNLocalize: ae28fc65c1ae7f595c86a926b6beb43790e491c3 - RNPermissions: 60b23d827dc7a4b2e347356fc20206184676637c + RNGestureHandler: a6fc176c2a0224a64fa635a65fac7baf2de379ed + RNLocalize: 1034c494e25d2e8d4c5c9062418f1cd6db24e27e + RNPermissions: 950d9f3b9c0225c92c1103366721e53491aec3f1 RNQrGenerator: af2f0888eb81b8ff99517a3929d6399444dcc56d RNReactNativeHapticFeedback: 8364333ca888b1b7ec9d2daf04b010ee5436366e - RNReanimated: 0516f7712064007219d296b7788c585ecbf73d52 - RNScreens: eb3800639b236501d2d6487d930b35fe3db68cb0 + RNReanimated: b9153787cb2d022e800229b75efcf87627117e3e + RNScreens: df54f9e1092ce77fe96fc0c3a5314862d05a506e RNSecureRandom: b64d263529492a6897e236a22a2c4249aa1b53dc - RNSentry: 0c2660868695668bf93eef20033d0e8bc6016666 - RNShare: 6300b941668273d502ecee9122cade0d5ea966bd - RNSound: cfeaf6c6a734303c887e04b946cbb7e294bff123 - RNStoreReview: b3cb7df1405d56afd51301ada4660f6c9b970055 - RNSVG: ca807495c5219c05c747254200b89a4e3078db31 - RNVectorIcons: f1bc9e04b6f67ec09ea54e6f092e75a9e205c1d7 - RNWorklets: b1faafefb82d9f29c4018404a0fb33974b494a7b + RNSentry: 18fc2982a2c646dfada4ddd6fc8e225e1bcad812 + RNShare: 8607a66b8edd8cf2d5781fb66250d8a07ec6d30d + RNSound: 460a3786c10accc5144d3b6866d3d8c3c41d2978 + RNStoreReview: 6acb6bf05fcc90f471753d4c128954a1426018b2 + RNSVG: 02c4605f1656727c3a83059ef119dc7e469df182 + RNVectorIcons: 0763c0f64e1ec73fe18f4ed2fb1e485f96417009 + RNWorklets: 5babf83fcbca84cab18fc630519510371686ca8f SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d Sentry: d587a8fe91ca13503ecd69a1905f3e8a0fcf61be - SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - SQLite.swift: a107c734115fea616a4ad31371d39f1637e8de56 - sqlite3: 8d708bc63e9f4ce48f0ad9d6269e478c5ced1d9b + SQLite.swift: c914f905e13b6318cdc07fd66661db14c6cdd330 + sqlite3: a51c07cf16e023d6c48abd5e5791a61a47354921 SwiftNIO: 829958aab300642625091f82fc2f49cb7cf4ef24 SwiftNIOConcurrencyHelpers: 697370136789b1074e4535eaae75cbd7f900370e SwiftNIOCore: 473fdfe746534d7aa25766916459eeaf6f92ef49 @@ -3500,12 +3584,12 @@ SPEC CHECKSUMS: SwiftNIOSSL: d153c5a6fc5b2301b0519b4c4d037a9414212da6 SwiftNIOTLS: 598af547490133e9aac52aed0c23c4a90c31dcfc SwiftNIOTransportServices: 0b2b407819d82eb63af558c5396e33c945759503 - SwiftProtobuf: e1b437c8e31a4c5577b643249a0bb62ed4f02153 - VisionCamera: 30b358b807324c692064f78385e9a732ce1bebfe - Yoga: 50518ade05048235d91a78b803336dbb5b159d5d + SwiftProtobuf: 409d3aaec90e51b1705b1dd8065b56893450e77c + VisionCamera: 7187b3dac1ff3071234ead959ce311875748e14f + Yoga: a9f26333e684a192cbb5d698ed7eab3053929519 ZIPFoundation: dfd3d681c4053ff7e2f7350bc4e53b5dba3f5351 ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 -PODFILE CHECKSUM: 3c9f8ab9de75f819ada260a3d6d3f372a510d556 +PODFILE CHECKSUM: 7104ec3e3ac4815ca6c359e22f9de82e6bcb2880 COCOAPODS: 1.16.2 diff --git a/ios/edge.xcodeproj/project.pbxproj b/ios/edge.xcodeproj/project.pbxproj index 72954219091..de6b257830f 100644 --- a/ios/edge.xcodeproj/project.pbxproj +++ b/ios/edge.xcodeproj/project.pbxproj @@ -330,7 +330,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\nSENTRY_XCODE=\"../node_modules/@sentry/react-native/scripts/sentry-xcode.sh\"\nBUNDLE_REACT_NATIVE=\"/bin/sh $SENTRY_XCODE $REACT_NATIVE_XCODE\"\n\nif grep -q 'SENTRY_MAP_UPLOAD_AUTH_TOKEN' sentry.properties; then\n echo \"Skipping Sentry source-map upload\"\n export SENTRY_DISABLE_AUTO_UPLOAD=true\nfi\n\n/bin/sh -c \"$WITH_ENVIRONMENT \\\"$BUNDLE_REACT_NATIVE\\\"\"\n"; + shellScript = "set -e\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\nSENTRY_XCODE=\"../node_modules/@sentry/react-native/scripts/sentry-xcode.sh\"\nBUNDLE_REACT_NATIVE=\"/bin/sh $SENTRY_XCODE $REACT_NATIVE_XCODE\"\n\nif grep -q 'SENTRY_MAP_UPLOAD_AUTH_TOKEN' sentry.properties; then\n echo \"Skipping Sentry source-map upload\"\n export SENTRY_DISABLE_AUTO_UPLOAD=true\nfi\n\n/bin/sh -c \"$WITH_ENVIRONMENT $SENTRY_XCODE\"\n"; }; 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -360,7 +360,7 @@ name = "[CP-User] [RNFB] Core Configuration"; runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"note: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"note: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"note: -> RNFB build script started\"\necho \"note: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"note: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"note: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n if ! _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\"); then\n echo \"error: Failed to parse firebase.json, check for syntax errors.\"\n exit 1\n fi\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"error: python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"note: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"note: <- RNFB build script finished\"\n"; }; C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -424,11 +424,16 @@ inputFileListPaths = ( ); inputPaths = ( + "$(SRCROOT)/.xcode.env", + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/edge/edge.entitlements", + "$(SRCROOT)/Pods/Target Support Files/Pods-edge/expo-configure-project.sh", ); name = "[Expo] Configure project"; outputFileListPaths = ( ); outputPaths = ( + "$(SRCROOT)/Pods/Target Support Files/Pods-edge/ExpoModulesProvider.swift", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -485,7 +490,7 @@ DEVELOPMENT_TEAM = G5LQ7MERPK; ENABLE_BITCODE = NO; INFOPLIST_FILE = edge/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -515,7 +520,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = G5LQ7MERPK; INFOPLIST_FILE = edge/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -597,6 +602,22 @@ "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + "${PODS_ROOT}/ReactCommon", + "${PODS_ROOT}/ReactCommon/react/nativemodule/core", + "${PODS_ROOT}/React-runtimeexecutor", + "${PODS_ROOT}/React-runtimeexecutor/platform/ios", + "${PODS_ROOT}/ReactCommon-Samples", + "${PODS_ROOT}/ReactCommon-Samples/platform/ios", + "${PODS_ROOT}/React-Fabric/react/renderer/components/view/platform/cxx", + "${PODS_ROOT}/React-NativeModulesApple", + "${PODS_ROOT}/React-graphics", + "${PODS_ROOT}/React-graphics/react/renderer/graphics/platform/ios", + "${PODS_ROOT}/React-featureflags", + "${PODS_ROOT}/React-renderercss", + "${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", ); IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD = ""; @@ -612,6 +633,10 @@ ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", @@ -619,11 +644,14 @@ "-DFOLLY_USE_LIBCPP=1", "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", + "-DRCT_REMOVE_LEGACY_ARCH=1", ); OTHER_LDFLAGS = "$(inherited)"; + PODFILE_DIR = "$(SRCROOT)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; USE_HERMES = true; }; name = Debug; @@ -686,6 +714,22 @@ "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers", "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + "${PODS_ROOT}/ReactCommon", + "${PODS_ROOT}/ReactCommon/react/nativemodule/core", + "${PODS_ROOT}/React-runtimeexecutor", + "${PODS_ROOT}/React-runtimeexecutor/platform/ios", + "${PODS_ROOT}/ReactCommon-Samples", + "${PODS_ROOT}/ReactCommon-Samples/platform/ios", + "${PODS_ROOT}/React-Fabric/react/renderer/components/view/platform/cxx", + "${PODS_ROOT}/React-NativeModulesApple", + "${PODS_ROOT}/React-graphics", + "${PODS_ROOT}/React-graphics/react/renderer/graphics/platform/ios", + "${PODS_ROOT}/React-featureflags", + "${PODS_ROOT}/React-renderercss", + "${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-featureflags/React_featureflags.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-renderercss/React_renderercss.framework/Headers", ); IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD = ""; @@ -700,6 +744,10 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = ( + "$(inherited)", + "-DRCT_REMOVE_LEGACY_ARCH=1", + ); OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", @@ -707,10 +755,13 @@ "-DFOLLY_USE_LIBCPP=1", "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", + "-DRCT_REMOVE_LEGACY_ARCH=1", ); OTHER_LDFLAGS = "$(inherited)"; + PODFILE_DIR = "$(SRCROOT)"; REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; USE_HERMES = true; VALIDATE_PRODUCT = YES; }; diff --git a/ios/edge/AppDelegate.swift b/ios/edge/AppDelegate.swift index 5e72ff52b2e..93601671ee0 100644 --- a/ios/edge/AppDelegate.swift +++ b/ios/edge/AppDelegate.swift @@ -1,10 +1,10 @@ -import ExpoQuickActions +internal import Expo +internal import ExpoQuickActions import Firebase import FirebaseMessaging import RNBootSplash import React import ReactAppDependencyProvider -import React_RCTAppDelegate import UIKit import UserNotifications @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var securityView: UIView? var reactNativeDelegate: ReactNativeDelegate? - var reactNativeFactory: RCTReactNativeFactory? + var reactNativeFactory: ExpoReactNativeFactory? /** * Handles deep links. @@ -67,7 +67,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // React Native template code: let delegate = ReactNativeDelegate() - let factory = RCTReactNativeFactory(delegate: delegate) + let factory = ExpoReactNativeFactory(delegate: delegate) delegate.dependencyProvider = RCTAppDependencyProvider() reactNativeDelegate = delegate @@ -182,13 +182,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate { /// Configures the React Native instance. /// React Native template code. -class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { +class ReactNativeDelegate: ExpoReactNativeFactoryDelegate { override func sourceURL(for bridge: RCTBridge) -> URL? { self.bundleURL() } // react-native-bootsplash integration: - override func customize(_ rootView: RCTRootView) { + // (Expo SDK 57's factory delegate passes the new-architecture root view as a + // plain UIView; RCTRootView is the old-architecture type.) + override func customize(_ rootView: UIView) { super.customize(rootView) RNBootSplash.initWithStoryboard("LaunchScreen", rootView: rootView) } diff --git a/ios/edge/Info.plist b/ios/edge/Info.plist index 7f52713a1e4..9916f370fa2 100644 --- a/ios/edge/Info.plist +++ b/ios/edge/Info.plist @@ -75,10 +75,10 @@ zcash reqaddr - LSRequiresIPhoneOS - LSMinimumSystemVersion 13.0 + LSRequiresIPhoneOS + NFCReaderUsageDescription $(PRODUCT_NAME) does not use NFC. NSAppTransportSecurity @@ -114,6 +114,8 @@ $(PRODUCT_NAME) uses photos to retrieve QR Code images. NSSpeechRecognitionUsageDescription $(PRODUCT_NAME) does not access speech recognition. + RCTNewArchEnabled + UIAppFonts AntDesign.ttf @@ -157,6 +159,8 @@ fetch remote-notification + UIDesignRequiresCompatibility + UILaunchStoryboardName LaunchScreen.storyboard UIRequiredDeviceCapabilities @@ -181,7 +185,5 @@ applinks:edge.app - UIDesignRequiresCompatibility - From 454d83b20a8d0bb96c4ce76469a85654c9ccca31 Mon Sep 17 00:00:00 2001 From: peachbits Date: Thu, 9 Jul 2026 19:13:30 -0700 Subject: [PATCH 05/37] Android: fix Fabric crash on text inputs (fontSize 0) React Native 0.86's Android Fabric text measurement throws IllegalArgumentException ("FontSize should be a positive value") for any Text whose font size is 0 - TextLayoutManager's letterSpacing.isNaN() check unconditionally invokes a getter that validates fontSize > 0. FilledTextInput animates its side-icon sizes to exactly 0 (clear icon on an empty input, left icon when focused), and those sizes feed AnimatedFontIcon's fontSize, so mounting any scene with a text input crashed the app - most visibly the password login scene via edge-login-ui-rn, which shares the same component pattern. Clamp animated font sizes to a minimum of 1 (visually equivalent: the icon containers already collapse to zero width) in the GUI's AnimatedFontIcon and FilledTextInput, and apply the same one-line clamp to edge-login-ui-rn via patch-package until the fix lands upstream. Co-Authored-By: Claude Opus 4.8 --- patches/edge-login-ui-rn+3.36.0.patch | 13 +++++++++++++ .../__snapshots__/FilledTextInput.test.tsx.snap | 4 ++-- .../modals/__snapshots__/AddressModal.test.tsx.snap | 4 ++-- .../__snapshots__/CategoryModal.test.tsx.snap | 4 ++-- .../__snapshots__/CountryListModal.test.tsx.snap | 4 ++-- .../modals/__snapshots__/LogsModal.test.tsx.snap | 4 ++-- .../PasswordReminderModal.test.tsx.snap | 4 ++-- .../__snapshots__/TextInputModal.test.tsx.snap | 4 ++-- .../CreateWalletAccountSetupScene.test.tsx.snap | 4 ++-- .../CreateWalletImportScene.test.tsx.snap | 4 ++-- src/components/icons/ThemedIcons.tsx | 5 ++++- src/components/themed/FilledTextInput.tsx | 4 +++- 12 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 patches/edge-login-ui-rn+3.36.0.patch diff --git a/patches/edge-login-ui-rn+3.36.0.patch b/patches/edge-login-ui-rn+3.36.0.patch new file mode 100644 index 00000000000..8be2237fb6a --- /dev/null +++ b/patches/edge-login-ui-rn+3.36.0.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js b/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js +index 462a84a..ed9fb2e 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js ++++ b/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js +@@ -28,7 +28,7 @@ function AnimatedFontIcon(props) { + return ({ + color: (_a = color === null || color === void 0 ? void 0 : color.value) !== null && _a !== void 0 ? _a : defaultColor, + fontFamily, +- fontSize: (_b = size === null || size === void 0 ? void 0 : size.value) !== null && _b !== void 0 ? _b : defaultSize, ++ fontSize: Math.max((_b = size === null || size === void 0 ? void 0 : size.value) !== null && _b !== void 0 ? _b : defaultSize, 1), + fontStyle: 'normal', + fontWeight: 'normal' + }); diff --git a/src/__tests__/components/__snapshots__/FilledTextInput.test.tsx.snap b/src/__tests__/components/__snapshots__/FilledTextInput.test.tsx.snap index 89a4257332e..f1a7bab94d3 100644 --- a/src/__tests__/components/__snapshots__/FilledTextInput.test.tsx.snap +++ b/src/__tests__/components/__snapshots__/FilledTextInput.test.tsx.snap @@ -147,7 +147,7 @@ exports[`FilledTextInput should render with some props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -159,7 +159,7 @@ exports[`FilledTextInput should render with some props 1`] = ` { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/AddressModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/AddressModal.test.tsx.snap index 7a2f966623e..36408213946 100644 --- a/src/__tests__/modals/__snapshots__/AddressModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/AddressModal.test.tsx.snap @@ -742,7 +742,7 @@ exports[`AddressModalComponent should render with loaded props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -754,7 +754,7 @@ exports[`AddressModalComponent should render with loaded props 1`] = ` { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/CategoryModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/CategoryModal.test.tsx.snap index 1f87d2bd50c..1c5750aac72 100644 --- a/src/__tests__/modals/__snapshots__/CategoryModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/CategoryModal.test.tsx.snap @@ -2720,7 +2720,7 @@ exports[`CategoryModal should render with an empty subcategory 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -2732,7 +2732,7 @@ exports[`CategoryModal should render with an empty subcategory 1`] = ` { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/CountryListModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/CountryListModal.test.tsx.snap index f9da8321d9c..fc5bfc22a7d 100644 --- a/src/__tests__/modals/__snapshots__/CountryListModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/CountryListModal.test.tsx.snap @@ -743,7 +743,7 @@ exports[`CountryListModal should render with a country list 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -755,7 +755,7 @@ exports[`CountryListModal should render with a country list 1`] = ` { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/LogsModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/LogsModal.test.tsx.snap index 275d677c7f8..6e6b6e2345f 100644 --- a/src/__tests__/modals/__snapshots__/LogsModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/LogsModal.test.tsx.snap @@ -923,7 +923,7 @@ exports[`LogsModal should render with a logs modal 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -935,7 +935,7 @@ exports[`LogsModal should render with a logs modal 1`] = ` { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/PasswordReminderModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/PasswordReminderModal.test.tsx.snap index 394f4bafd34..b1a028ffbae 100644 --- a/src/__tests__/modals/__snapshots__/PasswordReminderModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/PasswordReminderModal.test.tsx.snap @@ -852,7 +852,7 @@ Please enter your password below. A successful verification will prevent this wa "value": { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -864,7 +864,7 @@ Please enter your password below. A successful verification will prevent this wa { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/modals/__snapshots__/TextInputModal.test.tsx.snap b/src/__tests__/modals/__snapshots__/TextInputModal.test.tsx.snap index 5f2c6c91019..253d3a5b177 100644 --- a/src/__tests__/modals/__snapshots__/TextInputModal.test.tsx.snap +++ b/src/__tests__/modals/__snapshots__/TextInputModal.test.tsx.snap @@ -664,7 +664,7 @@ exports[`TextInputModal should render with a blank input field 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -676,7 +676,7 @@ exports[`TextInputModal should render with a blank input field 1`] = ` { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletAccountSetupScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletAccountSetupScene.test.tsx.snap index 2b679bb0cd9..228f11962ca 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletAccountSetupScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletAccountSetupScene.test.tsx.snap @@ -849,7 +849,7 @@ exports[`CreateWalletAccountSelect renders 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -861,7 +861,7 @@ exports[`CreateWalletAccountSelect renders 1`] = ` { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap index 172be801c6f..3cde0cd037c 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap @@ -824,7 +824,7 @@ exports[`CreateWalletImportScene should render with loading props 1`] = ` "value": { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, @@ -836,7 +836,7 @@ exports[`CreateWalletImportScene should render with loading props 1`] = ` { "color": "rgba(255, 255, 255, 0.502)", "fontFamily": "anticon", - "fontSize": 0, + "fontSize": 1, "fontStyle": "normal", "fontWeight": "normal", }, diff --git a/src/components/icons/ThemedIcons.tsx b/src/components/icons/ThemedIcons.tsx index 866d7c05b2b..a09eda0ea56 100644 --- a/src/components/icons/ThemedIcons.tsx +++ b/src/components/icons/ThemedIcons.tsx @@ -59,7 +59,10 @@ function AnimatedFontIcon( const style = useAnimatedStyle(() => ({ color: color?.value ?? defaultColor, fontFamily, - fontSize: size?.value ?? defaultSize, + // Fabric on Android throws on non-positive text font sizes, and icon + // sizes legitimately animate to 0 (e.g. FilledTextInput side icons), so + // clamp to 1 (invisible - the containers collapse to zero width anyway): + fontSize: Math.max(size?.value ?? defaultSize, 1), fontStyle: 'normal', fontWeight: 'normal' })) diff --git a/src/components/themed/FilledTextInput.tsx b/src/components/themed/FilledTextInput.tsx index dc1c7434419..295e25f5d56 100644 --- a/src/components/themed/FilledTextInput.tsx +++ b/src/components/themed/FilledTextInput.tsx @@ -838,7 +838,9 @@ const StyledAnimatedTextInput = styledWithRef(AnimatedTextInput)<{ }, useAnimatedStyle(() => ({ color: interpolateTextColor(focusAnimation, disableAnimation), - fontSize: scale.value * rem + // Fabric on Android throws on non-positive font sizes; clamp in case + // an animated scale passes through 0: + fontSize: Math.max(scale.value * rem, 1) })) ] }) From 71bf0bdde3739299c2faa6b32be49faf93ad206b Mon Sep 17 00:00:00 2001 From: peachbits Date: Fri, 3 Jul 2026 10:56:27 -0700 Subject: [PATCH 06/37] Restore ShadowTree commit-exhaustion protection React Native 0.86 ships the equivalent of our old react-native+0.79.2.patch upstream - ShadowTree::commit() now caps optimistic retries at MAX_COMMIT_ATTEMPTS_BEFORE_LOCKING and falls back to an exclusive recursive lock (ReactCommon/react/renderer/mounting/ShadowTree.cpp) - but only behind the preventShadowTreeCommitExhaustion feature flag, which defaults to false. Enable the flag with a 1-line patch so the RN upgrade doesn't silently drop the crash protection. Delete this patch when upstream flips the default. Co-Authored-By: Claude Opus 4.8 --- patches/react-native+0.86.0.patch | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 patches/react-native+0.86.0.patch diff --git a/patches/react-native+0.86.0.patch b/patches/react-native+0.86.0.patch new file mode 100644 index 00000000000..f076377529f --- /dev/null +++ b/patches/react-native+0.86.0.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/node_modules/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +index ecc79d8..7ecb740 100644 +--- a/node_modules/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h ++++ b/node_modules/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +@@ -300,7 +300,7 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { + } + + bool preventShadowTreeCommitExhaustion() override { +- return false; ++ return true; + } + + bool redBoxV2Android() override { From 71bdaaa324b9b8d5d819a8daf387d2e82bfe0465 Mon Sep 17 00:00:00 2001 From: peachbits Date: Sat, 25 Jul 2026 16:58:02 -0700 Subject: [PATCH 07/37] Upgrade reanimated to 4.5.3 and keyboard-controller to 1.22.2 These patch releases fix three Android new-architecture regressions found on a physical Android 10 device: send-scene tiles and icon buttons stuck at their initial animation size, a missing address-modal title, and the app viewport staying collapsed after the keyboard was dismissed. --- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4620ef0efdc..95ecd0b3255 100644 --- a/package-lock.json +++ b/package-lock.json @@ -86,7 +86,7 @@ "react-native-image-picker": "^8.2.1", "react-native-in-app-review": "^4.3.5", "react-native-keyboard-aware-scroll-view": "^0.9.5", - "react-native-keyboard-controller": "1.21.9", + "react-native-keyboard-controller": "1.22.2", "react-native-linear-gradient": "^2.8.3", "react-native-localize": "^3.4.2", "react-native-mail": "^6.1.1", @@ -95,7 +95,7 @@ "react-native-performance": "^5.1.4", "react-native-permissions": "^4.1.5", "react-native-piratechain": "0.6.3", - "react-native-reanimated": "4.5.0", + "react-native-reanimated": "4.5.3", "react-native-render-html": "^6.3.4", "react-native-reorderable-list": "^0.5.0", "react-native-safari-view": "^2.1.0", @@ -25158,9 +25158,9 @@ } }, "node_modules/react-native-keyboard-controller": { - "version": "1.21.9", - "resolved": "https://registry.npmjs.org/react-native-keyboard-controller/-/react-native-keyboard-controller-1.21.9.tgz", - "integrity": "sha512-+TkkFldht4+AXBQeDy1hLE7iqiW8/NkY/ekhcFsKIiRdI9qC5JDzx0TfAg1iYZB2IeOXppmURIy2jFCUjOcV1w==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/react-native-keyboard-controller/-/react-native-keyboard-controller-1.22.2.tgz", + "integrity": "sha512-O5NfkDCzNFJPkcyCNKdaRV9ouEeUNml/x5PMpKt3m5zkER0HM/qPCgg6ajpFieZSOUhZRrdUWd+966Abs2oERw==", "license": "MIT", "dependencies": { "react-native-is-edge-to-edge": "^1.2.1" @@ -25249,9 +25249,9 @@ } }, "node_modules/react-native-reanimated": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.5.0.tgz", - "integrity": "sha512-+iPfvK34PKKYP/p/4TaBliFkbfvjGDIvXuiiaxvISP5ip7sWegvlacwU/uAV6zNDSSmX0tDyER7PurPMKGDipA==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.5.3.tgz", + "integrity": "sha512-+owIckpD4sA13XKHaLrr8V1RP4paqoxKvz/jy2wl/ULjMsfcRlfIJdKJxR1kcQr4McBZ6hAoPo01NyLnmy2ycQ==", "license": "MIT", "dependencies": { "react-native-is-edge-to-edge": "^1.3.1", @@ -25260,7 +25260,7 @@ "peerDependencies": { "react": "*", "react-native": "0.83 - 0.86", - "react-native-worklets": "0.10.x" + "react-native-worklets": "0.10.x - 0.11.x" } }, "node_modules/react-native-reanimated/node_modules/react-native-is-edge-to-edge": { diff --git a/package.json b/package.json index c2c6f24074f..9e94a96a114 100644 --- a/package.json +++ b/package.json @@ -146,7 +146,7 @@ "react-native-image-picker": "^8.2.1", "react-native-in-app-review": "^4.3.5", "react-native-keyboard-aware-scroll-view": "^0.9.5", - "react-native-keyboard-controller": "1.21.9", + "react-native-keyboard-controller": "1.22.2", "react-native-linear-gradient": "^2.8.3", "react-native-localize": "^3.4.2", "react-native-mail": "^6.1.1", @@ -155,7 +155,7 @@ "react-native-performance": "^5.1.4", "react-native-permissions": "^4.1.5", "react-native-piratechain": "0.6.3", - "react-native-reanimated": "4.5.0", + "react-native-reanimated": "4.5.3", "react-native-render-html": "^6.3.4", "react-native-reorderable-list": "^0.5.0", "react-native-safari-view": "^2.1.0", From 9b7b4920cbd395f8ef9a7d20e22aad2e326e9847 Mon Sep 17 00:00:00 2001 From: peachbits Date: Sat, 25 Jul 2026 16:58:02 -0700 Subject: [PATCH 08/37] Android: enable ShadowTree commit-exhaustion protection at runtime React Native ships this protection default-off. Without it, a runaway ShadowTree commit loop aborts the app in native code with "assertion failed (attempts < 1024)", which reproduced on an Android 10 device while interacting with text inputs. The iOS side of this is a source patch, but Android loads the React Native core from a prebuilt library, so the default cannot be patched there. Override the flag at runtime instead. The override is once-per-process and load() already consumes it, so reset first and re-apply React Native's stable defaults alongside our one change. --- .../java/co/edgesecure/app/MainApplication.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt index a4350bbde8d..6527758cdbc 100644 --- a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt +++ b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt @@ -8,6 +8,9 @@ import com.facebook.react.ReactHost import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsOverrides_RNOSS_Stable_Android +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsProvider import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost import com.facebook.react.defaults.DefaultReactNativeHost import com.facebook.react.modules.i18nmanager.I18nUtil @@ -105,6 +108,22 @@ class MainApplication : // If you opted-in for the New Architecture, we load the native entry point for this // app. load() + + // load() consumed the process's single feature-flag override with React + // Native's stable defaults. Replace it with those same defaults plus the + // ShadowTree commit-exhaustion protection, which React Native ships + // default-off: without it, a runaway commit loop aborts the app in + // native code (ShadowTree.cpp: "assertion failed (attempts < 1024)"). + // Android loads the RN core prebuilt, so the default cannot be patched + // in source like on iOS. Resetting here is safe because no React + // runtime exists yet. + ReactNativeFeatureFlags.dangerouslyReset() + ReactNativeFeatureFlags.override( + object : + ReactNativeFeatureFlagsProvider by ReactNativeFeatureFlagsOverrides_RNOSS_Stable_Android() { + override fun preventShadowTreeCommitExhaustion(): Boolean = true + } + ) } onApplicationCreate(this) } From 2ba6521cfdc7b54bd4a7c1825f0f71505412cc65 Mon Sep 17 00:00:00 2001 From: peachbits Date: Sat, 25 Jul 2026 16:58:26 -0700 Subject: [PATCH 09/37] Fix drawer overlay on Android versions that cannot animate it The drawer's outside-tap overlay is an Animated.View whose dimming, touchability and stacking are all driven from a reanimated shared value. On Android below 12 under the new architecture those updates never apply, so the overlay never painted its scrim and never captured touches: taps fell through to the scene behind the open drawer and the drawer could not be closed by tapping outside. On those devices only, render a plain View driven by the drawer's discrete open state, sized explicitly because an absolutely positioned view sized only by insets measures 0x0 there. Every other platform keeps the original animated overlay, verified unchanged on an Android 16 emulator. React Navigation 7 makes this same change upstream, so this patch retires when we migrate. --- patches/@react-navigation+drawer+6.7.2.patch | 113 ++++++++++++++++++- 1 file changed, 111 insertions(+), 2 deletions(-) diff --git a/patches/@react-navigation+drawer+6.7.2.patch b/patches/@react-navigation+drawer+6.7.2.patch index 663d5904502..c4a2831a8b9 100644 --- a/patches/@react-navigation+drawer+6.7.2.patch +++ b/patches/@react-navigation+drawer+6.7.2.patch @@ -13,7 +13,7 @@ index 94770c4..9e091d3 100644 // Reanimated v3 dropped legacy v1 syntax const legacyImplemenationNotAvailable = diff --git a/node_modules/@react-navigation/drawer/src/views/modern/Drawer.tsx b/node_modules/@react-navigation/drawer/src/views/modern/Drawer.tsx -index 57af20c..77aca6a 100644 +index 57af20c..e5d3d9a 100644 --- a/node_modules/@react-navigation/drawer/src/views/modern/Drawer.tsx +++ b/node_modules/@react-navigation/drawer/src/views/modern/Drawer.tsx @@ -11,20 +11,15 @@ import { @@ -146,7 +146,15 @@ index 57af20c..77aca6a 100644 > {/* Immediate child of gesture handler needs to be an Animated.View */} + toggleDrawer({ open: false, isUserInitiated: true }) + } +@@ -400,7 +379,7 @@ export default function Drawer({ {renderDrawerContent()} @@ -155,3 +163,104 @@ index 57af20c..77aca6a 100644 ); } +diff --git a/node_modules/@react-navigation/drawer/src/views/modern/Overlay.tsx b/node_modules/@react-navigation/drawer/src/views/modern/Overlay.tsx +index a77a7fb..1a26cec 100644 +--- a/node_modules/@react-navigation/drawer/src/views/modern/Overlay.tsx ++++ b/node_modules/@react-navigation/drawer/src/views/modern/Overlay.tsx +@@ -1,5 +1,5 @@ + import * as React from 'react'; +-import { Platform, Pressable, StyleSheet } from 'react-native'; ++import { Platform, Pressable, StyleSheet, View } from 'react-native'; + import Animated, { + useAnimatedProps, + useAnimatedStyle, +@@ -7,8 +7,19 @@ import Animated, { + + const PROGRESS_EPSILON = 0.05; + ++// PATCHED (Edge): on Android below 12 (API 31) under the new architecture, ++// reanimated style/prop updates driven by shared values never reach these ++// views: the overlay never painted its dimming scrim and never captured ++// touches, so taps fell through to the scene behind the open drawer and the ++// drawer could not be closed by tapping outside. On those devices, render a ++// plain View driven by the discrete `open` prop instead. Capable devices ++// keep the original animated overlay unchanged. ++const useLegacyOverlay = ++ Platform.OS === 'android' && Number(Platform.Version) < 31; ++ + type Props = React.ComponentProps & { + progress: Animated.SharedValue; ++ open?: boolean; + onPress: () => void; + accessibilityLabel?: string; + }; +@@ -16,6 +27,7 @@ type Props = React.ComponentProps & { + const Overlay = React.forwardRef(function Overlay( + { + progress, ++ open, + onPress, + style, + accessibilityLabel = 'Close drawer', +@@ -42,6 +54,47 @@ const Overlay = React.forwardRef(function Overlay( + } as const; + }); + ++ const pressable = ( ++ ++ ); ++ ++ if (useLegacyOverlay) { ++ const active = open === true; ++ ++ return ( ++ )} ++ ref={ref as React.Ref} ++ pointerEvents={active ? 'auto' : 'none'} ++ accessibilityElementsHidden={!active} ++ importantForAccessibility={active ? 'auto' : 'no-hide-descendants'} ++ style={[ ++ // Size explicitly: on these devices an absolute view sized only by ++ // insets (top/left/right/bottom: 0) measures 0x0 under Fabric, so ++ // it neither paints nor receives touches. ++ { ++ position: 'absolute', ++ top: 0, ++ left: 0, ++ width: '100%', ++ height: '100%', ++ backgroundColor: 'rgba(0, 0, 0, 0.5)', ++ }, ++ overlayStyle, ++ { opacity: active ? 1 : 0, zIndex: active ? 0 : -1 }, ++ style, ++ ]} ++ > ++ {pressable} ++ ++ ); ++ } ++ + return ( + +- ++ {pressable} + + ); + }); From 2a613bab141b33442757a85f3c4334d942345c47 Mon Sep 17 00:00:00 2001 From: peachbits Date: Sat, 25 Jul 2026 16:58:26 -0700 Subject: [PATCH 10/37] Fix invisible and washed-out blur backgrounds on older Android devices On Android below 12 the blur library falls back to RenderScript, which cannot snapshot content rendered by the new architecture. Instead of the content behind it, it paints a flat gray wash, so modals, the tab bar, scene headers and footers, notification cards and the keyboard-avoiding buttons all rendered washed out or transparent. There is no way to make that blur render correctly, so skip it on those devices and have each host paint a solid background instead. The dark theme's modal color is translucent because it normally sits on top of the blur, so modals get a solid stand-in, and the QR modal gets a plain scrim in place of its blurred underlay. The login-ui patch carries the same fix for its own copies, plus a fix for a development-mode render error where animation worklets captured a Date they cannot serialize. --- patches/edge-login-ui-rn+3.36.0.patch | 124 +++++++++++++++++- src/components/buttons/KavButtons.tsx | 8 +- src/components/common/BlurBackground.tsx | 21 +++ src/components/modals/EdgeModal.tsx | 8 +- src/components/modals/QrModal.tsx | 26 +++- .../navigation/HeaderBackground.tsx | 8 +- .../notification/NotificationCard.tsx | 3 +- src/components/themed/MenuTabs.tsx | 10 +- src/components/themed/SceneFooterWrapper.tsx | 20 ++- 9 files changed, 206 insertions(+), 22 deletions(-) diff --git a/patches/edge-login-ui-rn+3.36.0.patch b/patches/edge-login-ui-rn+3.36.0.patch index 8be2237fb6a..ea7e4da4d11 100644 --- a/patches/edge-login-ui-rn+3.36.0.patch +++ b/patches/edge-login-ui-rn+3.36.0.patch @@ -1,13 +1,133 @@ +diff --git a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js b/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js +index 296ed73..cbb46aa 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js ++++ b/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js +@@ -4,16 +4,26 @@ import { cacheStyles } from 'react-native-patina'; + import { BlurView } from 'rn-id-blurview'; + import { useTheme } from '../services/ThemeContext'; + const isAndroid = Platform.OS === 'android'; ++// Android below 12 (API 31) blurs via RenderScript, which cannot snapshot ++// content rendered by the new architecture - BlurView paints a light gray ++// wash instead of blurred content. Worse, plain sibling Views also fail to ++// paint inside modals on those devices, so hosts must provide their own ++// solid background color and this component renders nothing. ++export const isBlurDisabled = isAndroid && Number(Platform.Version) < 31; + /** A blur background WITH rounded corners, used for most components */ + export const BlurBackground = () => { + const theme = useTheme(); + const styles = getStyles(theme); ++ if (isBlurDisabled) ++ return null; + return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: [styles.blurView, styles.roundCorner], overlayColor: "rgba(0, 0, 0, 0)" })); + }; + /** A blur background WITHOUT rounded corners. For the scene header/footer */ + export const BlurBackgroundNoRoundedCorners = () => { + const theme = useTheme(); + const styles = getStyles(theme); ++ if (isBlurDisabled) ++ return null; + return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: styles.blurView, overlayColor: "rgba(0, 0, 0, 0)" })); + }; + const getStyles = cacheStyles((theme) => ({ diff --git a/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js b/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js -index 462a84a..ed9fb2e 100644 +index 462a84a..3e65f32 100644 --- a/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js +++ b/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js -@@ -28,7 +28,7 @@ function AnimatedFontIcon(props) { +@@ -28,7 +28,10 @@ function AnimatedFontIcon(props) { return ({ color: (_a = color === null || color === void 0 ? void 0 : color.value) !== null && _a !== void 0 ? _a : defaultColor, fontFamily, - fontSize: (_b = size === null || size === void 0 ? void 0 : size.value) !== null && _b !== void 0 ? _b : defaultSize, ++ // Fabric on Android throws on non-positive text font sizes, and icon ++ // sizes legitimately animate to 0 (e.g. FilledTextInput side icons), so ++ // clamp to 1 (invisible - the containers collapse to zero width anyway): + fontSize: Math.max((_b = size === null || size === void 0 ? void 0 : size.value) !== null && _b !== void 0 ? _b : defaultSize, 1), fontStyle: 'normal', fontWeight: 'normal' }); +diff --git a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js +index e70234c..b4749a5 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js ++++ b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js +@@ -13,7 +13,7 @@ import { EdgeTouchableWithoutFeedback } from '../common/EdgeTouchableWithoutFeed + import { CloseIcon } from '../icons/ThemedIcons'; + import { useTheme } from '../services/ThemeContext'; + import { EdgeText } from '../themed/EdgeText'; +-import { BlurBackground } from '../ui4/BlurBackground'; ++import { BlurBackground, isBlurDisabled } from '../ui4/BlurBackground'; + const BACKGROUND_ALPHA = 0.7; + const SCROLL_INDICATOR_INSET_FIX = { right: 1 }; + const safeAreaGap = 64; // Overkill to avoid bottom of screen +@@ -123,7 +123,13 @@ const getStyles = cacheStyles((theme) => ({ + }, + modal: { + alignSelf: 'flex-end', +- backgroundColor: theme.modalBackground, ++ // Devices that cannot render the blur background get a solid color ++ // approximating the blurred glass look: ++ backgroundColor: isBlurDisabled ++ ? theme.isDark ++ ? '#2b2b2b' ++ : '#f2f2f2' ++ : theme.modalBackground, + borderTopLeftRadius: theme.rem(1), + borderTopRightRadius: theme.rem(1), + flexShrink: 1, +diff --git a/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js b/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js +index 83eb678..83a3279 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js ++++ b/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js +@@ -69,10 +69,13 @@ export const PasswordLoginScene = (props) => { + }, [inputHeight]); + const sAnimationMult = useSharedValue(0); + const sScrollY = useSharedValue(0); ++ // Capture only the count in the worklets below: localUsers entries contain ++ // `lastLogin: Date`, and the worklets runtime cannot serialize Date objects ++ // (dev-mode "[Worklets] Cannot copy value of type `Date`" render error). ++ const localUserCount = localUsers.length; + const dFinalHeight = useDerivedValue(() => { +- return (usernameItemHeight * +- Math.min(localUsers.length, MAX_DISPLAYED_LOCAL_USERS)); +- }, [usernameItemHeight, localUsers]); ++ return (usernameItemHeight * Math.min(localUserCount, MAX_DISPLAYED_LOCAL_USERS)); ++ }, [usernameItemHeight, localUserCount]); + const scrollHandler = useAnimatedScrollHandler({ + onScroll: (e) => { + sScrollY.value = e.contentOffset.y; +@@ -83,11 +86,11 @@ export const PasswordLoginScene = (props) => { + const aGradientOpacity = useAnimatedStyle(() => { + // Always hide the bottom ScrollView gradient if there's no entries below + // the lower bound of the ScrollView +- if (MAX_DISPLAYED_LOCAL_USERS > localUsers.length) ++ if (MAX_DISPLAYED_LOCAL_USERS > localUserCount) + return { opacity: 0 }; + // Define the bounds at which the opacity should begin to change +- const minScroll = usernameItemHeight * (localUsers.length - MAX_DISPLAYED_LOCAL_USERS - 1); +- const maxScroll = usernameItemHeight * (localUsers.length - MAX_DISPLAYED_LOCAL_USERS); ++ const minScroll = usernameItemHeight * (localUserCount - MAX_DISPLAYED_LOCAL_USERS - 1); ++ const maxScroll = usernameItemHeight * (localUserCount - MAX_DISPLAYED_LOCAL_USERS); + return { + opacity: interpolate(sScrollY.value, [minScroll, maxScroll], [1, 0], Extrapolate.CLAMP) + }; +diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js +index 9c77bc0..c7f23e8 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js ++++ b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js +@@ -6,9 +6,17 @@ import { Platform, StyleSheet } from 'react-native'; + import { BlurView } from 'rn-id-blurview'; + import { cacheStyles, useTheme } from '../services/ThemeContext'; + const isAndroid = Platform.OS === 'android'; ++// Android below 12 (API 31) blurs via RenderScript, which cannot snapshot ++// content rendered by the new architecture - BlurView paints a light gray ++// wash instead of blurred content. Worse, plain sibling Views also fail to ++// paint inside the modal on those devices, so the modal must provide its own ++// solid background color and this component renders nothing. ++export const isBlurDisabled = isAndroid && Number(Platform.Version) < 31; + export const BlurBackground = () => { + const theme = useTheme(); + const styles = getStyles(theme); ++ if (isBlurDisabled) ++ return null; + return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: styles.blurView, overlayColor: "rgba(0, 0, 0, 0)" })); + }; + const getStyles = cacheStyles((theme) => ({ diff --git a/src/components/buttons/KavButtons.tsx b/src/components/buttons/KavButtons.tsx index b429fc3541b..020cf198f34 100644 --- a/src/components/buttons/KavButtons.tsx +++ b/src/components/buttons/KavButtons.tsx @@ -1,7 +1,10 @@ import * as React from 'react' import { useHandler } from '../../hooks/useHandler' -import { BlurBackgroundNoRoundedCorners } from '../common/BlurBackground' +import { + BlurBackgroundNoRoundedCorners, + getBlurFallbackStyle +} from '../common/BlurBackground' import { EdgeAnim, fadeInDown10 } from '../common/EdgeAnim' import { cacheStyles, type Theme, useTheme } from '../services/ThemeContext' import type { ButtonInfo } from './ButtonsView' @@ -81,7 +84,8 @@ const getStyles = cacheStyles((theme: Theme) => ({ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', - padding: theme.rem(0.5) + padding: theme.rem(0.5), + ...getBlurFallbackStyle(theme) }, tertiary: { marginTop: theme.rem(0.25) diff --git a/src/components/common/BlurBackground.tsx b/src/components/common/BlurBackground.tsx index d4412147da2..083e77dbbf0 100644 --- a/src/components/common/BlurBackground.tsx +++ b/src/components/common/BlurBackground.tsx @@ -6,11 +6,31 @@ import { cacheStyles, type Theme, useTheme } from '../services/ThemeContext' const isAndroid = Platform.OS === 'android' +// Android below 12 (API 31) blurs via RenderScript, which cannot snapshot +// content rendered by the new architecture: instead of the content behind it, +// the blur paints a flat gray wash that washes out whatever it covers. There +// is no way to make it render correctly on those devices, so skip it entirely +// and let hosts paint a solid background instead (see getBlurFallbackStyle). +export const isBlurDisabled = isAndroid && Number(Platform.Version) < 31 + +/** + * Solid background for containers whose BlurBackground cannot render (see + * isBlurDisabled). Spread into a style object: it contributes nothing at all + * on capable devices, leaving their styles untouched. + */ +export const getBlurFallbackStyle = ( + theme: Theme +): { backgroundColor: string } | null => + isBlurDisabled + ? { backgroundColor: theme.isDark ? '#161616' : '#f6f6f6' } + : null + /** A blur background WITH rounded corners, used for most components */ export const BlurBackground: React.FC = () => { const theme = useTheme() const styles = getStyles(theme) + if (isBlurDisabled) return null return ( { const theme = useTheme() const styles = getStyles(theme) + if (isBlurDisabled) return null return ( ({ }, modal: { alignSelf: 'flex-end', - backgroundColor: theme.modalBackground, + // The dark theme's modal color is translucent because it normally sits on + // top of the blur. Where the blur is skipped, the scene would show + // through it, so use a solid stand-in instead: + backgroundColor: + isBlurDisabled && theme.isDark ? '#2b2b2b' : theme.modalBackground, borderTopLeftRadius: theme.rem(1), borderTopRightRadius: theme.rem(1), flexShrink: 1, diff --git a/src/components/modals/QrModal.tsx b/src/components/modals/QrModal.tsx index 7dd0c06d66d..a7abbb12a6e 100644 --- a/src/components/modals/QrModal.tsx +++ b/src/components/modals/QrModal.tsx @@ -1,11 +1,12 @@ import type { EdgeCurrencyWallet, EdgeTokenId } from 'edge-core-js' import * as React from 'react' -import { StyleSheet } from 'react-native' +import { StyleSheet, View } from 'react-native' import { type AirshipBridge, AirshipModal } from 'react-native-airship' import { useSafeAreaFrame } from 'react-native-safe-area-context' import { BlurView } from 'rn-id-blurview' -import { useTheme } from '../services/ThemeContext' +import { isBlurDisabled } from '../common/BlurBackground' +import { cacheStyles, type Theme, useTheme } from '../services/ThemeContext' import { QrCode } from '../themed/QrCode' interface Props { @@ -18,6 +19,7 @@ interface Props { export const QrModal: React.FC = props => { const { bridge, data, tokenId, wallet } = props const theme = useTheme() + const styles = getStyles(theme) const windowSize = useSafeAreaFrame() const maxSize = Math.min(windowSize.width, windowSize.height) @@ -34,10 +36,15 @@ export const QrModal: React.FC = props => { maxHeight={maxSize} onCancel={handleCancel} underlay={ - + // Where the blur cannot render, dim the scene with a plain scrim: + isBlurDisabled ? ( + + ) : ( + + ) } > = props => { ) } + +const getStyles = cacheStyles((theme: Theme) => ({ + scrim: { + backgroundColor: theme.modalSceneOverlayColor, + opacity: 0.7 + } +})) diff --git a/src/components/navigation/HeaderBackground.tsx b/src/components/navigation/HeaderBackground.tsx index fea8dea75aa..37bb7c9cb2e 100644 --- a/src/components/navigation/HeaderBackground.tsx +++ b/src/components/navigation/HeaderBackground.tsx @@ -8,7 +8,10 @@ import Animated, { } from 'react-native-reanimated' import { useSceneScrollContext } from '../../state/SceneScrollState' -import { BlurBackgroundNoRoundedCorners } from '../common/BlurBackground' +import { + BlurBackgroundNoRoundedCorners, + getBlurFallbackStyle +} from '../common/BlurBackground' import { styled } from '../hoc/styled' import { useTheme } from '../services/ThemeContext' import { DividerLine } from '../themed/DividerLine' @@ -34,11 +37,12 @@ export const HeaderBackground = (props: any): React.JSX.Element => { const HeaderBackgroundContainerView = styled(Animated.View)<{ scrollY: SharedValue -}>(() => ({ scrollY }) => [ +}>(theme => ({ scrollY }) => [ { ...StyleSheet.absoluteFill, alignItems: 'stretch', justifyContent: 'flex-end', + ...getBlurFallbackStyle(theme), opacity: 0 }, useAnimatedStyle(() => ({ diff --git a/src/components/notification/NotificationCard.tsx b/src/components/notification/NotificationCard.tsx index fc94c48711f..36dcf9de23d 100644 --- a/src/components/notification/NotificationCard.tsx +++ b/src/components/notification/NotificationCard.tsx @@ -13,7 +13,7 @@ import { runOnJS } from 'react-native-worklets' import { useHandler } from '../../hooks/useHandler' import { getThemedIconUri } from '../../util/CdnUris' -import { BlurBackground } from '../common/BlurBackground' +import { BlurBackground, getBlurFallbackStyle } from '../common/BlurBackground' import { EdgeTouchableOpacity } from '../common/EdgeTouchableOpacity' import { styled } from '../hoc/styled' import { showError } from '../services/AirshipInstance' @@ -208,6 +208,7 @@ const getStyles = cacheStyles((theme: Theme) => ({ overflow: 'hidden', borderRadius: theme.cardBorderRadius, marginHorizontal: theme.rem(0.5), + ...getBlurFallbackStyle(theme), // TODO: Design approval that we don't need to make ios/android specific // adjustments here. ...theme.notificationCardShadow diff --git a/src/components/themed/MenuTabs.tsx b/src/components/themed/MenuTabs.tsx index 2149f6d69f1..c40a4f7d7dd 100644 --- a/src/components/themed/MenuTabs.tsx +++ b/src/components/themed/MenuTabs.tsx @@ -32,7 +32,10 @@ import { import { config } from '../../theme/appConfig' import { useSelector } from '../../types/reactRedux' import { scale } from '../../util/scaling' -import { BlurBackgroundNoRoundedCorners } from '../common/BlurBackground' +import { + BlurBackgroundNoRoundedCorners, + getBlurFallbackStyle +} from '../common/BlurBackground' import { styled } from '../hoc/styled' import { useTheme } from '../services/ThemeContext' import { VectorIcon } from './VectorIcon' @@ -173,10 +176,11 @@ const Background = styled(Animated.View)<{ footerHeight: SharedValue openRatio: SharedValue tabLabelHeight: number -}>(() => ({ footerHeight: footerHeightRef, openRatio, tabLabelHeight }) => { +}>(theme => ({ footerHeight: footerHeightRef, openRatio, tabLabelHeight }) => { return [ { - ...StyleSheet.absoluteFill + ...StyleSheet.absoluteFill, + ...getBlurFallbackStyle(theme) }, useAnimatedStyle(() => { const openRatioInverted = interpolate(openRatio.value, [0, 1], [1, 0]) diff --git a/src/components/themed/SceneFooterWrapper.tsx b/src/components/themed/SceneFooterWrapper.tsx index 5ae18cc7574..79658ce59c6 100644 --- a/src/components/themed/SceneFooterWrapper.tsx +++ b/src/components/themed/SceneFooterWrapper.tsx @@ -8,7 +8,10 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context' import { useLayoutOnce } from '../../hooks/useLayoutOnce' import { useSceneFooterState } from '../../state/SceneFooterState' -import { BlurBackgroundNoRoundedCorners } from '../common/BlurBackground' +import { + BlurBackgroundNoRoundedCorners, + getBlurFallbackStyle +} from '../common/BlurBackground' import type { SceneWrapperInfo } from '../common/SceneWrapper' import { styled } from '../hoc/styled' @@ -69,6 +72,7 @@ export const SceneFooterWrapper = ( footerOpenRatio={footerOpenRatio} isKeyboardOpen={isKeyboardOpen} insetBottom={maybeInsetBottom} + noBackgroundBlur={noBackgroundBlur} onLayout={handleLayoutOnce} > {noBackgroundBlur ? null : } @@ -82,16 +86,24 @@ const ContainerAnimatedView = styled(Animated.View)<{ footerOpenRatio: SharedValue isKeyboardOpen: boolean insetBottom: number + noBackgroundBlur?: boolean }>( - () => - ({ containerHeight, footerOpenRatio, isKeyboardOpen, insetBottom }) => { + theme => + ({ + containerHeight, + footerOpenRatio, + isKeyboardOpen, + insetBottom, + noBackgroundBlur = false + }) => { // Exclude inset if the keyboard is open const maybeInsetBottom = !isKeyboardOpen ? insetBottom : 0 return [ { overflow: 'hidden', - paddingBottom: maybeInsetBottom + paddingBottom: maybeInsetBottom, + ...(noBackgroundBlur ? null : getBlurFallbackStyle(theme)) }, useAnimatedStyle(() => { if (containerHeight == null) return {} From f5bf411dc94311f443100637458d088e80731a80 Mon Sep 17 00:00:00 2001 From: peachbits Date: Sat, 25 Jul 2026 16:58:48 -0700 Subject: [PATCH 11/37] Wait for the core context before auto-logging in The auto-login effect runs on mount and disarms itself immediately, but on release builds this scene mounts before the core context reaches the store, so the attempt ran against the placeholder object, threw, and never retried. Bail out until the context is ready and let the effect re-run. Development builds win the race, which is why this only ever showed up in release builds. --- src/components/scenes/LoginScene.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/scenes/LoginScene.tsx b/src/components/scenes/LoginScene.tsx index ec8bc8fb71b..087a4273bdb 100644 --- a/src/components/scenes/LoginScene.tsx +++ b/src/components/scenes/LoginScene.tsx @@ -67,6 +67,11 @@ export const LoginScene: React.FC = props => { React.useEffect(() => { if (!firstRun) return + // The core context is an empty placeholder object until EdgeCoreManager + // finishes booting. On release builds this scene mounts first, so bail + // WITHOUT disarming firstRun; the context dep re-runs this effect once + // the real context lands, and YOLO can fire then. + if (context.loginWithPassword == null) return const { YOLO_USERNAME, YOLO_PASSWORD, YOLO_PIN } = ENV if ( YOLO_USERNAME != null && From cf3efbc314333cb235a5ae475274741a0f217217 Mon Sep 17 00:00:00 2001 From: peachbits Date: Sat, 25 Jul 2026 17:51:56 -0700 Subject: [PATCH 12/37] Android: turn off Fabric view recycling View recycling only runs under the new architecture, so enabling it turned this on for the first time. Recycled views arrive still carrying visual properties from their previous use: a button that becomes enabled stays dimmed, and labels render at a stale font size. Both were reproduced on an Android 10 device, on the survey modal's Next button and the wallet name modal's title. Keep recycling off so views render the way they did before the architecture switch. Re-enabling it is a performance follow-up once the property-reset gaps are fixed upstream. --- .../src/main/java/co/edgesecure/app/MainApplication.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt index 6527758cdbc..4ea6c029a4f 100644 --- a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt +++ b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt @@ -122,6 +122,16 @@ class MainApplication : object : ReactNativeFeatureFlagsProvider by ReactNativeFeatureFlagsOverrides_RNOSS_Stable_Android() { override fun preventShadowTreeCommitExhaustion(): Boolean = true + + // View recycling only runs under the new architecture, so enabling + // it turned these on for the first time. Recycled views arrive + // carrying visual properties from their previous use: buttons stay + // dimmed after becoming enabled, and labels render at a stale font + // size. Keep them off, matching how the app rendered before the + // architecture switch. + override fun enableViewRecyclingForText(): Boolean = false + + override fun enableViewRecyclingForView(): Boolean = false } ) } From dea9375b3d17d8dbd900521130c013fc4f241792 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 27 Jul 2026 10:32:52 -0700 Subject: [PATCH 13/37] Stop text shrinking itself illegibly small on Android EdgeText asks Android to shrink text to fit its box, with a floor of 65% of the intended size. Under the new architecture that floor is ignored: labels render at a fraction of their size while the text beside them is unaffected, which showed up on the wallet name modal's title and the amount modal's header. Let text truncate rather than shrink on Android, matching what a dozen call sites already opt into individually. Other platforms are unchanged. --- src/components/themed/EdgeText.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/themed/EdgeText.tsx b/src/components/themed/EdgeText.tsx index 2109a1ddca7..d043679f8d0 100644 --- a/src/components/themed/EdgeText.tsx +++ b/src/components/themed/EdgeText.tsx @@ -80,6 +80,11 @@ export const EdgeText: React.FC = (props: LabelProps) => { const theme = useTheme() const styles = getStyles(theme) + // Android's new architecture shrinks auto-sized text far below + // `minimumFontScale`, leaving labels illegibly small, so let text truncate + // there instead of shrinking: + const autoShrink = Platform.OS !== 'android' && !disableFontScaling + let { numberOfLines = 1 } = props if (typeof children === 'string' && children.includes('\n')) { numberOfLines = numberOfLines + (children.match(/\n/g) ?? []).length @@ -90,7 +95,7 @@ export const EdgeText: React.FC = (props: LabelProps) => { allowFontScaling={false} style={[styles.common, style, androidAdjustTextStyle(theme)]} numberOfLines={numberOfLines} - adjustsFontSizeToFit={!disableFontScaling} + adjustsFontSizeToFit={autoShrink} minimumFontScale={0.65} {...rest} > From c1a36f6bd82a9e5124a2c02cd96d0531242f0ae6 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 27 Jul 2026 14:53:02 -0700 Subject: [PATCH 14/37] Keep modals above the keyboard on Android Modals deliberately bleed past the bottom of the screen so the sheet never shows a seam above the navigation bar. That overhang sits behind the keyboard, which cut off the bottom of the modal's own content - the text input modal's submit button was only half visible. Drop the overhang while the keyboard is open, the same way SceneWrapper already drops its bottom inset. The drag slop stays, so swipe-to-dismiss is unchanged. --- src/components/modals/EdgeModal.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/modals/EdgeModal.tsx b/src/components/modals/EdgeModal.tsx index 5f24875fc27..e544326c404 100644 --- a/src/components/modals/EdgeModal.tsx +++ b/src/components/modals/EdgeModal.tsx @@ -11,6 +11,7 @@ import { GestureDetector, ScrollView } from 'react-native-gesture-handler' +import { useKeyboardHandler } from 'react-native-keyboard-controller' import { cacheStyles } from 'react-native-patina' import Animated, { useAnimatedStyle, @@ -132,6 +133,15 @@ export function EdgeModal(props: EdgeModalProps): React.ReactElement { } }, [handleCancel]) + // Insets are not shared values, so track this on the JS thread: + const [isKeyboardOpen, setIsKeyboardOpen] = React.useState(false) + useKeyboardHandler({ + onStart(event) { + 'worklet' + runOnJS(setIsKeyboardOpen)(event.progress === 1) + } + }) + const gesture = Gesture.Pan() .onUpdate(e => { offset.value = e.translationY @@ -156,7 +166,10 @@ export function EdgeModal(props: EdgeModalProps): React.ReactElement { transform: [{ translateY: Math.max(-dragSlop, offset.value) }] })) - const bottomGap = safeAreaGap + dragSlop + // The gap that lets the modal bleed past the bottom of the screen is + // rendered behind the keyboard, so drop it while the keyboard is open or + // it pushes the modal's own content underneath: + const bottomGap = (isKeyboardOpen ? 0 : safeAreaGap) + dragSlop const isHeaderless = title == null && onCancel == null const isCustomTitle = title != null && typeof title !== 'string' From b0f7ca64a1940da20e5ac49764769dee9f803327 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 27 Jul 2026 14:53:02 -0700 Subject: [PATCH 15/37] Fix amount field spacing and clipping on Android Two problems with how the amount and its currency code were laid out: The input carried a negative margin compensating for extra width that the old architecture added for short values. That extra width is gone, so the compensation pulled the currency code into the digits: '1USD' with one digit, correct spacing from two digits on. The input's width is also measured a render behind its contents, so a value that grows by more than one character at once - 123 becoming 1,234, which also gains a separator - was drawn wider than its box and the leading digits were clipped. Typing past it or deleting back to the same value looked fine, which is what made it look intermittent. Size the field with a matching Text instead, which measures in the same pass as the value it draws, and drop the obsolete margin. --- .../__snapshots__/RequestScene.test.tsx.snap | 258 +++++++++++------- src/components/themed/FlipInput2.tsx | 45 +-- 2 files changed, 188 insertions(+), 115 deletions(-) diff --git a/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap index 36e8c09d160..d1f5ea44282 100644 --- a/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap @@ -1487,57 +1487,90 @@ exports[`Request should render with loaded props 1`] = ` } } > - + + + + + "value": { + "color": "rgba(255, 255, 255, 1)", + }, + } + } + jestInlineStyle={ + [ + { + "fontFamily": "Quicksand-Medium", + "fontSize": 34, + "includeFontPadding": false, + "padding": 0, + }, + { + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + }, + ] + } + keyboardType="decimal-pad" + onBlur={[Function]} + onChangeText={[Function]} + onFocus={[Function]} + returnKeyType="done" + style={ + [ + { + "fontFamily": "Quicksand-Medium", + "fontSize": 34, + "includeFontPadding": false, + "padding": 0, + }, + { + "color": "rgba(255, 255, 255, 1)", + }, + { + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + }, + ] + } + value="" + /> + - + + + + + "value": { + "color": "rgba(255, 255, 255, 1)", + }, + } + } + jestInlineStyle={ + [ + { + "fontFamily": "Quicksand-Medium", + "fontSize": 34, + "includeFontPadding": false, + "padding": 0, + }, + { + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + }, + ] + } + keyboardType="decimal-pad" + onBlur={[Function]} + onChangeText={[Function]} + onFocus={[Function]} + returnKeyType="done" + style={ + [ + { + "fontFamily": "Quicksand-Medium", + "fontSize": 34, + "includeFontPadding": false, + "padding": 0, + }, + { + "color": "rgba(255, 255, 255, 1)", + }, + { + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + }, + ] + } + value="" + /> + () => [ } ]) +const sizerStyle = { opacity: 0 } as const + const AnimatedTextInput = Animated.createAnimatedComponent(TextInput) const AmountAnimatedNumericInput = React.forwardRef< @@ -474,27 +477,31 @@ const AmountAnimatedNumericInput = React.forwardRef< includeFontPadding: false, fontFamily: theme.fontFaceMedium, fontSize: theme.rem(1.5), - padding: 0, - - // Android has more space added to the width of the input - // after the last character in the input. It seems to be - // setting a min-width to the input to roughly 2 characters in size. - // We can compensate for this with a negative margin when the character length - // is less then 2 characters. - marginRight: - Platform.OS === 'android' - ? -theme.rem(Math.max(0, 2 - numericProps.value.length) * 0.4) - : 0 + padding: 0 } + // The input's own width is measured one edit behind its contents, so a + // value that grows by more than one character at once - like 123 becoming + // 1,234, which also gains a separator - ends up wider than its box and the + // leading digits are clipped. Size the box with a matching Text instead, + // which measures in the same pass as the value it draws. return ( - + + + {numericProps.value === '' ? ' ' : numericProps.value} + + + ) }) From c89e80b23921de27539440742ed40fd1f9015d56 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 27 Jul 2026 15:29:36 -0700 Subject: [PATCH 16/37] Stop the amount field jumping as you type The field echoes a keystroke before it has re-measured, so for one frame the text was wider than its box and slid left, taking the leading digits out of view before settling. A rejected keystroke made it worse: the value never changes, so the box never grows and the echo sat there until it was reverted. Reserve a character of width in the field so a keystroke always has somewhere to land. That reserved space reads as a slightly wider gap before the currency code, which is the trade: the alternative is letting the currency code sit over the reserved space, and then a keystroke briefly draws on top of it. --- .../scenes/__snapshots__/RequestScene.test.tsx.snap | 4 ++-- src/components/themed/FlipInput2.tsx | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap index d1f5ea44282..e8d3ecdbdd1 100644 --- a/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap @@ -1505,7 +1505,7 @@ exports[`Request should render with loaded props 1`] = ` ] } > - + 0 - + 0 ( disableAnimation={disableAnimation} focusAnimation={focusAnimation} > - {' ' + currencyName} + {currencyName} ) : null} @@ -492,7 +492,11 @@ const AmountAnimatedNumericInput = React.forwardRef< numberOfLines={1} style={[style, sizerStyle]} > - {numericProps.value === '' ? ' ' : numericProps.value} + {/* One character of slack: the field echoes a keystroke a frame + before this text has re-measured, and without the slack the + text scrolls for that frame and the leading digits jump. It + also absorbs rejected keystrokes, which never widen the box. */} + {numericProps.value + '0'} Date: Mon, 31 Aug 2026 15:06:13 -0700 Subject: [PATCH 17/37] Fix expo-modules-jsi under newer Swift compilers The Jenkins iOS agents' Xcode upgrade broke expo-modules-jsi 57.0.3 twice over. First, `abs(milliseconds)` in JavaScriptCodable+Date.swift became ambiguous (expo/expo#47957); upstream fixed it in 57.0.5 with `milliseconds.magnitude`, and the existing ~57.0.3 range already allows it, so the lockfile pin moves to 57.0.6 along with the matching pod. Second, the newer Swift rejects SWIFT_RETURNS_RETAINED on the two RuntimeScheduler constructors because the type is not imported as a shared reference. Upstream removed both annotations on their SDK 58 line; the patch mirrors that change exactly and is droppable once a 57.x release picks it up (57.0.6 is currently the newest). --- ios/Podfile.lock | 4 ++-- package-lock.json | 6 +++--- patches/expo-modules-jsi+57.0.6.patch | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 patches/expo-modules-jsi+57.0.6.patch diff --git a/ios/Podfile.lock b/ios/Podfile.lock index edd5479c987..df649ef3553 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -85,7 +85,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - ExpoModulesJSI (57.0.3): + - ExpoModulesJSI (57.0.6): - React-Core - ReactCommon - ExpoModulesWorklets (57.0.6): @@ -3428,7 +3428,7 @@ SPEC CHECKSUMS: ExpoKeepAwake: c26f14275017370cc8a4b7b43a0e23361f2053a5 ExpoLogBox: 8a3cfa2897e088083cd49fc1ff7fdb2de4385547 ExpoModulesCore: 1026f34fbae2bfe5f34bd9b7029abc9d683633ec - ExpoModulesJSI: 1abe88b923f2233ea75be46693611add7136b3a9 + ExpoModulesJSI: fb279421fb76e371f05b966244f13ae5cb2643c4 ExpoModulesWorklets: 2ba73eabbbd0470e43f8998757f4cb8abff8355b ExpoModulesWorkletsAdapter: f6e197437ec4b17cd455e8c307d793552250d348 ExpoQuickActions: fdbda7f5874aed3dd2b1d891ec00ab3300dc7541 diff --git a/package-lock.json b/package-lock.json index 95ecd0b3255..e4a7aadd922 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18100,9 +18100,9 @@ } }, "node_modules/expo-modules-jsi": { - "version": "57.0.3", - "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-57.0.3.tgz", - "integrity": "sha512-B+iXJCC5OIXjFKkLLSY2DZ8BGS+hC3PBTrALpV43pHqhXqqZrRH3uTEylZgsoKQO8N8tjmjAua2ucTFHtr1o0w==", + "version": "57.0.6", + "resolved": "https://registry.npmjs.org/expo-modules-jsi/-/expo-modules-jsi-57.0.6.tgz", + "integrity": "sha512-WK0xFEe0FdZTCLCdfXK+HVNYfAmEbA6goecRxqjr0gh3XYRKAr9tikxqcM0ItLQoEPKntscPZhWcPLGvr97Tfw==", "license": "MIT", "peerDependencies": { "react-native": "*" diff --git a/patches/expo-modules-jsi+57.0.6.patch b/patches/expo-modules-jsi+57.0.6.patch new file mode 100644 index 00000000000..b831dcd68ea --- /dev/null +++ b/patches/expo-modules-jsi+57.0.6.patch @@ -0,0 +1,22 @@ +diff --git a/node_modules/expo-modules-jsi/apple/Sources/ExpoModulesJSI-Cxx/include/RuntimeScheduler.h b/node_modules/expo-modules-jsi/apple/Sources/ExpoModulesJSI-Cxx/include/RuntimeScheduler.h +index 6115e87..957527c 100644 +--- a/node_modules/expo-modules-jsi/apple/Sources/ExpoModulesJSI-Cxx/include/RuntimeScheduler.h ++++ b/node_modules/expo-modules-jsi/apple/Sources/ExpoModulesJSI-Cxx/include/RuntimeScheduler.h +@@ -50,7 +50,7 @@ public: + `scheduleTask` dispatches through `fn`, which the host implements against + the real react::RuntimeScheduler. + */ +- SWIFT_RETURNS_RETAINED RuntimeScheduler(void *scheduler, ScheduleFn fn) noexcept ++ RuntimeScheduler(void *scheduler, ScheduleFn fn) noexcept + : nativeScheduler(scheduler), scheduleFn(fn) {} + + /** +@@ -58,7 +58,7 @@ public: + caller's thread — intended for standalone runtimes (e.g. tests) that have + no React scheduler. + */ +- SWIFT_RETURNS_RETAINED RuntimeScheduler() {} ++ RuntimeScheduler() {} + + RuntimeScheduler(const RuntimeScheduler &) = delete; + From 374640f60f5721d6e4ceb6fe5d985eaf21ffec0b Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 31 Aug 2026 16:39:26 -0700 Subject: [PATCH 18/37] Patch expo-modules-core for stricter Swift concurrency checks The Jenkins agent's newer Swift rejects EventEmitter's `nonisolated(unsafe) weak let` captures being sent into the JavaScript actor ("sending 'emitter' risks causing data races"). Upstream's SDK 58 line already fixed this by boxing the weak reference in the NonisolatedUnsafeWeakVar wrapper that 57.0.6 ships but does not yet use here; this patch mirrors that change exactly. No 57.x release carries it (57.0.14 is byte-identical in this file), so the patch is droppable when one does. --- patches/expo-modules-core+57.0.6.patch | 44 ++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 patches/expo-modules-core+57.0.6.patch diff --git a/patches/expo-modules-core+57.0.6.patch b/patches/expo-modules-core+57.0.6.patch new file mode 100644 index 00000000000..181ea874f9a --- /dev/null +++ b/patches/expo-modules-core+57.0.6.patch @@ -0,0 +1,44 @@ +diff --git a/node_modules/expo-modules-core/ios/Core/Events/EventEmitter.swift b/node_modules/expo-modules-core/ios/Core/Events/EventEmitter.swift +index 3046568..dd03845 100644 +--- a/node_modules/expo-modules-core/ios/Core/Events/EventEmitter.swift ++++ b/node_modules/expo-modules-core/ios/Core/Events/EventEmitter.swift +@@ -42,14 +42,14 @@ public extension EventEmitter { + return + } + // The emitter is not necessarily `Sendable` - some modules hold non-sendable state — so we can't let +- // the compiler send `self` into the `@JavaScriptActor` region. Capturing it as `nonisolated(unsafe)` is +- // safe here because the scheduled closure only calls `withEventTarget`, which touches `@JavaScriptActor`- +- // isolated or `Sendable` state (the JS object, the registry, `appContext`) and the emitter's identity - +- // never the module's own mutable state. +- nonisolated(unsafe) weak let emitter = self ++ // the compiler send `self` into the `@JavaScriptActor` region. Wrapping it in a weak, `@unchecked ++ // Sendable` box is safe here because the scheduled closure only calls `withEventTarget`, which touches ++ // `@JavaScriptActor`-isolated or `Sendable` state (the JS object, the registry, `appContext`) and the ++ // emitter's identity - never the module's own mutable state. ++ let emitter = NonisolatedUnsafeWeakVar(self) + + runtime.schedule { +- guard let emitter else { ++ guard let emitter = emitter.value else { + return + } + let dispatched = emitter.withEventTarget { target in +@@ -70,13 +70,13 @@ public extension EventEmitter { + log.warn("Trying to send event '\(event)' to \(type(of: self)), but the JS runtime has been lost") + return + } +- // See the note in `emit(event:payload:)` above - the emitter is captured as `nonisolated(unsafe)` +- // because it isn't necessarily `Sendable`, and the scheduled closure only reaches `@JavaScriptActor`- +- // isolated or `Sendable` state through it. +- nonisolated(unsafe) weak let emitter = self ++ // See the note in `emit(event:payload:)` above - the emitter is captured in a weak, `@unchecked ++ // Sendable` box because it isn't necessarily `Sendable`, and the scheduled closure only reaches ++ // `@JavaScriptActor`-isolated or `Sendable` state through it. ++ let emitter = NonisolatedUnsafeWeakVar(self) + + runtime.schedule { [weak appContext] in +- guard let emitter, let appContext else { ++ guard let emitter = emitter.value, let appContext else { + return + } + let jsPayload: JavaScriptValue From 5550444e5ef2783fa4cd1f2dc91c76941e85d4ec Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 10 Aug 2026 16:16:22 -0700 Subject: [PATCH 19/37] Drop two unused dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `deprecated-react-native-prop-types` exists to shim libraries that import PropTypes from react-native; RN 0.86 removed those exports entirely and nothing in the app imports it. `@types/react-native` is stale at 0.71 and obsolete since react-native ships its own types. `react-native-email-link` looks equally unused — it appears in no source file — but it stays: edge-login-ui-rn imports it in PasswordRecoveryActions while declaring it only as a devDependency, so the app has to supply it. Removing it breaks the bundle at password recovery. Fourteen other packages reach us the same way; `react-native-linear-gradient`, `rn-id-blurview`, `react-native-vector-icons` and `react-native-permissions` are the ones that matter for any future dependency cleanup. --- package-lock.json | 18 ------------------ package.json | 2 -- 2 files changed, 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index e4a7aadd922..1ba31834c63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,7 +44,6 @@ "date-fns": "^2.22.1", "dateformat": "^3.0.3", "deepmerge": "^4.3.1", - "deprecated-react-native-prop-types": "^5.0.0", "detect-bundler": "^1.1.0", "disklet": "^0.6.0", "edge-core-js": "^2.48.1", @@ -157,7 +156,6 @@ "@types/node-fetch": "^2.6.2", "@types/prompts": "^2.0.14", "@types/react": "^19.2.0", - "@types/react-native": "^0.71.1", "@types/react-native-custom-tabs": "^0.1.2", "@types/react-native-safari-view": "^2.0.5", "@types/react-native-snap-carousel": "^3.8.9", @@ -15978,22 +15976,6 @@ "node": ">= 0.8" } }, - "node_modules/deprecated-react-native-prop-types": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "@react-native/normalize-colors": "^0.73.0", - "invariant": "^2.2.4", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/deprecated-react-native-prop-types/node_modules/@react-native/normalize-colors": { - "version": "0.73.2", - "license": "MIT" - }, "node_modules/des.js": { "version": "1.0.0", "dev": true, diff --git a/package.json b/package.json index 9e94a96a114..af0ec59ec39 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,6 @@ "date-fns": "^2.22.1", "dateformat": "^3.0.3", "deepmerge": "^4.3.1", - "deprecated-react-native-prop-types": "^5.0.0", "detect-bundler": "^1.1.0", "disklet": "^0.6.0", "edge-core-js": "^2.48.1", @@ -217,7 +216,6 @@ "@types/node-fetch": "^2.6.2", "@types/prompts": "^2.0.14", "@types/react": "^19.2.0", - "@types/react-native": "^0.71.1", "@types/react-native-custom-tabs": "^0.1.2", "@types/react-native-safari-view": "^2.0.5", "@types/react-native-snap-carousel": "^3.8.9", From 2438b09f70de87a9397b53d88c31d81e2c1bc2e6 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 10 Aug 2026 16:17:32 -0700 Subject: [PATCH 20/37] Render gradients with expo-linear-gradient react-native-linear-gradient has no codegen spec, so every gradient in the app - cards, buttons, the header, the tab bar, the scene background - was drawn through Fabric's legacy view-manager interop. expo-linear-gradient is a real Fabric component and Expo is already a dependency, so this swap removes a native dependency rather than adding one: edge-login-ui-rn's six gradient scenes migrate through the regenerated patch, which lets react-native-linear-gradient leave package.json entirely (verified on device that removing it beforehand left PinLoginScene throwing "View config not found for component BVLinearGradient"), and the BVLinearGradient pod gives way to ExpoLinearGradient. The props are the same (`colors`, `start`, `end`, `locations`); nothing uses `useAngle`, the one prop Expo lacks. What differs is the typing: Expo wants the color and location arrays to be tuples of two or more, since a gradient with fewer stops has nothing to interpolate. The theme's gradient fields become `GradientColors` to match, and the six scenes that darken the first stop of the asset background build a new tuple instead of mutating a copy. react-native-gifted-charts also reaches for a gradient, but it tries react-native-linear-gradient and falls back to expo-linear-gradient, with both declared optional; the bundle builds and resolves to the Expo one. expo-linear-gradient is mocked in jestSetup because importing it pulls in expo-modules-core, which expects native globals the react-native jest preset doesn't provide. Snapshots move from BVLinearGradient to that mock. Touching these files takes them off the ESLint warnings list, so their pre-existing lint errors are fixed here too. --- eslint.config.mjs | 12 +- ios/Podfile.lock | 12 +- jestSetup.js | 6 + package-lock.json | 23 +- package.json | 2 +- patches/edge-login-ui-rn+3.36.0.patch | 133 ------ patches/edge-login-ui-rn+3.37.0.patch | 430 ++++++++++++++++++ src/__tests__/components/Card.test.tsx | 2 +- .../__snapshots__/BalanceCard.test.tsx.snap | 22 +- .../__snapshots__/Buttons.test.tsx.snap | 376 +++++++-------- .../__snapshots__/Card.test.tsx.snap | 26 +- .../__snapshots__/MenuTabs.test.tsx.snap | 11 +- .../__snapshots__/SceneHeader.test.tsx.snap | 13 +- .../__snapshots__/AddressModal.test.tsx.snap | 11 +- .../AutoLogoutModal.test.tsx.snap | 11 +- .../__snapshots__/CategoryModal.test.tsx.snap | 88 ++-- .../__snapshots__/LogsModal.test.tsx.snap | 37 +- .../PasswordReminderModal.test.tsx.snap | 22 +- .../TextInputModal.test.tsx.snap | 22 +- ...reateWalletAccountSetupScene.test.tsx.snap | 24 +- .../CreateWalletEditNameScene.test.tsx.snap | 37 +- .../CreateWalletImportScene.test.tsx.snap | 35 +- ...reateWalletSelectCryptoScene.test.tsx.snap | 24 +- .../CurrencyNotificationScene.test.tsx.snap | 13 +- .../CurrencySettings.ui.test.tsx.snap | 35 +- .../DefaultFiatSettingScene.test.tsx.snap | 24 +- .../EdgeLoginScene.test.tsx.snap | 13 +- .../FioAddressDetailsScene.test.tsx.snap | 50 +- .../FioAddressListScene.test.tsx.snap | 59 ++- .../FioAddressRegisterScene.test.tsx.snap | 46 +- ...essRegisterSelectWalletScene.test.tsx.snap | 26 +- .../FioAddressRegisteredScene.test.tsx.snap | 26 +- .../FioAddressSettingsScene.test.tsx.snap | 46 +- ...FioConnectWalletConfirmScene.test.tsx.snap | 24 +- .../FioDomainRegisterScene.test.tsx.snap | 24 +- .../__snapshots__/RequestScene.test.tsx.snap | 48 +- .../__snapshots__/SendScene2.ui.test.tsx.snap | 299 ++++++------ .../__snapshots__/SettingsScene.test.tsx.snap | 288 ++++++------ .../SwapConfirmationScene.test.tsx.snap | 39 +- .../SwapCreateScene.test.tsx.snap | 35 +- .../SwapSuccessScene.test.tsx.snap | 13 +- .../TransactionDetailsScene.test.tsx.snap | 202 ++++---- src/components/buttons/EdgeButton.tsx | 2 +- src/components/buttons/IconButton.tsx | 2 +- src/components/buttons/PillButton.tsx | 2 +- src/components/cards/EdgeCard.tsx | 4 +- src/components/cards/GiftCardDisplayCard.tsx | 2 +- src/components/cards/HomeTileCard.tsx | 2 +- src/components/cards/InfoCard.tsx | 2 +- src/components/common/DividerLineUi4.tsx | 5 +- src/components/common/DotsBackground.tsx | 6 +- src/components/common/SceneWrapper.tsx | 4 +- src/components/modals/GradientFadeout.tsx | 18 +- .../navigation/HeaderBackground.tsx | 2 +- .../progress-indicators/Shimmer.tsx | 2 +- .../progress-indicators/ShimmerCard.tsx | 2 +- .../progress-indicators/StepProgressBar.tsx | 6 +- .../scenes/ChangeMiningFeeScene.tsx | 45 +- src/components/scenes/GiftCardMarketScene.tsx | 2 +- src/components/scenes/RequestScene.tsx | 18 +- src/components/scenes/SendScene2.tsx | 18 +- .../scenes/Staking/StakeOptionsScene.tsx | 18 +- .../scenes/TransactionDetailsScene.tsx | 18 +- src/components/scenes/WalletDetailsScene.tsx | 18 +- src/components/themed/DividerLine.tsx | 7 +- src/components/themed/MenuTabs.tsx | 2 +- src/components/themed/SideMenu.tsx | 2 +- .../themed/TransactionListComponents.tsx | 12 +- src/types/Theme.ts | 37 +- 69 files changed, 1551 insertions(+), 1396 deletions(-) delete mode 100644 patches/edge-login-ui-rn+3.36.0.patch create mode 100644 patches/edge-login-ui-rn+3.37.0.patch diff --git a/eslint.config.mjs b/eslint.config.mjs index 4b286bc245a..b9465116975 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -139,7 +139,7 @@ export default [ 'src/app.ts', 'src/components/buttons/ButtonsView.tsx', 'src/components/buttons/EdgeSwitch.tsx', - 'src/components/buttons/IconButton.tsx', + 'src/components/buttons/MinimalButton.tsx', 'src/components/buttons/ModalButtons.tsx', 'src/components/buttons/ReturnKeyTypeButton.tsx', @@ -150,7 +150,7 @@ export default [ 'src/components/cards/FiatAmountInputCard.tsx', 'src/components/cards/FiatExchangeDetailsCard.tsx', - 'src/components/cards/HomeTileCard.tsx', + 'src/components/cards/IconMessageCard.tsx', 'src/components/cards/LoanDetailsSummaryCard.tsx', 'src/components/cards/LoanSummaryCard.tsx', @@ -170,7 +170,6 @@ export default [ 'src/components/common/AnimatedNumber.tsx', 'src/components/common/CrossFade.tsx', - 'src/components/common/DotsBackground.tsx', 'src/components/common/ExpandableList.tsx', 'src/components/common/QrPeephole.tsx', @@ -208,7 +207,6 @@ export default [ 'src/components/modals/FioExpiredModal.tsx', 'src/components/modals/FundAccountModal.tsx', - 'src/components/modals/GradientFadeout.tsx', 'src/components/modals/InsufficientFeesModal.tsx', 'src/components/modals/ListModal.tsx', @@ -247,8 +245,6 @@ export default [ 'src/components/progress-indicators/FullScreenLoader.tsx', 'src/components/progress-indicators/LoadingSplashScreen.tsx', - 'src/components/progress-indicators/StepProgressBar.tsx', - 'src/components/rows/CryptoFiatAmountRow.tsx', 'src/components/rows/EdgeRow.tsx', @@ -257,8 +253,6 @@ export default [ 'src/components/rows/SwapProviderRow.tsx', 'src/components/rows/TxCryptoAmountRow.tsx', - 'src/components/scenes/ChangeMiningFeeScene.tsx', - 'src/components/scenes/ConfirmScene.tsx', 'src/components/scenes/CreateWalletAccountSelectScene.tsx', 'src/components/scenes/CreateWalletAccountSetupScene.tsx', @@ -347,7 +341,6 @@ export default [ 'src/components/text/TitleText.tsx', 'src/components/themed/Alert.tsx', - 'src/components/themed/DividerLine.tsx', 'src/components/themed/EdgeProviderComponent.tsx', 'src/components/themed/ExplorerCard.tsx', @@ -372,7 +365,6 @@ export default [ 'src/components/themed/ThemedButtons.tsx', 'src/components/themed/Thermostat.tsx', 'src/components/themed/Title.tsx', - 'src/components/themed/TransactionListComponents.tsx', 'src/components/themed/VectorIcon.tsx', 'src/components/themed/WalletList.tsx', diff --git a/ios/Podfile.lock b/ios/Podfile.lock index df649ef3553..30517c7f9a9 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,7 +1,5 @@ PODS: - _NIODataStructures (2.40.0) - - BVLinearGradient (2.8.3): - - React-Core - CGRPCZlib (1.8.0) - CNIOAtomics (2.40.0) - CNIOBoringSSL (2.19.0) @@ -60,6 +58,8 @@ PODS: - ExpoModulesCore - ExpoKeepAwake (57.0.1): - ExpoModulesCore + - ExpoLinearGradient (57.0.1): + - ExpoModulesCore - ExpoLogBox (57.0.1): - React-Core - ExpoModulesCore (57.0.6): @@ -2926,7 +2926,6 @@ PODS: - ZXingObjC/All (3.6.9) DEPENDENCIES: - - BVLinearGradient (from `../node_modules/react-native-linear-gradient`) - disklet (from `../node_modules/disklet`) - edge-core-js (from `../node_modules/edge-core-js`) - edge-currency-accountbased (from `../node_modules/edge-currency-accountbased`) @@ -2940,6 +2939,7 @@ DEPENDENCIES: - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) - ExpoFont (from `../node_modules/expo-font/ios`) - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) + - ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`) - "ExpoLogBox (from `../node_modules/@expo/log-box`)" - ExpoModulesCore (from `../node_modules/expo-modules-core`) - ExpoModulesJSI (from `../node_modules/expo-modules-jsi/apple`) @@ -3118,8 +3118,6 @@ SPEC REPOS: - ZXingObjC EXTERNAL SOURCES: - BVLinearGradient: - :path: "../node_modules/react-native-linear-gradient" disklet: :path: "../node_modules/disklet" edge-core-js: @@ -3146,6 +3144,8 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-font/ios" ExpoKeepAwake: :path: "../node_modules/expo-keep-awake/ios" + ExpoLinearGradient: + :path: "../node_modules/expo-linear-gradient/ios" ExpoLogBox: :path: "../node_modules/@expo/log-box" ExpoModulesCore: @@ -3404,7 +3404,6 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: _NIODataStructures: 3d45d8e70a1d17a15b1dc59d102c63dbc0525ffd - BVLinearGradient: cb006ba232a1f3e4f341bb62c42d1098c284da70 CGRPCZlib: 298dd3237ba4bd7b3eed109e7080ff3324b7d9c9 CNIOAtomics: 8edf08644e5e6fa0f021c239be9e8beb1cd9ef18 CNIOBoringSSL: 2c9c96c2e95f15e83fb8d26b9738d939cc39ae33 @@ -3426,6 +3425,7 @@ SPEC CHECKSUMS: ExpoFileSystem: e441dae0ae671fc451640517550973d9e024fdf0 ExpoFont: 59e1faf66ba9bcd232ae1e2ce58d202a48b6f65e ExpoKeepAwake: c26f14275017370cc8a4b7b43a0e23361f2053a5 + ExpoLinearGradient: 903b3f5fe566c666ff78b2599add51d094483613 ExpoLogBox: 8a3cfa2897e088083cd49fc1ff7fdb2de4385547 ExpoModulesCore: 1026f34fbae2bfe5f34bd9b7029abc9d683633ec ExpoModulesJSI: fb279421fb76e371f05b966244f13ae5cb2643c4 diff --git a/jestSetup.js b/jestSetup.js index 25b412cba60..dc35eb950b1 100644 --- a/jestSetup.js +++ b/jestSetup.js @@ -135,6 +135,12 @@ jest.mock('edge-login-ui-rn', () => ({ } })) +// expo-linear-gradient reaches for expo-modules-core's native globals on +// import, which don't exist under the react-native jest preset: +jest.mock('expo-linear-gradient', () => ({ + LinearGradient: 'ExpoLinearGradient' +})) + jest.mock('react-native-share', () => 'RNShare') jest.mock( diff --git a/package-lock.json b/package-lock.json index 1ba31834c63..de402532e7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,6 +54,7 @@ "edge-login-ui-rn": "^3.37.2", "ethers": "^5.7.2", "expo": "^57.0.7", + "expo-linear-gradient": "~57.0.1", "expo-quick-actions": "^5.0.0", "jsrsasign": "^11.1.0", "marked": "^15.0.9", @@ -86,7 +87,6 @@ "react-native-in-app-review": "^4.3.5", "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-keyboard-controller": "1.22.2", - "react-native-linear-gradient": "^2.8.3", "react-native-localize": "^3.4.2", "react-native-mail": "^6.1.1", "react-native-monero": "0.5.0", @@ -18036,6 +18036,17 @@ "react": "*" } }, + "node_modules/expo-linear-gradient": { + "version": "57.0.1", + "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-57.0.1.tgz", + "integrity": "sha512-CpS8eMqoIWcHVGKV66zbDvzotCw9qYp3f8CuI9N+h1LaO0tMLUzBpkhAKePUsXlpN3yolYlHFSPkfVZ/uSh+iA==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/expo-modules-autolinking": { "version": "57.0.8", "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-57.0.8.tgz", @@ -24983,6 +24994,8 @@ }, "node_modules/react-native-email-link": { "version": "1.14.5", + "resolved": "https://registry.npmjs.org/react-native-email-link/-/react-native-email-link-1.14.5.tgz", + "integrity": "sha512-TNi9OeGcJlw6FXl1dWAKEBGJEgKPBfsiB3v8GaHqqCtzmWnKE+8y1Wfhaaloh37OJb2vqp1cwDpW5m6PiTXazA==", "license": "MIT", "peerDependencies": { "react": ">=16.8.0", @@ -25153,14 +25166,6 @@ "react-native-reanimated": ">=3.0.0" } }, - "node_modules/react-native-linear-gradient": { - "version": "2.8.3", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/react-native-localize": { "version": "3.4.2", "license": "MIT", diff --git a/package.json b/package.json index af0ec59ec39..95158b85b53 100644 --- a/package.json +++ b/package.json @@ -114,6 +114,7 @@ "edge-login-ui-rn": "^3.37.2", "ethers": "^5.7.2", "expo": "^57.0.7", + "expo-linear-gradient": "~57.0.1", "expo-quick-actions": "^5.0.0", "jsrsasign": "^11.1.0", "marked": "^15.0.9", @@ -146,7 +147,6 @@ "react-native-in-app-review": "^4.3.5", "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-keyboard-controller": "1.22.2", - "react-native-linear-gradient": "^2.8.3", "react-native-localize": "^3.4.2", "react-native-mail": "^6.1.1", "react-native-monero": "0.5.0", diff --git a/patches/edge-login-ui-rn+3.36.0.patch b/patches/edge-login-ui-rn+3.36.0.patch deleted file mode 100644 index ea7e4da4d11..00000000000 --- a/patches/edge-login-ui-rn+3.36.0.patch +++ /dev/null @@ -1,133 +0,0 @@ -diff --git a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js b/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js -index 296ed73..cbb46aa 100644 ---- a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js -+++ b/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js -@@ -4,16 +4,26 @@ import { cacheStyles } from 'react-native-patina'; - import { BlurView } from 'rn-id-blurview'; - import { useTheme } from '../services/ThemeContext'; - const isAndroid = Platform.OS === 'android'; -+// Android below 12 (API 31) blurs via RenderScript, which cannot snapshot -+// content rendered by the new architecture - BlurView paints a light gray -+// wash instead of blurred content. Worse, plain sibling Views also fail to -+// paint inside modals on those devices, so hosts must provide their own -+// solid background color and this component renders nothing. -+export const isBlurDisabled = isAndroid && Number(Platform.Version) < 31; - /** A blur background WITH rounded corners, used for most components */ - export const BlurBackground = () => { - const theme = useTheme(); - const styles = getStyles(theme); -+ if (isBlurDisabled) -+ return null; - return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: [styles.blurView, styles.roundCorner], overlayColor: "rgba(0, 0, 0, 0)" })); - }; - /** A blur background WITHOUT rounded corners. For the scene header/footer */ - export const BlurBackgroundNoRoundedCorners = () => { - const theme = useTheme(); - const styles = getStyles(theme); -+ if (isBlurDisabled) -+ return null; - return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: styles.blurView, overlayColor: "rgba(0, 0, 0, 0)" })); - }; - const getStyles = cacheStyles((theme) => ({ -diff --git a/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js b/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js -index 462a84a..3e65f32 100644 ---- a/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js -+++ b/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js -@@ -28,7 +28,10 @@ function AnimatedFontIcon(props) { - return ({ - color: (_a = color === null || color === void 0 ? void 0 : color.value) !== null && _a !== void 0 ? _a : defaultColor, - fontFamily, -- fontSize: (_b = size === null || size === void 0 ? void 0 : size.value) !== null && _b !== void 0 ? _b : defaultSize, -+ // Fabric on Android throws on non-positive text font sizes, and icon -+ // sizes legitimately animate to 0 (e.g. FilledTextInput side icons), so -+ // clamp to 1 (invisible - the containers collapse to zero width anyway): -+ fontSize: Math.max((_b = size === null || size === void 0 ? void 0 : size.value) !== null && _b !== void 0 ? _b : defaultSize, 1), - fontStyle: 'normal', - fontWeight: 'normal' - }); -diff --git a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js -index e70234c..b4749a5 100644 ---- a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js -+++ b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js -@@ -13,7 +13,7 @@ import { EdgeTouchableWithoutFeedback } from '../common/EdgeTouchableWithoutFeed - import { CloseIcon } from '../icons/ThemedIcons'; - import { useTheme } from '../services/ThemeContext'; - import { EdgeText } from '../themed/EdgeText'; --import { BlurBackground } from '../ui4/BlurBackground'; -+import { BlurBackground, isBlurDisabled } from '../ui4/BlurBackground'; - const BACKGROUND_ALPHA = 0.7; - const SCROLL_INDICATOR_INSET_FIX = { right: 1 }; - const safeAreaGap = 64; // Overkill to avoid bottom of screen -@@ -123,7 +123,13 @@ const getStyles = cacheStyles((theme) => ({ - }, - modal: { - alignSelf: 'flex-end', -- backgroundColor: theme.modalBackground, -+ // Devices that cannot render the blur background get a solid color -+ // approximating the blurred glass look: -+ backgroundColor: isBlurDisabled -+ ? theme.isDark -+ ? '#2b2b2b' -+ : '#f2f2f2' -+ : theme.modalBackground, - borderTopLeftRadius: theme.rem(1), - borderTopRightRadius: theme.rem(1), - flexShrink: 1, -diff --git a/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js b/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js -index 83eb678..83a3279 100644 ---- a/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js -+++ b/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js -@@ -69,10 +69,13 @@ export const PasswordLoginScene = (props) => { - }, [inputHeight]); - const sAnimationMult = useSharedValue(0); - const sScrollY = useSharedValue(0); -+ // Capture only the count in the worklets below: localUsers entries contain -+ // `lastLogin: Date`, and the worklets runtime cannot serialize Date objects -+ // (dev-mode "[Worklets] Cannot copy value of type `Date`" render error). -+ const localUserCount = localUsers.length; - const dFinalHeight = useDerivedValue(() => { -- return (usernameItemHeight * -- Math.min(localUsers.length, MAX_DISPLAYED_LOCAL_USERS)); -- }, [usernameItemHeight, localUsers]); -+ return (usernameItemHeight * Math.min(localUserCount, MAX_DISPLAYED_LOCAL_USERS)); -+ }, [usernameItemHeight, localUserCount]); - const scrollHandler = useAnimatedScrollHandler({ - onScroll: (e) => { - sScrollY.value = e.contentOffset.y; -@@ -83,11 +86,11 @@ export const PasswordLoginScene = (props) => { - const aGradientOpacity = useAnimatedStyle(() => { - // Always hide the bottom ScrollView gradient if there's no entries below - // the lower bound of the ScrollView -- if (MAX_DISPLAYED_LOCAL_USERS > localUsers.length) -+ if (MAX_DISPLAYED_LOCAL_USERS > localUserCount) - return { opacity: 0 }; - // Define the bounds at which the opacity should begin to change -- const minScroll = usernameItemHeight * (localUsers.length - MAX_DISPLAYED_LOCAL_USERS - 1); -- const maxScroll = usernameItemHeight * (localUsers.length - MAX_DISPLAYED_LOCAL_USERS); -+ const minScroll = usernameItemHeight * (localUserCount - MAX_DISPLAYED_LOCAL_USERS - 1); -+ const maxScroll = usernameItemHeight * (localUserCount - MAX_DISPLAYED_LOCAL_USERS); - return { - opacity: interpolate(sScrollY.value, [minScroll, maxScroll], [1, 0], Extrapolate.CLAMP) - }; -diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js -index 9c77bc0..c7f23e8 100644 ---- a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js -+++ b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js -@@ -6,9 +6,17 @@ import { Platform, StyleSheet } from 'react-native'; - import { BlurView } from 'rn-id-blurview'; - import { cacheStyles, useTheme } from '../services/ThemeContext'; - const isAndroid = Platform.OS === 'android'; -+// Android below 12 (API 31) blurs via RenderScript, which cannot snapshot -+// content rendered by the new architecture - BlurView paints a light gray -+// wash instead of blurred content. Worse, plain sibling Views also fail to -+// paint inside the modal on those devices, so the modal must provide its own -+// solid background color and this component renders nothing. -+export const isBlurDisabled = isAndroid && Number(Platform.Version) < 31; - export const BlurBackground = () => { - const theme = useTheme(); - const styles = getStyles(theme); -+ if (isBlurDisabled) -+ return null; - return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: styles.blurView, overlayColor: "rgba(0, 0, 0, 0)" })); - }; - const getStyles = cacheStyles((theme) => ({ diff --git a/patches/edge-login-ui-rn+3.37.0.patch b/patches/edge-login-ui-rn+3.37.0.patch new file mode 100644 index 00000000000..e2b9739628a --- /dev/null +++ b/patches/edge-login-ui-rn+3.37.0.patch @@ -0,0 +1,430 @@ +diff --git a/node_modules/edge-login-ui-rn/lib/components/buttons/EdgeButton.js b/node_modules/edge-login-ui-rn/lib/components/buttons/EdgeButton.js +index b4a087e..8106e29 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/buttons/EdgeButton.js ++++ b/node_modules/edge-login-ui-rn/lib/components/buttons/EdgeButton.js +@@ -2,9 +2,9 @@ + * IMPORTANT: Changes in this file MUST be synced between edge-react-gui and + * edge-login-ui-rn! + */ ++import { LinearGradient } from 'expo-linear-gradient'; + import * as React from 'react'; + import { ActivityIndicator, Platform, StyleSheet, View } from 'react-native'; +-import LinearGradient from 'react-native-linear-gradient'; + import { cacheStyles } from 'react-native-patina'; + import { usePendingPress } from '../../hooks/usePendingPress'; + import { fixSides, mapSides, sidesToMargin } from '../../util/sides'; +diff --git a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.d.ts b/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.d.ts +index 4fdfab4..adfeca7 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.d.ts ++++ b/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.d.ts +@@ -1,5 +1,6 @@ + /// ++export declare const isBlurDisabled: boolean; + /** A blur background WITH rounded corners, used for most components */ +-export declare const BlurBackground: () => JSX.Element; ++export declare const BlurBackground: () => JSX.Element | null; + /** A blur background WITHOUT rounded corners. For the scene header/footer */ +-export declare const BlurBackgroundNoRoundedCorners: () => JSX.Element; ++export declare const BlurBackgroundNoRoundedCorners: () => JSX.Element | null; +diff --git a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js b/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js +index 296ed73..cbb46aa 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js ++++ b/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.js +@@ -4,16 +4,26 @@ import { cacheStyles } from 'react-native-patina'; + import { BlurView } from 'rn-id-blurview'; + import { useTheme } from '../services/ThemeContext'; + const isAndroid = Platform.OS === 'android'; ++// Android below 12 (API 31) blurs via RenderScript, which cannot snapshot ++// content rendered by the new architecture - BlurView paints a light gray ++// wash instead of blurred content. Worse, plain sibling Views also fail to ++// paint inside modals on those devices, so hosts must provide their own ++// solid background color and this component renders nothing. ++export const isBlurDisabled = isAndroid && Number(Platform.Version) < 31; + /** A blur background WITH rounded corners, used for most components */ + export const BlurBackground = () => { + const theme = useTheme(); + const styles = getStyles(theme); ++ if (isBlurDisabled) ++ return null; + return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: [styles.blurView, styles.roundCorner], overlayColor: "rgba(0, 0, 0, 0)" })); + }; + /** A blur background WITHOUT rounded corners. For the scene header/footer */ + export const BlurBackgroundNoRoundedCorners = () => { + const theme = useTheme(); + const styles = getStyles(theme); ++ if (isBlurDisabled) ++ return null; + return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: styles.blurView, overlayColor: "rgba(0, 0, 0, 0)" })); + }; + const getStyles = cacheStyles((theme) => ({ +diff --git a/node_modules/edge-login-ui-rn/lib/components/common/DividerLineUi4.d.ts b/node_modules/edge-login-ui-rn/lib/components/common/DividerLineUi4.d.ts +index cff6869..da58b8a 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/common/DividerLineUi4.d.ts ++++ b/node_modules/edge-login-ui-rn/lib/components/common/DividerLineUi4.d.ts +@@ -1,11 +1,12 @@ + import * as React from 'react'; ++import type { GradientColors } from '../../types/Theme'; + interface Props { + /** Extend to the right outside of the container. For scene-level usage. */ + extendRight?: boolean; + /** @deprecated Only to be used during the UI4 transition */ + marginRem?: number[] | number; + /** Unused by current Edge themes, but supported for third-party integrations. */ +- colors?: string[]; ++ colors?: GradientColors; + } + /** + * A simple horizontal divider line for separating content sections. +diff --git a/node_modules/edge-login-ui-rn/lib/components/common/DividerLineUi4.js b/node_modules/edge-login-ui-rn/lib/components/common/DividerLineUi4.js +index 2468702..d7eafde 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/common/DividerLineUi4.js ++++ b/node_modules/edge-login-ui-rn/lib/components/common/DividerLineUi4.js +@@ -1,5 +1,5 @@ ++import { LinearGradient } from 'expo-linear-gradient'; + import * as React from 'react'; +-import LinearGradient from 'react-native-linear-gradient'; + import { cacheStyles } from 'react-native-patina'; + import { fixSides, mapSides, sidesToMargin } from '../../util/sides'; + import { useTheme } from '../services/ThemeContext'; +@@ -19,7 +19,10 @@ export const DividerLineUi4 = (props) => { + : extendRight + ? styles.extendRight + : styles.default; +- const dividerColors = colors !== null && colors !== void 0 ? colors : [theme.lineDivider, theme.lineDivider]; ++ const dividerColors = colors !== null && colors !== void 0 ? colors : [ ++ theme.lineDivider, ++ theme.lineDivider ++ ]; + return (React.createElement(LinearGradient, { colors: dividerColors, start: start, end: end, style: [styles.divider, margin] })); + }; + const getStyles = cacheStyles((theme) => ({ +diff --git a/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js b/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js +index 462a84a..3e65f32 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js ++++ b/node_modules/edge-login-ui-rn/lib/components/icons/ThemedIcons.js +@@ -28,7 +28,10 @@ function AnimatedFontIcon(props) { + return ({ + color: (_a = color === null || color === void 0 ? void 0 : color.value) !== null && _a !== void 0 ? _a : defaultColor, + fontFamily, +- fontSize: (_b = size === null || size === void 0 ? void 0 : size.value) !== null && _b !== void 0 ? _b : defaultSize, ++ // Fabric on Android throws on non-positive text font sizes, and icon ++ // sizes legitimately animate to 0 (e.g. FilledTextInput side icons), so ++ // clamp to 1 (invisible - the containers collapse to zero width anyway): ++ fontSize: Math.max((_b = size === null || size === void 0 ? void 0 : size.value) !== null && _b !== void 0 ? _b : defaultSize, 1), + fontStyle: 'normal', + fontWeight: 'normal' + }); +diff --git a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js +index e70234c..b4749a5 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js ++++ b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js +@@ -13,7 +13,7 @@ import { EdgeTouchableWithoutFeedback } from '../common/EdgeTouchableWithoutFeed + import { CloseIcon } from '../icons/ThemedIcons'; + import { useTheme } from '../services/ThemeContext'; + import { EdgeText } from '../themed/EdgeText'; +-import { BlurBackground } from '../ui4/BlurBackground'; ++import { BlurBackground, isBlurDisabled } from '../ui4/BlurBackground'; + const BACKGROUND_ALPHA = 0.7; + const SCROLL_INDICATOR_INSET_FIX = { right: 1 }; + const safeAreaGap = 64; // Overkill to avoid bottom of screen +@@ -123,7 +123,13 @@ const getStyles = cacheStyles((theme) => ({ + }, + modal: { + alignSelf: 'flex-end', +- backgroundColor: theme.modalBackground, ++ // Devices that cannot render the blur background get a solid color ++ // approximating the blurred glass look: ++ backgroundColor: isBlurDisabled ++ ? theme.isDark ++ ? '#2b2b2b' ++ : '#f2f2f2' ++ : theme.modalBackground, + borderTopLeftRadius: theme.rem(1), + borderTopRightRadius: theme.rem(1), + flexShrink: 1, +diff --git a/node_modules/edge-login-ui-rn/lib/components/modals/GradientFadeout.js b/node_modules/edge-login-ui-rn/lib/components/modals/GradientFadeout.js +index 6bf6555..361902f 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/modals/GradientFadeout.js ++++ b/node_modules/edge-login-ui-rn/lib/components/modals/GradientFadeout.js +@@ -1,5 +1,5 @@ ++import { LinearGradient } from 'expo-linear-gradient'; + import * as React from 'react'; +-import LinearGradient from 'react-native-linear-gradient'; + import { cacheStyles } from 'react-native-patina'; + import { useTheme } from '../services/ThemeContext'; + const MARKS = [0, 0.2, 0.75, 1]; +@@ -12,8 +12,12 @@ export const GradientFadeOut = () => { + const theme = useTheme(); + const styles = getStyles(theme); + const color = theme.modal; ++ // Written out rather than mapped so the colors stay a fixed-length tuple: ++ // `LinearGradient` wants at least two stops, and as many colors as marks. + const colors = React.useMemo(() => { +- return MARKS.map(mark => color + `0${Math.floor(255 * mark).toString(16)}`.slice(-2)); ++ const fade = (mark) => color + `0${Math.floor(255 * mark).toString(16)}`.slice(-2); ++ const [first, second, third, fourth] = MARKS; ++ return [fade(first), fade(second), fade(third), fade(fourth)]; + }, [color]); + return (React.createElement(LinearGradient, { style: styles.container, start: START, end: END, colors: colors, locations: MARKS, pointerEvents: "none" })); + }; +diff --git a/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js b/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js +index 83eb678..83a3279 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js ++++ b/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js +@@ -69,10 +69,13 @@ export const PasswordLoginScene = (props) => { + }, [inputHeight]); + const sAnimationMult = useSharedValue(0); + const sScrollY = useSharedValue(0); ++ // Capture only the count in the worklets below: localUsers entries contain ++ // `lastLogin: Date`, and the worklets runtime cannot serialize Date objects ++ // (dev-mode "[Worklets] Cannot copy value of type `Date`" render error). ++ const localUserCount = localUsers.length; + const dFinalHeight = useDerivedValue(() => { +- return (usernameItemHeight * +- Math.min(localUsers.length, MAX_DISPLAYED_LOCAL_USERS)); +- }, [usernameItemHeight, localUsers]); ++ return (usernameItemHeight * Math.min(localUserCount, MAX_DISPLAYED_LOCAL_USERS)); ++ }, [usernameItemHeight, localUserCount]); + const scrollHandler = useAnimatedScrollHandler({ + onScroll: (e) => { + sScrollY.value = e.contentOffset.y; +@@ -83,11 +86,11 @@ export const PasswordLoginScene = (props) => { + const aGradientOpacity = useAnimatedStyle(() => { + // Always hide the bottom ScrollView gradient if there's no entries below + // the lower bound of the ScrollView +- if (MAX_DISPLAYED_LOCAL_USERS > localUsers.length) ++ if (MAX_DISPLAYED_LOCAL_USERS > localUserCount) + return { opacity: 0 }; + // Define the bounds at which the opacity should begin to change +- const minScroll = usernameItemHeight * (localUsers.length - MAX_DISPLAYED_LOCAL_USERS - 1); +- const maxScroll = usernameItemHeight * (localUsers.length - MAX_DISPLAYED_LOCAL_USERS); ++ const minScroll = usernameItemHeight * (localUserCount - MAX_DISPLAYED_LOCAL_USERS - 1); ++ const maxScroll = usernameItemHeight * (localUserCount - MAX_DISPLAYED_LOCAL_USERS); + return { + opacity: interpolate(sScrollY.value, [minScroll, maxScroll], [1, 0], Extrapolate.CLAMP) + }; +diff --git a/node_modules/edge-login-ui-rn/lib/components/scenes/PinLoginScene.js b/node_modules/edge-login-ui-rn/lib/components/scenes/PinLoginScene.js +index d5ba59c..0967891 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/scenes/PinLoginScene.js ++++ b/node_modules/edge-login-ui-rn/lib/components/scenes/PinLoginScene.js +@@ -8,9 +8,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge + }); + }; + import { asMaybeNetworkError, asMaybePasswordError, asMaybeUsernameError } from 'edge-core-js'; ++import { LinearGradient } from 'expo-linear-gradient'; + import * as React from 'react'; + import { FlatList, Keyboard, Platform, View } from 'react-native'; +-import LinearGradient from 'react-native-linear-gradient'; + import { cacheStyles } from 'react-native-patina'; + import { SafeAreaView } from 'react-native-safe-area-context'; + import { SvgXml } from 'react-native-svg'; +diff --git a/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js b/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js +index 5fed31f..ad8aea7 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js ++++ b/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js +@@ -1,5 +1,5 @@ ++import { LinearGradient } from 'expo-linear-gradient'; + import * as React from 'react'; +-import LinearGradient from 'react-native-linear-gradient'; + import { cacheStyles } from 'react-native-patina'; + import { usePendingPress } from '../../hooks/usePendingPress'; + import { fixSides, mapSides, sidesToMargin, sidesToPadding } from '../../util/sides'; +diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts +index 1ce7388..3a90515 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts ++++ b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts +@@ -2,4 +2,5 @@ + * IMPORTANT: Changes in this file MUST be synced with edge-react-gui! + */ + /// +-export declare const BlurBackground: () => JSX.Element; ++export declare const isBlurDisabled: boolean; ++export declare const BlurBackground: () => JSX.Element | null; +diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js +index 9c77bc0..c7f23e8 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js ++++ b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js +@@ -6,9 +6,17 @@ import { Platform, StyleSheet } from 'react-native'; + import { BlurView } from 'rn-id-blurview'; + import { cacheStyles, useTheme } from '../services/ThemeContext'; + const isAndroid = Platform.OS === 'android'; ++// Android below 12 (API 31) blurs via RenderScript, which cannot snapshot ++// content rendered by the new architecture - BlurView paints a light gray ++// wash instead of blurred content. Worse, plain sibling Views also fail to ++// paint inside the modal on those devices, so the modal must provide its own ++// solid background color and this component renders nothing. ++export const isBlurDisabled = isAndroid && Number(Platform.Version) < 31; + export const BlurBackground = () => { + const theme = useTheme(); + const styles = getStyles(theme); ++ if (isBlurDisabled) ++ return null; + return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: styles.blurView, overlayColor: "rgba(0, 0, 0, 0)" })); + }; + const getStyles = cacheStyles((theme) => ({ +diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.d.ts b/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.d.ts +index 1fc2957..8ce3c4b 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.d.ts ++++ b/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.d.ts +@@ -1,5 +1,5 @@ ++import { LinearGradientProps } from 'expo-linear-gradient'; + import * as React from 'react'; +-import { LinearGradientProps } from 'react-native-linear-gradient'; + interface Props { + overlay?: React.ReactNode; + children: React.ReactNode | React.ReactNode[]; +diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.js b/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.js +index 9e5b49d..a4d9930 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.js ++++ b/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.js +@@ -7,9 +7,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; ++import { LinearGradient } from 'expo-linear-gradient'; + import * as React from 'react'; + import { StyleSheet, View } from 'react-native'; +-import LinearGradient from 'react-native-linear-gradient'; + import { cacheStyles } from 'react-native-patina'; + import { useHandler } from '../../hooks/useHandler'; + import { triggerHaptic } from '../../util/haptic'; +diff --git a/node_modules/edge-login-ui-rn/lib/types/Theme.d.ts b/node_modules/edge-login-ui-rn/lib/types/Theme.d.ts +index b98562b..b407833 100644 +--- a/node_modules/edge-login-ui-rn/lib/types/Theme.d.ts ++++ b/node_modules/edge-login-ui-rn/lib/types/Theme.d.ts +@@ -3,8 +3,14 @@ declare const asGradientCoords: import("cleaners").ObjectCleaner<{ + y: number; + }>; + type GradientCoords = ReturnType; ++/** ++ * A gradient needs at least two stops to interpolate between, which ++ * `LinearGradient` enforces in its own prop types. A plain `string[]` says ++ * nothing about length, so themes declare the tuple instead. ++ */ ++export type GradientColors = readonly [string, string, ...string[]]; + declare const asThemeGradientParams: import("cleaners").ObjectCleaner<{ +- colors: string[]; ++ colors: GradientColors; + start: { + x: any; + y: any; +@@ -68,7 +74,7 @@ export interface Theme { + buttonBorderRadiusRem: number; + keypadButtonOutline: string; + keypadButtonOutlineWidth: number; +- keypadButton: string[]; ++ keypadButton: GradientColors; + keypadButtonColorStart: GradientCoords; + keypadButtonColorEnd: GradientCoords; + keypadButtonText: string; +@@ -79,7 +85,7 @@ export interface Theme { + keypadButtonFont: string; + primaryButtonOutline: string; + primaryButtonOutlineWidth: number; +- primaryButton: string[]; ++ primaryButton: GradientColors; + primaryButtonColorStart: GradientCoords; + primaryButtonColorEnd: GradientCoords; + primaryButtonText: string; +@@ -89,7 +95,7 @@ export interface Theme { + primaryButtonFont: string; + secondaryButtonOutline: string; + secondaryButtonOutlineWidth: number; +- secondaryButton: string[]; ++ secondaryButton: GradientColors; + secondaryButtonColorStart: GradientCoords; + secondaryButtonColorEnd: GradientCoords; + secondaryButtonText: string; +@@ -99,7 +105,7 @@ export interface Theme { + secondaryButtonFont: string; + escapeButtonOutline: string; + escapeButtonOutlineWidth: number; +- escapeButton: string[]; ++ escapeButton: GradientColors; + escapeButtonColorStart: GradientCoords; + escapeButtonColorEnd: GradientCoords; + escapeButtonText: string; +@@ -109,7 +115,7 @@ export interface Theme { + escapeButtonFont: string; + dangerButtonOutline: string; + dangerButtonOutlineWidth: number; +- dangerButton: string[]; ++ dangerButton: GradientColors; + dangerButtonColorStart: GradientCoords; + dangerButtonColorEnd: GradientCoords; + dangerButtonText: string; +@@ -119,7 +125,7 @@ export interface Theme { + dangerButtonFont: string; + pinUsernameButtonOutline: string; + pinUsernameButtonOutlineWidth: number; +- pinUsernameButton: string[]; ++ pinUsernameButton: GradientColors; + pinUsernameButtonColorStart: GradientCoords; + pinUsernameButtonColorEnd: GradientCoords; + pinUsernameButtonText: string; +diff --git a/node_modules/edge-login-ui-rn/lib/types/Theme.js b/node_modules/edge-login-ui-rn/lib/types/Theme.js +index f5c8d89..4f2d0ef 100644 +--- a/node_modules/edge-login-ui-rn/lib/types/Theme.js ++++ b/node_modules/edge-login-ui-rn/lib/types/Theme.js +@@ -8,8 +8,15 @@ const asGradientCoords = asObject({ + x: asNumber, + y: asNumber + }); ++const asGradientColors = raw => { ++ const [first, second, ...rest] = asArray(asString)(raw); ++ if (first == null || second == null) { ++ throw new TypeError('A gradient needs at least two colors'); ++ } ++ return [first, second, ...rest]; ++}; + const asThemeGradientParams = asObject({ +- colors: asArray(asString), ++ colors: asGradientColors, + start: asGradientCoords, + end: asGradientCoords + }); +@@ -82,7 +89,7 @@ export const asOptionalTheme = asObject({ + buttonBorderRadiusRem: asOptional(asNumber), + keypadButtonOutline: asOptional(asString), + keypadButtonOutlineWidth: asOptional(asNumber), +- keypadButton: asOptional(asArray(asString)), ++ keypadButton: asOptional(asGradientColors), + keypadButtonColorStart: asOptional(asGradientCoords), + keypadButtonColorEnd: asOptional(asGradientCoords), + keypadButtonText: asOptional(asString), +@@ -93,7 +100,7 @@ export const asOptionalTheme = asObject({ + keypadButtonFont: asOptional(asString), + primaryButtonOutline: asOptional(asString), + primaryButtonOutlineWidth: asOptional(asNumber), +- primaryButton: asOptional(asArray(asString)), ++ primaryButton: asOptional(asGradientColors), + primaryButtonColorStart: asOptional(asGradientCoords), + primaryButtonColorEnd: asOptional(asGradientCoords), + primaryButtonText: asOptional(asString), +@@ -103,7 +110,7 @@ export const asOptionalTheme = asObject({ + primaryButtonFont: asOptional(asString), + secondaryButtonOutline: asOptional(asString), + secondaryButtonOutlineWidth: asOptional(asNumber), +- secondaryButton: asOptional(asArray(asString)), ++ secondaryButton: asOptional(asGradientColors), + secondaryButtonColorStart: asOptional(asGradientCoords), + secondaryButtonColorEnd: asOptional(asGradientCoords), + secondaryButtonText: asOptional(asString), +@@ -113,7 +120,7 @@ export const asOptionalTheme = asObject({ + secondaryButtonFont: asOptional(asString), + escapeButtonOutline: asOptional(asString), + escapeButtonOutlineWidth: asOptional(asNumber), +- escapeButton: asOptional(asArray(asString)), ++ escapeButton: asOptional(asGradientColors), + escapeButtonColorStart: asOptional(asGradientCoords), + escapeButtonColorEnd: asOptional(asGradientCoords), + escapeButtonText: asOptional(asString), +@@ -123,7 +130,7 @@ export const asOptionalTheme = asObject({ + escapeButtonFont: asOptional(asString), + pinUsernameButtonOutline: asOptional(asString), + pinUsernameButtonOutlineWidth: asOptional(asNumber), +- pinUsernameButton: asOptional(asArray(asString)), ++ pinUsernameButton: asOptional(asGradientColors), + pinUsernameButtonColorStart: asOptional(asGradientCoords), + pinUsernameButtonColorEnd: asOptional(asGradientCoords), + pinUsernameButtonText: asOptional(asString), diff --git a/src/__tests__/components/Card.test.tsx b/src/__tests__/components/Card.test.tsx index 819a9887f00..e08ba59acb5 100644 --- a/src/__tests__/components/Card.test.tsx +++ b/src/__tests__/components/Card.test.tsx @@ -8,7 +8,7 @@ import { EdgeCard } from '../../components/cards/EdgeCard' import { EdgeText } from '../../components/themed/EdgeText' import { FakeProviders } from '../../util/fake/FakeProviders' -const testColors = ['#4c669f', '#3b5998', '#192f6a'] +const testColors = ['#4c669f', '#3b5998', '#192f6a'] as const const testIconUri = 'https://content.edge.app/currencyIconsV3/bitcoin/bitcoin.png' diff --git a/src/__tests__/components/__snapshots__/BalanceCard.test.tsx.snap b/src/__tests__/components/__snapshots__/BalanceCard.test.tsx.snap index cc02ab1b616..620db44ef2c 100644 --- a/src/__tests__/components/__snapshots__/BalanceCard.test.tsx.snap +++ b/src/__tests__/components/__snapshots__/BalanceCard.test.tsx.snap @@ -1574,21 +1574,20 @@ exports[`BalanceCard should render with loading props 1`] = ` } } > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Section 1 - - - hello , - - - - - - - - - - - - - - - - - - - , + , - - - + - - - - + - - - - + - - , + , - , + , - - - - + - - - + - - + - - - - - + - - - - - , + , - - - - - + - - - + - - , + , - - - - , + , - - , + , - - - + - - - - + - - + - - - + - - - - - + - - - - + - - - + - - - + - - + - - - - + - - - - + - - - - + - - , + , - - - - - - - - - - - - - - - - - - - - - - - - - - , + , - - - , + , - - - - + - , + , - - - - - - - - - , + , - - - - - - - - { +export const GradientFadeOut = (): React.ReactElement => { const theme = useTheme() const styles = getStyles(theme) const color = theme.modal - const colors: string[] = React.useMemo(() => { - return MARKS.map( - mark => color + `0${Math.floor(255 * mark).toString(16)}`.slice(-2) - ) + // Written out rather than mapped so the colors stay a fixed-length tuple: + // `LinearGradient` wants at least two stops, and as many colors as marks. + const colors = React.useMemo((): GradientColors => { + const fade = (mark: number): string => + color + `0${Math.floor(255 * mark).toString(16)}`.slice(-2) + const [first, second, third, fourth] = MARKS + return [fade(first), fade(second), fade(third), fade(fourth)] }, [color]) return ( { +}): React.ReactElement => { const theme = useTheme() const styles = getStyles(theme) @@ -116,7 +116,7 @@ const StepProgressRow = React.memo(StepProgressRowComponent) // ----------------------------------------------------------------------------- const StepProgressBarComponent = (props: { actionDisplayInfos: ActionDisplayInfo[] -}) => { +}): React.ReactElement => { // completedSteps of -1 will gray out all steps, while 0 will highlight the // first step const { actionDisplayInfos, ...containerProps } = props diff --git a/src/components/scenes/ChangeMiningFeeScene.tsx b/src/components/scenes/ChangeMiningFeeScene.tsx index 218ec27ea23..01bc6ff7917 100644 --- a/src/components/scenes/ChangeMiningFeeScene.tsx +++ b/src/components/scenes/ChangeMiningFeeScene.tsx @@ -13,6 +13,7 @@ import { FEE_STRINGS } from '../../constants/WalletAndCurrencyConstants' import { useIconColor } from '../../hooks/useIconColor' import { lstrings } from '../../locales/strings' import type { EdgeAppSceneProps } from '../../types/routerTypes' +import type { GradientColors } from '../../types/Theme' import type { FeeOption } from '../../types/types' import { darkenHexColor } from '../../util/utils' import { SceneButtons } from '../buttons/SceneButtons' @@ -84,7 +85,8 @@ export class ChangeMiningFeeComponent extends React.PureComponent< ) { // Reset the custom fees if they don't match the format: const defaultCustomFee = {} - // @ts-expect-error + // @ts-expect-error - defaultCustomFee starts as an empty object literal, + // so TypeScript infers no index signature to write these keys through. for (const key of customFormat) defaultCustomFee[key] = '' this.state = { networkFeeOption, customNetworkFee: defaultCustomFee } } else { @@ -101,14 +103,14 @@ export class ChangeMiningFeeComponent extends React.PureComponent< } } - onSubmit = () => { + onSubmit = (): void => { const { networkFeeOption, customNetworkFee } = this.state const { navigation, route } = this.props route.params.onSubmit(networkFeeOption, customNetworkFee) navigation.goBack() } - render() { + render(): React.ReactElement { const { iconColor, theme } = this.props const styles = getStyles(theme) @@ -120,14 +122,15 @@ export class ChangeMiningFeeComponent extends React.PureComponent< iconAccentColor: iconColor ?? '#00000000' } - const backgroundColors = [...theme.assetBackgroundGradientColors] - if (iconColor != null && theme.isDark) { - const scaledColor = darkenHexColor( - iconColor, - theme.assetBackgroundColorScale - ) - backgroundColors[0] = scaledColor - } + // Destructured rather than mutated so the gradient keeps its tuple type: + // `LinearGradient` needs a compile-time guarantee of two or more stops. + const [firstColor, ...restColors] = theme.assetBackgroundGradientColors + const backgroundColors: GradientColors = [ + iconColor != null && theme.isDark + ? darkenHexColor(iconColor, theme.assetBackgroundColorScale) + : firstColor, + ...restColors + ] return ( { return ( { - // @ts-expect-error + // @ts-expect-error - feeSetting is a plain string here, + // not the FeeOption union the state expects. this.setState({ networkFeeOption: feeSetting }) }} > @@ -185,7 +190,9 @@ export class ChangeMiningFeeComponent extends React.PureComponent< ) } - renderCustomFeeTextInput(customFormat: Array) { + renderCustomFeeTextInput( + customFormat: Array + ): React.ReactElement | null { const { networkFeeOption, customNetworkFee } = this.state if (networkFeeOption !== 'custom') return null @@ -203,7 +210,9 @@ export class ChangeMiningFeeComponent extends React.PureComponent< }) }} value={customNetworkFee[key]} - placeholder={FEE_STRINGS[key] || key} + // customFormat comes from the plugin's currencyInfo, which can name + // fee settings FEE_STRINGS has no label for, despite the key type. + placeholder={FEE_STRINGS[key] ?? key} returnKeyType="done" keyboardType="numeric" /> @@ -212,7 +221,7 @@ export class ChangeMiningFeeComponent extends React.PureComponent< ) } - renderFeeWarning() { + renderFeeWarning(): React.ReactElement | null { const { networkFeeOption } = this.state const { theme } = this.props const styles = getStyles(theme) diff --git a/src/components/scenes/GiftCardMarketScene.tsx b/src/components/scenes/GiftCardMarketScene.tsx index 12baf7c1a47..4a8999e186f 100644 --- a/src/components/scenes/GiftCardMarketScene.tsx +++ b/src/components/scenes/GiftCardMarketScene.tsx @@ -1,8 +1,8 @@ import { useQuery } from '@tanstack/react-query' +import { LinearGradient } from 'expo-linear-gradient' import * as React from 'react' import type { ListRenderItem } from 'react-native' import { ScrollView, StyleSheet, View } from 'react-native' -import LinearGradient from 'react-native-linear-gradient' import Animated from 'react-native-reanimated' import { showCountrySelectionModal } from '../../actions/CountryListActions' diff --git a/src/components/scenes/RequestScene.tsx b/src/components/scenes/RequestScene.tsx index d09bb24a1e3..4d2ffbca17b 100644 --- a/src/components/scenes/RequestScene.tsx +++ b/src/components/scenes/RequestScene.tsx @@ -26,6 +26,7 @@ import { getExchangeRate } from '../../selectors/WalletSelectors' import { config } from '../../theme/appConfig' import { useDispatch, useSelector } from '../../types/reactRedux' import type { EdgeAppSceneProps, NavigationBase } from '../../types/routerTypes' +import type { GradientColors } from '../../types/Theme' import type { StringMap } from '../../types/types' import { getCurrencyCode, @@ -492,14 +493,15 @@ export class RequestSceneComponent extends React.Component< iconAccentColor: iconColor ?? '#00000000' } - const backgroundColors = [...theme.assetBackgroundGradientColors] - if (iconColor != null && theme.isDark) { - const scaledColor = darkenHexColor( - iconColor, - theme.assetBackgroundColorScale - ) - backgroundColors[0] = scaledColor - } + // Destructured rather than mutated so the gradient keeps its tuple type: + // `LinearGradient` needs a compile-time guarantee of two or more stops. + const [firstColor, ...restColors] = theme.assetBackgroundGradientColors + const backgroundColors: GradientColors = [ + iconColor != null && theme.isDark + ? darkenHexColor(iconColor, theme.assetBackgroundColorScale) + : firstColor, + ...restColors + ] return isLightAccount ? ( this.renderLightAccountMode() diff --git a/src/components/scenes/SendScene2.tsx b/src/components/scenes/SendScene2.tsx index 050a7e8ddf2..808e3de2f03 100644 --- a/src/components/scenes/SendScene2.tsx +++ b/src/components/scenes/SendScene2.tsx @@ -48,6 +48,7 @@ import { config } from '../../theme/appConfig' import { useState } from '../../types/reactHooks' import { useDispatch, useSelector } from '../../types/reactRedux' import type { EdgeAppSceneProps, NavigationBase } from '../../types/routerTypes' +import type { GradientColors } from '../../types/Theme' import type { FioRequest } from '../../types/types' import { getCurrencyCode } from '../../util/CurrencyInfoHelpers' import { getWalletName } from '../../util/CurrencyWalletHelpers' @@ -1784,14 +1785,15 @@ const SendComponent: React.FC = props => { iconAccentColor: iconColor ?? '#00000000' } - const backgroundColors = [...theme.assetBackgroundGradientColors] - if (iconColor != null && theme.isDark) { - const scaledColor = darkenHexColor( - iconColor, - theme.assetBackgroundColorScale - ) - backgroundColors[0] = scaledColor - } + // Destructured rather than mutated so the gradient keeps its tuple type: + // `LinearGradient` needs a compile-time guarantee of two or more stops. + const [firstColor, ...restColors] = theme.assetBackgroundGradientColors + const backgroundColors: GradientColors = [ + iconColor != null && theme.isDark + ? darkenHexColor(iconColor, theme.assetBackgroundColorScale) + : firstColor, + ...restColors + ] React.useEffect(() => { // Hack: While you would think to use InteractionManager.runAfterInteractions, diff --git a/src/components/scenes/Staking/StakeOptionsScene.tsx b/src/components/scenes/Staking/StakeOptionsScene.tsx index d16db930d04..af4c49a90fc 100644 --- a/src/components/scenes/Staking/StakeOptionsScene.tsx +++ b/src/components/scenes/Staking/StakeOptionsScene.tsx @@ -13,6 +13,7 @@ import type { StakePolicy } from '../../../plugins/stake-plugins/types' import { EMPTY_STAKE_POSITION_MAP } from '../../../reducers/StakingReducer' import { useSelector } from '../../../types/reactRedux' import type { EdgeAppSceneProps } from '../../../types/routerTypes' +import type { GradientColors } from '../../../types/Theme' import { getCurrencyCode } from '../../../util/CurrencyInfoHelpers' import { getPluginFromPolicyId, @@ -130,14 +131,15 @@ const StakeOptionsSceneComponent: React.FC = props => { iconAccentColor: iconColor ?? '#00000000' } - const backgroundColors = [...theme.assetBackgroundGradientColors] - if (iconColor != null && theme.isDark) { - const scaledColor = darkenHexColor( - iconColor, - theme.assetBackgroundColorScale - ) - backgroundColors[0] = scaledColor - } + // Destructured rather than mutated so the gradient keeps its tuple type: + // `LinearGradient` needs a compile-time guarantee of two or more stops. + const [firstColor, ...restColors] = theme.assetBackgroundGradientColors + const backgroundColors: GradientColors = [ + iconColor != null && theme.isDark + ? darkenHexColor(iconColor, theme.assetBackgroundColorScale) + : firstColor, + ...restColors + ] return ( = props => { iconAccentColor: iconColor ?? '#00000000' } - const backgroundColors = [...theme.assetBackgroundGradientColors] - if (iconColor != null && theme.isDark) { - const scaledColor = darkenHexColor( - iconColor, - theme.assetBackgroundColorScale - ) - backgroundColors[0] = scaledColor - } + // Destructured rather than mutated so the gradient keeps its tuple type: + // `LinearGradient` needs a compile-time guarantee of two or more stops. + const [firstColor, ...restColors] = theme.assetBackgroundGradientColors + const backgroundColors: GradientColors = [ + iconColor != null && theme.isDark + ? darkenHexColor(iconColor, theme.assetBackgroundColorScale) + : firstColor, + ...restColors + ] const fiatAction = action != null && action.actionType === 'fiat' ? action : undefined diff --git a/src/components/scenes/WalletDetailsScene.tsx b/src/components/scenes/WalletDetailsScene.tsx index a15947e4691..f4034c07f61 100644 --- a/src/components/scenes/WalletDetailsScene.tsx +++ b/src/components/scenes/WalletDetailsScene.tsx @@ -39,6 +39,7 @@ import type { RouteProp, WalletsTabSceneProps } from '../../types/routerTypes' +import type { GradientColors } from '../../types/Theme' import { getDisplayInfoCards } from '../../util/infoUtils' import { coinrankListData, infoServerData } from '../../util/network' import { @@ -345,14 +346,15 @@ const WalletDetailsComponent: React.FC = (props: Props) => { iconAccentColor: iconColor ?? '#00000000' } - const backgroundColors = [...theme.assetBackgroundGradientColors] - if (iconColor != null && theme.isDark) { - const scaledColor = darkenHexColor( - iconColor, - theme.assetBackgroundColorScale - ) - backgroundColors[0] = scaledColor - } + // Destructured rather than mutated so the gradient keeps its tuple type: + // `LinearGradient` needs a compile-time guarantee of two or more stops. + const [firstColor, ...restColors] = theme.assetBackgroundGradientColors + const backgroundColors: GradientColors = [ + iconColor != null && theme.isDark + ? darkenHexColor(iconColor, theme.assetBackgroundColorScale) + : firstColor, + ...restColors + ] return ( { +export const DividerLine = (props: Props): React.ReactElement => { const { marginRem } = props const theme = useTheme() const styles = getStyles(theme) diff --git a/src/components/themed/MenuTabs.tsx b/src/components/themed/MenuTabs.tsx index c40a4f7d7dd..ba6a147f5f7 100644 --- a/src/components/themed/MenuTabs.tsx +++ b/src/components/themed/MenuTabs.tsx @@ -3,12 +3,12 @@ import type { BottomTabNavigationEventMap } from '@react-navigation/bottom-tabs' import type { NavigationHelpers, ParamListBase } from '@react-navigation/native' +import { LinearGradient } from 'expo-linear-gradient' import * as React from 'react' import { useMemo } from 'react' import { Platform, StyleSheet, TouchableOpacity } from 'react-native' import DeviceInfo from 'react-native-device-info' import { useReanimatedKeyboardAnimation } from 'react-native-keyboard-controller' -import LinearGradient from 'react-native-linear-gradient' import Animated, { interpolate, type SharedValue, diff --git a/src/components/themed/SideMenu.tsx b/src/components/themed/SideMenu.tsx index 0dece84236f..e704139c0cb 100644 --- a/src/components/themed/SideMenu.tsx +++ b/src/components/themed/SideMenu.tsx @@ -4,6 +4,7 @@ import { } from '@react-navigation/drawer' import { DrawerActions } from '@react-navigation/native' import type { EdgeUserInfo } from 'edge-core-js' +import { LinearGradient } from 'expo-linear-gradient' import hashjs from 'hash.js' import * as React from 'react' import { @@ -14,7 +15,6 @@ import { ScrollView, View } from 'react-native' -import LinearGradient from 'react-native-linear-gradient' import Animated, { Easing, useAnimatedStyle, diff --git a/src/components/themed/TransactionListComponents.tsx b/src/components/themed/TransactionListComponents.tsx index 361043476f6..c8cc65675ee 100644 --- a/src/components/themed/TransactionListComponents.tsx +++ b/src/components/themed/TransactionListComponents.tsx @@ -1,11 +1,11 @@ +import { LinearGradient } from 'expo-linear-gradient' import * as React from 'react' import { ActivityIndicator, View } from 'react-native' -import LinearGradient from 'react-native-linear-gradient' import { cacheStyles, type Theme, useTheme } from '../services/ThemeContext' import { EdgeText } from '../themed/EdgeText' -export const EmptyLoader = () => { +export const EmptyLoader = (): React.ReactElement => { const theme = useTheme() const styles = getStyles(theme) return ( @@ -15,7 +15,9 @@ export const EmptyLoader = () => { ) } -export const SectionHeader = (props: { title?: string }) => { +export const SectionHeader = (props: { + title?: string +}): React.ReactElement => { const theme = useTheme() const styles = getStyles(theme) @@ -42,7 +44,9 @@ export const SectionHeader = (props: { title?: string }) => { ) } -export const SectionHeaderCentered = (props: { title: string }) => { +export const SectionHeaderCentered = (props: { + title: string +}): React.ReactElement => { const theme = useTheme() const styles = getStyles(theme) return ( diff --git a/src/types/Theme.ts b/src/types/Theme.ts index 0629d0ef019..2b23a8cabef 100644 --- a/src/types/Theme.ts +++ b/src/types/Theme.ts @@ -15,8 +15,15 @@ export interface ThemeDot { // Updates to dots. undefined keeps the dots, null deletes them export type OverrideDots = Array | undefined | null> +/** + * A gradient needs at least two stops to interpolate between. `LinearGradient` + * enforces that in its own prop types, so the theme has to promise it too — + * a plain `string[]` says nothing about length and won't satisfy it. + */ +export type GradientColors = readonly [string, string, ...string[]] + interface ThemeGradientParams { - colors: string[] + colors: GradientColors start: GradientCoords end: GradientCoords } @@ -97,7 +104,7 @@ export interface Theme { loadingIcon: string // Background - backgroundGradientColors: string[] + backgroundGradientColors: GradientColors backgroundGradientStart: { x: number; y: number } backgroundGradientEnd: { x: number; y: number } backgroundDots: { @@ -106,7 +113,7 @@ export interface Theme { dots: ThemeDot[] assetOverrideDots: OverrideDots } - assetBackgroundGradientColors: string[] + assetBackgroundGradientColors: GradientColors assetBackgroundGradientStart: { x: number; y: number } assetBackgroundGradientEnd: { x: number; y: number } assetBackgroundColorScale: number @@ -141,7 +148,7 @@ export interface Theme { tileBackgroundMuted: string // Section Lists - listSectionHeaderBackgroundGradientColors: string[] + listSectionHeaderBackgroundGradientColors: GradientColors listSectionHeaderBackgroundGradientStart: { x: number; y: number } | null listSectionHeaderBackgroundGradientEnd: { x: number; y: number } | null @@ -178,10 +185,10 @@ export interface Theme { // Header headerIcon: ImageProp - headerBackground: string[] + headerBackground: GradientColors headerBackgroundStart: GradientCoords headerBackgroundEnd: GradientCoords - headerOutlineColors: string[] + headerOutlineColors: GradientColors // Buttons buttonBorderRadiusRem: number @@ -189,7 +196,7 @@ export interface Theme { keypadButtonOutline: string keypadButtonOutlineWidth: number - keypadButton: string[] + keypadButton: GradientColors keypadButtonColorStart: GradientCoords keypadButtonColorEnd: GradientCoords keypadButtonText: string @@ -201,7 +208,7 @@ export interface Theme { primaryButtonOutline: string primaryButtonOutlineWidth: number - primaryButton: string[] + primaryButton: GradientColors primaryButtonColorStart: GradientCoords primaryButtonColorEnd: GradientCoords primaryButtonText: string @@ -212,8 +219,8 @@ export interface Theme { secondaryButtonOutline: string secondaryButtonOutlineWidth: number - secondaryButton: string[] - secondaryButtonDisabled: string[] + secondaryButton: GradientColors + secondaryButtonDisabled: GradientColors secondaryButtonColorStart: GradientCoords secondaryButtonColorEnd: GradientCoords secondaryButtonText: string @@ -224,7 +231,7 @@ export interface Theme { escapeButtonOutline: string escapeButtonOutlineWidth: number - escapeButton: string[] + escapeButton: GradientColors escapeButtonColorStart: GradientCoords escapeButtonColorEnd: GradientCoords escapeButtonText: string @@ -235,7 +242,7 @@ export interface Theme { pinUsernameButtonOutline: string pinUsernameButtonOutlineWidth: number - pinUsernameButton: string[] + pinUsernameButton: GradientColors pinUsernameButtonColorStart: GradientCoords pinUsernameButtonColorEnd: GradientCoords pinUsernameButtonText: string @@ -274,10 +281,10 @@ export interface Theme { // Mimics raised/embossed text on physical credit cards embossedTextShadow: TextShadowParams - tabBarBackground: string[] + tabBarBackground: GradientColors tabBarBackgroundStart: GradientCoords tabBarBackgroundEnd: GradientCoords - tabBarTopOutlineColors: string[] + tabBarTopOutlineColors: GradientColors tabBarIcon: string tabBarIconHighlighted: string @@ -327,7 +334,7 @@ export interface Theme { // DividerLine component dividerLineHeight: number - dividerLineColors: string[] + dividerLineColors: GradientColors // Notifications // notificationBackground: string, From 597ae02c0e6c0a33224f344709f33bf0a651fedd Mon Sep 17 00:00:00 2001 From: peachbits Date: Tue, 11 Aug 2026 16:35:33 -0700 Subject: [PATCH 21/37] Install one copy of airship and patina MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit edge-login-ui-rn asked for react-native-airship ^0.2.9 and patina ^0.1.6 while this app asks for ^0.3.0 and ^0.2.0, so npm installed both — nested copies under edge-login-ui-rn alongside ours. Both packages are UI-layer singletons: airship owns the portal host every modal mounts into, and patina caches themed styles. Two module instances of either is the same class of problem as the duplicate yaob that once cross-wired native IO. edge-login-ui-rn now asks for the same versions, but npm resolves the dependency tree from its published manifest, so that alone won't collapse the duplicates until a release goes out. The overrides make it true today and stay correct afterwards. Both are pure JavaScript, so no native rebuild is involved. Verified the auto-logoff modal still mounts and dismisses through the portal host. --- package-lock.json | 15 --------------- package.json | 4 +++- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index de402532e7f..d337386ac10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16676,21 +16676,6 @@ "react-native": "*" } }, - "node_modules/edge-login-ui-rn/node_modules/react-native-airship": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/react-native-airship/-/react-native-airship-0.2.12.tgz", - "integrity": "sha512-AFo7N11ZhFW88LacNNjZECxR5iQhIiAv0U/DDoVxgsdx2uyZXALShUbQngZftDCcPEqoOkCoQUgGt2kDYvqmFg==", - "license": "MIT", - "dependencies": { - "yavent": "^0.1.1" - } - }, - "node_modules/edge-login-ui-rn/node_modules/react-native-patina": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/react-native-patina/-/react-native-patina-0.1.6.tgz", - "integrity": "sha512-3mtDnDRbkTx3mtS9BsaYgFy5C+RuSTTHLu5VV+8g8lJtvaSdcsflpmf5dh3ZmCSJc2tDORfzU+nuRQ2keVY91Q==", - "license": "MIT" - }, "node_modules/edge-login-ui-rn/node_modules/react-redux": { "version": "7.2.4", "license": "MIT", diff --git a/package.json b/package.json index 95158b85b53..48bdb11bb0b 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,9 @@ }, "overrides": { "yaob": "^0.4.0", - "bip39": "3.0.4" + "bip39": "3.0.4", + "react-native-airship": "^0.3.0", + "react-native-patina": "^0.2.0" }, "dependencies": { "@brigad/react-native-adservices": "^0.1.3", From 116b60ec002cc6e925c24725022eee33e8eff64c Mon Sep 17 00:00:00 2001 From: peachbits Date: Wed, 12 Aug 2026 11:05:04 -0700 Subject: [PATCH 22/37] Scroll around the keyboard with keyboard-controller react-native-keyboard-aware-scroll-view has had no release since 2022. It is pure JavaScript, so it never appeared in a codegen audit, but it drives its scrolling with findNodeHandle, UIManager.measureInWindow and UIManager.viewIsDescendantOf - the legacy measurement APIs the new architecture only serves through a compatibility shim. We already depend on react-native-keyboard-controller, which ships an equivalent component. `extraScrollHeight` becomes `bottomOffset`, and the `enableOnAndroid` / `enableAutomaticScroll` opt-ins go away because the replacement always does both. Everything else is plain ScrollView props. SendScene2 keeps a ref to scroll to the end, which is now a plain `ref` rather than `innerRef`, and takes React Native's `scrollToEnd({ animated })` signature instead of the old library's positional one. SurveyModal is the one behavior change: it passed an extraScrollHeight of -16rem on iOS against +9rem on Android, a hack around the old library measuring the two platforms differently. bottomOffset means the same thing on both, so both now pass the 2.75rem every other scene uses. edge-login-ui-rn makes the same migration in its three keyboard scenes, so its patch is regenerated here - and renamed to 3.37.2, the version npm actually resolves, silencing the version-mismatch warning every install printed. Verified on Android: the address form scrolls a field near the bottom clear of the keyboard on focus and accepts input. Touching these files takes them off the ESLint warnings list, so their pre-existing lint errors are fixed too. --- eslint.config.mjs | 8 +- jestSetup.js | 6 +- package-lock.json | 1 - package.json | 1 - ....0.patch => edge-login-ui-rn+3.37.2.patch} | 48 +- .../CreateWalletImportScene.test.tsx.snap | 1014 +- .../__snapshots__/SendScene2.ui.test.tsx.snap | 19380 ++++++++-------- src/components/modals/SurveyModal.tsx | 15 +- src/components/scenes/ConfirmScene.tsx | 9 +- .../scenes/CreateWalletImportScene.tsx | 2 +- src/components/scenes/FormScene.tsx | 7 +- .../scenes/Loans/LoanCloseScene.tsx | 7 +- .../scenes/Loans/LoanCreateScene.tsx | 11 +- .../scenes/Loans/LoanDetailsScene.tsx | 13 +- src/components/scenes/SendScene2.tsx | 15 +- src/components/scenes/SpendingLimitsScene.tsx | 8 +- src/plugins/gui/scenes/AddressFormScene.tsx | 6 +- src/plugins/gui/scenes/SepaFormScene.tsx | 6 +- src/plugins/ramps/banxa/banxaRampPlugin.ts | 4 +- 19 files changed, 10292 insertions(+), 10269 deletions(-) rename patches/{edge-login-ui-rn+3.37.0.patch => edge-login-ui-rn+3.37.2.patch} (85%) diff --git a/eslint.config.mjs b/eslint.config.mjs index b9465116975..5fa1d7b1c79 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -253,7 +253,6 @@ export default [ 'src/components/rows/SwapProviderRow.tsx', 'src/components/rows/TxCryptoAmountRow.tsx', - 'src/components/scenes/ConfirmScene.tsx', 'src/components/scenes/CreateWalletAccountSelectScene.tsx', 'src/components/scenes/CreateWalletAccountSetupScene.tsx', @@ -278,15 +277,13 @@ export default [ 'src/components/scenes/Fio/FioRequestListScene.tsx', 'src/components/scenes/Fio/FioSentRequestDetailsScene.tsx', 'src/components/scenes/Fio/FioStakingOverviewScene.tsx', - 'src/components/scenes/FormScene.tsx', + 'src/components/scenes/inputs/DigitInput.tsx', 'src/components/scenes/inputs/DigitInput/PinDots.tsx', 'src/components/scenes/LoadingScene.tsx', - 'src/components/scenes/Loans/LoanCloseScene.tsx', - 'src/components/scenes/Loans/LoanCreateScene.tsx', 'src/components/scenes/Loans/LoanDashboardScene.tsx', - 'src/components/scenes/Loans/LoanDetailsScene.tsx', + 'src/components/scenes/Loans/LoanManageScene.tsx', 'src/components/scenes/Loans/LoanStatusScene.tsx', @@ -297,7 +294,6 @@ export default [ 'src/components/scenes/PromotionSettingsScene.tsx', - 'src/components/scenes/SpendingLimitsScene.tsx', 'src/components/scenes/Staking/EarnScene.tsx', 'src/components/scenes/SwapSettingsScene.tsx', diff --git a/jestSetup.js b/jestSetup.js index dc35eb950b1..6e01b81afb3 100644 --- a/jestSetup.js +++ b/jestSetup.js @@ -77,6 +77,7 @@ jest.mock('react-native-image-colors', () => ({ })) jest.mock('react-native-keyboard-controller', () => ({ + KeyboardAwareScrollView: 'KeyboardAwareScrollView', useReanimatedKeyboardAnimation: () => ({ height: { value: 0 }, progress: { value: 0 } @@ -272,11 +273,6 @@ jest.mock('react-native-device-info', () => { } }) -jest.mock('react-native-keyboard-aware-scroll-view', () => { - const { ScrollView } = require('react-native') - return { KeyboardAwareScrollView: ScrollView } -}) - jest.mock('react-native-reorderable-list', () => ({ ...jest.requireActual('react-native-reorderable-list'), useReorderableDrag: () => jest.fn() diff --git a/package-lock.json b/package-lock.json index d337386ac10..93b568b8ea3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -85,7 +85,6 @@ "react-native-image-colors": "^2.4.0", "react-native-image-picker": "^8.2.1", "react-native-in-app-review": "^4.3.5", - "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-keyboard-controller": "1.22.2", "react-native-localize": "^3.4.2", "react-native-mail": "^6.1.1", diff --git a/package.json b/package.json index 48bdb11bb0b..4f7aa4beb4e 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,6 @@ "react-native-image-colors": "^2.4.0", "react-native-image-picker": "^8.2.1", "react-native-in-app-review": "^4.3.5", - "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-keyboard-controller": "1.22.2", "react-native-localize": "^3.4.2", "react-native-mail": "^6.1.1", diff --git a/patches/edge-login-ui-rn+3.37.0.patch b/patches/edge-login-ui-rn+3.37.2.patch similarity index 85% rename from patches/edge-login-ui-rn+3.37.0.patch rename to patches/edge-login-ui-rn+3.37.2.patch index e2b9739628a..c912a965cfb 100644 --- a/patches/edge-login-ui-rn+3.37.0.patch +++ b/patches/edge-login-ui-rn+3.37.2.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/edge-login-ui-rn/lib/components/buttons/EdgeButton.js b/node_modules/edge-login-ui-rn/lib/components/buttons/EdgeButton.js -index b4a087e..8106e29 100644 +index 11c6f1e..7cba2e9 100644 --- a/node_modules/edge-login-ui-rn/lib/components/buttons/EdgeButton.js +++ b/node_modules/edge-login-ui-rn/lib/components/buttons/EdgeButton.js @@ -2,9 +2,9 @@ @@ -167,10 +167,41 @@ index 6bf6555..361902f 100644 }, [color]); return (React.createElement(LinearGradient, { style: styles.container, start: START, end: END, colors: colors, locations: MARKS, pointerEvents: "none" })); }; +diff --git a/node_modules/edge-login-ui-rn/lib/components/scenes/ChangePasswordScene.js b/node_modules/edge-login-ui-rn/lib/components/scenes/ChangePasswordScene.js +index 99fe5a5..ccf7529 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/scenes/ChangePasswordScene.js ++++ b/node_modules/edge-login-ui-rn/lib/components/scenes/ChangePasswordScene.js +@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge + }; + import * as React from 'react'; + import { Keyboard, Platform, ScrollView } from 'react-native'; +-import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; ++import { KeyboardAwareScrollView } from 'react-native-keyboard-controller'; + import { cacheStyles } from 'react-native-patina'; + import { lstrings } from '../../common/locales/strings'; + import { useHandler } from '../../hooks/useHandler'; +@@ -91,7 +91,7 @@ const ChangePasswordSceneComponent = ({ initPassword, title, onBack, onSkip, onS + onPress: handleNext, + spinner + }, animDistanceStart: 0 }))); +- return (React.createElement(ThemedScene, { onBack: onBack, onSkip: onSkip, title: title }, isIos ? (React.createElement(ScrollView, { ref: scrollViewRef, contentContainerStyle: [styles.container, keyboardPadding], keyboardShouldPersistTaps: "handled" }, content)) : (React.createElement(KeyboardAwareScrollView, { contentContainerStyle: [styles.container, keyboardPadding], keyboardShouldPersistTaps: "handled", extraScrollHeight: theme.rem(6), enableAutomaticScroll: true, enableOnAndroid: true }, content)))); ++ return (React.createElement(ThemedScene, { onBack: onBack, onSkip: onSkip, title: title }, isIos ? (React.createElement(ScrollView, { ref: scrollViewRef, contentContainerStyle: [styles.container, keyboardPadding], keyboardShouldPersistTaps: "handled" }, content)) : (React.createElement(KeyboardAwareScrollView, { contentContainerStyle: [styles.container, keyboardPadding], keyboardShouldPersistTaps: "handled", bottomOffset: theme.rem(6) }, content)))); + }; + const getStyles = cacheStyles((theme) => ({ + container: { diff --git a/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js b/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js -index 83eb678..83a3279 100644 +index 83eb678..7087057 100644 --- a/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js +++ b/node_modules/edge-login-ui-rn/lib/components/scenes/PasswordLoginScene.js +@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge + import { asMaybeNetworkError, asMaybeOtpError, asMaybePasswordError, asMaybeUsernameError } from 'edge-core-js'; + import * as React from 'react'; + import { Keyboard, View } from 'react-native'; +-import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; ++import { KeyboardAwareScrollView } from 'react-native-keyboard-controller'; + import { cacheStyles } from 'react-native-patina'; + import Animated, { Easing, Extrapolate, interpolate, useAnimatedScrollHandler, useAnimatedStyle, useDerivedValue, useSharedValue, withTiming } from 'react-native-reanimated'; + import AntDesignIcon from 'react-native-vector-icons/AntDesign'; @@ -69,10 +69,13 @@ export const PasswordLoginScene = (props) => { }, [inputHeight]); const sAnimationMult = useSharedValue(0); @@ -218,6 +249,19 @@ index d5ba59c..0967891 100644 import { cacheStyles } from 'react-native-patina'; import { SafeAreaView } from 'react-native-safe-area-context'; import { SvgXml } from 'react-native-svg'; +diff --git a/node_modules/edge-login-ui-rn/lib/components/scenes/newAccount/NewAccountUsernameScene.js b/node_modules/edge-login-ui-rn/lib/components/scenes/newAccount/NewAccountUsernameScene.js +index 8a5c3f3..e4699a4 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/scenes/newAccount/NewAccountUsernameScene.js ++++ b/node_modules/edge-login-ui-rn/lib/components/scenes/newAccount/NewAccountUsernameScene.js +@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge + }; + import { asMaybeNetworkError } from 'edge-core-js'; + import * as React from 'react'; +-import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; ++import { KeyboardAwareScrollView } from 'react-native-keyboard-controller'; + import { cacheStyles } from 'react-native-patina'; + import { sprintf } from 'sprintf-js'; + import { maybeRouteComplete } from '../../../actions/LoginInitActions'; diff --git a/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js b/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js index 5fed31f..ad8aea7 100644 --- a/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap index 9678c5c52f6..649522d7427 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap @@ -316,87 +316,186 @@ exports[`CreateWalletImportScene should render with loading props 1`] = ` } /> - - + + + + + Enter your private seed, private key, or active key to verify and restore the associated wallet + + - - - - Enter your private seed, private key, or active key to verify and restore the associated wallet - - + - - - - Private Key or Private Seed - - - + + > + Private Key or Private Seed + - + + + - - -  - - +  + + + - + - - - - Next - - + ], + null, + ] + } + > + Next + - + `; diff --git a/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap b/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap index 25f8b0d9eab..e7d1c3408a5 100644 --- a/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap @@ -185,7 +185,8 @@ exports[`SendScene2 1 spendTarget 1`] = ` - - - + + - - - - Send from Wallet - - + + My Bitcoin (BTC) + + + + - My Bitcoin (BTC) - - - - -  - - +  + - + + + + + + Send to Address + + + + some pub address + + + + + +  + + + + - + - Send to Address + Amount: - + 0.00001234 BTC + + - - some pub address - - + (€0.23) + -  +  - + + + + + + + + + - + + Add Another Address + + + - - - - Amount: - - - 0.00001234 BTC - - - (€0.23) - - - - -  - - - + "fontFamily": "Feather", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - + + + - - - + + 0 (0) + + + + - Add Another Address - - - - -  - - +  + - + + + + + - - - - Network Fee: - - - 0 (0) - - - - -  - - - - - - - - - - - - - - - - - - - + + - - - - Send from Wallet - - + + My Bitcoin (BTC) + + + + - My Bitcoin (BTC) - - - - -  - - +  + - + + + - - - - Send to Address - - - - some pub address - - - + } + > + Send to Address + -  + some pub address - - - - - - Amount: - - - 0.00001234 BTC - - - (€0.23) - - - - -  - - - - - - - - - +  + + + + - - + - Add Another Address + Amount: + + + 0.00001234 BTC + + + (€0.23) -  +  + + + + + + + + Add Another Address + + + + +  + + + + + + + + + - - - - Network Fee: - - + + 0 (0) + + + + - 0 (0) - - - - -  - - +  + - + + + "marginBottom": 11, + "marginLeft": 11, + "marginRight": 11, + "marginTop": 11, + }, + ] + } + > - - - info tile label 1 - - - info tile value 1 - - + info tile label 1 + + + info tile value 1 + - + + "borderBottomColor": "rgba(255, 255, 255, .1)", + "borderBottomWidth": 1, + "height": 1, + }, + { + "margin": 11, + }, + ] + } + /> + - - - info tile label 2 - - - info tile value 2 - - + info tile label 2 + + + info tile value 2 + - + - - + } + /> + - - - - - - - - - - Send from Wallet - - - My Bitcoin (BTC) - - - - -  - - - - - - - + + + - + + Send from Wallet + + + My Bitcoin (BTC) + + + - - - - Send To some pub address - - - Amount: 0.00001234 BTC (€0.23) - - - - -  - - - + "fontFamily": "FontAwesome", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - + + + + + + + + + } + > - Send to Address 2 + Send To some pub address - - - some pub address 2 - - + Amount: 0.00001234 BTC (€0.23) + - + + + + + Send to Address 2 + + + + some pub address 2 + + + + - - - - - Amount: 2 - - - 0.00012345 BTC - - - (€2.26) - - - - -  - - - + "fontFamily": "FontAwesome", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - - - - - - + + Amount: 2 + + + 0.00012345 BTC + + - Add Another Address + (€2.26) -  +  - + + + + + + Add Another Address + + + + +  + + + + + + + + + + } + /> + - - - Network Fee: - - + + 0 (0) + + + + - 0 (0) - - - - -  - - +  + - + - - + } + /> + - - + + - - - - Send from Wallet - - - My Bitcoin (BTC) - - - + - -  - - - - - - - - - - - + My Bitcoin (BTC) + + + - - - - Send To some pub address - - - Amount: 0.00001234 BTC (€0.23) - - - - -  - - - + "fontFamily": "FontAwesome", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - + + + + + + + + + - - - - Amount: 2 - - + + Amount: 0.00001234 BTC (€0.23) + + + + - 0.00012345 BTC - - - (€2.26) - - - - -  - - +  + - - - - - - - + - Network Fee: + Amount: 2 + 0.00012345 BTC + + - 0 (0) + (€2.26) -  +  + + + + + + + + + Network Fee: + + + 0 (0) + + + + +  + + + + + + + - - + } + /> + - - - - - - - - - - Send from Wallet - - - My Bitcoin (BTC) - - - - -  - - - - - - - + + - + + Send from Wallet + + + My Bitcoin (BTC) + + + - - - - Send To some pub address - - - Amount: 0.00001234 BTC (€0.23) - - - - -  - - - + "fontFamily": "FontAwesome", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - + + + + + + + + + } + > - Send to Address 2 + Send To some pub address - + Amount: 0.00001234 BTC (€0.23) + + + + +  + + + + + + + + + Send to Address 2 + + - - some pub address 2 - - - - -  + some pub address 2 + + +  + + - + - + + + - - - - Network Fee: - - + + 0 (0) + + + + - 0 (0) - - - - -  - - +  + - + - - + } + /> + - + - + > - - - - - - Send from Wallet - - - My Bitcoin (BTC) - - - - -  - - - - - - - + /> - + + Send from Wallet + + + My Bitcoin (BTC) + + + - - - - Send To some pub address - - - Amount: 0.00001234 BTC (€0.23) - - - - -  - - - + "fontFamily": "FontAwesome", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - + + } + > + + - - - Network Fee: + Send To some pub address - 0 (0) + Amount: 0.00001234 BTC (€0.23) -  +  + + + + + + + + + Network Fee: + + + 0 (0) + + + + +  + + + + + + + - - + } + /> + - - - - - - - - - - Send from Wallet - - - My Bitcoin (BTC) - - - - -  - - - - - - - + + + - - - - - Send To some pub address - - - Amount: 0.00001234 BTC (€0.23) - - - + - -  - - - + "color": "#FFFFFF", + "fontSize": 22, + }, + null, + ] + } + > + My Bitcoin (BTC) + - + +  + + + + + + + + + + + + } + layout={ + LinearTransition { + "build": [Function], + "durationV": 300, + "randomizeDelay": false, + "reduceMotionV": "system", + } + } + > - Send to Address 2 + Send To some pub address - + Amount: 0.00001234 BTC (€0.23) + + + - + - some pub address 2 - - + ], + { + "fontFamily": "FontAwesome", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - + + + - - - + + - - Amount: 2 - - - 0.00012345 BTC - - - (€2.26) - - - - -  - - + some pub address 2 + - - - - - - - + - Network Fee: + Amount: 2 + 0.00012345 BTC + + - 0 (0) + (€2.26) -  +  + + + + + + + + + Network Fee: + + + 0 (0) + + + + +  + + + + + + + - - + } + /> + - - - - - - - - - - Send from Wallet - - - My Bitcoin (BTC) - - - - -  - - - - - - - + + - + + Send from Wallet + + + My Bitcoin (BTC) + + + - - - - Send To some pub address - - - Amount: 0.00001234 BTC (€0.23) - - - + ], + { + "fontFamily": "FontAwesome", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - + + + + + + + + + - - Send to Address 2 + Send To some pub address - + Amount: 0.00001234 BTC (€0.23) + + + + + + + + + Send to Address 2 + + - - some pub address 2 - - - - -  + some pub address 2 - - + +  + + + + + + - - - Amount: 2 - - - 0.00012345 BTC - - + - (€2.26) - - + ], + null, + ] + } + > + 0.00012345 BTC + + + (€2.26) + - + + + } + > + - - - - Network Fee: - - - 0 (0) - - - + - + + + -  - - + ], + { + "fontFamily": "Feather", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - + - - + } + /> + - - - - - + + + + + + + + + + + + + Send from Wallet + + + My Bitcoin (BTC) + + + + +  + + + + + + + - + layout={ + LinearTransition { + "build": [Function], + "durationV": 300, + "randomizeDelay": false, + "reduceMotionV": "system", + } + } + > + - - - - Send from Wallet - - - My Bitcoin (BTC) - - - + -  + Send To some pub address + + + Amount: 0.00001234 BTC (€0.23) - - - - - + + Send to Address 2 + + - - - - Send To some pub address - - - Amount: 0.00001234 BTC (€0.23) - - + some pub address 2 + - + + + } + layout={ + LinearTransition { + "build": [Function], + "durationV": 300, + "randomizeDelay": false, + "reduceMotionV": "system", + } + } + > - Send to Address 2 + Amount: 2 - - - some pub address 2 - - - - - - - - + 0.00012345 BTC + + - - Amount: 2 - - - 0.00012345 BTC - - - (€2.26) - - + (€2.26) + - + + + } + > + - - - - Network Fee: - - - 0 (0) - - - + - + + + -  - - + ], + { + "fontFamily": "Feather", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + - + - - + } + /> + - - + } + > + + + + + + + + Send from Wallet + + + My Bitcoin (BTC) + + + + +  + + + + + + + + - - - - Send from Wallet - - - My Bitcoin (BTC) - - + Send to Address + - -  - - - - - - - - - - - - - - Send to Address - + +  + + + Enter + + + - +  + + - -  - - - Enter - - - + + + - -  - - - Scan - - - + - -  - - - Paste - - + Paste + - + - + - + + - + + + - +  + + + Scam Warning + + + + + + • + + - - + > + Edge will not give financial advice. + + -  + • - Scam Warning + Cryptocurrency transactions are irreversible. - - - • - - - Edge will not give financial advice. - - - - - • - - - Cryptocurrency transactions are irreversible. - - - + - - • - - - Do not send money to people or organizations you do not know. - - + Do not send money to people or organizations you do not know. + - - If you have any questions or concerns regarding this send, please contact support@edge.app - + + If you have any questions or concerns regarding this send, please contact support@edge.app + - + = props => { } > - {/** HACK: iOS and Android use extraScrollHeight differently... */} void } -const ConfirmSceneComponent = (props: Props) => { +const ConfirmSceneComponent = (props: Props): React.ReactElement => { const { navigation, route } = props const theme = useTheme() const styles = getStyles(theme) const { titleText, bodyText, infoTiles, onConfirm, onBack } = route.params - const renderInfoTiles = () => { + const renderInfoTiles = (): React.ReactElement[] | null => { if (infoTiles == null) return null return infoTiles.map(({ label, value }) => ( @@ -56,8 +56,7 @@ const ConfirmSceneComponent = (props: Props) => { return ( {/* We have to use the SceneHeaderUi4 component here because diff --git a/src/components/scenes/CreateWalletImportScene.tsx b/src/components/scenes/CreateWalletImportScene.tsx index 5ee9f302db1..27692910efe 100644 --- a/src/components/scenes/CreateWalletImportScene.tsx +++ b/src/components/scenes/CreateWalletImportScene.tsx @@ -1,7 +1,7 @@ import type { JsonObject } from 'edge-core-js' import * as React from 'react' import { Linking, Platform, View } from 'react-native' -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' +import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import { sprintf } from 'sprintf-js' import { PLACEHOLDER_WALLET_ID } from '../../actions/CreateWalletActions' diff --git a/src/components/scenes/FormScene.tsx b/src/components/scenes/FormScene.tsx index 6d86380598f..244c8b99a0e 100644 --- a/src/components/scenes/FormScene.tsx +++ b/src/components/scenes/FormScene.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { View } from 'react-native' -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' +import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import { SCROLL_INDICATOR_INSET_FIX } from '../../constants/constantSettings' import { lstrings } from '../../locales/strings' @@ -17,7 +17,7 @@ interface Props { sliderDisabled: boolean } -export const FormScene = (props: Props) => { +export const FormScene = (props: Props): React.ReactElement => { const { headerText, headerTertiary, @@ -38,8 +38,7 @@ export const FormScene = (props: Props) => { /> {children} diff --git a/src/components/scenes/Loans/LoanCloseScene.tsx b/src/components/scenes/Loans/LoanCloseScene.tsx index 69c835b900c..536d8bf2339 100644 --- a/src/components/scenes/Loans/LoanCloseScene.tsx +++ b/src/components/scenes/Loans/LoanCloseScene.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' +import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import Ionicon from 'react-native-vector-icons/Ionicons' import { sprintf } from 'sprintf-js' @@ -49,7 +49,7 @@ export interface Props extends EdgeAppSceneProps<'loanClose'> { // TODO: Check contentPadding -export const LoanCloseSceneComponent = (props: Props) => { +export const LoanCloseSceneComponent = (props: Props): React.ReactElement => { const theme = useTheme() const styles = getStyles(theme) const dispatch = useDispatch() @@ -182,8 +182,7 @@ export const LoanCloseSceneComponent = (props: Props) => { /> {} -export const LoanCreateScene = (props: Props) => { +export const LoanCreateScene = (props: Props): React.ReactElement => { const { navigation, route } = props const { borrowEngine, borrowPlugin } = route.params @@ -456,8 +456,8 @@ export const LoanCreateScene = (props: Props) => { } } }) - .catch(e => { - showError(e.message) + .catch((e: unknown) => { + showError(e) }) } @@ -520,8 +520,7 @@ export const LoanCreateScene = (props: Props) => { withTopMargin /> diff --git a/src/components/scenes/Loans/LoanDetailsScene.tsx b/src/components/scenes/Loans/LoanDetailsScene.tsx index cccf6b8a72f..2cc149ff981 100644 --- a/src/components/scenes/Loans/LoanDetailsScene.tsx +++ b/src/components/scenes/Loans/LoanDetailsScene.tsx @@ -2,7 +2,7 @@ import { add, div, gt, max, mul, sub } from 'biggystring' import type { EdgeCurrencyWallet, EdgeTokenId } from 'edge-core-js' import * as React from 'react' import { ActivityIndicator } from 'react-native' -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' +import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import Ionicon from 'react-native-vector-icons/Ionicons' import { sprintf } from 'sprintf-js' @@ -55,7 +55,7 @@ interface Props extends EdgeAppSceneProps<'loanDetails'> { loanAccount: LoanAccount } -export const LoanDetailsSceneComponent = (props: Props) => { +export const LoanDetailsSceneComponent = (props: Props): React.ReactElement => { const theme = useTheme() const styles = getStyles(theme) @@ -144,14 +144,14 @@ export const LoanDetailsSceneComponent = (props: Props) => { sprintf(AAVE_SUPPORT_ARTICLE_URL_1S, 'loan-details') ) - const handleProgramStatusCardPress = (programEdge: LoanProgramEdge) => { + const handleProgramStatusCardPress = (programEdge: LoanProgramEdge): void => { navigation.navigate('loanStatus', { actionQueueId: programEdge.programId, loanAccountId }) } - const renderProgramStatusCard = () => { + const renderProgramStatusCard = (): React.ReactElement | null => { if (runningProgramMessage != null && runningProgramEdge != null) { return ( { withTopMargin /> @@ -447,7 +446,7 @@ export const useFiatTotal = ( export const displayFiatTotal = ( isoFiatCurrencyCode: string, fiatAmount: string -) => { +): string => { const fiatSymbol = getFiatSymbol(isoFiatCurrencyCode) return `${fiatSymbol}${formatFiatString({ autoPrecision: true, fiatAmount })}` diff --git a/src/components/scenes/SendScene2.tsx b/src/components/scenes/SendScene2.tsx index 808e3de2f03..e42bca44279 100644 --- a/src/components/scenes/SendScene2.tsx +++ b/src/components/scenes/SendScene2.tsx @@ -22,7 +22,8 @@ import { type TextInput, View } from 'react-native' -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' +import type { KeyboardAwareScrollViewRef } from 'react-native-keyboard-controller' +import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import { sprintf } from 'sprintf-js' import type { GuiExchangeRates } from '../../actions/ExchangeRateActions' @@ -210,7 +211,7 @@ const SendComponent: React.FC = props => { const needsScrollToEnd = React.useRef(false) const makeSpendCounter = React.useRef(0) - const scrollViewRef = React.useRef(null) + const scrollViewRef = React.useRef(null) const isSendingRef = React.useRef(false) const initialMount = React.useRef(true) @@ -1801,7 +1802,7 @@ const SendComponent: React.FC = props => { // determined and the scrollToEnd call would be effective. const timeout = setTimeout(() => { if (needsScrollToEnd.current) { - scrollViewRef.current?.scrollToEnd(true) + scrollViewRef.current?.scrollToEnd({ animated: true }) needsScrollToEnd.current = false } }, SCROLL_TO_END_DELAY_MS) @@ -1832,17 +1833,13 @@ const SendComponent: React.FC = props => { <> { - const kbRef: KeyboardAwareScrollView | null = ref as any - scrollViewRef.current = kbRef - }} + ref={scrollViewRef} contentContainerStyle={{ ...insetStyle, paddingTop: 0, paddingBottom: theme.rem(5) }} - extraScrollHeight={theme.rem(2.75)} - enableOnAndroid + bottomOffset={theme.rem(2.75)} scrollIndicatorInsets={SCROLL_INDICATOR_INSET_FIX} > diff --git a/src/components/scenes/SpendingLimitsScene.tsx b/src/components/scenes/SpendingLimitsScene.tsx index 475ac555c3e..ec54a270ac8 100644 --- a/src/components/scenes/SpendingLimitsScene.tsx +++ b/src/components/scenes/SpendingLimitsScene.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { View } from 'react-native' -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' +import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import { writeSpendingLimits } from '../../actions/LocalSettingsActions' import { SCROLL_INDICATOR_INSET_FIX } from '../../constants/constantSettings' @@ -20,7 +20,7 @@ import { MainButton } from '../themed/MainButton' interface Props extends EdgeAppSceneProps<'spendingLimits'> {} -export const SpendingLimitsScene = (props: Props) => { +export const SpendingLimitsScene = (props: Props): React.ReactElement => { const { navigation } = props const theme = useTheme() const styles = getStyles(theme) @@ -47,7 +47,7 @@ export const SpendingLimitsScene = (props: Props) => { setTransactionIsEnabled(!transactionIsEnabled) }) - const handleSubmitAsync = async () => { + const handleSubmitAsync = async (): Promise => { const spendingLimits = { transaction: { isEnabled: transactionIsEnabled, @@ -66,7 +66,7 @@ export const SpendingLimitsScene = (props: Props) => { // Satsify "misused promise" const handleSubmit = useHandler(() => { - handleSubmitAsync().catch(err => { + handleSubmitAsync().catch((err: unknown) => { showError(err) }) }) diff --git a/src/plugins/gui/scenes/AddressFormScene.tsx b/src/plugins/gui/scenes/AddressFormScene.tsx index 1cbd9979888..c66e4eaee85 100644 --- a/src/plugins/gui/scenes/AddressFormScene.tsx +++ b/src/plugins/gui/scenes/AddressFormScene.tsx @@ -2,7 +2,7 @@ import { asArray, asObject, asOptional, asString } from 'cleaners' import * as React from 'react' import { Platform, ScrollView, View } from 'react-native' -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' +import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import { SceneButtons } from '../../../components/buttons/SceneButtons' import { EdgeTouchableOpacity } from '../../../components/common/EdgeTouchableOpacity' @@ -355,9 +355,7 @@ export const AddressFormScene = React.memo((props: Props) => { {scrollContent} diff --git a/src/plugins/gui/scenes/SepaFormScene.tsx b/src/plugins/gui/scenes/SepaFormScene.tsx index 7fdd5cfee56..61350c80f46 100644 --- a/src/plugins/gui/scenes/SepaFormScene.tsx +++ b/src/plugins/gui/scenes/SepaFormScene.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { Platform, ScrollView, View } from 'react-native' -import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' +import { KeyboardAwareScrollView } from 'react-native-keyboard-controller' import { SceneButtons } from '../../../components/buttons/SceneButtons' import { SceneWrapper } from '../../../components/common/SceneWrapper' @@ -139,9 +139,7 @@ export const SepaFormScene = React.memo((props: Props) => { {scrollContent} diff --git a/src/plugins/ramps/banxa/banxaRampPlugin.ts b/src/plugins/ramps/banxa/banxaRampPlugin.ts index 2eeb886718a..501882c7031 100644 --- a/src/plugins/ramps/banxa/banxaRampPlugin.ts +++ b/src/plugins/ramps/banxa/banxaRampPlugin.ts @@ -1082,7 +1082,7 @@ export const banxaRampPlugin: RampPluginFactory = ( const maxPrices = asBanxaPricesResponse(maxResponse) const maxPriceRow = maxPrices.data.prices.find(p => { return ( - p.payment_method_id === paymentObj!.id && + p.payment_method_id === paymentObj.id && p.coin_code === banxaCoin && p.fiat_code === fiatCode ) @@ -1170,7 +1170,7 @@ export const banxaRampPlugin: RampPluginFactory = ( const banxaPrices = asBanxaPricesResponse(response) const priceRow = banxaPrices.data.prices.find(p => { return ( - p.payment_method_id === paymentObj!.id && + p.payment_method_id === paymentObj.id && p.coin_code === banxaCoin && p.fiat_code === fiatCode ) From 355602135f2e03e16624f73bcc2f19737a5943a3 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 31 Aug 2026 11:20:17 -0700 Subject: [PATCH 23/37] Drop the BlurView global nothing reads anymore LoginScene has published `global.ReactNativeBlurView` since 2020, when edge-login-ui-rn could not add a native dependency without a breaking release and instead feature-detected a blur component the host snuck to it at runtime (falling back to a dim underlay without one). The reading side was deleted from login-ui in September 2023 (v2.15.0), when its modals started importing rn-id-blurview directly. Nothing in this app, in the installed login-ui lib, or anywhere else in node_modules reads the global today, so the assignment has been write-only for almost three years. The rn-id-blurview import here existed only to feed it. --- src/components/scenes/LoginScene.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/components/scenes/LoginScene.tsx b/src/components/scenes/LoginScene.tsx index 087a4273bdb..4bec9d2ff86 100644 --- a/src/components/scenes/LoginScene.tsx +++ b/src/components/scenes/LoginScene.tsx @@ -2,7 +2,6 @@ import type { EdgeAccount } from 'edge-core-js' import { type InitialRouteName, LoginScreen } from 'edge-login-ui-rn' import * as React from 'react' import { Keyboard, StatusBar, View } from 'react-native' -import { BlurView } from 'rn-id-blurview' import { getDeviceSettings } from '../../actions/DeviceSettingsActions' import { showSendLogsModal } from '../../actions/LogActions' @@ -34,9 +33,6 @@ export interface LoginParams { loginUiInitialRoute?: InitialRouteName } -// @ts-expect-error Sneak the BlurView over to the login UI: -global.ReactNativeBlurView = BlurView - interface Props extends RootSceneProps<'login'> {} let firstRun = true From d42daf86388d6e435bc0c4e3bd57251ffd5302f9 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 31 Aug 2026 13:48:55 -0700 Subject: [PATCH 24/37] Blur modals and chrome again on Android 12+ Under the new architecture the old blur path (rn-id-blurview, Dimezis 2) snapshots the window with a software canvas that renders empty on every Android version - the API < 31 grey wash and a silently transparent sheet on 12+ are the same disease with different symptoms. Modal sheets were see-through over busy scenes, and the chrome tint had been impersonating blur all along. Dimezis 3 fixed the snapshot in hardware but changed the contract: content must be wrapped in an explicit blur target, and whole-window sampling is gone. expo-blur ships that backend as a Fabric-native component, so this adds expo-blur (and its pod) rather than another native dependency. Two targets cover the two kinds of blur surface, shaped by one hard constraint: a blur view must never sit inside its own target, or the renderer recurses computing transforms and overflows the stack (a native libhwui crash). - Modals: the app tree gains one BlurTarget wrapping Main, inside the Airship layer, so ModalBlurBackground (EdgeModal) and the QR modal underlay sample the app content from outside it. login-ui mounts the equivalent target in LoginUiProvider for its own modals, delivered through the regenerated patch. - Chrome: the header, scene footer, tab bar, and notification cards overlay the scene and live inside the app-level target, so each SceneWrapper wraps its content (background dots plus children, excluding the absolutely-positioned footer overlay) in its own target and publishes the ref through a registry while focused. ChromeBlurBackground samples whichever scene is focused, retargeting as navigation changes, and falls back to the long-standing tint when no scene publishes one (login, scenes outside SceneWrapper). The scene footer needs no special casing: with tabs it portals into MenuTabs and without them it is absolutely positioned, so it never sits inside what it samples. Modal backgrounds return to translucent-over-blur on 12+, keeping the solid color below API 31 where no blur implementation can render. iOS keeps its existing whole-window blur, unchanged. Verified on device: the sort modal frosts the wallet list, the security-alerts modal is opaque and legible, the tab bar softly blurs list content scrolling beneath it, and no recursion crash across cold start, tab switches, and stack navigation. --- CHANGELOG.md | 2 + eslint.config.mjs | 1 - ios/Podfile.lock | 6 + jestSetup.js | 6 + package-lock.json | 12 + package.json | 1 + patches/edge-login-ui-rn+3.37.2.patch | 136 +- .../__snapshots__/MenuTabs.test.tsx.snap | 19 +- ...reateWalletAccountSetupScene.test.tsx.snap | 20 +- .../CreateWalletEditNameScene.test.tsx.snap | 10 +- .../CreateWalletImportScene.test.tsx.snap | 10 +- ...reateWalletSelectCryptoScene.test.tsx.snap | 3483 +++--- .../CurrencyNotificationScene.test.tsx.snap | 20 +- .../CurrencySettings.ui.test.tsx.snap | 20 +- .../DefaultFiatSettingScene.test.tsx.snap | 1471 +-- .../EdgeLoginScene.test.tsx.snap | 10 +- .../FioAddressDetailsScene.test.tsx.snap | 10 +- .../FioAddressListScene.test.tsx.snap | 10 +- .../FioAddressRegisterScene.test.tsx.snap | 20 +- ...essRegisterSelectWalletScene.test.tsx.snap | 10 +- .../FioAddressRegisteredScene.test.tsx.snap | 10 +- .../FioAddressSettingsScene.test.tsx.snap | 20 +- ...FioConnectWalletConfirmScene.test.tsx.snap | 20 +- .../FioDomainRegisterScene.test.tsx.snap | 20 +- .../__snapshots__/RequestScene.test.tsx.snap | 20 +- .../__snapshots__/SendScene2.ui.test.tsx.snap | 100 +- .../__snapshots__/SettingsScene.test.tsx.snap | 20 +- .../SwapConfirmationScene.test.tsx.snap | 3320 +++--- .../SwapCreateScene.test.tsx.snap | 1394 +-- .../SwapSuccessScene.test.tsx.snap | 10 +- .../TransactionDetailsScene.test.tsx.snap | 9556 +++++++++-------- src/components/common/BlurBackground.tsx | 236 +- src/components/common/SceneWrapper.tsx | 75 +- src/components/modals/EdgeModal.tsx | 16 +- src/components/modals/QrModal.tsx | 8 +- .../navigation/HeaderBackground.tsx | 4 +- .../notification/NotificationCard.tsx | 7 +- src/components/services/Providers.tsx | 20 +- src/components/themed/MenuTabs.tsx | 4 +- src/components/themed/SceneFooterWrapper.tsx | 4 +- 40 files changed, 10410 insertions(+), 9731 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40c67c4be8f..a90852a10f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # edge-react-gui ## Unreleased (develop) +- fixed: The header, scene footer, tab bar, and notification cards blur the scene behind them again on Android 12 and above, sampling the focused scene's content. Below Android 12 they keep their solid backgrounds. +- fixed: See-through modal sheets on Android under the new architecture. Modals blur the screen behind them again on Android 12 and above via a new blur backend (the old one snapshots the window in a way the new architecture renders as empty), and use a solid background color below Android 12, where no blur implementation can render. ## 4.51.0 (staging) diff --git a/eslint.config.mjs b/eslint.config.mjs index 5fa1d7b1c79..75230ae962a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -317,7 +317,6 @@ export default [ 'src/components/services/NetworkActivity.ts', 'src/components/services/PasswordReminderService.ts', 'src/components/services/PermissionsManager.tsx', - 'src/components/services/Providers.tsx', 'src/components/services/SortedWalletList.ts', 'src/components/services/StatusBarManager.tsx', diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 30517c7f9a9..b87e7c277cc 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -50,6 +50,8 @@ PODS: - Yoga - ExpoAsset (57.0.6): - ExpoModulesCore + - ExpoBlur (57.0.2): + - ExpoModulesCore - ExpoDomWebView (57.0.1): - ExpoModulesCore - ExpoFileSystem (57.0.1): @@ -2935,6 +2937,7 @@ DEPENDENCIES: - EXConstants (from `../node_modules/expo-constants/ios`) - Expo (from `../node_modules/expo`) - ExpoAsset (from `../node_modules/expo-asset/ios`) + - ExpoBlur (from `../node_modules/expo-blur/ios`) - "ExpoDomWebView (from `../node_modules/@expo/dom-webview/ios`)" - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) - ExpoFont (from `../node_modules/expo-font/ios`) @@ -3136,6 +3139,8 @@ EXTERNAL SOURCES: :path: "../node_modules/expo" ExpoAsset: :path: "../node_modules/expo-asset/ios" + ExpoBlur: + :path: "../node_modules/expo-blur/ios" ExpoDomWebView: :path: "../node_modules/@expo/dom-webview/ios" ExpoFileSystem: @@ -3421,6 +3426,7 @@ SPEC CHECKSUMS: EXConstants: 8641fb5fcb789b2bfc9d01c9206a6826ca9d49e6 Expo: 9dca8652db31f31b9a6b748dfbca5818c044d61d ExpoAsset: c270900c121a250ceabbf692dfecc2f1564ec82f + ExpoBlur: 69e67b4fbfed6f7325377af2aefa8aa4f00cd2af ExpoDomWebView: beaec034e51bd028428b98bb1f2633ab79c6d095 ExpoFileSystem: e441dae0ae671fc451640517550973d9e024fdf0 ExpoFont: 59e1faf66ba9bcd232ae1e2ce58d202a48b6f65e diff --git a/jestSetup.js b/jestSetup.js index 6e01b81afb3..f2db792d8c7 100644 --- a/jestSetup.js +++ b/jestSetup.js @@ -136,6 +136,12 @@ jest.mock('edge-login-ui-rn', () => ({ } })) +// expo-blur is ESM and reaches for native globals, like expo-linear-gradient: +jest.mock('expo-blur', () => ({ + BlurTargetView: 'BlurTargetView', + BlurView: 'ExpoBlurView' +})) + // expo-linear-gradient reaches for expo-modules-core's native globals on // import, which don't exist under the react-native jest preset: jest.mock('expo-linear-gradient', () => ({ diff --git a/package-lock.json b/package-lock.json index 93b568b8ea3..41b6535ce1a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,6 +54,7 @@ "edge-login-ui-rn": "^3.37.2", "ethers": "^5.7.2", "expo": "^57.0.7", + "expo-blur": "~57.0.2", "expo-linear-gradient": "~57.0.1", "expo-quick-actions": "^5.0.0", "jsrsasign": "^11.1.0", @@ -17973,6 +17974,17 @@ "semver": "^7.6.0" } }, + "node_modules/expo-blur": { + "version": "57.0.2", + "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-57.0.2.tgz", + "integrity": "sha512-Aoud8H8lmlNkbRufyvRLefmGFELdBf1n5Te/Xm+Zx8ORINH+aXL+gKb5mbftFSha860+I7pMArz77TBYz8HDVg==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/expo-constants": { "version": "57.0.6", "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-57.0.6.tgz", diff --git a/package.json b/package.json index 4f7aa4beb4e..c792251e1ab 100644 --- a/package.json +++ b/package.json @@ -116,6 +116,7 @@ "edge-login-ui-rn": "^3.37.2", "ethers": "^5.7.2", "expo": "^57.0.7", + "expo-blur": "~57.0.2", "expo-linear-gradient": "~57.0.1", "expo-quick-actions": "^5.0.0", "jsrsasign": "^11.1.0", diff --git a/patches/edge-login-ui-rn+3.37.2.patch b/patches/edge-login-ui-rn+3.37.2.patch index c912a965cfb..779a0044b6e 100644 --- a/patches/edge-login-ui-rn+3.37.2.patch +++ b/patches/edge-login-ui-rn+3.37.2.patch @@ -115,7 +115,7 @@ index 462a84a..3e65f32 100644 fontWeight: 'normal' }); diff --git a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js -index e70234c..b4749a5 100644 +index e70234c..1a08cb6 100644 --- a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js +++ b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js @@ -13,7 +13,7 @@ import { EdgeTouchableWithoutFeedback } from '../common/EdgeTouchableWithoutFeed @@ -132,8 +132,8 @@ index e70234c..b4749a5 100644 modal: { alignSelf: 'flex-end', - backgroundColor: theme.modalBackground, -+ // Devices that cannot render the blur background get a solid color -+ // approximating the blurred glass look: ++ // Devices that cannot render the blur background (Android below 12) get ++ // a solid color approximating the blurred glass look: + backgroundColor: isBlurDisabled + ? theme.isDark + ? '#2b2b2b' @@ -167,6 +167,29 @@ index 6bf6555..361902f 100644 }, [color]); return (React.createElement(LinearGradient, { style: styles.container, start: START, end: END, colors: colors, locations: MARKS, pointerEvents: "none" })); }; +diff --git a/node_modules/edge-login-ui-rn/lib/components/publicApi/LoginUiProvider.js b/node_modules/edge-login-ui-rn/lib/components/publicApi/LoginUiProvider.js +index b876f76..9bafaf8 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/publicApi/LoginUiProvider.js ++++ b/node_modules/edge-login-ui-rn/lib/components/publicApi/LoginUiProvider.js +@@ -3,6 +3,7 @@ import { SafeAreaProvider } from 'react-native-safe-area-context'; + import { asOptionalTheme } from '../../types/Theme'; + import { Airship } from '../services/AirshipInstance'; + import { changeTheme, getTheme, ThemeProvider } from '../services/ThemeContext'; ++import { BlurTarget, BlurTargetProvider } from '../ui4/BlurBackground'; + /** + * We use this context to determine if `LoginUiProvider` is mounted, and whether + * we are on mobile or desktop. +@@ -33,7 +34,9 @@ function LoginUiProviderComponent(props) { + return (React.createElement(loginUiContext.Provider, { value: { hasProvider: true, isDesktop: (_a = props.isDesktop) !== null && _a !== void 0 ? _a : false } }, + React.createElement(SafeAreaProvider, null, + React.createElement(ThemeProvider, null, +- React.createElement(Airship, null, props.children))))); ++ React.createElement(BlurTargetProvider, null, ++ React.createElement(Airship, null, ++ React.createElement(BlurTarget, null, props.children))))))); + } + export const LoginUiProvider = React.memo(LoginUiProviderComponent); + export function MaybeProvideLoginUi(props) { diff --git a/node_modules/edge-login-ui-rn/lib/components/scenes/ChangePasswordScene.js b/node_modules/edge-login-ui-rn/lib/components/scenes/ChangePasswordScene.js index 99fe5a5..ccf7529 100644 --- a/node_modules/edge-login-ui-rn/lib/components/scenes/ChangePasswordScene.js @@ -274,38 +297,117 @@ index 5fed31f..ad8aea7 100644 import { usePendingPress } from '../../hooks/usePendingPress'; import { fixSides, mapSides, sidesToMargin, sidesToPadding } from '../../util/sides'; diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts -index 1ce7388..3a90515 100644 +index 1ce7388..d6101c1 100644 --- a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts +++ b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts -@@ -2,4 +2,5 @@ +@@ -1,5 +1,22 @@ + /** * IMPORTANT: Changes in this file MUST be synced with edge-react-gui! */ - /// +-/// -export declare const BlurBackground: () => JSX.Element; ++import React from 'react'; +export declare const isBlurDisabled: boolean; -+export declare const BlurBackground: () => JSX.Element | null; ++/** Owns the blur-target ref. Mounted by LoginUiProvider above both the ++ * target and the Airship layer whose modals sample it. */ ++export declare function BlurTargetProvider(props: { ++ children: React.ReactNode; ++}): React.ReactElement; ++/** Marks its children as the content blur surfaces sample. Wraps the app ++ * content, NOT the modal layer - a modal must not sample itself. */ ++export declare function BlurTarget(props: { ++ children: React.ReactNode; ++}): React.ReactElement; ++/** The Android 12+ blur: expo-blur's Dimezis 3 backend, which works under ++ * the new architecture but needs the BlurTarget above. Falls back to a plain ++ * tint when no target is mounted. */ ++export declare const AndroidBlur: (props: { ++ rounded?: boolean; ++}) => React.ReactElement; ++export declare const BlurBackground: () => React.ReactElement | null; diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js -index 9c77bc0..c7f23e8 100644 +index 9c77bc0..3ff7ba5 100644 --- a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js +++ b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.js -@@ -6,9 +6,17 @@ import { Platform, StyleSheet } from 'react-native'; +@@ -1,16 +1,62 @@ + /** + * IMPORTANT: Changes in this file MUST be synced with edge-react-gui! + */ ++import { BlurTargetView, BlurView as ExpoBlurView } from 'expo-blur'; + import React from 'react'; + import { Platform, StyleSheet } from 'react-native'; ++import { cacheStyles } from 'react-native-patina'; import { BlurView } from 'rn-id-blurview'; - import { cacheStyles, useTheme } from '../services/ThemeContext'; +-import { cacheStyles, useTheme } from '../services/ThemeContext'; ++import { useTheme } from '../services/ThemeContext'; const isAndroid = Platform.OS === 'android'; -+// Android below 12 (API 31) blurs via RenderScript, which cannot snapshot -+// content rendered by the new architecture - BlurView paints a light gray -+// wash instead of blurred content. Worse, plain sibling Views also fail to -+// paint inside the modal on those devices, so the modal must provide its own -+// solid background color and this component renders nothing. ++// Android below 12 (API 31) has no working blur under the new architecture: ++// RenderScript cannot snapshot Fabric-rendered content, so the modal must ++// provide its own solid background color and this component renders nothing. +export const isBlurDisabled = isAndroid && Number(Platform.Version) < 31; ++/** ++ * The content blur surfaces sample from. On Android 12+ the blur ++ * implementation (Dimezis BlurView 3, via expo-blur) can only blur content ++ * wrapped in an explicit target view - the old whole-window snapshot renders ++ * nothing under the new architecture. On iOS this wrapper is a plain View. ++ */ ++const BlurTargetContext = React.createContext(null); ++/** Owns the blur-target ref. Mounted by LoginUiProvider above both the ++ * target and the Airship layer whose modals sample it. */ ++export function BlurTargetProvider(props) { ++ const ref = React.useRef(null); ++ return (React.createElement(BlurTargetContext.Provider, { value: ref }, props.children)); ++} ++/** Marks its children as the content blur surfaces sample. Wraps the app ++ * content, NOT the modal layer - a modal must not sample itself. */ ++export function BlurTarget(props) { ++ const ref = React.useContext(BlurTargetContext); ++ return (React.createElement(BlurTargetView, { ref: ref !== null && ref !== void 0 ? ref : undefined, collapsable: false, style: styles.blurTarget }, props.children)); ++} ++/** The Android 12+ blur: expo-blur's Dimezis 3 backend, which works under ++ * the new architecture but needs the BlurTarget above. Falls back to a plain ++ * tint when no target is mounted. */ ++export const AndroidBlur = (props) => { ++ const { rounded = false } = props; ++ const theme = useTheme(); ++ const stylesLocal = getStyles(theme); ++ const blurTarget = React.useContext(BlurTargetContext); ++ return (React.createElement(ExpoBlurView, { blurMethod: "dimezisBlurViewSdk31Plus", blurTarget: blurTarget !== null && blurTarget !== void 0 ? blurTarget : undefined, tint: theme.isDark ? 'dark' : 'light', intensity: 100, style: [ ++ StyleSheet.absoluteFill, ++ stylesLocal.clip, ++ rounded ? stylesLocal.roundCorner : null ++ ] })); ++}; export const BlurBackground = () => { const theme = useTheme(); - const styles = getStyles(theme); +- const styles = getStyles(theme); +- return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: styles.blurView, overlayColor: "rgba(0, 0, 0, 0)" })); ++ const stylesLocal = getStyles(theme); + if (isBlurDisabled) + return null; - return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: styles.blurView, overlayColor: "rgba(0, 0, 0, 0)" })); ++ if (isAndroid) ++ return React.createElement(AndroidBlur, { rounded: true }); ++ return (React.createElement(BlurView, { blurType: theme.isDark ? 'dark' : 'light', style: stylesLocal.blurView, overlayColor: "rgba(0, 0, 0, 0)" })); }; ++const styles = StyleSheet.create({ ++ blurTarget: { flex: 1 } ++}); const getStyles = cacheStyles((theme) => ({ + blurView: Object.assign(Object.assign({}, StyleSheet.absoluteFillObject), { + // We need this backgroundColor because Android applies an overlay to the +@@ -21,5 +67,11 @@ const getStyles = cacheStyles((theme) => ({ + ? theme.isDark + ? '#161616aa' + : '#ffffff55' +- : undefined }) ++ : undefined }), ++ clip: { ++ overflow: 'hidden' ++ }, ++ roundCorner: { ++ borderRadius: theme.cardBorderRadius ++ } + })); diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.d.ts b/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.d.ts index 1fc2957..8ce3c4b 100644 --- a/node_modules/edge-login-ui-rn/lib/components/ui4/EdgeCard.d.ts diff --git a/src/__tests__/components/__snapshots__/MenuTabs.test.tsx.snap b/src/__tests__/components/__snapshots__/MenuTabs.test.tsx.snap index 671eba0edd9..5210f8eeb65 100644 --- a/src/__tests__/components/__snapshots__/MenuTabs.test.tsx.snap +++ b/src/__tests__/components/__snapshots__/MenuTabs.test.tsx.snap @@ -109,14 +109,17 @@ exports[`MenuTabs should render with loading props 1`] = ` blurType="dark" overlayColor="rgba(0, 0, 0, 0)" style={ - { - "backgroundColor": undefined, - "bottom": 0, - "left": 0, - "position": "absolute", - "right": 0, - "top": 0, - } + [ + { + "backgroundColor": undefined, + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + }, + null, + ] } /> - , + - , -] + + `; diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletEditNameScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletEditNameScene.test.tsx.snap index 126806a2fc4..f1e3db6bc8d 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletEditNameScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletEditNameScene.test.tsx.snap @@ -1,7 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`CreateWalletEditNameComponent should render with loading props 1`] = ` - - + `; diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap index 649522d7427..a3ab9808e7f 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletImportScene.test.tsx.snap @@ -1,7 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`CreateWalletImportScene should render with loading props 1`] = ` - - + `; diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap index 0c148dc3e12..f1fe79086b8 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap @@ -64,150 +64,69 @@ exports[`CreateWalletSelectCrypto should render with loading props 1`] = ` ] } > - - - - - - - - - + - + - + + + + opacity={0.1} + > + + + + - - - - + + - - Choose Wallets to Add - - - - - + Choose Wallets to Add + + + + - -  - - - -  +  - - - + + +  + + + + - - -  - - - - - - - - + submitBehavior="submit" + testID="undefined.textInput" + textAlignVertical="top" + /> - - - - - - ETH - - - Ethereum +  - - - - + + + - + + + + + + > + ETH + + + Ethereum + - + + - - REP (Ethereum) - - - Augur - - - - - - - - - - - + + + + + + + + + REP (Ethereum) + + + > + Augur + - + + - - REPV2 (Ethereum) - - - Augur v2 - - - - - - - - - - - + + + + + + + + } + > + + REPV2 (Ethereum) + + + Augur v2 + - + + - - HERC (Ethereum) - - - Hercules - - - - - - - - - - - + + + + + + + + } + > + + HERC (Ethereum) + + + Hercules + - + + - - DAI (Ethereum) - - - Dai Stablecoin - - - - - - - - - - - + + + + + + + + + + DAI (Ethereum) + + + Dai Stablecoin + + + - + + + + + + + - - + + - Add Custom Token - + ] + } + > + Add Custom Token + + - - - + + + , - , + - , -] + + `; diff --git a/src/__tests__/scenes/__snapshots__/CurrencySettings.ui.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CurrencySettings.ui.test.tsx.snap index cc0f9db222f..a0ffe9391e1 100644 --- a/src/__tests__/scenes/__snapshots__/CurrencySettings.ui.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CurrencySettings.ui.test.tsx.snap @@ -1,7 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`CurrencySettings should render 1`] = ` -[ + - , + - , -] + + `; diff --git a/src/__tests__/scenes/__snapshots__/DefaultFiatSettingScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/DefaultFiatSettingScene.test.tsx.snap index 2a2135ad459..ac452c9dc0a 100644 --- a/src/__tests__/scenes/__snapshots__/DefaultFiatSettingScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/DefaultFiatSettingScene.test.tsx.snap @@ -63,150 +63,69 @@ exports[`DefaultFiatSettingComponent should render with loading props 1`] = ` ] } > - - - - - - - - - + - + - + + + + opacity={0.1} + > + + + + - - - - + + - - - Select Fiat - - + + Select Fiat + + + - -  - - - -  +  - - - + + +  + + + + - + - -  - + +  + + - - + - - - + stickyHeaderIndices={[]} + viewabilityConfigCallbackPairs={[]} + > + - - - - - + /> - - USD - - + + + + - United States Dollar - + + USD + + + United States Dollar + + - - - + + + `; diff --git a/src/__tests__/scenes/__snapshots__/EdgeLoginScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/EdgeLoginScene.test.tsx.snap index 4b20d827c03..b674cbcca3a 100644 --- a/src/__tests__/scenes/__snapshots__/EdgeLoginScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/EdgeLoginScene.test.tsx.snap @@ -1,7 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`EdgeLoginScene should render with loading props 1`] = ` - - + `; diff --git a/src/__tests__/scenes/__snapshots__/FioAddressDetailsScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/FioAddressDetailsScene.test.tsx.snap index 43f9fc837a4..45a4abf090f 100644 --- a/src/__tests__/scenes/__snapshots__/FioAddressDetailsScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/FioAddressDetailsScene.test.tsx.snap @@ -1,7 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`FioAddressDetails should render with loading props 1`] = ` - - + `; diff --git a/src/__tests__/scenes/__snapshots__/FioAddressListScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/FioAddressListScene.test.tsx.snap index 7151b131870..bd22ca5cf4a 100644 --- a/src/__tests__/scenes/__snapshots__/FioAddressListScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/FioAddressListScene.test.tsx.snap @@ -2,7 +2,13 @@ exports[`FioAddressList should render with loading props 1`] = ` [ - - , + , - , + - , -] + + `; diff --git a/src/__tests__/scenes/__snapshots__/FioAddressRegisterSelectWalletScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/FioAddressRegisterSelectWalletScene.test.tsx.snap index 6430a86f3bf..74005e00a79 100644 --- a/src/__tests__/scenes/__snapshots__/FioAddressRegisterSelectWalletScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/FioAddressRegisterSelectWalletScene.test.tsx.snap @@ -1,7 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`FioAddressRegistered should render with loading props 1`] = ` - - + `; diff --git a/src/__tests__/scenes/__snapshots__/FioAddressRegisteredScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/FioAddressRegisteredScene.test.tsx.snap index 15f07c1fa8a..2423bf9ef3e 100644 --- a/src/__tests__/scenes/__snapshots__/FioAddressRegisteredScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/FioAddressRegisteredScene.test.tsx.snap @@ -1,7 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`FioAddressRegistered should render with loading props 1`] = ` - - + `; diff --git a/src/__tests__/scenes/__snapshots__/FioAddressSettingsScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/FioAddressSettingsScene.test.tsx.snap index a43e6c97b88..32a8135c8c4 100644 --- a/src/__tests__/scenes/__snapshots__/FioAddressSettingsScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/FioAddressSettingsScene.test.tsx.snap @@ -1,7 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`FioAddressSettingsComponent should render with loading props 1`] = ` -[ + - , + - , -] + + `; diff --git a/src/__tests__/scenes/__snapshots__/FioConnectWalletConfirmScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/FioConnectWalletConfirmScene.test.tsx.snap index a312cac3f4f..9828aedc0dc 100644 --- a/src/__tests__/scenes/__snapshots__/FioConnectWalletConfirmScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/FioConnectWalletConfirmScene.test.tsx.snap @@ -1,7 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`FioConnectWalletConfirm should render with loading props 1`] = ` -[ + - , + - , -] + + `; diff --git a/src/__tests__/scenes/__snapshots__/FioDomainRegisterScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/FioDomainRegisterScene.test.tsx.snap index 150d6d64417..3c28c8c5f74 100644 --- a/src/__tests__/scenes/__snapshots__/FioDomainRegisterScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/FioDomainRegisterScene.test.tsx.snap @@ -1,7 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`FioDomainRegister should render with loading props 1`] = ` -[ + - , + - , -] + + `; diff --git a/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap index 0e3f998bb4c..5556a9f62f9 100644 --- a/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/RequestScene.test.tsx.snap @@ -1,7 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Request should render a blank scene with loaded props 1`] = ` - - + `; exports[`Request should render with loaded props 1`] = ` - - + `; exports[`Request should render with loading props 1`] = ` diff --git a/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap b/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap index e7d1c3408a5..414e55baf53 100644 --- a/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/SendScene2.ui.test.tsx.snap @@ -1,7 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SendScene2 1 spendTarget 1`] = ` - - + `; exports[`SendScene2 1 spendTarget with info tiles 1`] = ` - - + `; exports[`SendScene2 2 spendTargets 1`] = ` - - + `; exports[`SendScene2 2 spendTargets hide tiles 1`] = ` - - + `; exports[`SendScene2 2 spendTargets hide tiles 2`] = ` - - + `; exports[`SendScene2 2 spendTargets hide tiles 3`] = ` - - + `; exports[`SendScene2 2 spendTargets lock tiles 1`] = ` - - + `; exports[`SendScene2 2 spendTargets lock tiles 2`] = ` - - + `; exports[`SendScene2 2 spendTargets lock tiles 3`] = ` - - + `; exports[`SendScene2 Render SendScene 1`] = ` - - + `; diff --git a/src/__tests__/scenes/__snapshots__/SettingsScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/SettingsScene.test.tsx.snap index c0b451388f7..392046753ec 100644 --- a/src/__tests__/scenes/__snapshots__/SettingsScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/SettingsScene.test.tsx.snap @@ -1,7 +1,19 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SettingsScene should render SettingsScene 1`] = ` -[ + - , + - , -] + + `; diff --git a/src/__tests__/scenes/__snapshots__/SwapConfirmationScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/SwapConfirmationScene.test.tsx.snap index 5d9acc45fe4..c2df9296d95 100644 --- a/src/__tests__/scenes/__snapshots__/SwapConfirmationScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/SwapConfirmationScene.test.tsx.snap @@ -2,150 +2,68 @@ exports[`SwapConfirmationScene should render with loading props 1`] = ` [ - - - - - - - - - + - + - + + + + opacity={0.1} + > + + + + - - - , - + + - - + } + style={ + [ + { + "height": 1334, + "width": 750, + }, + { + "maxHeight": 1334, + }, + { + "padding": 0, + }, + ] + } + > + - + + Exchange + + + - Exchange - + /> - - - - + - - + > + + - -  - + +  + + + High Price Impact + + - High Price Impact + This swap rate is significantly less favorable than the current market rate. - - This swap rate is significantly less favorable than the current market rate. - - - - - + - - - - - + + + - - - - + > + + + + - - BTC - - - - My Bitcoin - - - - - ₿ 0.0001 - - + > + + BTC + + - €1.83 + My Bitcoin - - - - @@ -976,704 +899,362 @@ exports[`SwapConfirmationScene should render with loading props 1`] = ` "fontSize": 22, "includeFontPadding": false, }, - { - "fontSize": 17, - "marginTop": 6, - }, + undefined, null, ] } > - Max network fee + ₿ 0.0001 - - - - 0.00000001 BTC (<0.01 EUR) - + + €1.83 + + - - Total Amount - - - - + Max network fee + + + - 1.83 EUR - + + 0.00000001 BTC (<0.01 EUR) + + - - - - - - - - - To - - - - - - - - - - - - + - + Total Amount + + + - - - + > + 1.83 EUR + + + + + + + - + - - ETH - - - - My Ethereum - - + ], + null, + ] + } + > + To + - - Ξ 0 - - - - €0.000000 - - - (99.99%) - - - + /> - - - - + + + + vbHeight={61} + vbWidth={61} + width={61} + > + + + + - Powered by + ETH + + + My Ethereum + + + + + Ξ 0 + + - - + > + €0.000000 + - Tap to Change Provider - + (99.99%) + + + + + + + + + + + + + + + + + + Powered by + + + + + + Tap to Change Provider + + - - -  - + [ + { + "color": "#00f1a2", + "fontSize": 22, + }, + undefined, + ], + { + "fontFamily": "Feather", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + + - - - - + + - + +  + + + -  + Slide to Confirm - - Slide to Confirm - - - , + + , - - - - - - - - + - + - + + + + opacity={0.1} + > + + + + - - - , - + + - - + } + style={ + [ + { + "height": 1334, + "width": 750, + }, + { + "maxHeight": 1334, + }, + { + "padding": 0, + }, + ] + } + > + - + - - - + + - Select Source Wallet - + ] + } + > + Select Source Wallet + + - - - + + - + +  + + + -  - + /> - - - - + - - - + + - Select Receiving Wallet - + ] + } + > + Select Receiving Wallet + + - - - + + /> + - - , + + , - , + , - - - - - - - + - + + + + opacity={0.1} + > + + + - - - , - + + - - + } + style={ + [ + { + "height": 1334, + "width": 750, + }, + { + "maxHeight": 1334, + }, + { + "padding": 0, + }, + ] + } + > + - + } + jestAnimatedStyle={ + { + "value": {}, + } + } + layout={ + LinearTransition { + "build": [Function], + "durationV": 300, + "randomizeDelay": false, + "reduceMotionV": "system", + } + } + > - - + } + /> - - Sender Name - + + - timmy + Sender Name + + + timmy + + - - - + -  - + {}, + ] + } + > +  + + - - - + - - - - - Bitcoin Amount - - - ₿ 0.123 - - - - - - Amount in USD - - - $ + Bitcoin Amount - 0.00 + ₿ 0.123 - - -  - - - - - + /> - - Amount at Current Price - - - $ + Amount in USD + + + $ + + + 0.00 + + + + - 1230.00 +  + + + + + - (0%) + Amount at Current Price + + + $ + + + 1230.00 + + + (0%) + + - - - + "x": 0, + "y": 0.5, + } + } + style={ + [ + { + "borderBottomColor": "rgba(255, 255, 255, .1)", + "borderBottomWidth": 1, + "height": 1, + }, + { + "margin": 11, + }, + ] + } + /> - - Date - - + Date + + + 8/31/2018, 2:59:40 PM + + + + + + - 8/31/2018, 2:59:40 PM - + + Wallet + + + wallet name + + - + + + + - - Wallet - - + Category + + + Income + + + + +  + + + + + + - wallet name - + + Notes + + + Tap to Add Note (Optional) + + + + +  + + - - + /> + - + } + jestAnimatedStyle={ + { + "value": {}, + } + } + layout={ + LinearTransition { + "build": [Function], + "durationV": 300, + "randomizeDelay": false, + "reduceMotionV": "system", + } + } + > + - - Category - - - Income - - - - + Transaction ID + + + this is the txid + + + -  - + +  + + - + + + + - - Notes - - + View Advanced Transaction Data + + + Show in Explorer + + + - Tap to Add Note (Optional) - + +  + + - + - + + My Receive Addresses + + + this is an address + + + -  - + +  + + - - - - - - - - - - - + "x": 0, + "y": 0.5, + } + } + style={ + [ + { + "borderBottomColor": "rgba(255, 255, 255, .1)", + "borderBottomWidth": 1, + "height": 1, + }, + { + "margin": 11, + }, + ] + } + /> - - Transaction ID - - + Raw Transaction Bytes + + + this is a signed tx + + + - this is the txid - + +  + + + + + + + + - + -  - + + Done + + - + + , + , +] +`; + +exports[`TransactionDetailsScene should render with negative nativeAmount and fiatAmount 1`] = ` +[ + + + + - + + + + - + + + + + + + + + + + + + - View Advanced Transaction Data + Recipient Name - - Show in Explorer - + + timmy + + -  +  - + + + + + - - My Receive Addresses - - - this is an address - + + Bitcoin Amount + + + ₿ 0.12299999 (+0 fee) + + - - -  - - - - - + /> - - Raw Transaction Bytes - - - this is a signed tx - - - - + Amount in USD + + + + $ + + + 6392.93 + + + + -  - + +  + + - - - - - - - - - - - Done - - - - - - - - - , - , -] -`; - -exports[`TransactionDetailsScene should render with negative nativeAmount and fiatAmount 1`] = ` -[ - - - - - - - - - - - - - - , - - - - - - - - - - - - - Recipient Name - - - - timmy - - - - - -  - - - - - - - - - - - - - - Bitcoin Amount - - - ₿ 0.12299999 (+0 fee) - - - - - - - - Amount in USD - - - - $ - - - 6392.93 - - - - - -  - - - - - - - - Amount at Current Price - - - - $ - - - 1230.00 - - - (-80.75%) - - - - - - - - - Date - - - 8/31/2018, 2:59:40 PM - - - - - - - - Wallet - - - wallet name - - - - - - - - - - - - - - Category - - - Expense - - - - -  - - - - - - - - Notes - - + + - Tap to Add Note (Optional) - + + Amount at Current Price + + + + $ + + + 1230.00 + + + (-80.75%) + + + - + - + + Date + + -  - + null, + ] + } + > + 8/31/2018, 2:59:40 PM + + - - - - - - - - - - - + "x": 0, + "y": 0.5, + } + } + style={ + [ + { + "borderBottomColor": "rgba(255, 255, 255, .1)", + "borderBottomWidth": 1, + "height": 1, + }, + { + "margin": 11, + }, + ] + } + /> - - Transaction ID - - - this is the txid - - - - -  - + null, + ] + } + > + Wallet + + + wallet name + + - - - - + - - View Advanced Transaction Data - - - Show in Explorer - + + Category + + + Expense + + + + +  + + - + - + + Notes + + + Tap to Add Note (Optional) + + + -  - + +  + + - + + + + + + - - My Receive Addresses - - - this is an address - - - - + Transaction ID + + + this is the txid + + + -  - + +  + + - + + + + - - Raw Transaction Bytes - - + View Advanced Transaction Data + + + Show in Explorer + + + + +  + + + + + + - this is a signed tx - - - + My Receive Addresses + + + this is an address + + + + +  + + + + + - + + Raw Transaction Bytes + + + this is a signed tx + + + -  - + +  + + - - - - - - + + - Done - + ] + } + > + Done + + - - , + + , | null>(null) + +/** Owns the blur-target ref. Mount above both the target and the Airship + * layer whose modals sample it. */ +export function BlurTargetProvider(props: { + children: React.ReactNode +}): React.ReactElement { + const ref = React.useRef(null) + return ( + + {props.children} + + ) +} + +/** Marks its children as the content blur surfaces sample. Wrap the app's + * scene tree, NOT the modal layer - a modal must not sample itself. */ +export function BlurTarget(props: { + children: React.ReactNode +}): React.ReactElement { + const ref = React.useContext(BlurTargetContext) + return ( + + {props.children} + + ) +} + +export const useBlurTarget = (): React.RefObject | undefined => + React.useContext(BlurTargetContext) ?? undefined + +// +// Focused-scene blur target: the chrome overlaying a scene (header, footer, +// tab bar, notification cards) blurs THAT scene's content. Chrome cannot use +// the app-level target above because chrome lives inside it, and a blur view +// must never sample a tree containing itself. Each SceneWrapper publishes its +// content view here while focused; chrome subscribes to the current one. +// + +const sceneBlurRegistry: { + ref: React.RefObject | null + listeners: Set<() => void> +} = { ref: null, listeners: new Set() } + +const emitSceneBlur = (): void => { + sceneBlurRegistry.listeners.forEach(listener => { + listener() + }) +} +const subscribeSceneBlur = (listener: () => void): (() => void) => { + sceneBlurRegistry.listeners.add(listener) + return () => sceneBlurRegistry.listeners.delete(listener) +} +const getFocusedSceneBlurTarget = (): React.RefObject | null => + sceneBlurRegistry.ref + +/** + * For SceneWrapper: returns a ref to attach to the scene's BlurTargetView, + * published as the focused scene's blur target while `active`. + */ +export function useSceneBlurTarget( + active: boolean +): React.RefObject { + const ref = React.useRef(null) + React.useEffect(() => { + if (!active) return + sceneBlurRegistry.ref = ref + emitSceneBlur() + return () => { + if (sceneBlurRegistry.ref === ref) { + sceneBlurRegistry.ref = null + emitSceneBlur() + } + } + }, [active]) + return ref +} + +interface AndroidBlurProps { + rounded?: boolean + /** iOS-style blur tint. Defaults to the theme's mode. */ + reverseTint?: boolean + /** Sample this target instead of the app-level one. */ + targetRef?: React.RefObject +} + +/** The Android 12+ blur: expo-blur's Dimezis 3 backend, which works under + * the new architecture but needs the BlurTarget above. Falls back to a plain + * tint when no target is mounted (e.g. tests). */ +const AndroidBlur = (props: AndroidBlurProps): React.ReactElement => { + const { rounded = false, reverseTint = false, targetRef } = props + const theme = useTheme() + const stylesLocal = getStyles(theme) + const appTarget = useBlurTarget() + const blurTarget = targetRef ?? appTarget + const dark = reverseTint ? !theme.isDark : theme.isDark + return ( + + ) +} + +/** + * A blur background WITH rounded corners, for content living INSIDE the + * blur target (cards, chrome). On Android this renders the tint only: these + * surfaces sit inside the BlurTarget, and a blur view must never sample a + * tree containing itself - that recursion overflows the renderer's stack. + * Per-surface targets are the future fix; the tint is today's shipped look. + */ export const BlurBackground: React.FC = () => { const theme = useTheme() - const styles = getStyles(theme) + const stylesLocal = getStyles(theme) if (isBlurDisabled) return null + if (isAndroid) { + return + } return ( ) } -/** A blur background WITHOUT rounded corners. For the scene header/footer */ +/** A blur background WITHOUT rounded corners. For the scene header/footer, + * which also live inside the blur target - see BlurBackground. */ export const BlurBackgroundNoRoundedCorners: React.FC = () => { const theme = useTheme() - const styles = getStyles(theme) + const stylesLocal = getStyles(theme) + + if (isBlurDisabled) return null + if (isAndroid) return + return ( + + ) +} + +/** The blur behind chrome overlaying the focused scene: the header, scene + * footer, tab bar, and notification cards. These live inside the app-level + * target, so on Android they sample the focused scene's own target instead, + * falling back to their long-standing tint when no scene publishes one + * (login, scenes without a wrapped content view). */ +export const ChromeBlurBackground: React.FC<{ rounded?: boolean }> = props => { + const { rounded = false } = props + const theme = useTheme() + const stylesLocal = getStyles(theme) + const sceneTarget = React.useSyncExternalStore( + subscribeSceneBlur, + getFocusedSceneBlurTarget + ) + + if (isBlurDisabled) return null + if (isAndroid) { + if (sceneTarget == null) { + return ( + + ) + } + return + } + return ( + + ) +} + +/** The blur behind modal sheets. Modals mount in the Airship layer, outside + * the BlurTarget, so on Android 12+ they can sample it for real blur. */ +export const ModalBlurBackground: React.FC = () => { + const theme = useTheme() + const stylesLocal = getStyles(theme) if (isBlurDisabled) return null + if (isAndroid) return return ( ) } +/** Full-screen blur with the tint flipped against the theme, for standing out + * over content rather than blending in (the QR modal's underlay). */ +export const BlurUnderlayReversed: React.FC = () => { + const theme = useTheme() + + if (isBlurDisabled) return null + if (isAndroid) return + return ( + + ) +} + +const styles = StyleSheet.create({ + blurTarget: { flex: 1 } +}) + const getStyles = cacheStyles((theme: Theme) => ({ blurView: { ...StyleSheet.absoluteFill, @@ -68,6 +277,9 @@ const getStyles = cacheStyles((theme: Theme) => ({ : '#ffffff55' : undefined }, + clip: { + overflow: 'hidden' + }, roundCorner: { // Weird quirk: iOS needs rounding at this component level to properly round // corners, even if the parent has round corners. Parents can't hide diff --git a/src/components/common/SceneWrapper.tsx b/src/components/common/SceneWrapper.tsx index cddeff93766..5865fc5872b 100644 --- a/src/components/common/SceneWrapper.tsx +++ b/src/components/common/SceneWrapper.tsx @@ -48,6 +48,7 @@ import { styled } from '../hoc/styled' import { SceneContainer } from '../layout/SceneContainer' import { NotificationView } from '../notification/NotificationView' import { MAX_TAB_BAR_HEIGHT } from '../themed/MenuTabs' +import { BlurTargetView, useSceneBlurTarget } from './BlurBackground' import { type AccentColors, DotsBackground } from './DotsBackground' export interface InsetStyle { @@ -172,6 +173,11 @@ function SceneWrapperComponent(props: SceneWrapperProps): React.ReactElement { const navigation = useNavigation() const isIos = Platform.OS === 'ios' + // Publish this scene's content as the blur target chrome samples while the + // scene is focused (see BlurBackground): + const isSceneFocused = useIsFocused() + const sceneBlurTargetRef = useSceneBlurTarget(isSceneFocused) + // Track dock height for content padding when dockProps is used const [dockHeight, setDockHeight] = useState(0) @@ -400,21 +406,27 @@ function SceneWrapperComponent(props: SceneWrapperProps): React.ReactElement { if (scroll) { return ( <> - - - {memoizedChildren} - + + + {memoizedChildren} + + {renderFooter == null ? null : ( - + + - {memoizedChildren} + {memoizedChildren} + {renderFooter == null ? null : ( - {memoizedChildren} - + {renderFooter == null ? null : ( (props: EdgeModalProps): React.ReactElement { - + @@ -251,11 +251,13 @@ const getStyles = cacheStyles((theme: Theme) => ({ }, modal: { alignSelf: 'flex-end', - // The dark theme's modal color is translucent because it normally sits on - // top of the blur. Where the blur is skipped, the scene would show - // through it, so use a solid stand-in instead: - backgroundColor: - isBlurDisabled && theme.isDark ? '#2b2b2b' : theme.modalBackground, + // Devices that cannot render the blur background (Android below 12) get + // a solid color approximating the blurred glass look: + backgroundColor: isBlurDisabled + ? theme.isDark + ? '#2b2b2b' + : '#f2f2f2' + : theme.modalBackground, borderTopLeftRadius: theme.rem(1), borderTopRightRadius: theme.rem(1), flexShrink: 1, diff --git a/src/components/modals/QrModal.tsx b/src/components/modals/QrModal.tsx index a7abbb12a6e..b1c4bbbbf7b 100644 --- a/src/components/modals/QrModal.tsx +++ b/src/components/modals/QrModal.tsx @@ -3,9 +3,8 @@ import * as React from 'react' import { StyleSheet, View } from 'react-native' import { type AirshipBridge, AirshipModal } from 'react-native-airship' import { useSafeAreaFrame } from 'react-native-safe-area-context' -import { BlurView } from 'rn-id-blurview' -import { isBlurDisabled } from '../common/BlurBackground' +import { BlurUnderlayReversed, isBlurDisabled } from '../common/BlurBackground' import { cacheStyles, type Theme, useTheme } from '../services/ThemeContext' import { QrCode } from '../themed/QrCode' @@ -40,10 +39,7 @@ export const QrModal: React.FC = props => { isBlurDisabled ? ( ) : ( - + ) } > diff --git a/src/components/navigation/HeaderBackground.tsx b/src/components/navigation/HeaderBackground.tsx index c2b6080dbe6..6208fe5c8de 100644 --- a/src/components/navigation/HeaderBackground.tsx +++ b/src/components/navigation/HeaderBackground.tsx @@ -9,7 +9,7 @@ import Animated, { import { useSceneScrollContext } from '../../state/SceneScrollState' import { - BlurBackgroundNoRoundedCorners, + ChromeBlurBackground, getBlurFallbackStyle } from '../common/BlurBackground' import { styled } from '../hoc/styled' @@ -24,7 +24,7 @@ export const HeaderBackground = (props: any): React.JSX.Element => { return ( - + = (props: Props) => { Platform.OS === 'android' ? styles.shadowAndroid : styles.shadowIos } > - + { - store.dispatch(loadDeviceReferral()).catch(err => { + store.dispatch(loadDeviceReferral()).catch((err: unknown) => { console.warn(err) }) - store.dispatch(fetchCountryCode()).catch(err => { + store.dispatch(fetchCountryCode()).catch((err: unknown) => { console.warn(err) }) }, [store]) @@ -72,14 +73,19 @@ export function Providers(props: Props) { {renderStateProviders( - -

- + + + +
+ + + )} diff --git a/src/components/themed/MenuTabs.tsx b/src/components/themed/MenuTabs.tsx index ba6a147f5f7..e6a23758f66 100644 --- a/src/components/themed/MenuTabs.tsx +++ b/src/components/themed/MenuTabs.tsx @@ -33,7 +33,7 @@ import { config } from '../../theme/appConfig' import { useSelector } from '../../types/reactRedux' import { scale } from '../../util/scaling' import { - BlurBackgroundNoRoundedCorners, + ChromeBlurBackground, getBlurFallbackStyle } from '../common/BlurBackground' import { styled } from '../hoc/styled' @@ -126,7 +126,7 @@ export const MenuTabs = (props: BottomTabBarProps): React.JSX.Element => { tabLabelHeight={tabLabelHeight} pointerEvents="none" > - + - {noBackgroundBlur ? null : } + {noBackgroundBlur ? null : } {children} ) From 1b339f66e069859dc000ff67b2063cfdc4315344 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 31 Aug 2026 15:51:38 -0700 Subject: [PATCH 25/37] Drop notifications below the Android status bar Edge-to-edge draws the window under the status bar, and the Airship layer's safe-area measurement is iOS-only (it measures through React Native's SafeAreaView, a no-op on Android), so dropdown notifications - received transactions, error alerts - slid in underneath the status bar and camera cutout instead of below them. Add the top inset to the dropdown's own padding on Android. iOS already receives it from the Airship layer, so it is excluded there to avoid a doubled gap. login-ui's error dropdown gets the same fix through the regenerated patch. --- CHANGELOG.md | 1 + patches/edge-login-ui-rn+3.37.2.patch | 29 +++++++++++++++++++++++ src/components/common/AirshipDropdown.tsx | 14 +++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a90852a10f2..31845ec453c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # edge-react-gui ## Unreleased (develop) +- fixed: Received-transaction and error dropdowns no longer slide in underneath the Android status bar on edge-to-edge devices. - fixed: The header, scene footer, tab bar, and notification cards blur the scene behind them again on Android 12 and above, sampling the focused scene's content. Below Android 12 they keep their solid backgrounds. - fixed: See-through modal sheets on Android under the new architecture. Modals blur the screen behind them again on Android 12 and above via a new blur backend (the old one snapshots the window in a way the new architecture renders as empty), and use a solid background color below Android 12, where no blur implementation can render. diff --git a/patches/edge-login-ui-rn+3.37.2.patch b/patches/edge-login-ui-rn+3.37.2.patch index 779a0044b6e..a95dddd724c 100644 --- a/patches/edge-login-ui-rn+3.37.2.patch +++ b/patches/edge-login-ui-rn+3.37.2.patch @@ -13,6 +13,35 @@ index 11c6f1e..7cba2e9 100644 import { cacheStyles } from 'react-native-patina'; import { usePendingPress } from '../../hooks/usePendingPress'; import { fixSides, mapSides, sidesToMargin } from '../../util/sides'; +diff --git a/node_modules/edge-login-ui-rn/lib/components/common/AlertDropdown.js b/node_modules/edge-login-ui-rn/lib/components/common/AlertDropdown.js +index be4835b..cbf5719 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/common/AlertDropdown.js ++++ b/node_modules/edge-login-ui-rn/lib/components/common/AlertDropdown.js +@@ -1,7 +1,8 @@ + import * as React from 'react'; +-import { View } from 'react-native'; ++import { Platform, View } from 'react-native'; + import { AirshipDropdown } from 'react-native-airship'; + import { cacheStyles } from 'react-native-patina'; ++import { useSafeAreaInsets } from 'react-native-safe-area-context'; + import AntDesignIcon from 'react-native-vector-icons/AntDesign'; + import EntypoIcon from 'react-native-vector-icons/Entypo'; + import { lstrings } from '../../common/locales/strings'; +@@ -10,7 +11,13 @@ import { UnscaledText } from './UnscaledText'; + function AlertDropdownComponent(props) { + const { bridge, message, theme, warning } = props; + const styles = getStyles(theme); +- return (React.createElement(AirshipDropdown, { bridge: bridge, backgroundColor: warning ? theme.dropdownWarning : theme.dropdownError }, ++ // The Airship layer's own safe-area measurement only works on iOS, and ++ // edge-to-edge Android draws the window under the status bar, so push the ++ // content below it ourselves. iOS already gets this from the layer, so ++ // adding it here would double the gap: ++ const insets = useSafeAreaInsets(); ++ const androidTopInset = Platform.OS === 'android' ? insets.top : 0; ++ return (React.createElement(AirshipDropdown, { bridge: bridge, backgroundColor: warning ? theme.dropdownWarning : theme.dropdownError, padding: [androidTopInset, 0, 0, 0] }, + React.createElement(View, { style: styles.container }, + React.createElement(EntypoIcon, { name: "warning", size: theme.rem(1.25), style: styles.icon }), + React.createElement(UnscaledText, { style: styles.text }, diff --git a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.d.ts b/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.d.ts index 4fdfab4..adfeca7 100644 --- a/node_modules/edge-login-ui-rn/lib/components/common/BlurBackground.d.ts diff --git a/src/components/common/AirshipDropdown.tsx b/src/components/common/AirshipDropdown.tsx index 7308fabe8bd..624b6a3a77a 100644 --- a/src/components/common/AirshipDropdown.tsx +++ b/src/components/common/AirshipDropdown.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { Dimensions, View } from 'react-native' +import { Dimensions, Platform, View } from 'react-native' import type { AirshipBridge } from 'react-native-airship' import { Gesture, GestureDetector } from 'react-native-gesture-handler' import { cacheStyles } from 'react-native-patina' @@ -8,6 +8,7 @@ import Animated, { useSharedValue, withTiming } from 'react-native-reanimated' +import { useSafeAreaInsets } from 'react-native-safe-area-context' import { runOnJS } from 'react-native-worklets' import { useHandler } from '../../hooks/useHandler' @@ -47,6 +48,15 @@ export function AirshipDropdown(props: Props): React.ReactElement { const theme = useTheme() const styles = getStyles(theme) + // The Airship layer's own safe-area measurement only works on iOS, and + // edge-to-edge Android draws the window under the status bar, so push the + // content below it ourselves. iOS already gets this from the layer, so + // adding it here would double the gap: + const insets = useSafeAreaInsets() + const androidInsetStyle = { + paddingTop: safeAreaGap + (Platform.OS === 'android' ? insets.top : 0) + } + // The user must drag this far to close the drop-down: const closeThreshold = theme.rem(1.5) @@ -136,7 +146,7 @@ export function AirshipDropdown(props: Props): React.ReactElement { return ( - + {children} From ded5694b64a16ee2910119f381a4b50aef417ec0 Mon Sep 17 00:00:00 2001 From: peachbits Date: Tue, 1 Sep 2026 12:07:37 -0700 Subject: [PATCH 26/37] Upgrade react-native-performance to 6.0.0 Two fixes in 6.0.0 target exactly this app's setup: new-architecture detection on React Native 0.77+ and an Android soft exception when the event emitter is touched before initialization (plus Android listener-leak fixes). The breaking changes do not reach us - Flipper support removal (React Native itself dropped Flipper), Flow-to-TypeScript codegen internals, and renames of old-bridge lifecycle APIs the app never calls. Our entire usage is the standard performance mark/measure API in perf.ts. --- ios/Podfile.lock | 4 ++-- package-lock.json | 6 ++++-- package.json | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b87e7c277cc..64419262d2b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1668,7 +1668,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - react-native-performance (5.1.4): + - react-native-performance (6.0.0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -3502,7 +3502,7 @@ SPEC CHECKSUMS: react-native-mail: 6e83813066984b26403d3fdfe79ac7bb31857e3c react-native-monero: d2b0167fd79d8eeda80ad357f12e8fee8edf63a7 react-native-netinfo: adec161a2fc40d327f2c1bab7d8c57a91943ab74 - react-native-performance: d673456bafde4fbf8170e0f267f77a899c3f507b + react-native-performance: c2cf9c69321cd5eacfdba07ced92409a185140a8 react-native-piratechain: b8a42336b1f8e6ccfc3ee054d18ed79d68d42fa1 react-native-render-html: 5afc4751f1a98621b3009432ef84c47019dcb2bd react-native-safari-view: 07dc856a2663fef31eaca6beb79b111b8f6cf1f2 diff --git a/package-lock.json b/package-lock.json index 41b6535ce1a..ba0a5d6ffb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,7 +91,7 @@ "react-native-mail": "^6.1.1", "react-native-monero": "0.5.0", "react-native-patina": "^0.2.0", - "react-native-performance": "^5.1.4", + "react-native-performance": "^6.0.0", "react-native-permissions": "^4.1.5", "react-native-piratechain": "0.6.3", "react-native-reanimated": "4.5.3", @@ -25199,7 +25199,9 @@ "license": "MIT" }, "node_modules/react-native-performance": { - "version": "5.1.4", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/react-native-performance/-/react-native-performance-6.0.0.tgz", + "integrity": "sha512-Sca75O8jhqXAnNbqvINnrw248Kv9cIwoGxToD8u2uX+BrkAxxXS+YhClEV5L3JdiOpdNCO1MJ5R9bgs2VkNpFg==", "license": "MIT", "peerDependencies": { "react-native": "*" diff --git a/package.json b/package.json index c792251e1ab..4ceb928ccbe 100644 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "react-native-mail": "^6.1.1", "react-native-monero": "0.5.0", "react-native-patina": "^0.2.0", - "react-native-performance": "^5.1.4", + "react-native-performance": "^6.0.0", "react-native-permissions": "^4.1.5", "react-native-piratechain": "0.6.3", "react-native-reanimated": "4.5.3", From 5e30fe0ea9b56be433c918dee6673ac6f87843ab Mon Sep 17 00:00:00 2001 From: peachbits Date: Tue, 1 Sep 2026 12:26:29 -0700 Subject: [PATCH 27/37] Upgrade react-native-sound to 0.13 and haptic-feedback to 3.0 Both upgrades take the module from bridge interop to codegen under the new architecture. Sound 0.13.0 changes nothing in the API we touch (setCategory, load, play). Haptic-feedback 3.0.0 keeps the default-export trigger() call both this app and edge-login-ui-rn use; its breaking changes are additions (hooks, patterns) and the TurboModule conversion, which is why jest now needs a mock - the import itself demands a native binding. login-ui pins ^1.14.0 until its next release, so an npm override keeps the tree at one copy, the same arrangement airship and patina already use; the login-ui branch bumps its own range in lockstep. --- ios/Podfile.lock | 27 +++++++++++++++++++++++---- jestSetup.js | 4 ++++ package-lock.json | 20 +++++++++++++++----- package.json | 5 +++-- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 64419262d2b..6b4087ba9f7 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2410,8 +2410,27 @@ PODS: - RNQrGenerator (1.4.6): - React - ZXingObjC - - RNReactNativeHapticFeedback (1.14.0): + - RNReactNativeHapticFeedback (3.0.0): + - hermes-engine + - 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 + - ReactNativeDependencies + - Yoga - RNReanimated (4.5.3): - hermes-engine - RCTRequired @@ -2598,7 +2617,7 @@ PODS: - ReactCommon/turbomodule/core - ReactNativeDependencies - Yoga - - RNSound (0.12.0): + - RNSound (0.13.0): - hermes-engine - RCTRequired - RCTTypeSafety @@ -3561,13 +3580,13 @@ SPEC CHECKSUMS: RNLocalize: 1034c494e25d2e8d4c5c9062418f1cd6db24e27e RNPermissions: 950d9f3b9c0225c92c1103366721e53491aec3f1 RNQrGenerator: af2f0888eb81b8ff99517a3929d6399444dcc56d - RNReactNativeHapticFeedback: 8364333ca888b1b7ec9d2daf04b010ee5436366e + RNReactNativeHapticFeedback: ab7ef0c4befc540f5431166f98d74edfc70001f7 RNReanimated: b9153787cb2d022e800229b75efcf87627117e3e RNScreens: df54f9e1092ce77fe96fc0c3a5314862d05a506e RNSecureRandom: b64d263529492a6897e236a22a2c4249aa1b53dc RNSentry: 18fc2982a2c646dfada4ddd6fc8e225e1bcad812 RNShare: 8607a66b8edd8cf2d5781fb66250d8a07ec6d30d - RNSound: 460a3786c10accc5144d3b6866d3d8c3c41d2978 + RNSound: 8e9d0d0c836de07b646743a60bc976276c9edfcd RNStoreReview: 6acb6bf05fcc90f471753d4c128954a1426018b2 RNSVG: 02c4605f1656727c3a83059ef119dc7e469df182 RNVectorIcons: 0763c0f64e1ec73fe18f4ed2fb1e485f96417009 diff --git a/jestSetup.js b/jestSetup.js index f2db792d8c7..cd5efff04db 100644 --- a/jestSetup.js +++ b/jestSetup.js @@ -10,6 +10,10 @@ import mockSafeAreaContext from 'react-native-safe-area-context/jest/mock' // -------------------------------------------------------------------- jest.mock('@react-native-clipboard/clipboard', () => mockClipboard) +jest.mock('react-native-haptic-feedback', () => ({ + __esModule: true, + default: { trigger() {} } +})) jest.mock('react-native-permissions', () => mockPermissions) jest.mock('react-native-safe-area-context', () => mockSafeAreaContext) // Firebase 25 instantiates a native event emitter on import, which crashes in diff --git a/package-lock.json b/package-lock.json index ba0a5d6ffb5..e977e6e2c3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,7 +82,7 @@ "react-native-get-random-values": "^1.11.0", "react-native-gifted-charts": "1.4.63", "react-native-gradle-plugin": "^0.71.19", - "react-native-haptic-feedback": "^1.14.0", + "react-native-haptic-feedback": "^3.0.0", "react-native-image-colors": "^2.4.0", "react-native-image-picker": "^8.2.1", "react-native-in-app-review": "^4.3.5", @@ -102,7 +102,7 @@ "react-native-screens": "4.25.2", "react-native-securerandom": "^1.0.1", "react-native-share": "^12.0.11", - "react-native-sound": "^0.12.0", + "react-native-sound": "^0.13.0", "react-native-store-review": "https://github.com/EdgeApp/react-native-store-review#b0a3379829056e7328b550d5b135271f7a777083", "react-native-svg": "15.15.4", "react-native-vector-icons": "^10.1.0", @@ -25092,10 +25092,18 @@ "license": "MIT" }, "node_modules/react-native-haptic-feedback": { - "version": "1.14.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-native-haptic-feedback/-/react-native-haptic-feedback-3.0.0.tgz", + "integrity": "sha512-yxBQFHhXU8S0xupGtzDRToGw5yMWezUdLzxtlx2Oi9YpjPwprWZWCw8foPt0S2t84B0ZikzZYyOHiMSXIelUxg==", "license": "MIT", "peerDependencies": { - "react-native": ">=0.60.0" + "react": ">=18.0.0", + "react-native": ">=0.71.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } } }, "node_modules/react-native-image-colors": { @@ -25336,7 +25344,9 @@ } }, "node_modules/react-native-sound": { - "version": "0.12.0", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/react-native-sound/-/react-native-sound-0.13.0.tgz", + "integrity": "sha512-SnREzaV0fmpYNuDV1Y8M7FutmaYei0pKBgpldULKKJMkoA3DBv5ppyRxY+oxRQ7HwEpt6LsonrKgM+13GH/tCw==", "license": "MIT", "peerDependencies": { "react": "*", diff --git a/package.json b/package.json index 4ceb928ccbe..772ce1e6345 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "yaob": "^0.4.0", "bip39": "3.0.4", "react-native-airship": "^0.3.0", + "react-native-haptic-feedback": "^3.0.0", "react-native-patina": "^0.2.0" }, "dependencies": { @@ -144,7 +145,7 @@ "react-native-get-random-values": "^1.11.0", "react-native-gifted-charts": "1.4.63", "react-native-gradle-plugin": "^0.71.19", - "react-native-haptic-feedback": "^1.14.0", + "react-native-haptic-feedback": "^3.0.0", "react-native-image-colors": "^2.4.0", "react-native-image-picker": "^8.2.1", "react-native-in-app-review": "^4.3.5", @@ -164,7 +165,7 @@ "react-native-screens": "4.25.2", "react-native-securerandom": "^1.0.1", "react-native-share": "^12.0.11", - "react-native-sound": "^0.12.0", + "react-native-sound": "^0.13.0", "react-native-store-review": "https://github.com/EdgeApp/react-native-store-review#b0a3379829056e7328b550d5b135271f7a777083", "react-native-svg": "15.15.4", "react-native-vector-icons": "^10.1.0", From 5374f1f8ec688a15ca5fc27a751f6eb252d37dc8 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 31 Aug 2026 12:24:55 -0700 Subject: [PATCH 28/37] Add changelog entries --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31845ec453c..ef13ea3f03d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,19 @@ - fixed: The header, scene footer, tab bar, and notification cards blur the scene behind them again on Android 12 and above, sampling the focused scene's content. Below Android 12 they keep their solid backgrounds. - fixed: See-through modal sheets on Android under the new architecture. Modals blur the screen behind them again on Android 12 and above via a new blur backend (the old one snapshots the window in a way the new architecture renders as empty), and use a solid background color below Android 12, where no blur implementation can render. +- changed: Draw gradients with expo-linear-gradient and scroll around the keyboard with react-native-keyboard-controller, replacing two libraries that rendered through the new architecture's legacy compatibility layers (react-native-linear-gradient and the unmaintained react-native-keyboard-aware-scroll-view). +- changed: The feedback survey now uses the same keyboard offset on both platforms, replacing a per-platform workaround the old scroll library required. +- fixed: The app no longer installs two copies of react-native-airship and react-native-patina (one nested under edge-login-ui-rn). + +- changed: Upgrade react-native-sound to 0.13.0 and react-native-haptic-feedback to 3.0.0, both now codegen-native under the new architecture. +- changed: Upgrade react-native-performance to 6.0.0, fixing new-architecture detection and an Android event-emitter race. +- changed: Upgrade to React Native 0.86, Expo SDK 57, and the new architecture on both platforms. On Android this substantially improves scrolling performance: in release-build benchmarks, dropped frames during wallet-list scrolling fell from 7.3% to 2.5%, the worst-case frame rate rose from 33 to 48 fps, and peak CPU fell 38%, at the cost of higher memory use. +- changed: Long labels on Android now truncate with an ellipsis instead of shrinking to fit. The new renderer ignores the minimum text size, which could render labels illegibly small. +- changed: Android 11 and below now show solid backgrounds where blur effects used to be. Those Android versions cannot render blur under the new architecture, which painted a gray wash over the content instead. +- fixed: Modals no longer sit behind the keyboard on Android, hiding their bottom buttons. +- fixed: The amount field no longer clips its trailing digit or shifts sideways while typing. +- fixed: Tapping outside the side menu closes it again on Android versions that cannot animate the overlay. + ## 4.51.0 (staging) - added: Push info-server attestation tokens into edge-core-js via `setAttestationToken` so the login server can skip CAPTCHA for attested devices, and allow `LOGIN_SERVER` / `INFO_SERVER` env overrides for local E2E stacks. From 5c1a48b79ce98cebd1b5af4890a31049de6e4b41 Mon Sep 17 00:00:00 2001 From: peachbits Date: Tue, 1 Sep 2026 14:38:30 -0700 Subject: [PATCH 29/37] fixup! Blur modals and chrome again on Android 12+ --- ...reateWalletSelectCryptoScene.test.tsx.snap | 42 +++++++++---------- .../DefaultFiatSettingScene.test.tsx.snap | 42 +++++++++---------- src/components/common/SceneWrapper.tsx | 15 ++++--- 3 files changed, 47 insertions(+), 52 deletions(-) diff --git a/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap index f1fe79086b8..f5acb8badb0 100644 --- a/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/CreateWalletSelectCryptoScene.test.tsx.snap @@ -27,15 +27,6 @@ exports[`CreateWalletSelectCrypto should render with loading props 1`] = ` "height": 1334, "width": 750, }, - { - "paddingBottom": 0, - "paddingLeft": 0, - "paddingRight": 0, - "paddingTop": 64, - }, - { - "padding": 0, - }, ] } style={ @@ -49,18 +40,9 @@ exports[`CreateWalletSelectCrypto should render with loading props 1`] = ` "height": 1334, "width": 750, }, - { - "paddingBottom": 0, - "paddingLeft": 0, - "paddingRight": 0, - "paddingTop": 64, - }, { "maxHeight": 1334, }, - { - "padding": 0, - }, ] } > @@ -72,10 +54,26 @@ exports[`CreateWalletSelectCrypto should render with loading props 1`] = ` } } style={ - { - "flexGrow": 1, - "flexShrink": 1, - } + [ + { + "alignItems": "stretch", + "flexDirection": "column", + "justifyContent": "flex-start", + }, + { + "flexGrow": 1, + "flexShrink": 1, + }, + { + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 64, + }, + { + "padding": 0, + }, + ] } > @@ -71,10 +53,26 @@ exports[`DefaultFiatSettingComponent should render with loading props 1`] = ` } } style={ - { - "flexGrow": 1, - "flexShrink": 1, - } + [ + { + "alignItems": "stretch", + "flexDirection": "column", + "justifyContent": "flex-start", + }, + { + "flexGrow": 1, + "flexShrink": 1, + }, + { + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 64, + }, + { + "padding": 0, + }, + ] } > Date: Tue, 1 Sep 2026 14:38:40 -0700 Subject: [PATCH 30/37] Start disabled text inputs in their disabled look The disable animation's shared value always started at 0 (enabled), and a mount effect then animated it toward the actual disabled prop. An input mounted with disabled=true therefore flashed its enabled look for ~300ms every time its scene appeared - most visibly the spending-limit amount field, whose scene mounts it disabled whenever the limit is switched off. Seed the shared value with the mounted state so the first frame is already correct; later prop changes still animate as before. Fix the same pattern in edge-login-ui-rn's copies of these inputs via the login-ui patch, mirroring an identical commit in that repo. --- CHANGELOG.md | 1 + patches/edge-login-ui-rn+3.37.2.patch | 32 +++++++++++++++++++++++ src/components/themed/FilledTextInput.tsx | 5 ++-- src/components/themed/SimpleTextInput.tsx | 5 ++-- 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef13ea3f03d..d565b3f7e6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # edge-react-gui ## Unreleased (develop) +- fixed: Text inputs mounted in the disabled state (such as the spending-limit amount) no longer flash their enabled look before dimming when a scene appears. - fixed: Received-transaction and error dropdowns no longer slide in underneath the Android status bar on edge-to-edge devices. - fixed: The header, scene footer, tab bar, and notification cards blur the scene behind them again on Android 12 and above, sampling the focused scene's content. Below Android 12 they keep their solid backgrounds. - fixed: See-through modal sheets on Android under the new architecture. Modals blur the screen behind them again on Android 12 and above via a new blur backend (the old one snapshots the window in a way the new architecture renders as empty), and use a solid background color below Android 12, where no blur implementation can render. diff --git a/patches/edge-login-ui-rn+3.37.2.patch b/patches/edge-login-ui-rn+3.37.2.patch index a95dddd724c..3f6dcc1b73b 100644 --- a/patches/edge-login-ui-rn+3.37.2.patch +++ b/patches/edge-login-ui-rn+3.37.2.patch @@ -314,6 +314,22 @@ index 8a5c3f3..e4699a4 100644 import { cacheStyles } from 'react-native-patina'; import { sprintf } from 'sprintf-js'; import { maybeRouteComplete } from '../../../actions/LoginInitActions'; +diff --git a/node_modules/edge-login-ui-rn/lib/components/themed/FilledTextInput.js b/node_modules/edge-login-ui-rn/lib/components/themed/FilledTextInput.js +index 324ee0f..7f0fd48 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/themed/FilledTextInput.js ++++ b/node_modules/edge-login-ui-rn/lib/components/themed/FilledTextInput.js +@@ -83,8 +83,9 @@ export const FilledTextInput = React.forwardRef((props, ref) => { + isFocused, + setNativeProps + })); +- // Animates between 0 and 1 based our disabled state: +- const disableAnimation = useSharedValue(0); ++ // Animates between 0 and 1 based our disabled state, starting at the ++ // mounted state so the input doesn't flash its enabled look on entry: ++ const disableAnimation = useSharedValue(disabled ? 1 : 0); + React.useEffect(() => { + disableAnimation.value = withTiming(disabled ? 1 : 0); + }, [disableAnimation, disabled]); diff --git a/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js b/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js index 5fed31f..ad8aea7 100644 --- a/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js @@ -325,6 +341,22 @@ index 5fed31f..ad8aea7 100644 import { cacheStyles } from 'react-native-patina'; import { usePendingPress } from '../../hooks/usePendingPress'; import { fixSides, mapSides, sidesToMargin, sidesToPadding } from '../../util/sides'; +diff --git a/node_modules/edge-login-ui-rn/lib/components/themed/SimpleTextInput.js b/node_modules/edge-login-ui-rn/lib/components/themed/SimpleTextInput.js +index 7288462..466b83d 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/themed/SimpleTextInput.js ++++ b/node_modules/edge-login-ui-rn/lib/components/themed/SimpleTextInput.js +@@ -69,8 +69,9 @@ export const SimpleTextInput = React.forwardRef((props, ref) => { + isFocused, + setNativeProps + })); +- // Animates between 0 and 1 based our disabled state: +- const disableAnimation = useSharedValue(0); ++ // Animates between 0 and 1 based our disabled state, starting at the ++ // mounted state so the input doesn't flash its enabled look on entry: ++ const disableAnimation = useSharedValue(disabled ? 1 : 0); + React.useEffect(() => { + disableAnimation.value = withTiming(disabled ? 1 : 0); + }, [disableAnimation, disabled]); diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts index 1ce7388..d6101c1 100644 --- a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts diff --git a/src/components/themed/FilledTextInput.tsx b/src/components/themed/FilledTextInput.tsx index 295e25f5d56..5447d24c9fd 100644 --- a/src/components/themed/FilledTextInput.tsx +++ b/src/components/themed/FilledTextInput.tsx @@ -319,8 +319,9 @@ export const FilledTextInput = React.forwardRef< } }, [displayValue, inputRef, sharedDisplayValue]) - // Animates between 0 and 1 based our disabled state: - const disableAnimation = useSharedValue(0) + // Animates between 0 and 1 based our disabled state, starting at the + // mounted state so the input doesn't flash its enabled look on entry: + const disableAnimation = useSharedValue(disabled ? 1 : 0) React.useEffect(() => { disableAnimation.value = withTiming(disabled ? 1 : 0) }, [disableAnimation, disabled]) diff --git a/src/components/themed/SimpleTextInput.tsx b/src/components/themed/SimpleTextInput.tsx index 1c167b604b2..63d94a34b00 100644 --- a/src/components/themed/SimpleTextInput.tsx +++ b/src/components/themed/SimpleTextInput.tsx @@ -197,8 +197,9 @@ export const SimpleTextInput = React.forwardRef< setNativeProps })) - // Animates between 0 and 1 based our disabled state: - const disableAnimation = useSharedValue(0) + // Animates between 0 and 1 based our disabled state, starting at the + // mounted state so the input doesn't flash its enabled look on entry: + const disableAnimation = useSharedValue(disabled ? 1 : 0) React.useEffect(() => { disableAnimation.value = withTiming(disabled ? 1 : 0) }, [disableAnimation, disabled]) From 60fb0b77d2c84d082acdf7519f0aa5c0a6c55f4b Mon Sep 17 00:00:00 2001 From: peachbits Date: Tue, 1 Sep 2026 17:32:49 -0700 Subject: [PATCH 31/37] fixup! Upgrade to React Native 0.86 and Expo SDK 57 --- app.json | 6 +----- jestSetup.js | 5 +++-- package-lock.json | 36 ++++++++---------------------------- package.json | 2 +- 4 files changed, 13 insertions(+), 36 deletions(-) diff --git a/app.json b/app.json index 6fcb36f1907..e4b57563ab3 100644 --- a/app.json +++ b/app.json @@ -1,8 +1,4 @@ { "name": "edge", - "displayName": "edge", - "plugins": [ - "@react-native-community/datetimepicker", - "@sentry/react-native" - ] + "displayName": "edge" } diff --git a/jestSetup.js b/jestSetup.js index cd5efff04db..f44e17bf61f 100644 --- a/jestSetup.js +++ b/jestSetup.js @@ -36,8 +36,9 @@ require('react-native-reanimated').setUpTests() jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter') -// The RN 0.85 jest preset returns undefined from Keyboard.addListener; return a -// removable subscription so effect cleanups (showListener.remove()) don't throw. +// The NativeEventEmitter automock above makes Keyboard.addListener return +// undefined; return a removable subscription so effect cleanups +// (showListener.remove()) don't throw. require('react-native').Keyboard.addListener = () => ({ remove: () => {} }) for (const log in global.console) { diff --git a/package-lock.json b/package-lock.json index e977e6e2c3b..4d0c034cd0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -138,7 +138,7 @@ "@react-native-community/cli-platform-android": "20.1.0", "@react-native-community/cli-platform-ios": "20.1.0", "@react-native/babel-preset": "0.86.0", - "@react-native/jest-preset": "^0.85.3", + "@react-native/jest-preset": "0.86.0", "@react-native/metro-config": "0.86.0", "@react-native/typescript-config": "0.86.0", "@rollup/plugin-babel": "^6.0.3", @@ -9845,14 +9845,14 @@ } }, "node_modules/@react-native/jest-preset": { - "version": "0.85.3", - "resolved": "https://registry.npmjs.org/@react-native/jest-preset/-/jest-preset-0.85.3.tgz", - "integrity": "sha512-ALPSrM0q2fU+5AXcOXzDKx7rxVKPMvygAZfsTWLdrGRVWIqf/HEfM0R8euQqIKUqmEuQ1TxMWN+px3h6gc4vow==", + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/jest-preset/-/jest-preset-0.86.0.tgz", + "integrity": "sha512-KA+xpIP3DvJy7PQJ9c6ZdEKkOPChl+Rk/rV2MhQACEAzfhWU84407KZQv4ccyO3B4caD0gPrFjE96a4P993nsQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/js-polyfills": "0.85.3", + "@react-native/js-polyfills": "0.86.0", "babel-jest": "^29.7.0", "jest-environment-node": "^29.7.0", "regenerator-runtime": "^0.13.2" @@ -9865,10 +9865,9 @@ } }, "node_modules/@react-native/js-polyfills": { - "version": "0.85.3", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.85.3.tgz", - "integrity": "sha512-U2+aMshIXf1uFn77tpBb/xhHWB9vkVrMpt7kkucAugF8hJKYTDGB587X7WwelHduK2KBfhl4giSv0rzZGoef9A==", - "dev": true, + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.0.tgz", + "integrity": "sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==", "license": "MIT", "engines": { "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" @@ -9909,16 +9908,6 @@ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" } }, - "node_modules/@react-native/metro-config/node_modules/@react-native/js-polyfills": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.0.tgz", - "integrity": "sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" - } - }, "node_modules/@react-native/normalize-colors": { "version": "0.86.0", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.86.0.tgz", @@ -25540,15 +25529,6 @@ "react-native": ">=0.47.0 <1.0.0" } }, - "node_modules/react-native/node_modules/@react-native/js-polyfills": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.86.0.tgz", - "integrity": "sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==", - "license": "MIT", - "engines": { - "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0" - } - }, "node_modules/react-native/node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", diff --git a/package.json b/package.json index 772ce1e6345..66b743c0c8a 100644 --- a/package.json +++ b/package.json @@ -201,7 +201,7 @@ "@react-native-community/cli-platform-android": "20.1.0", "@react-native-community/cli-platform-ios": "20.1.0", "@react-native/babel-preset": "0.86.0", - "@react-native/jest-preset": "^0.85.3", + "@react-native/jest-preset": "0.86.0", "@react-native/metro-config": "0.86.0", "@react-native/typescript-config": "0.86.0", "@rollup/plugin-babel": "^6.0.3", From 1216f7042970971d8613f338f11ab32299f4bf15 Mon Sep 17 00:00:00 2001 From: peachbits Date: Wed, 2 Sep 2026 21:24:52 -0700 Subject: [PATCH 32/37] fixup! Keep modals above the keyboard on Android --- src/components/modals/EdgeModal.tsx | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/components/modals/EdgeModal.tsx b/src/components/modals/EdgeModal.tsx index e143d83fb3e..efa4998d5c4 100644 --- a/src/components/modals/EdgeModal.tsx +++ b/src/components/modals/EdgeModal.tsx @@ -4,7 +4,7 @@ */ import * as React from 'react' -import { BackHandler, Dimensions, View } from 'react-native' +import { BackHandler, Dimensions, Keyboard, View } from 'react-native' import type { AirshipBridge } from 'react-native-airship' import { Gesture, @@ -133,14 +133,21 @@ export function EdgeModal(props: EdgeModalProps): React.ReactElement { } }, [handleCancel]) - // Insets are not shared values, so track this on the JS thread: - const [isKeyboardOpen, setIsKeyboardOpen] = React.useState(false) - useKeyboardHandler({ - onStart(event) { - 'worklet' - runOnJS(setIsKeyboardOpen)(event.progress === 1) - } - }) + // Insets are not shared values, so track this on the JS thread. Seed from + // the live state, since a modal can mount while the keyboard is already + // open: + const [isKeyboardOpen, setIsKeyboardOpen] = React.useState(() => + Keyboard.isVisible() + ) + useKeyboardHandler( + { + onStart(event) { + 'worklet' + runOnJS(setIsKeyboardOpen)(event.progress === 1) + } + }, + [] + ) const gesture = Gesture.Pan() .onUpdate(e => { From 2fd4758d734f37e499d2014e60ba6461c979e6da Mon Sep 17 00:00:00 2001 From: peachbits Date: Wed, 2 Sep 2026 21:24:52 -0700 Subject: [PATCH 33/37] fixup! Android: fix Fabric crash on text inputs (fontSize 0) --- src/components/themed/FilledTextInput.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/themed/FilledTextInput.tsx b/src/components/themed/FilledTextInput.tsx index 5447d24c9fd..444aaf35558 100644 --- a/src/components/themed/FilledTextInput.tsx +++ b/src/components/themed/FilledTextInput.tsx @@ -798,10 +798,10 @@ const PlaceholderText = styled(Animated.Text)<{ focusAnimation, disableAnimation ), - fontSize: interpolate( - shift.value, - [0, 1], - [fontSizeBase, fontSizeScaled] + // Clamp in case an animated scale passes through 0: + fontSize: Math.max( + interpolate(shift.value, [0, 1], [fontSizeBase, fontSizeScaled]), + 1 ) } }) From a7ac2a89bbd21b3ca08b390d4353f3fc7626aa6e Mon Sep 17 00:00:00 2001 From: peachbits Date: Wed, 2 Sep 2026 21:24:52 -0700 Subject: [PATCH 34/37] fixup! Stop the amount field jumping as you type --- src/components/themed/FlipInput2.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/themed/FlipInput2.tsx b/src/components/themed/FlipInput2.tsx index 0f865d3159a..3b6e5c2b3de 100644 --- a/src/components/themed/FlipInput2.tsx +++ b/src/components/themed/FlipInput2.tsx @@ -488,6 +488,9 @@ const AmountAnimatedNumericInput = React.forwardRef< return ( Date: Wed, 2 Sep 2026 21:24:52 -0700 Subject: [PATCH 35/37] fixup! Android: turn off Fabric view recycling --- .../app/src/main/java/co/edgesecure/app/MainApplication.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt index 4ea6c029a4f..46ee8209bf1 100644 --- a/android/app/src/main/java/co/edgesecure/app/MainApplication.kt +++ b/android/app/src/main/java/co/edgesecure/app/MainApplication.kt @@ -129,6 +129,11 @@ class MainApplication : // dimmed after becoming enabled, and labels render at a stale font // size. Keep them off, matching how the app rendered before the // architecture switch. + // The master recycling switch defaults off in 0.86.0, but pin it so + // a future point release cannot flip it on and silently activate + // the image recycler (which defaults on under the master switch): + override fun enableViewRecycling(): Boolean = false + override fun enableViewRecyclingForText(): Boolean = false override fun enableViewRecyclingForView(): Boolean = false From 4d8bce9c572e8ba2deaeb3c5f4f1627d0d58ffcf Mon Sep 17 00:00:00 2001 From: peachbits Date: Wed, 2 Sep 2026 21:24:52 -0700 Subject: [PATCH 36/37] fixup! Add changelog entries --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d565b3f7e6f..4c329eb9714 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,8 +16,9 @@ - changed: Long labels on Android now truncate with an ellipsis instead of shrinking to fit. The new renderer ignores the minimum text size, which could render labels illegibly small. - changed: Android 11 and below now show solid backgrounds where blur effects used to be. Those Android versions cannot render blur under the new architecture, which painted a gray wash over the content instead. - fixed: Modals no longer sit behind the keyboard on Android, hiding their bottom buttons. -- fixed: The amount field no longer clips its trailing digit or shifts sideways while typing. +- fixed: The amount field no longer clips its leading digits or shifts sideways while typing. - fixed: Tapping outside the side menu closes it again on Android versions that cannot animate the overlay. +- fixed: Screen readers no longer announce the amount field's hidden sizing text, which read as the amount with a stray trailing zero. ## 4.51.0 (staging) From 224c2e7f97ff66e64dfa61fe342b32f110487f88 Mon Sep 17 00:00:00 2001 From: peachbits Date: Wed, 2 Sep 2026 21:25:18 -0700 Subject: [PATCH 37/37] Sync the login-ui patch with the lib fixes Regenerate patches/edge-login-ui-rn+3.37.2.patch from the edge-login-ui-rn branch (PR #301) so the app picks up the fixes mirrored there: EdgeText truncating instead of shrinking on Android, EdgeModal dropping its bottom overhang while the keyboard is open (seeded from Keyboard.isVisible), and the animated font-size clamps in both text inputs. This lands as one commit rather than fixups to the matching feature commits because the 3.37.2 patch file postdates them - it was created by the keyboard-controller commit and evolves forward from there. The patch disappears entirely once login-ui releases and the dependency bumps. Co-Authored-By: Claude Fable 5 --- patches/edge-login-ui-rn+3.37.2.patch | 123 +++++++++++++++++++++++++- 1 file changed, 119 insertions(+), 4 deletions(-) diff --git a/patches/edge-login-ui-rn+3.37.2.patch b/patches/edge-login-ui-rn+3.37.2.patch index 3f6dcc1b73b..ff0c8d65500 100644 --- a/patches/edge-login-ui-rn+3.37.2.patch +++ b/patches/edge-login-ui-rn+3.37.2.patch @@ -144,9 +144,18 @@ index 462a84a..3e65f32 100644 fontWeight: 'normal' }); diff --git a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js -index e70234c..1a08cb6 100644 +index e70234c..d14a3b2 100644 --- a/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js +++ b/node_modules/edge-login-ui-rn/lib/components/modals/EdgeModal.js +@@ -3,7 +3,7 @@ + * edge-login-ui-rn! + */ + import * as React from 'react'; +-import { BackHandler, Dimensions, View } from 'react-native'; ++import { BackHandler, Dimensions, Keyboard, Platform, View } from 'react-native'; + import { Gesture, GestureDetector, ScrollView } from 'react-native-gesture-handler'; + import { cacheStyles } from 'react-native-patina'; + import Animated, { runOnJS, useAnimatedStyle, useSharedValue, withTiming } from 'react-native-reanimated'; @@ -13,7 +13,7 @@ import { EdgeTouchableWithoutFeedback } from '../common/EdgeTouchableWithoutFeed import { CloseIcon } from '../icons/ThemedIcons'; import { useTheme } from '../services/ThemeContext'; @@ -156,7 +165,42 @@ index e70234c..1a08cb6 100644 const BACKGROUND_ALPHA = 0.7; const SCROLL_INDICATOR_INSET_FIX = { right: 1 }; const safeAreaGap = 64; // Overkill to avoid bottom of screen -@@ -123,7 +123,13 @@ const getStyles = cacheStyles((theme) => ({ +@@ -66,6 +66,22 @@ export function EdgeModal(props) { + backHandler.remove(); + }; + }, [handleCancel]); ++ // Track the keyboard on the JS thread. This file cannot use ++ // react-native-keyboard-controller like edge-react-gui's copy: the host ++ // app's KeyboardProvider mounts below this library's Airship layer, so ++ // listen to React Native's own keyboard events instead: ++ // Seed from the live state, since a modal can mount while the keyboard is ++ // already open. (Optional call: isVisible is missing on very old RN.) ++ const [isKeyboardOpen, setIsKeyboardOpen] = React.useState(() => { var _a, _b; return (_b = (_a = Keyboard.isVisible) === null || _a === void 0 ? void 0 : _a.call(Keyboard)) !== null && _b !== void 0 ? _b : false; }); ++ React.useEffect(() => { ++ const isIos = Platform.OS === 'ios'; ++ const showListener = Keyboard.addListener(isIos ? 'keyboardWillShow' : 'keyboardDidShow', () => setIsKeyboardOpen(true)); ++ const hideListener = Keyboard.addListener(isIos ? 'keyboardWillHide' : 'keyboardDidHide', () => setIsKeyboardOpen(false)); ++ return () => { ++ showListener.remove(); ++ hideListener.remove(); ++ }; ++ }, []); + const gesture = Gesture.Pan() + .onUpdate(e => { + offset.value = e.translationY; +@@ -86,7 +102,10 @@ export function EdgeModal(props) { + const modalStyle = useAnimatedStyle(() => ({ + transform: [{ translateY: Math.max(-dragSlop, offset.value) }] + })); +- const bottomGap = safeAreaGap + dragSlop; ++ // The gap that lets the modal bleed past the bottom of the screen is ++ // rendered behind the keyboard, so drop it while the keyboard is open or ++ // it pushes the modal's own content underneath: ++ const bottomGap = (isKeyboardOpen ? 0 : safeAreaGap) + dragSlop; + const isHeaderless = title == null && onCancel == null; + const isCustomTitle = title != null && typeof title !== 'string'; + const modalLayout = { +@@ -123,7 +142,13 @@ const getStyles = cacheStyles((theme) => ({ }, modal: { alignSelf: 'flex-end', @@ -314,8 +358,29 @@ index 8a5c3f3..e4699a4 100644 import { cacheStyles } from 'react-native-patina'; import { sprintf } from 'sprintf-js'; import { maybeRouteComplete } from '../../../actions/LoginInitActions'; +diff --git a/node_modules/edge-login-ui-rn/lib/components/themed/EdgeText.js b/node_modules/edge-login-ui-rn/lib/components/themed/EdgeText.js +index b8257fd..6af380a 100644 +--- a/node_modules/edge-login-ui-rn/lib/components/themed/EdgeText.js ++++ b/node_modules/edge-login-ui-rn/lib/components/themed/EdgeText.js +@@ -45,11 +45,15 @@ export const EdgeText = (props) => { + const { children, style, disableFontScaling = false } = props, rest = __rest(props, ["children", "style", "disableFontScaling"]); + const theme = useTheme(); + const styles = getStyles(theme); ++ // Android's new architecture shrinks auto-sized text far below ++ // `minimumFontScale`, leaving labels illegibly small, so let text truncate ++ // there instead of shrinking: ++ const autoShrink = Platform.OS !== 'android' && !disableFontScaling; + let { numberOfLines = 1 } = props; + if (typeof children === 'string' && children.includes('\n')) { + numberOfLines = numberOfLines + ((_a = children.match(/\n/g)) !== null && _a !== void 0 ? _a : []).length; + } +- return (React.createElement(Text, Object.assign({ allowFontScaling: false, style: [styles.common, style, androidAdjustTextStyle(theme)], numberOfLines: numberOfLines, adjustsFontSizeToFit: !disableFontScaling, minimumFontScale: 0.65 }, rest), children)); ++ return (React.createElement(Text, Object.assign({ allowFontScaling: false, style: [styles.common, style, androidAdjustTextStyle(theme)], numberOfLines: numberOfLines, adjustsFontSizeToFit: autoShrink, minimumFontScale: 0.65 }, rest), children)); + }; + /** Makes the contents of an `EdgeText` or `Paragraph` smaller (0.75rem). + * Unless used within a `Paragraph` block, provides no outer spacing. */ diff --git a/node_modules/edge-login-ui-rn/lib/components/themed/FilledTextInput.js b/node_modules/edge-login-ui-rn/lib/components/themed/FilledTextInput.js -index 324ee0f..7f0fd48 100644 +index 324ee0f..22c791a 100644 --- a/node_modules/edge-login-ui-rn/lib/components/themed/FilledTextInput.js +++ b/node_modules/edge-login-ui-rn/lib/components/themed/FilledTextInput.js @@ -83,8 +83,9 @@ export const FilledTextInput = React.forwardRef((props, ref) => { @@ -330,6 +395,36 @@ index 324ee0f..7f0fd48 100644 React.useEffect(() => { disableAnimation.value = withTiming(disabled ? 1 : 0); }, [disableAnimation, disabled]); +@@ -312,7 +313,8 @@ const PlaceholderText = styled(Animated.Text)(theme => ({ disableAnimation, focu + const fontSizeScaled = oneRem * scale.value * 0.75; + return { + color: interpolatePlaceholderTextColor(focusAnimation, disableAnimation), +- fontSize: interpolate(shift.value, [0, 1], [fontSizeBase, fontSizeScaled]) ++ // Clamp in case an animated scale passes through 0: ++ fontSize: Math.max(interpolate(shift.value, [0, 1], [fontSizeBase, fontSizeScaled]), 1) + }; + }) + ]; +@@ -337,7 +339,8 @@ const StyledAnimatedTextInput = styledWithRef(AnimatedTextInput)(theme => ({ dis + }, + useAnimatedStyle(() => ({ + color: interpolateTextColor(focusAnimation, disableAnimation), +- fontSize: scale.value * rem ++ // Clamp in case an animated scale passes through 0: ++ fontSize: Math.max(scale.value * rem, 1) + })) + ]; + }); +@@ -361,7 +364,8 @@ const StyledNumericInput = styledWithRef(NumericInput)(theme => ({ disableAnimat + }, + useAnimatedStyle(() => ({ + color: interpolateTextColor(focusAnimation, disableAnimation), +- fontSize: scale.value * rem ++ // Clamp in case an animated scale passes through 0: ++ fontSize: Math.max(scale.value * rem, 1) + })) + ]; + }); diff --git a/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js b/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js index 5fed31f..ad8aea7 100644 --- a/node_modules/edge-login-ui-rn/lib/components/themed/PinButton.js @@ -342,7 +437,7 @@ index 5fed31f..ad8aea7 100644 import { usePendingPress } from '../../hooks/usePendingPress'; import { fixSides, mapSides, sidesToMargin, sidesToPadding } from '../../util/sides'; diff --git a/node_modules/edge-login-ui-rn/lib/components/themed/SimpleTextInput.js b/node_modules/edge-login-ui-rn/lib/components/themed/SimpleTextInput.js -index 7288462..466b83d 100644 +index 7288462..e6f001e 100644 --- a/node_modules/edge-login-ui-rn/lib/components/themed/SimpleTextInput.js +++ b/node_modules/edge-login-ui-rn/lib/components/themed/SimpleTextInput.js @@ -69,8 +69,9 @@ export const SimpleTextInput = React.forwardRef((props, ref) => { @@ -357,6 +452,26 @@ index 7288462..466b83d 100644 React.useEffect(() => { disableAnimation.value = withTiming(disabled ? 1 : 0); }, [disableAnimation, disabled]); +@@ -183,7 +184,8 @@ const PlaceholderText = styled(Animated.Text)(theme => ({ disableAnimation, focu + return { + opacity: interpolate(hasValueAnimation.value, [0, 1], [1, 0]), + color: interpolatePlaceholderTextColor(focusAnimation, disableAnimation), +- fontSize: scale.value * rem ++ // Clamp in case an animated scale passes through 0: ++ fontSize: Math.max(scale.value * rem, 1) + }; + }) + ]; +@@ -202,7 +204,8 @@ const InputField = styledWithRef(AnimatedTextInput)(theme => ({ disableAnimation + }, + useAnimatedStyle(() => ({ + color: interpolateTextColor(focusAnimation, disableAnimation), +- fontSize: scale.value * rem ++ // Clamp in case an animated scale passes through 0: ++ fontSize: Math.max(scale.value * rem, 1) + })) + ]; + }); diff --git a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts b/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts index 1ce7388..d6101c1 100644 --- a/node_modules/edge-login-ui-rn/lib/components/ui4/BlurBackground.d.ts