diff --git a/.gitignore b/.gitignore index 7561f1a00..5a0e8ed85 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ ios/Converse.xcworkspace/xcshareddata/swiftpm/Package.resolved # Android /android/ +build-*.apk diff --git a/App.tsx b/App.tsx index 186e5406a..2a9fb69e7 100644 --- a/App.tsx +++ b/App.tsx @@ -42,6 +42,7 @@ import { privySecureStorage } from "./utils/keychain/helpers"; import { initSentry } from "./utils/sentry"; import "./utils/splash/splash"; import "./features/notifications/utils"; +import { setupAppAttest } from "@utils/appCheck"; LogBox.ignoreLogs([ "Privy: Expected status code 200, received 400", // Privy @@ -65,6 +66,10 @@ const App = () => { const styles = useStyles(); const debugRef = useRef(); + useEffect(() => { + setupAppAttest(); + }, []); + useCoinbaseWalletListener(true, coinbaseUrl); useEffect(() => { diff --git a/README.md b/README.md index d5ae16091..febb122e2 100644 --- a/README.md +++ b/README.md @@ -49,11 +49,13 @@ Until then Converse web will only show 1 to 1 conversations and the majority of Web support is an end goal and the team is happy to fix any issues that are reported ### Install JS/React Native Dependencies + ``` yarn ``` ### Building the Web App + ``` yarn start ``` @@ -72,6 +74,7 @@ yarn start ``` # Linting + ``` yarn lint ``` @@ -79,6 +82,7 @@ yarn lint # Testing ## Running Jest tests + Before running the tests make sure that you have a `.env` file setup with the variables variable set ```sh @@ -88,6 +92,7 @@ yarn test ## Running Performance Tests Capture baselines for performance tests + ```sh yarn test:perf:baseline ``` @@ -95,6 +100,7 @@ yarn test:perf:baseline Make changes to the code to see the performance impact Run the performance tests again to see the changes + ```sh yarn test:perf ``` @@ -103,22 +109,22 @@ yarn test:perf Frames are expected to follow the Open Frames Standard https://github.com/open-frames/standard - - # Release Processes ### Main Branch + Represents the current production code. ### Release Branches + Each release branch is based off of `main` or the release branch before it. It is used to prepare and stabilize the code for a specific release version (e.g., `release/2.0.8`). ### Feature Branches + Feature branches are longer-lived features or refactors expected to take additional time. They should be based off of the targeted feature release branch. This structure allows code to flow **from `main` to release branches to feature branches**. - ![Merge Diagram](docs/image.png) --- @@ -128,6 +134,7 @@ This structure allows code to flow **from `main` to release branches to feature Assuming your branch is `feature/scw`, and your feature is targeted for release `2.1.0`, follow these steps to rebase: 1. First, checkout the feature branch: + ```bash git fetch origin git branch feature/scw -D @@ -141,7 +148,9 @@ Assuming your branch is `feature/scw`, and your feature is targeted for release ``` ### Exceptions + There are certain times where this flow does not work as intended. For example: -* Build scripts: These may need to be run off of the default main branch instead of feature or release branches. -* Read me updates: These are not required to be on a branch and can be committed directly to main. -* Bug fixes that can be OTA updated: These can be committed directly to main to perform an OTA update. + +- Build scripts: These may need to be run off of the default main branch instead of feature or release branches. +- Read me updates: These are not required to be on a branch and can be committed directly to main. +- Bug fixes that can be OTA updated: These can be committed directly to main to perform an OTA update. diff --git a/app.config.ts b/app.config.ts index e3714ceb0..eb8f5fec5 100644 --- a/app.config.ts +++ b/app.config.ts @@ -233,6 +233,8 @@ export default ({ config }: ConfigContext): ExpoConfig => ({ url: "https://sentry.io/", }, ], + ["@react-native-firebase/app-check"], + "./scripts/build/android/notifeeExpoPlugin.js", // See https://github.com/invertase/notifee/issues/350 "./scripts/build/android/androidDependenciesExpoPlugin.js", // Handle some conflicting dependencies manually "./scripts/build/android/buildGradleProperties.js", // Increase memory for building android in EAS diff --git a/config.ts b/config.ts index 3f66f4fa9..4dc3af386 100644 --- a/config.ts +++ b/config.ts @@ -1,8 +1,9 @@ import { DEFAULT_SUPPORTED_CHAINS } from "@utils/evm/wallets"; import { XmtpEnv } from "@xmtp/xmtp-js"; -import Constants from "expo-constants"; import { Platform } from "react-native"; import { base, baseSepolia } from "wagmi/chains"; +import { getApiUri } from "./utils/apiConfig"; +import { Environments, isDev, isPreview } from "./utils/getEnv"; declare const process: { env: { @@ -53,12 +54,14 @@ const defaultConfig = { const isAndroid = Platform.OS === "android"; +const apiURI = getApiUri(); + const ENV = { dev: { ...defaultConfig, - env: "dev", + apiURI, + env: Environments.dev, xmtpEnv: (process.env.EXPO_PUBLIC_DEV_XMTP_ENV || "dev") as XmtpEnv, - apiURI: process.env.EXPO_PUBLIC_DEV_API_URI || "", debugMenu: true, bundleId: "com.converse.dev", appleAppGroup: "group.com.converse.dev", @@ -70,10 +73,13 @@ const ENV = { ), alphaGroupChatUrl: "https://converse.xyz/group-invite/UDv3aYZONQGc6_XPJY6Ch", + appCheckDebugToken: isAndroid + ? process.env.EXPO_PUBLIC_FIREBASE_APP_CHECK_DEBUG_TOKEN_ANDROID + : process.env.EXPO_PUBLIC_FIREBASE_APP_CHECK_DEBUG_TOKEN_IOS, }, preview: { ...defaultConfig, - env: "preview", + env: Environments.preview, xmtpEnv: "dev", apiURI: "https://backend-staging.converse.xyz", debugMenu: true, @@ -88,10 +94,11 @@ const ENV = { ].flatMap((domain) => [`https://${domain}`, `http://${domain}`, domain]), alphaGroupChatUrl: "https://converse.xyz/group-invite/eQAvo-WvwrdBTsHINuSMJ", + appCheckDebugToken: undefined, }, prod: { ...defaultConfig, - env: "prod", + env: Environments.prod, xmtpEnv: "production", apiURI: "https://backend-prod.converse.xyz", debugMenu: false, @@ -121,13 +128,14 @@ const ENV = { }, alphaGroupChatUrl: "https://converse.xyz/group-invite/eQAvo-WvwrdBTsHINuSMJ", + appCheckDebugToken: undefined, }, } as const; -const getConfig = () => { - if (__DEV__) { +export const getConfig = () => { + if (isDev) { return ENV.dev; - } else if (Constants.expoConfig?.extra?.ENV === "preview") { + } else if (isPreview) { return ENV.preview; } else { return ENV.prod; diff --git a/eas.json b/eas.json index b7d0928e0..a958cd60b 100644 --- a/eas.json +++ b/eas.json @@ -13,7 +13,7 @@ }, "node": "20.15.1", "ios": { - "cocoapods": "1.14.3" + "cocoapods": "1.16.2" }, "android": { "resourceClass": "medium" @@ -29,7 +29,7 @@ "node": "20.15.1", "ios": { "resourceClass": "large", - "cocoapods": "1.14.3" + "cocoapods": "1.16.2" } }, "production-android": { diff --git a/features/GroupInvites/joinGroup/JoinGroup.client.ts b/features/GroupInvites/joinGroup/JoinGroup.client.ts index e795e5f60..c51e66f23 100644 --- a/features/GroupInvites/joinGroup/JoinGroup.client.ts +++ b/features/GroupInvites/joinGroup/JoinGroup.client.ts @@ -1,7 +1,6 @@ import { IGroupConsentOptions } from "@hooks/useGroupConsent"; import { createGroupJoinRequest, getGroupJoinRequest } from "@utils/api"; import { GroupInvite } from "@utils/api.types"; -// import { getGroupIdFromTopic } from "@utils/groupUtils/groupId"; import { getV3IdFromTopic } from "@/utils/groupUtils/groupId"; import logger from "@utils/logger"; import { diff --git a/ios/Converse.xcodeproj/project.pbxproj b/ios/Converse.xcodeproj/project.pbxproj index b7a701b67..cf2999b98 100644 --- a/ios/Converse.xcodeproj/project.pbxproj +++ b/ios/Converse.xcodeproj/project.pbxproj @@ -3,13 +3,16 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 60; objects = { /* Begin PBXBuildFile section */ 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 15EBCA4A2D13414100241032 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 15EBCA492D13414100241032 /* GoogleService-Info.plist */; }; + 15EBCA4B2D13414100241032 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 15EBCA492D13414100241032 /* GoogleService-Info.plist */; }; + 19BACCA5A8C482ED4B85F4AE /* Pods_Converse.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E14C537DB575FE9167DE049A /* Pods_Converse.framework */; }; 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; 4C2440D02A9C8BE8004F31A3 /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C2440CF2A9C8BE8004F31A3 /* Keychain.swift */; }; 4C2440D22A9C8C5A004F31A3 /* Datatypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C2440D12A9C8C5A004F31A3 /* Datatypes.swift */; }; @@ -28,12 +31,11 @@ 4CFB3F322BCE878300A47FFE /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB3F312BCE876A00A47FFE /* PrivacyInfo.xcprivacy */; }; 4CFB3F332BCE878A00A47FFE /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB3F312BCE876A00A47FFE /* PrivacyInfo.xcprivacy */; }; 6821E5F22C2B2A620051F947 /* Spam.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6821E5F12C2B2A620051F947 /* Spam.swift */; }; - 9075F7ED8DD224A49926DAA1 /* Pods_Converse.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A60FA9F79ECEAE8E341071C /* Pods_Converse.framework */; }; + 7B689C0740BB18FD869B41B8 /* Pods_ConverseNotificationExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9CB664EE1E0F717DB379E4E /* Pods_ConverseNotificationExtension.framework */; }; B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; B7969B4A79FE4F9F8C52019D /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68FED7E170C7437EB719C8C6 /* noop-file.swift */; }; BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; DA84913A2AD94AED00288FE0 /* NotificationUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8491392AD94AED00288FE0 /* NotificationUtils.swift */; }; - F58EA8305884ED6DF0BDF78D /* Pods_ConverseNotificationExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 205EAD7021331DF97121D96C /* Pods_ConverseNotificationExtension.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -61,16 +63,13 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 000A3CED54C850EE71144470 /* Pods-Converse.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Converse.debug.xcconfig"; path = "Target Support Files/Pods-Converse/Pods-Converse.debug.xcconfig"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* Converse.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Converse.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Converse/AppDelegate.h; sourceTree = ""; }; 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Converse/AppDelegate.mm; sourceTree = ""; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Converse/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Converse/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Converse/main.m; sourceTree = ""; }; - 1445CF94083F9D9607454340 /* Pods-ConverseNotificationExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConverseNotificationExtension.release.xcconfig"; path = "Target Support Files/Pods-ConverseNotificationExtension/Pods-ConverseNotificationExtension.release.xcconfig"; sourceTree = ""; }; - 205EAD7021331DF97121D96C /* Pods_ConverseNotificationExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ConverseNotificationExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3A60FA9F79ECEAE8E341071C /* Pods_Converse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Converse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 15EBCA492D13414100241032 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 4C2440CF2A9C8BE8004F31A3 /* Keychain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = ""; }; 4C2440D12A9C8C5A004F31A3 /* Datatypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Datatypes.swift; sourceTree = ""; }; 4C2440D32A9C8CFE004F31A3 /* Client.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Client.swift; sourceTree = ""; }; @@ -87,13 +86,17 @@ 4CBD67172A9CF7C30010C648 /* Sentry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sentry.swift; sourceTree = ""; }; 4CBD671B2A9D08050010C648 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; 4CFB3F312BCE876A00A47FFE /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + 57BD1F4E3C2C98EDEE2B50AA /* Pods-Converse.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Converse.release.xcconfig"; path = "Target Support Files/Pods-Converse/Pods-Converse.release.xcconfig"; sourceTree = ""; }; 6821E5F12C2B2A620051F947 /* Spam.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Spam.swift; sourceTree = ""; }; 68FED7E170C7437EB719C8C6 /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "Converse/noop-file.swift"; sourceTree = ""; }; - 719365A4F39A103E17CDA8CF /* Pods-Converse.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Converse.release.xcconfig"; path = "Target Support Files/Pods-Converse/Pods-Converse.release.xcconfig"; sourceTree = ""; }; + 7DAB5A0EF68FD62E9903A54F /* Pods-ConverseNotificationExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConverseNotificationExtension.release.xcconfig"; path = "Target Support Files/Pods-ConverseNotificationExtension/Pods-ConverseNotificationExtension.release.xcconfig"; sourceTree = ""; }; AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Converse/SplashScreen.storyboard; sourceTree = ""; }; BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; - D1C50CFE219D5A0A7A8098B5 /* Pods-ConverseNotificationExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConverseNotificationExtension.debug.xcconfig"; path = "Target Support Files/Pods-ConverseNotificationExtension/Pods-ConverseNotificationExtension.debug.xcconfig"; sourceTree = ""; }; + C9CB664EE1E0F717DB379E4E /* Pods_ConverseNotificationExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ConverseNotificationExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DA8491392AD94AED00288FE0 /* NotificationUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationUtils.swift; sourceTree = ""; }; + DEE10FF98ED77E1CC4F74C2D /* Pods-Converse.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Converse.debug.xcconfig"; path = "Target Support Files/Pods-Converse/Pods-Converse.debug.xcconfig"; sourceTree = ""; }; + E14C537DB575FE9167DE049A /* Pods_Converse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Converse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E315655DDE5400C29FCD0031 /* Pods-ConverseNotificationExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ConverseNotificationExtension.debug.xcconfig"; path = "Target Support Files/Pods-ConverseNotificationExtension/Pods-ConverseNotificationExtension.debug.xcconfig"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Converse/ExpoModulesProvider.swift"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -103,7 +106,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9075F7ED8DD224A49926DAA1 /* Pods_Converse.framework in Frameworks */, + 19BACCA5A8C482ED4B85F4AE /* Pods_Converse.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -112,7 +115,7 @@ buildActionMask = 2147483647; files = ( 4C31F4EE29AF887B0032D062 /* Alamofire in Frameworks */, - F58EA8305884ED6DF0BDF78D /* Pods_ConverseNotificationExtension.framework in Frameworks */, + 7B689C0740BB18FD869B41B8 /* Pods_ConverseNotificationExtension.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -135,12 +138,19 @@ name = Converse; sourceTree = ""; }; + 1581A1112D12066900FAFD98 /* Google Services */ = { + isa = PBXGroup; + children = ( + ); + path = "Google Services"; + sourceTree = ""; + }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 3A60FA9F79ECEAE8E341071C /* Pods_Converse.framework */, - 205EAD7021331DF97121D96C /* Pods_ConverseNotificationExtension.framework */, + E14C537DB575FE9167DE049A /* Pods_Converse.framework */, + C9CB664EE1E0F717DB379E4E /* Pods_ConverseNotificationExtension.framework */, ); name = Frameworks; sourceTree = ""; @@ -186,6 +196,7 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + 1581A1112D12066900FAFD98 /* Google Services */, 13B07FAE1A68108700A75B9A /* Converse */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 4C65044B295C7C1F00C5A40F /* ConverseNotificationExtension */, @@ -193,6 +204,7 @@ 2D16E6871FA4F8E400B85C8A /* Frameworks */, D65327D7A22EEC0BE12398D9 /* Pods */, D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, + 15EBCA492D13414100241032 /* GoogleService-Info.plist */, ); indentWidth = 2; sourceTree = ""; @@ -228,10 +240,10 @@ D65327D7A22EEC0BE12398D9 /* Pods */ = { isa = PBXGroup; children = ( - 000A3CED54C850EE71144470 /* Pods-Converse.debug.xcconfig */, - 719365A4F39A103E17CDA8CF /* Pods-Converse.release.xcconfig */, - D1C50CFE219D5A0A7A8098B5 /* Pods-ConverseNotificationExtension.debug.xcconfig */, - 1445CF94083F9D9607454340 /* Pods-ConverseNotificationExtension.release.xcconfig */, + DEE10FF98ED77E1CC4F74C2D /* Pods-Converse.debug.xcconfig */, + 57BD1F4E3C2C98EDEE2B50AA /* Pods-Converse.release.xcconfig */, + E315655DDE5400C29FCD0031 /* Pods-ConverseNotificationExtension.debug.xcconfig */, + 7DAB5A0EF68FD62E9903A54F /* Pods-ConverseNotificationExtension.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -251,7 +263,7 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Converse" */; buildPhases = ( - 87B65BC22A20E255EFBC3706 /* [CP] Check Pods Manifest.lock */, + 17F5574754FC8979F9A199D8 /* [CP] Check Pods Manifest.lock */, C4304E4C15B6A588EF0F2290 /* [Expo] Configure project */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, @@ -259,8 +271,9 @@ 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, BADF501E92C64E5B8BE5C54D /* Upload Debug Symbols to Sentry */, 4C650452295C7C1F00C5A40F /* Embed Foundation Extensions */, - E77124006398F213A9B2B887 /* [CP] Embed Pods Frameworks */, - 950B8C24E47BF20C9F204515 /* [CP] Copy Pods Resources */, + 183A28503D5BB3D0AF7B6703 /* [CP] Embed Pods Frameworks */, + 06B549071BA6CEEBAC055058 /* [CP] Copy Pods Resources */, + 5EE7AEECEA0CE78EF11A85B0 /* [CP-User] [RNFB] Core Configuration */, ); buildRules = ( ); @@ -276,11 +289,11 @@ isa = PBXNativeTarget; buildConfigurationList = 4C650455295C7C1F00C5A40F /* Build configuration list for PBXNativeTarget "ConverseNotificationExtension" */; buildPhases = ( - 33B7BB1240A8B27013DBBDC1 /* [CP] Check Pods Manifest.lock */, + 6C2EBD2F0142FE6223CA8017 /* [CP] Check Pods Manifest.lock */, 4C650446295C7C1F00C5A40F /* Sources */, 4C650447295C7C1F00C5A40F /* Frameworks */, 4C650448295C7C1F00C5A40F /* Resources */, - 9A59CB24F8B33E7377CBE29F /* [CP] Copy Pods Resources */, + 4B87D4151278FFDCA0FF35EB /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -343,6 +356,7 @@ BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, + 15EBCA4A2D13414100241032 /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -351,6 +365,7 @@ buildActionMask = 2147483647; files = ( 4CFB3F332BCE878A00A47FFE /* PrivacyInfo.xcprivacy in Resources */, + 15EBCA4B2D13414100241032 /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -372,51 +387,7 @@ shellPath = /bin/sh; shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n/bin/sh `\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode.sh'\"` `\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; }; - 33B7BB1240A8B27013DBBDC1 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-ConverseNotificationExtension-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 87B65BC22A20E255EFBC3706 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Converse-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 950B8C24E47BF20C9F204515 /* [CP] Copy Pods Resources */ = { + 06B549071BA6CEEBAC055058 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -434,6 +405,11 @@ "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/ExpoLocalization/ExpoLocalization_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/ReachabilitySwift.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", @@ -445,6 +421,7 @@ "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-launcher/EXDevLauncher.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-menu/EXDevMenu.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -459,6 +436,11 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoLocalization_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ReachabilitySwift.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", @@ -470,13 +452,62 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevLauncher.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevMenu.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Converse/Pods-Converse-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 9A59CB24F8B33E7377CBE29F /* [CP] Copy Pods Resources */ = { + 17F5574754FC8979F9A199D8 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Converse-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 183A28503D5BB3D0AF7B6703 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Converse/Pods-Converse-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/MMKV/MMKV.framework", + "${BUILT_PRODUCTS_DIR}/MMKVCore/MMKVCore.framework", + "${BUILT_PRODUCTS_DIR}/MMKVAppExtension/MMKVAppExtension.framework", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MMKV.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MMKVCore.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MMKVAppExtension.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Converse/Pods-Converse-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 4B87D4151278FFDCA0FF35EB /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -502,64 +533,73 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ConverseNotificationExtension/Pods-ConverseNotificationExtension-resources.sh\"\n"; showEnvVarsInLog = 0; }; - BADF501E92C64E5B8BE5C54D /* Upload Debug Symbols to Sentry */ = { + 5EE7AEECEA0CE78EF11A85B0 /* [CP-User] [RNFB] Core Configuration */ = { isa = PBXShellScriptBuildPhase; - buildActionMask = 8; + buildActionMask = 2147483647; files = ( ); inputPaths = ( + "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", ); - name = "Upload Debug Symbols to Sentry"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 1; + name = "[CP-User] [RNFB] Core Configuration"; + runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh `${NODE_BINARY:-node} --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode-debug-files.sh'\"`\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 \"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"; }; - C4304E4C15B6A588EF0F2290 /* [Expo] Configure project */ = { + 6C2EBD2F0142FE6223CA8017 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "[Expo] Configure project"; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ConverseNotificationExtension-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Converse/expo-configure-project.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + BADF501E92C64E5B8BE5C54D /* Upload Debug Symbols to Sentry */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 8; + files = ( + ); + inputPaths = ( + ); + name = "Upload Debug Symbols to Sentry"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 1; + shellPath = /bin/sh; + shellScript = "/bin/sh `${NODE_BINARY:-node} --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode-debug-files.sh'\"`\n"; }; - E77124006398F213A9B2B887 /* [CP] Embed Pods Frameworks */ = { + C4304E4C15B6A588EF0F2290 /* [Expo] Configure project */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Converse/Pods-Converse-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/MMKV/MMKV.framework", - "${BUILT_PRODUCTS_DIR}/MMKVCore/MMKVCore.framework", - "${BUILT_PRODUCTS_DIR}/MMKVAppExtension/MMKVAppExtension.framework", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/OpenSSL-Universal/OpenSSL.framework/OpenSSL", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", ); - name = "[CP] Embed Pods Frameworks"; + name = "[Expo] Configure project"; + outputFileListPaths = ( + ); outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MMKV.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MMKVCore.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MMKVAppExtension.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Converse/Pods-Converse-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Converse/expo-configure-project.sh\"\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -609,7 +649,7 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 000A3CED54C850EE71144470 /* Pods-Converse.debug.xcconfig */; + baseConfigurationReference = DEE10FF98ED77E1CC4F74C2D /* Pods-Converse.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconPreview; @@ -626,7 +666,7 @@ "FB_SONARKIT_ENABLED=1", ); INFOPLIST_FILE = Converse/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -652,7 +692,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 719365A4F39A103E17CDA8CF /* Pods-Converse.release.xcconfig */; + baseConfigurationReference = 57BD1F4E3C2C98EDEE2B50AA /* Pods-Converse.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconPreview; @@ -664,7 +704,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = Q6W2FLK8DM; INFOPLIST_FILE = Converse/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -689,7 +729,7 @@ }; 4C650453295C7C1F00C5A40F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D1C50CFE219D5A0A7A8098B5 /* Pods-ConverseNotificationExtension.debug.xcconfig */; + baseConfigurationReference = E315655DDE5400C29FCD0031 /* Pods-ConverseNotificationExtension.debug.xcconfig */; buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -709,7 +749,7 @@ INFOPLIST_FILE = ConverseNotificationExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = ConverseNotificationExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -733,7 +773,7 @@ }; 4C650454295C7C1F00C5A40F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1445CF94083F9D9607454340 /* Pods-ConverseNotificationExtension.release.xcconfig */; + baseConfigurationReference = 7DAB5A0EF68FD62E9903A54F /* Pods-ConverseNotificationExtension.release.xcconfig */; buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -754,7 +794,7 @@ INFOPLIST_FILE = ConverseNotificationExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = ConverseNotificationExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/Converse/AppDelegate.mm b/ios/Converse/AppDelegate.mm index fd3e138a1..ac6d5e6a9 100644 --- a/ios/Converse/AppDelegate.mm +++ b/ios/Converse/AppDelegate.mm @@ -1,5 +1,8 @@ #import "AppDelegate.h" +#import "RNFBAppCheckModule.h" +#import + #import #import @@ -13,6 +16,12 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( // They will be passed down to the ViewController used by React Native. self.initialProps = @{}; + [RNFBAppCheckModule sharedInstance]; + + // Firebase Configuration is provided via Google Services/GoogleServices-Info-.plist and the proper file is copied + // during build via the scripts/build/ios/[preview|prod].js files + [FIRApp configure]; + return [super application:application didFinishLaunchingWithOptions:launchOptions]; } diff --git a/ios/Converse/Converse.entitlements b/ios/Converse/Converse.entitlements index d9a38358f..987190aaa 100644 --- a/ios/Converse/Converse.entitlements +++ b/ios/Converse/Converse.entitlements @@ -4,6 +4,15 @@ aps-environment development + com.apple.developer.associated-domains + + applinks:dev.converse.xyz + applinks:dev.getconverse.app + + com.apple.developer.devicecheck.appattest-environment + production + com.apple.developer.usernotifications.communication + com.apple.security.application-groups group.com.converse.dev @@ -12,12 +21,5 @@ $(AppIdentifierPrefix)com.converse.dev - com.apple.developer.associated-domains - - applinks:dev.converse.xyz - applinks:dev.getconverse.app - - com.apple.developer.usernotifications.communication - diff --git a/ios/ConverseNotificationExtension/Spam.swift b/ios/ConverseNotificationExtension/Spam.swift index 635387b97..32d8233fb 100644 --- a/ios/ConverseNotificationExtension/Spam.swift +++ b/ios/ConverseNotificationExtension/Spam.swift @@ -185,7 +185,7 @@ func computeSpamScoreV3Message(client: XMTP.Client, conversation: XMTP.Conversat if let senderAddresses = try await group.members.first(where: {$0.inboxId == senderInboxId})?.addresses { for address in senderAddresses { - if try await client.preferences.addressState(address:address) == .denied { + if try await client.preferences.addressState(address: address) == .denied { return 1 } } diff --git a/ios/Gemfile b/ios/Gemfile index 6ebdc2c5c..1b3b350e3 100644 --- a/ios/Gemfile +++ b/ios/Gemfile @@ -1,5 +1,8 @@ source 'https://rubygems.org' +# Specify minimum bundler version for Ruby 3.3.x compatibility +gem 'bundler', '>= 2.4.0' + gem 'cocoapods' gem 'cocoapods-pod-linkage' gem 'activesupport', '>= 6.1.7.3', '< 7.1.0' diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock index 0f7434b31..42cc32bd8 100644 --- a/ios/Gemfile.lock +++ b/ios/Gemfile.lock @@ -116,6 +116,7 @@ PLATFORMS DEPENDENCIES activesupport (>= 6.1.7.3, < 7.1.0) + bundler (>= 2.4.0) cocoapods cocoapods-pod-linkage diff --git a/ios/Google Services/GoogleService-Info-preview.plist b/ios/Google Services/GoogleService-Info-preview.plist new file mode 100644 index 000000000..ed7f90868 --- /dev/null +++ b/ios/Google Services/GoogleService-Info-preview.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyD5G_3H8Q1wzUiRTuv9SefDyjlJxigHJh8 + GCM_SENDER_ID + 564961909146 + PLIST_VERSION + 1 + BUNDLE_ID + com.converse.preview + PROJECT_ID + converse-unshut-labs + STORAGE_BUCKET + converse-unshut-labs.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:564961909146:ios:5dfa3959b85ed8ccbd0223 + + \ No newline at end of file diff --git a/ios/Google Services/GoogleService-Info-prod.plist b/ios/Google Services/GoogleService-Info-prod.plist new file mode 100644 index 000000000..8fe83a021 --- /dev/null +++ b/ios/Google Services/GoogleService-Info-prod.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyD5G_3H8Q1wzUiRTuv9SefDyjlJxigHJh8 + GCM_SENDER_ID + 564961909146 + PLIST_VERSION + 1 + BUNDLE_ID + com.converse.prod + PROJECT_ID + converse-unshut-labs + STORAGE_BUCKET + converse-unshut-labs.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:564961909146:ios:2e5cb8de4619ba59bd0223 + + \ No newline at end of file diff --git a/ios/Google Services/firebase-setup.readme.md b/ios/Google Services/firebase-setup.readme.md new file mode 100644 index 000000000..8d3a3a052 --- /dev/null +++ b/ios/Google Services/firebase-setup.readme.md @@ -0,0 +1,26 @@ +# Firebase Configuration + +Firebase config files are copied into the filepath expected by Firebase libraries at build time via the `scripts/build/ios/[preview|prod].js` files. + +Firebase looks for this file in + +`ios/GoogleService-Info.plist` + +In order to ease development, we keep the file corresponding to our debug environment in the root of the repo, in the location expected by Firebase initialization. + +We keep the environment specific files tucked away in `ios/Google Services/` to avoid cluttering the top level of our folder. + +- ios/Google Services/GoogleService-Info-preview.plist (preview) +- ios/Google Services/GoogleService-Info-prod.plist (prod) + +## Supporting Documentation this is Safe, If Not Advised Always + +https://stackoverflow.com/a/44937513/2441420 + +> While it's not the end of the world if you commit `GoogleService-Info.plist` (similarly, on Android, `google-services.json`), you're better off leaving it out for one big reason: **You're making it clear that others who build your code that they should be setting up their own Firebase project to host its configuration and data (because your project simply won't build with that file missing).** Furthermore, if your project has world-writable resources in it, you can expect that people who get a hold of your app and config so easily will inadvertently start writing data into it, which is probably not what you want. + +> Open source projects that require a Firebase setup should ideally have it stated in the readme that anyone who wants to work with this app needs to go through the process of setting up Firebase. + +> The data in these config files is not exactly private - they can be extracted fairly easily from an IPA or Android APK. It's just probably not in your best interest to share them as part of your app's code. + +For simplicity, we're doing it this way for now. If any security issues arise, we can spend the time to set this up more privately for our build scripts. diff --git a/ios/GoogleService-Info.plist b/ios/GoogleService-Info.plist new file mode 100644 index 000000000..9dbf095bf --- /dev/null +++ b/ios/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyD5G_3H8Q1wzUiRTuv9SefDyjlJxigHJh8 + GCM_SENDER_ID + 564961909146 + PLIST_VERSION + 1 + BUNDLE_ID + com.converse.dev + PROJECT_ID + converse-unshut-labs + STORAGE_BUCKET + converse-unshut-labs.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:564961909146:ios:779bcea169541560bd0223 + + \ No newline at end of file diff --git a/ios/Podfile b/ios/Podfile index 14ab7af96..b4dc4a1a5 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -28,6 +28,8 @@ target 'Converse' do config = use_native_modules! use_frameworks! :linkage => :static + $RNFirebaseAsStaticFramework = true + pod 'MMKV', $mmkvVersion, :linkage => :dynamic pod 'MMKVCore', $mmkvVersion, :linkage => :dynamic pod 'XMTP', $xmtpVersion, :modular_headers => true @@ -67,6 +69,12 @@ target 'Converse' do config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0' config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' end + + if ["expo-dev-menu", "Main", "ReactNativeCompatibles", "SafeAreaView", "Vendored"].include?(target.name) + target.build_configurations.each do |config| + config.build_settings['DEFINES_MODULE'] = 'YES' # or 'NO', but must be consistent + end + end end # This is necessary for Xcode 14, because it signs resource bundles by default diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b9bbf041e..ea8d3e82e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,4 +1,8 @@ PODS: + - AppCheckCore (11.2.0): + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) - boost (1.84.0) - CoinbaseWalletSDK/Client (1.0.4) - CoinbaseWalletSDK/CrossPlatform (1.0.4): @@ -30,18 +34,18 @@ PODS: - ExpoModulesCore - EXNotifications (0.28.19): - ExpoModulesCore - - Expo (51.0.38): + - Expo (51.0.39): - ExpoModulesCore - - expo-dev-client (4.0.28): + - expo-dev-client (4.0.29): - EXManifests - expo-dev-launcher - expo-dev-menu - expo-dev-menu-interface - EXUpdatesInterface - - expo-dev-launcher (4.0.28): + - expo-dev-launcher (4.0.29): - DoubleConversion - EXManifests - - expo-dev-launcher/Main (= 4.0.28) + - expo-dev-launcher/Main (= 4.0.29) - expo-dev-menu - expo-dev-menu-interface - ExpoModulesCore @@ -67,7 +71,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - expo-dev-launcher/Main (4.0.28): + - expo-dev-launcher/Main (4.0.29): - DoubleConversion - EXManifests - expo-dev-launcher/Unsafe @@ -96,7 +100,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - expo-dev-launcher/Unsafe (4.0.28): + - expo-dev-launcher/Unsafe (4.0.29): - DoubleConversion - EXManifests - expo-dev-menu @@ -124,10 +128,10 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - expo-dev-menu (5.0.22): + - expo-dev-menu (5.0.23): - DoubleConversion - - expo-dev-menu/Main (= 5.0.22) - - expo-dev-menu/ReactNativeCompatibles (= 5.0.22) + - expo-dev-menu/Main (= 5.0.23) + - expo-dev-menu/ReactNativeCompatibles (= 5.0.23) - glog - hermes-engine - RCT-Folly (= 2024.01.01.00) @@ -147,8 +151,8 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - expo-dev-menu-interface (1.8.3) - - expo-dev-menu/Main (5.0.22): + - expo-dev-menu-interface (1.8.4) + - expo-dev-menu/Main (5.0.23): - DoubleConversion - EXManifests - expo-dev-menu-interface @@ -175,7 +179,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - expo-dev-menu/ReactNativeCompatibles (5.0.22): + - expo-dev-menu/ReactNativeCompatibles (5.0.23): - DoubleConversion - glog - hermes-engine @@ -196,7 +200,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - expo-dev-menu/SafeAreaView (5.0.22): + - expo-dev-menu/SafeAreaView (5.0.23): - DoubleConversion - ExpoModulesCore - glog @@ -218,7 +222,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - expo-dev-menu/Vendored (5.0.22): + - expo-dev-menu/Vendored (5.0.23): - DoubleConversion - expo-dev-menu/SafeAreaView - glog @@ -312,7 +316,7 @@ PODS: - ExpoModulesCore - ExpoWebBrowser (13.0.3): - ExpoModulesCore - - EXSplashScreen (0.27.6): + - EXSplashScreen (0.27.7): - DoubleConversion - ExpoModulesCore - glog @@ -369,8 +373,37 @@ PODS: - EXUpdatesInterface (0.16.2): - ExpoModulesCore - FBLazyVector (0.75.4) + - Firebase/AppCheck (11.4.0): + - Firebase/CoreOnly + - FirebaseAppCheck (~> 11.4.0) + - Firebase/CoreOnly (11.4.0): + - FirebaseCore (= 11.4.0) + - FirebaseAppCheck (11.4.0): + - AppCheckCore (~> 11.0) + - FirebaseAppCheckInterop (~> 11.0) + - FirebaseCore (~> 11.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - FirebaseAppCheckInterop (11.6.0) + - FirebaseCore (11.4.0): + - FirebaseCoreInternal (~> 11.0) + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/Logger (~> 8.0) + - FirebaseCoreInternal (11.6.0): + - "GoogleUtilities/NSData+zlib (~> 8.0)" - fmt (9.1.0) - glog (0.3.5) + - GoogleUtilities/Environment (8.0.2): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.0.2): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - "GoogleUtilities/NSData+zlib (8.0.2)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.0.2) + - GoogleUtilities/UserDefaults (8.0.2): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy - hermes-engine (0.75.4): - hermes-engine/Pre-built (= 0.75.4) - hermes-engine/Pre-built (0.75.4) @@ -404,6 +437,7 @@ PODS: - React-callinvoker - React-Core - OpenSSL-Universal (1.1.2200) + - PromisesObjC (2.4.0) - RCT-Folly (2024.01.01.00): - boost - DoubleConversion @@ -1664,7 +1698,7 @@ PODS: - React-Core - react-native-get-random-values (1.11.0): - React-Core - - react-native-keyboard-controller (1.14.3): + - react-native-keyboard-controller (1.14.5): - DoubleConversion - glog - hermes-engine @@ -2025,12 +2059,12 @@ PODS: - React-logger (= 0.75.4) - React-perflogger (= 0.75.4) - React-utils (= 0.75.4) - - ReactNativeIosContextMenu (2.5.2): + - ReactNativeIosContextMenu (2.5.1): - ContextMenuAuxiliaryPreview (~> 0.3) - DGSwiftUtilities - ExpoModulesCore - ReactNativeIosUtilities - - ReactNativeIosUtilities (4.5.1): + - ReactNativeIosUtilities (4.5.0): - ComputableLayout (~> 0.7) - DGSwiftUtilities (~> 0.27) - ExpoModulesCore @@ -2044,6 +2078,13 @@ PODS: - React-Core - RNDeviceInfo (10.9.0): - React-Core + - RNFBApp (21.4.0): + - Firebase/CoreOnly (<= 11.4.0) + - React-Core + - RNFBAppCheck (21.4.0): + - Firebase/AppCheck (<= 11.4.0) + - React-Core + - RNFBApp - RNFlashList (1.6.4): - React-Core - RNFS (2.20.0): @@ -2364,6 +2405,8 @@ DEPENDENCIES: - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)" - RNDeviceInfo (from `../node_modules/react-native-device-info`) + - "RNFBApp (from `../node_modules/@react-native-firebase/app`)" + - "RNFBAppCheck (from `../node_modules/@react-native-firebase/app-check`)" - "RNFlashList (from `../node_modules/@shopify/flash-list`)" - RNFS (from `../node_modules/react-native-fs`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) @@ -2384,6 +2427,7 @@ DEPENDENCIES: SPEC REPOS: trunk: + - AppCheckCore - CoinbaseWalletSDK - ComputableLayout - Connect-Swift @@ -2391,6 +2435,12 @@ SPEC REPOS: - CryptoSwift - CSecp256k1 - DGSwiftUtilities + - Firebase + - FirebaseAppCheck + - FirebaseAppCheckInterop + - FirebaseCore + - FirebaseCoreInternal + - GoogleUtilities - libavif - libdav1d - libwebp @@ -2400,6 +2450,7 @@ SPEC REPOS: - MMKVAppExtension - MMKVCore - OpenSSL-Universal + - PromisesObjC - ReachabilitySwift - SDWebImage - SDWebImageAVIFCoder @@ -2665,6 +2716,10 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-clipboard/clipboard" RNDeviceInfo: :path: "../node_modules/react-native-device-info" + RNFBApp: + :path: "../node_modules/@react-native-firebase/app" + RNFBAppCheck: + :path: "../node_modules/@react-native-firebase/app-check" RNFlashList: :path: "../node_modules/@shopify/flash-list" RNFS: @@ -2695,9 +2750,10 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: + AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f boost: 4cb898d0bf20404aab1850c656dcea009429d6c1 CoinbaseWalletSDK: ea1f37512bbc69ebe07416e3b29bf840f5cc3152 - CoinbaseWalletSDKExpo: fc6cc756974827763d7a0decf7140c2902dafca2 + CoinbaseWalletSDKExpo: 7488819c860868cd5fe117f6be43dd42c2e65919 ComputableLayout: c50faffac4ed9f8f05b0ce5e6f3a60df1f6042c8 Connect-Swift: 84e043b904f63dc93a2c01c6c125da25e765b50d ContextMenuAuxiliaryPreview: 20be0be795b783b68f8792732eed4bed9f202c1c @@ -2705,48 +2761,54 @@ SPEC CHECKSUMS: CSecp256k1: 2a59c03e52637ded98896a33be4b2649392cb843 DGSwiftUtilities: 3be87518a22cc29d3a93e1b9543576705f501fb5 DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 - EASClient: 1509a9a6b48b932ec61667644634daf2562983b8 - EXApplication: c08200c34daca7af7fd76ac4b9d606077410e8ad - EXConstants: 409690fbfd5afea964e5e9d6c4eb2c2b59222c59 - EXImageLoader: ab589d67d6c5f2c33572afea9917304418566334 + EASClient: 95592393d6d1e60609f0afb373191d918c687b98 + EXApplication: ec862905fdab3a15bf6bd8ca1a99df7fc02d7762 + EXConstants: 89d35611505a8ce02550e64e43cd05565da35f9a + EXImageLoader: 1fe96c70cdc78bedc985ec4b1fab5dd8e67dc38b EXJSONUtils: 30c17fd9cc364d722c0946a550dfbf1be92ef6a4 - EXManifests: c1fab4c3237675e7b0299ea8df0bcb14baca4f42 - EXNotifications: 85496c9fab09d759d0e4ff594bca078ab817c40c - Expo: 9b6666ef2fedcfc89c5b9be2aa1ce12b81f9e7f5 - expo-dev-client: e25e1c63686cc097d9701354e475b2b60038b83b - expo-dev-launcher: d71690e9583fa44dfcfe789d098ce8b194b777ba - expo-dev-menu: cd0e86c49b59aff06299533c938e81b2f92b3920 - expo-dev-menu-interface: be32c09f1e03833050f0ee290dcc86b3ad0e73e4 - ExpoAsset: 323700f291684f110fb55f0d4022a3362ea9f875 - ExpoBackgroundFetch: a06c553ecaf0bade0acd691042d996b9ce926327 - ExpoBlur: fa53f874e7b208bc3756d1bf07903c12e790beb1 - ExpoClipboard: 23d203f5d4843699fbc45be1cc4fe1fbd811a6fa - ExpoContacts: 67cc93caa3e5023dd245f9e0ef26856aaa005c3e - ExpoCrypto: 156078f266bf28f80ecf5e2a9c3a0d6ffce07a1c - ExpoDevice: fc94f0e42ecdfd897e7590f2874fc64dfa7e9b1c - ExpoDocumentPicker: a82eaccc62ecb62662d5a6ca7a8ef40b71daa521 - ExpoFileSystem: 80bfe850b1f9922c16905822ecbf97acd711dc51 - ExpoFont: 00756e6c796d8f7ee8d211e29c8b619e75cbf238 - ExpoHaptics: 5a3a88971af384255baf2504f38b41189cec6984 - ExpoHead: fcb28a68ed4ba28f177394d2dfb8a0a8824cd103 - ExpoImage: 42162e3d264ce07a62766d6bd26bd299fe4c6faa - ExpoImageManipulator: aea99205c66043a00a0af90e345395637b9902fa - ExpoImagePicker: 12a420923383ae38dccb069847218f27a3b87816 - ExpoKeepAwake: 3b8815d9dd1d419ee474df004021c69fdd316d08 - ExpoLinearGradient: 8cec4a09426d8934c433e83cb36262d72c667fce - ExpoLocalization: f04eeec2e35bed01ab61c72ee1768ec04d093d01 - ExpoModulesCore: 652c6599c9308d6d334987dbc5ddd9f72bd76cda - ExpoSecureStore: 060cebcb956b80ddae09821610ac1aa9e1ac74cd - ExpoSystemUI: d4f065a016cae6721b324eb659cdee4d4cf0cb26 - ExpoWebBrowser: 7595ccac6938eb65b076385fd23d035db9ecdc8e - EXSplashScreen: c55b181f3e451bf6f4945045ca24a6da06b52056 + EXManifests: ebb7f551c340c0d06f3ecd9ae662e418bf68417c + EXNotifications: 6ce128c0d3d3d161cd68bfd07d593db40e140396 + Expo: ed0a748eb6be0efd2c3df7f6de3f3158a14464c9 + expo-dev-client: 67bfa449de8ee3e3cd88a6945a8058819fffb0f0 + expo-dev-launcher: f3fa6a4c4976fe19bd629442523e91a3a3b0c0eb + expo-dev-menu: ce6a1b3aa6285a0fce5eef1152184caf9a2651a4 + expo-dev-menu-interface: 5c6b79875bf0ab1251ea9962f60968fe39ed2637 + ExpoAsset: 286fee7ba711ce66bf20b315e68106b13b8629fc + ExpoBackgroundFetch: 2988b27bc95f322e856dbd44060b6951fdfe8950 + ExpoBlur: d6023b4ccd20035624b60ae0bda541e65b9ece5c + ExpoClipboard: 243e22ff4161bbffcd3d2db469ae860ddc1156be + ExpoContacts: 7ff826023ae74e6f29876a0942e00722c9b7bdf4 + ExpoCrypto: c5c052d5f9f668c21975cb4caf072cec23c823fa + ExpoDevice: 84b3ed79df1234c17edfbf335f6ecf3c636f74de + ExpoDocumentPicker: 3204d5169a090ddbb23c4bf035bb86c3a6ea0ec2 + ExpoFileSystem: 2988caaf68b7cb706e36d382829d99811d9d76a5 + ExpoFont: 38dddf823e32740c2a9f37c926a33aeca736b5c4 + ExpoHaptics: 9f47be324f691b6291c17c216189ab832d1a4d69 + ExpoHead: 37970100b038694465cc39044cf23f3d1f56fade + ExpoImage: 8fe3bbd2cae98bc004efec6fc4387837c9d30e10 + ExpoImageManipulator: eb92d3ac4bad0fe96258f17273b9e295e87447be + ExpoImagePicker: 517a47896adf5d55d0a1c159e5d1e312af12e57c + ExpoKeepAwake: dd02e65d49f1cfd9194640028ae2857e536eb1c9 + ExpoLinearGradient: 4c44b3803b441724874b232e6520b51ca6a50db1 + ExpoLocalization: 1b4195ed48148c7f52ce790d3965cc19483fcbf2 + ExpoModulesCore: 980f298148bfa1ae51ffabf9cc01e9dce348b9c5 + ExpoSecureStore: 6506992a9f53c94ea716c54d4a63144965945c2c + ExpoSystemUI: 2072307375696c398a5d75633bdd5143fadc3d26 + ExpoWebBrowser: cf10afe886891ab495877dada977fe6c269614a4 + EXSplashScreen: 0b38e744b600a971894b70be448ef44d56ec9416 EXStructuredHeaders: cb8d1f698e144f4c5547b4c4963e1552f5d2b457 - EXTaskManager: 9c3520305c3aa1b4a12a7c6d1e3f85f2779c06e9 - EXUpdates: 60b8b9b0d6e8cb7699ebd375a4deada231b9f5ca - EXUpdatesInterface: 996527fd7d1a5d271eb523258d603f8f92038f24 + EXTaskManager: b515b853fd97286a25cb643978ff7fa456f3139a + EXUpdates: 6af28f44a252f396c4ff8ed0af40bceca85f1432 + EXUpdatesInterface: c3a9494c2173db6442c7d5ad4e5b984972760fd3 FBLazyVector: 430e10366de01d1e3d57374500b1b150fe482e6d + Firebase: cf1b19f21410b029b6786a54e9764a0cacad3c99 + FirebaseAppCheck: 933cbda29279ed316b82360bca77602ac1af1ff2 + FirebaseAppCheckInterop: 347aa09a805219a31249b58fc956888e9fcb314b + FirebaseCore: e0510f1523bc0eb21653cac00792e1e2bd6f1771 + FirebaseCoreInternal: d98ab91e2d80a56d7b246856a8885443b302c0c2 fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 - glog: fdfdfe5479092de0c4bdbebedd9056951f092c4f + glog: 69ef571f3de08433d766d614c73a9838a06bf7eb + GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d hermes-engine: ea92f60f37dba025e293cbe4b4a548fd26b610a0 libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f @@ -2756,98 +2818,101 @@ SPEC CHECKSUMS: MMKV: f902fb6719da13c2ab0965233d8963a59416f911 MMKVAppExtension: fcf23c6b250cc87db63507bc57be8e6ed378168d MMKVCore: d26e4d3edd5cb8588c2569222cbd8be4231374e9 - op-sqlite: 7720c6cc59e76c983263edc07420e642b45fa288 + op-sqlite: 0be8d81d27e0b6d422c3b604db8c00e5a2eb89c6 OpenSSL-Universal: 6e1ae0555546e604dbc632a2b9a24a9c46c41ef6 - RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + RCT-Folly: 34124ae2e667a0e5f0ea378db071d27548124321 RCTDeprecation: 726d24248aeab6d7180dac71a936bbca6a994ed1 RCTRequired: a94e7febda6db0345d207e854323c37e3a31d93b RCTTypeSafety: 28e24a6e44f5cbf912c66dde6ab7e07d1059a205 ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda React: c2830fa483b0334bda284e46a8579ebbe0c5447e React-callinvoker: 4aecde929540c26b841a4493f70ebf6016691eb8 - React-Core: 9c059899f00d46b5cec3ed79251f77d9c469553d - React-CoreModules: 9fac2d31803c0ed03e4ddaa17f1481714f8633a5 - React-cxxreact: a979810a3ca4045ceb09407a17563046a7f71494 + React-Core: 32a581847d74ce9b5f51d9d11a4e4d132ad61553 + React-CoreModules: f53e0674e1747fa41c83bc970e82add97b14ad87 + React-cxxreact: 86f3b1692081fd954a0cb27cc90d14674645b64b React-debug: 7e346b6eeacd2ee1118a0ee7d39f613b428b4be8 - React-defaultsnativemodule: 02b3b73698aca4f8ebfe03e3802bbb8eafb30d6c - React-domnativemodule: 90e3bc5a3e57b367b9787c78a39d7e8dc15cb3b0 - React-Fabric: 7e3f79f77929338739d4f6936ecc12cca23644ac - React-FabricComponents: ba910350959d665f6335bdf6cf6347e99661cdac - React-FabricImage: df5337c9b500542ce744c98327625c420dcd1256 + React-defaultsnativemodule: 5ab6844adce01f0e52671eaa6d806e2214bbfc44 + React-domnativemodule: 448609757e37684cf407cda13d1f6c47deec44cf + React-Fabric: bfef5f9db01f81b73eed5a58fe1e46949c0c665e + React-FabricComponents: 4e845f93a35050a7c0f9dac7805caa62552be939 + React-FabricImage: 3478af0ed02c8728680b23f2dd890e59069856ea React-featureflags: 4c45b3c06f9a124d2598aff495bfc59470f40597 - React-featureflagsnativemodule: daee66dc32dd85a16bfd912911cc33fc7d50542d - React-graphics: a2e6209991a191c94405a234460e05291fa986b9 - React-hermes: 2069b08e965e48b7f8aa2c0ca0a2f383349ed55d - React-idlecallbacksnativemodule: 8e1d156b4e47cc6a5f80f53869131417979f7c64 - React-ImageManager: 17772f78d93539a1a10901b5f537031772fa930c - React-jserrorhandler: 62af5111f6444688182a5850d4b584cbc0c5d6a8 - React-jsi: d68f1d516e5120a510afe356647a6a1e1f98f2db - React-jsiexecutor: 6366a08a0fc01c9b65736f8deacd47c4a397912a - React-jsinspector: e21448249ea4a247f1b5786089e3cfe63d5c0111 - React-jsitracing: dab78a74a581f63320604c9de4ab9039209e0501 - React-logger: d79b704bf215af194f5213a6b7deec50ba8e6a9b - React-Mapbuffer: 42c779748af341935a63ad8831723b8cb1e97830 - React-microtasksnativemodule: fc15e6b9e8cc5a99d1cfa0f31c454c4c3de4e7ae - react-native-aes-gcm-crypto: f1bade1824458569b0e0f27ef4bc647ffe48ebbc - react-native-compat: ea7b6b73dbd2503594a287d7fb41660ee4f83f40 - react-native-context-menu-view: 30915369a9b5887904c571b616653acf3f1c8edb - react-native-fast-create-hash: 0d0f0ec146f12feadace675164f881bbe692f8bd - react-native-get-random-values: 21325b2244dfa6b58878f51f9aa42821e7ba3d06 - react-native-keyboard-controller: cdf3b225aff038f60956f0d33e3971fef91e2c17 - react-native-menu: d32728a357dfb360cf01cd5979cf7713c5acbb95 - react-native-mmkv: 54f5626371820ab9385821db1bbb03b6ab62c28a - react-native-netinfo: bdb108d340cdb41875c9ced535977cac6d2ff321 - react-native-passkey: 29ff814a83dfd4311478498e71a801dce68043ac - react-native-quick-base64: 777057ea4286f806b00259ede65dc79c7c706320 - react-native-quick-crypto: b781b80216e0b21379349daaa43679926881f916 - react-native-safe-area-context: a240ad4b683349e48b1d51fed1611138d1bdad97 - react-native-sfsymbols: bd3a0d3eab185e80b571bae60753dcf5a0d57967 - react-native-sqlite-storage: f6d515e1c446d1e6d026aa5352908a25d4de3261 - react-native-webview: b5d58bd1e9a23e699db5e676c7c84b65c57ad5af + React-featureflagsnativemodule: 1c482a7ea0e69330cc59895192a73a2f6f737c33 + React-graphics: eb61d404819486a2d9335c043a967a0c4b8ca743 + React-hermes: cad69ee9a53870cc38e5386889aa7ea81c75b6a1 + React-idlecallbacksnativemodule: 1e3f0212792ace82cc6f3b91f53f5d034f533acc + React-ImageManager: 6652c4cc3de260b5269d58277de383cacd53a234 + React-jserrorhandler: 552c5fcd2ee64307c568734b965ea082e1be25cf + React-jsi: bc1f6073e203fb540edd6d26f926ad041809b443 + React-jsiexecutor: 1e8fc70dd9614c3e9d5c3c876b2ea3cd1d931ee4 + React-jsinspector: 11cf0ade960351b76217a16e31418b9d7f881513 + React-jsitracing: e512a1023a25de831b51be1c773caa6036125a44 + React-logger: 80d87daf2f98bf95ab668b79062c1e0c3f0c2f8a + React-Mapbuffer: b2642edd9be75d51ead8cda109c986665eae09cf + React-microtasksnativemodule: 94f7e35c4984282f04f946fb1be1d008aff4bdf0 + react-native-aes-gcm-crypto: d572dd7a69f31c539bb8309b3a829bfa3bfad244 + react-native-compat: b02635b29b85ac35b89fb2f98b2922f2c77804b1 + react-native-context-menu-view: 3bb7e1aa97c897e26a027d23895a60066f7e4e17 + react-native-fast-create-hash: e25af5a905132c4081b4e20dc6336ba8d751e8a0 + react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba + react-native-keyboard-controller: 254638e45a4582deda6fa124d0b8069d1dbbdad6 + react-native-menu: a9c8d518bf2ea5a04bc5653fb37424b1ac408a84 + react-native-mmkv: aa743b3422e32101a77b22f74bdb6446b46191b7 + react-native-netinfo: 2e3c27627db7d49ba412bfab25834e679db41e21 + react-native-passkey: 0ec9f876837f2d37676f8b5df2650905463a6964 + react-native-quick-base64: daf67f19ee076b77f0755bf4056f3425f164e1d8 + react-native-quick-crypto: c51345598218c36181b44117a2acddd641cc9c3d + react-native-safe-area-context: df9763c5de6fa38883028e243a0b60123acb8858 + react-native-sfsymbols: 095f133da14534b26859c6f01065e0fada8993e9 + react-native-sqlite-storage: 0c84826214baaa498796c7e46a5ccc9a82e114ed + react-native-webview: a239a46e53d1c7f751a4761901e8c7688628eda1 React-nativeconfig: 31072ab0146e643594f6959c7f970a04b6c9ddd0 - React-NativeModulesApple: f49bb0befd8650ac3ff8fc2684072b16c09bf478 + React-NativeModulesApple: 356d0eb7e3b79603e9d611cd3bac658a998c71db React-perflogger: 59e1a3182dca2cee7b9f1f7aab204018d46d1914 - React-performancetimeline: 3d70a278cc3344def506e97aff3640e658656110 + React-performancetimeline: 2bf8625ff44f482cba84e48e4ab21dee405d68cd React-RCTActionSheet: d80e68d3baa163e4012a47c1f42ddd8bcd9672cc - React-RCTAnimation: bde981f6bd7f8493696564da9b3bd05721d3b3cc - React-RCTAppDelegate: 0176615c51476c88212bf3edbafb840d39ea7631 - React-RCTBlob: 520a0382bf8e89b9153d60e3c6293e51615834e9 - React-RCTFabric: f04c63400264f44a252ebba62dfb8cff8e5bd9b4 - React-RCTImage: 90448d2882464af6015ed57c98f463f8748be465 - React-RCTLinking: 1bd95d0a704c271d21d758e0f0388cced768d77d - React-RCTNetwork: 218af6e63eb9b47935cc5a775b7a1396cf10ff91 - React-RCTSettings: e10b8e42b0fce8a70fbf169de32a2ae03243ef6b - React-RCTText: e7bf9f4997a1a0b45c052d4ad9a0fe653061cf29 - React-RCTVibration: 5b70b7f11e48d1c57e0d4832c2097478adbabe93 + React-RCTAnimation: 051f0781709c5ed80ba8aa2b421dfb1d72a03162 + React-RCTAppDelegate: 106d225d076988b06aa4834e68d1ab754f40cacf + React-RCTBlob: 895eaf8bca2e76ee1c95b479235c6ccebe586fc6 + React-RCTFabric: 1d736a1f539ae72dcefd473f964f532a0e658309 + React-RCTImage: b73149c0cd54b641dba2d6250aaf168fee784d9f + React-RCTLinking: 23e519712285427e50372fbc6e0265d422abf462 + React-RCTNetwork: a5d06d122588031989115f293654b13353753630 + React-RCTSettings: 87d03b5d94e6eadd1e8c1d16a62f790751aafb55 + React-RCTText: 75e9dd39684f4bcd1836134ac2348efaca7437b3 + React-RCTVibration: 033c161fe875e6fa096d0d9733c2e2501682e3d4 React-rendererconsistency: 35cef4bc4724194c544b6e5e2bd9b3f7aff52082 - React-rendererdebug: 9b1a6a2d4f8086a438f75f28350ccba16b7b706a + React-rendererdebug: 4e801e9f8d16d21877565dca2845a2e56202b8c6 React-rncore: 2c7c94d6e92db0850549223eb2fa8272e0942ac2 - React-RuntimeApple: 90f1dfd648cae853afb60eb13a9579c942b2df33 - React-RuntimeCore: 355ee6b0c3a7f4e66afe44f757a7585fc6008c9e + React-RuntimeApple: ff845be41902d053f1348541a647e669a2f509f4 + React-RuntimeCore: 8b30ac97af1bdd5d2622ee2a75becf1e552b89c7 React-runtimeexecutor: ea90d8e3a9e0f4326939858dafc6ab17c031a5d3 - React-RuntimeHermes: 13d33b49355663bdbbca6719abcbc4f534f274b9 - React-runtimescheduler: 1132af91176dcc8ac566b10f7b57b10873125564 - React-utils: d1bae5ac6a5fb94a772ebfc7a7e1aba3a6706a3a - ReactCodegen: 99b435b58bd874bb0626b3fb16437d2e8735d370 - ReactCommon: 1007c09a406a451ddbd874e51511aa541d6034f6 - ReactNativeIosContextMenu: 3e0880f9bd20af2905b57ace99b69a36be125d1a - ReactNativeIosUtilities: 4980803356bff7906929d5d034da58bfc9bb824a - rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba - RNAWSCognito: fe0c870c7cd9970a2efefc075b3f2d75eac913c7 - RNCAsyncStorage: 826b603ae9c0f88b5ac4e956801f755109fa4d5c - RNCClipboard: 0a720adef5ec193aa0e3de24c3977222c7e52a37 - RNDeviceInfo: 02ea8b23e2280fa18e00a06d7e62804d74028579 - RNFlashList: b521ebdd7f9352673817f1d98e8bdc0c8cf8545b - RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 - RNGestureHandler: 634189dbe31ecedf6e75c0d8b5ec5ae208850074 - RNLocalize: dbea38dcb344bf80ff18a1757b1becf11f70cae4 - RNNotifee: 522276e0be010e98173175fb838514b69f18cbe0 - RNReactNativeSharedGroupPreferences: de0121a4224c267bc7e9fb16c398f3f087c8da81 - RNReanimated: e71d3475e3ef59d343061839b4506a7eaeeeae96 - RNScreens: de55b9d7de8a017d1588dcb70415492d0b0597c2 - RNSentry: d912c49a595c6ac6d89797c51bd6f3a9f8c7848c - RNShare: 0fad69ae2d71de9d1f7b9a43acf876886a6cb99c - RNSVG: 43b64ed39c14ce830d840903774154ca0c1f27ec + React-RuntimeHermes: 6a5be21d1f8a603989d8734a0021c0534df23dd9 + React-runtimescheduler: 21ad58e37e35a132f2a5ecad78e68ea7fbc8e2ba + React-utils: 0dbea1179726ad65a1b13470a3f3c73da98f4496 + ReactCodegen: f961bc28110632dd4c8e8d95c1a80f5344022cd2 + ReactCommon: 23eed247b5c8e57b59a823ce209353883da61dd2 + ReactNativeIosContextMenu: 23da83d33323a0ef2010a6199df335e51f0df88e + ReactNativeIosUtilities: 30ff2cd1d1d7b18d8e745f5ab57aaca821504d4b + rn-fetch-blob: 25612b6d6f6e980c6f17ed98ba2f58f5696a51ca + RNAWSCognito: 7f374b06129b2efd233fe9fa5c60443d90126bc1 + RNCAsyncStorage: aa75595c1aefa18f868452091fa0c411a516ce11 + RNCClipboard: 4598dae0fe33e2aa130d9d213e2007be78310266 + RNDeviceInfo: 8af23685571b7867d8dc15fb89e7fb5fa8607e1e + RNFBApp: 21cbda2e7d2657cd3c92f490c050f5f0905d2ff0 + RNFBAppCheck: b29eba01cd2aaf193e34386e62c32d21cf9d353b + RNFlashList: 23b2c67aa684179d29c8c2f468c6f5334e609951 + RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 + RNGestureHandler: 7a5e61d9feeb04f8e993f8408f752982461cbb0e + RNLocalize: 01b15a24a8f1856eeaeeb77f4179ccd88c117a73 + RNNotifee: 6635a40b3ccc1660f1025278145499882867d54a + RNReactNativeSharedGroupPreferences: 21b8537d8842328dcaf93036ba9e927d05eaf5bf + RNReanimated: bd3da720fbd5baafadea9302e898696a76f66ad3 + RNScreens: f608e369383b866daacbedfd24733b6639736c28 + RNSentry: 1aa2851d54bec344abfb19d0fdc94c8e3cb0c80c + RNShare: 694e19d7f74ac4c04de3a8af0649e9ccc03bd8b1 + RNSVG: 0e7deccab0678200815104223aadd5ca734dd41d SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3 SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c @@ -2860,9 +2925,9 @@ SPEC CHECKSUMS: SwiftProtobuf: 4dbaffec76a39a8dc5da23b40af1a5dc01a4c02d UMAppLoader: f17a5ee8e85b536ace0fc254b447a37ed198d57e XMTP: b5311154b2a3cda7c07ce78ae9fa6d111bac979d - XMTPReactNative: 19b1bde805593502a14a7337c0b132efa911e5db + XMTPReactNative: 2a8cb6762dd530574888fe1a0ea209baf33b3155 Yoga: b05994d1933f507b0a28ceaa4fdb968dc18da178 -PODFILE CHECKSUM: c41ba0637d8261aca47e5705727f10078165114f +PODFILE CHECKSUM: 817cfd8d47dddfd40f04fe7497065df343397a8a COCOAPODS: 1.16.2 diff --git a/package.json b/package.json index 01ab698ed..fe5c8b12f 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "android": "EXPO_ENV=dev expo run:android", "android:build:dev": "eas build -p android --profile development --local", "android:reverse": "adb reverse tcp:8081 tcp:8081 && adb reverse tcp:9875 tcp:9875", + "android:sendApk": "./scripts/android/sendApk.sh", "build": "node scripts/build/build.js", "commit": "git show --format=\"%h\" --no-patch", "db": "ts-node scripts/migrations/db.ts", @@ -13,7 +14,7 @@ "ios": "expo run:ios", "run:ios": "EXPO_ENV=dev expo run:ios", "postinstall": "patch-package && node scripts/wasm.js && husky install && cross-os postinstall", - "start": "EXPO_ENV=dev expo start", + "start": "EXPO_ENV=dev expo start --scheme converse-dev", "start:preview": "EXPO_ENV=preview expo start", "test": "echo \"➜ Running tests...\" && jest --testPathIgnorePatterns='.*\\.perf-test\\.tsx$'", "test:perf:baseline": "echo \"➜ Running tests with performance...\" && echo \"➜ Capture baseline performance tests...\" && yarn reassure --baseline && echo \"➜ Running current performance tests...\"", @@ -59,6 +60,8 @@ "@react-native-async-storage/async-storage": "1.23.1", "@react-native-clipboard/clipboard": "^1.14.1", "@react-native-community/netinfo": "11.3.1", + "@react-native-firebase/app": "^21.4.0", + "@react-native-firebase/app-check": "^21.4.0", "@react-native-menu/menu": "^1.1.2", "@react-native/metro-config": "^0.73.3", "@react-navigation/drawer": "^6.6.6", diff --git a/queries/QueryKeys.ts b/queries/QueryKeys.ts index 1b750be2b..a4f8f9ca6 100644 --- a/queries/QueryKeys.ts +++ b/queries/QueryKeys.ts @@ -30,13 +30,13 @@ export enum QueryKeys { // Conversations export const conversationsQueryKey = (account: string) => [ QueryKeys.CONVERSATIONS, - account.toLowerCase(), + account?.toLowerCase(), ]; export const conversationQueryKey = ( account: string, topic: ConversationTopic -) => [QueryKeys.CONVERSATION, account.toLowerCase(), topic]; +) => [QueryKeys.CONVERSATION, account?.toLowerCase(), topic]; export const dmQueryKey = (account: string, peer: string) => [ QueryKeys.CONVERSATION_DM, @@ -53,24 +53,24 @@ export const conversationMessageQueryKey = ( export const conversationMessagesQueryKey = ( account: string, topic: ConversationTopic -) => [QueryKeys.CONVERSATION_MESSAGES, account.toLowerCase(), topic]; +) => [QueryKeys.CONVERSATION_MESSAGES, account?.toLowerCase(), topic]; export const conversationPreviewMessagesQueryKey = ( account: string, topic: ConversationTopic -) => [QueryKeys.CONVERSATION_MESSAGES, account.toLowerCase(), topic]; +) => [QueryKeys.CONVERSATION_MESSAGES, account?.toLowerCase(), topic]; // Members export const groupMembersQueryKey = ( account: string, topic: ConversationTopic -) => [QueryKeys.GROUP_MEMBERS, account.toLowerCase(), topic]; +) => [QueryKeys.GROUP_MEMBERS, account?.toLowerCase(), topic]; // Group Mutable Metadata export const groupPinnedFrameQueryKey = ( account: string, topic: ConversationTopic -) => [QueryKeys.PINNED_FRAME, account.toLowerCase(), topic]; +) => [QueryKeys.PINNED_FRAME, account?.toLowerCase(), topic]; export const groupPermissionPolicyQueryKey = ( account: string, @@ -86,21 +86,21 @@ export const groupCreatorQueryKey = ( export const groupPermissionsQueryKey = ( account: string, topic: ConversationTopic -) => [QueryKeys.GROUP_PERMISSIONS, account.toLowerCase(), topic]; +) => [QueryKeys.GROUP_PERMISSIONS, account?.toLowerCase(), topic]; // Group Invites export const groupInviteQueryKey = (account: string, inviteId: string) => [ QueryKeys.GROUP_INVITE, - account.toLowerCase(), + account?.toLowerCase(), inviteId, ]; export const groupJoinRequestQueryKey = ( account: string, requestId: string -) => [QueryKeys.GROUP_JOIN_REQUEST, account.toLowerCase(), requestId]; +) => [QueryKeys.GROUP_JOIN_REQUEST, account?.toLowerCase(), requestId]; export const pendingJoinRequestsQueryKey = (account: string) => [ QueryKeys.PENDING_JOIN_REQUESTS, - account.toLowerCase(), + account?.toLowerCase(), ]; diff --git a/screens/Navigation/Navigation.tsx b/screens/Navigation/Navigation.tsx index 9460b1181..bc0592051 100644 --- a/screens/Navigation/Navigation.tsx +++ b/screens/Navigation/Navigation.tsx @@ -47,7 +47,6 @@ import WebviewPreviewNav, { WebviewPreviewNavParams, } from "./WebviewPreviewNav"; import { translate } from "@/i18n"; -import { ConversationTopic } from "@xmtp/react-native-sdk"; export type NavigationParamList = { Idle: undefined; diff --git a/scripts/android/sendApk.sh b/scripts/android/sendApk.sh new file mode 100755 index 000000000..fbeef0d51 --- /dev/null +++ b/scripts/android/sendApk.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# Finds the newest APK in the project root and pushes it to +# the connected Android device's Downloads folder. +# +# This script handles cases where no APK exists and provides +# helpful error messages and next steps. +# +# Side effects: +# - Pushes APK file to /storage/emulated/0/Download/ +# - Outputs status messages to console +# +# Example when APK exists: +# $ ./sendApk.sh +# Output: Successfully pushed newest APK to device +# +# Example when no APK exists: +# $ ./sendApk.sh +# Output: No APK found. Please run yarn android:build:dev + +# Get the project root directory +PROJECT_ROOT="$(pwd)" + +# Find the newest build-*.apk file +NEWEST_APK=$(ls -t "$PROJECT_ROOT"/build-*.apk 2>/dev/null | head -n 1) + +if [ -z "$NEWEST_APK" ]; then + echo "❌ No APK found in project root." + echo "👉 Please run 'yarn android:build:dev' first or move your built apk to the project root" + exit 0 +fi + +# Check if device is connected +if ! adb devices | grep -q "device$"; then + echo "❌ No Android device connected" + echo "👉 Please connect a device and enable USB debugging" + exit 0 +fi + +# Push the APK to device +if adb push "$NEWEST_APK" /storage/emulated/0/Download/; then + echo "✅ Successfully pushed $(basename "$NEWEST_APK") to device" + echo "📱 Check your device's Downloads folder to install" +else + echo "❌ Failed to push APK to device" + echo "👉 Please check your device connection and permissions" + exit 1 +fi \ No newline at end of file diff --git a/scripts/build/build.js b/scripts/build/build.js index d76e68b02..a64506af7 100644 --- a/scripts/build/build.js +++ b/scripts/build/build.js @@ -6,10 +6,36 @@ const prompts = require("prompts"); const { handleEnv } = require("./eas"); const appJson = require("../../app.json"); - const PROJECT_ROOT = path.join(__dirname, "..", ".."); const build = async () => { + try { + execSync("eas --version", { stdio: "ignore" }); + } catch (error) { + console.error("\nError: EAS CLI is not installed."); + const { shouldInstall } = await prompts({ + type: "confirm", + name: "shouldInstall", + message: "Would you like to install EAS CLI now?", + initial: true, + }); + + if (shouldInstall) { + console.log("\nInstalling EAS CLI..."); + try { + execSync("npm install -g eas-cli", { stdio: "inherit" }); + console.log("\nEAS CLI installed successfully!\n"); + } catch (installError) { + console.error("\nFailed to install EAS CLI."); + console.log("Please install manually with: npm install -g eas-cli\n"); + process.exit(1); + } + } else { + console.log("\nPlease install EAS CLI with: npm install -g eas-cli\n"); + process.exit(1); + } + } + const isAdvanced = process.argv.includes("--advanced"); const questions = [ { @@ -163,8 +189,8 @@ const build = async () => { platform === "ios" ? "ipa" : env === "production" || env === "preview" - ? "aab" - : "apk"; + ? "aab" + : "apk"; buildArgs.push( "--local", "--output", diff --git a/scripts/build/build.utils.js b/scripts/build/build.utils.js new file mode 100644 index 000000000..b9f8a6d79 --- /dev/null +++ b/scripts/build/build.utils.js @@ -0,0 +1,91 @@ +const fs = require("fs"); +const { execSync } = require("child_process"); + +/** + * Lists all GoogleService-Info plist files in the iOS directory + * + * @returns {string[]} Array of found plist file paths + * @example + * // Returns: + * [ + * 'ios/Google Services/GoogleService-Info-prod.plist', + * 'ios/Google Services/GoogleService-Info-preview.plist' + * ] + */ +const findGoogleServiceFiles = () => { + try { + const result = execSync('find ios -name "GoogleService-Info*.plist"', { + encoding: "utf8", + }); + return result.split("\n").filter(Boolean); + } catch (error) { + console.warn(`Failed to find GoogleService-Info files: ${error.message}`); + return []; + } +}; + +/** + * Copies environment-specific Firebase config file for iOS builds + * + * This utility handles copying the correct GoogleService-Info.plist + * file based on the build environment (preview/production). + * + * @param {string} env - Build environment ('preview' | 'production') + * @throws {Error} If source file doesn't exist or copy fails + * @sideEffects + * - Copies GoogleService-Info.plist to ios/Converse/ + * - Logs operation status to console + * + * @example + * // Copy preview config + * copyGoogleServiceInfo('preview') + * /// Side effects: + * // - Copies preview plist file + * // - Logs success message + * + * @example + * // Copy production config + * copyGoogleServiceInfo('production') + * /// Side effects: + * // - Copies production plist file + * // - Logs success message + */ +const copyGoogleServiceInfo = (env) => { + // Validate environment + const validEnvs = ["preview", "production"]; + if (!validEnvs.includes(env)) { + throw new Error( + `Invalid environment: "${env}". Must be one of: ${validEnvs.join(", ")}` + ); + } + + const SOURCE = `ios/Google Services/GoogleService-Info-${ + env === "production" ? "prod" : "preview" + }.plist`; + const DEST = "ios/Converse/GoogleService-Info.plist"; + + try { + if (!fs.existsSync(SOURCE)) { + const availableFiles = findGoogleServiceFiles(); + throw new Error( + `Source file not found: ${SOURCE}\n\n` + + `Available GoogleService-Info files:\n${ + availableFiles.length + ? availableFiles.map((f) => `- ${f}`).join("\n") + : " None found" + }` + ); + } + fs.copyFileSync(SOURCE, DEST); + console.log(`✓ Copied ${env} GoogleService-Info.plist`); + } catch (error) { + console.error( + `✗ Failed to copy GoogleService-Info.plist: ${error.message}` + ); + throw error; + } +}; + +module.exports = { + copyGoogleServiceInfo, +}; diff --git a/scripts/build/ios/preview.js b/scripts/build/ios/preview.js index 4bf7d933f..18df30d2c 100644 --- a/scripts/build/ios/preview.js +++ b/scripts/build/ios/preview.js @@ -1,22 +1,71 @@ +/** + * iOS Preview Environment Configuration Script + * + * This script modifies various iOS configuration files to set up + * the preview environment build variant of the Converse app. + * It updates bundle IDs, display names, URL schemes and + * entitlements to use preview-specific values. + * + * The GoogleService-Info.plist file contains Firebase configuration + * specific to the preview environment. This file is downloaded from: + * https://console.firebase.google.com/project/converse-unshut-labs/ + * settings/general/ios:com.converse.preview + * + * The file contains environment-specific Firebase settings including: + * - API keys + * - Bundle IDs + * - Project IDs + * - Client IDs + * - Database URLs + * + * @sideEffects + * - Copies preview-specific GoogleService-Info.plist + * - Updates Xcode project config + * - Updates Info.plist files + * - Updates entitlements files + */ + const fs = require("fs"); const plist = require("plist"); +const { copyGoogleServiceInfo } = require("../build.utils.js"); +/** + * iOS Preview Environment Configuration Script + * + * This script modifies various iOS configuration files to set up + * the preview environment build variant of the Converse app. + * It updates bundle IDs, display names, URL schemes and + * entitlements to use preview-specific values. + * + * @sideEffects + * - Updates Xcode project config + * - Updates Info.plist files + * - Updates entitlements files + */ const go = async () => { + copyGoogleServiceInfo("preview"); + // + // Update Xcode Project Bundle ID + // ---------------------------------------- const PROJ_PATH = "ios/Converse.xcodeproj/project.pbxproj"; const projContent = fs.readFileSync(PROJ_PATH, "utf-8"); - const newProjContent = projContent - .replace( - /PRODUCT_BUNDLE_IDENTIFIER = com\.converse\.dev/g, - "PRODUCT_BUNDLE_IDENTIFIER = com.converse.preview" - ); + // Replace dev bundle ID with preview bundle ID + const newProjContent = projContent.replace( + /PRODUCT_BUNDLE_IDENTIFIER = com\.converse\.dev/g, + "PRODUCT_BUNDLE_IDENTIFIER = com.converse.preview" + ); fs.writeFileSync(PROJ_PATH, newProjContent); + // + // Update Info.plist Files + // ---------------------------------------- const PLIST_APP_PATH = "ios/Converse/Info.plist"; const PLIST_EXTENSION_PATH = "ios/ConverseNotificationExtension/Info.plist"; + // Update main app Info.plist const appInfo = plist.parse(fs.readFileSync(PLIST_APP_PATH, "utf8")); appInfo.CFBundleDisplayName = "Converse PREVIEW"; appInfo.CFBundleURLSchemes = ["converse-preview", "com.converse.preview"]; @@ -27,22 +76,31 @@ const go = async () => { const newAppInfo = plist.build(appInfo); fs.writeFileSync(PLIST_APP_PATH, newAppInfo, "utf-8"); - const extensionInfo = plist.parse(fs.readFileSync(PLIST_EXTENSION_PATH, "utf8")); + // Update notification extension Info.plist + const extensionInfo = plist.parse( + fs.readFileSync(PLIST_EXTENSION_PATH, "utf8") + ); extensionInfo.AppBundleId = "com.converse.preview"; extensionInfo.Env = "preview"; const newExtensionInfo = plist.build(extensionInfo); fs.writeFileSync(PLIST_EXTENSION_PATH, newExtensionInfo, "utf-8"); + // + // Update Entitlements Files + // ---------------------------------------- const ENTITLEMENTS_APP_PATH = "ios/Converse/Converse.entitlements"; const ENTITLEMENTS_EXTENSION_PATH = "ios/ConverseNotificationExtension/ConverseNotificationExtension.entitlements"; + // Load entitlements files const entitlementsApp = plist.parse( fs.readFileSync(ENTITLEMENTS_APP_PATH, "utf8") ); const entitlementsExtension = plist.parse( fs.readFileSync(ENTITLEMENTS_EXTENSION_PATH, "utf8") ); + + // Update main app entitlements entitlementsApp["keychain-access-groups"][0] = entitlementsApp[ "keychain-access-groups" ][0].replace("com.converse.dev", "com.converse.preview"); @@ -59,6 +117,8 @@ const go = async () => { "applinks:dev.getconverse.app", "applinks:preview.getconverse.app" ); + + // Update notification extension entitlements entitlementsExtension["keychain-access-groups"][0] = entitlementsExtension[ "keychain-access-groups" ][0].replace("com.converse.dev", "com.converse.preview"); @@ -67,6 +127,8 @@ const go = async () => { "com.converse.dev", "com.converse.preview" ); + + // Write updated entitlements back to files const newEntitlementsApp = plist.build(entitlementsApp); fs.writeFileSync(ENTITLEMENTS_APP_PATH, newEntitlementsApp, "utf-8"); diff --git a/scripts/build/ios/production.js b/scripts/build/ios/production.js index e6f8f01c7..3e64150ae 100644 --- a/scripts/build/ios/production.js +++ b/scripts/build/ios/production.js @@ -1,10 +1,29 @@ const fs = require("fs"); const plist = require("plist"); +const { copyGoogleServiceInfo } = require("../build.utils.js"); +/** + * iOS Production Environment Configuration Script + * + * This script modifies various iOS configuration files to set up + * the production environment build variant of the Converse app. + * It updates bundle IDs, display names, URL schemes and + * entitlements to use production-specific values. + * + * @sideEffects + * - Updates Xcode project config + * - Updates Info.plist files + * - Updates entitlements files + */ const go = async () => { + copyGoogleServiceInfo("production"); + const PROJ_PATH = "ios/Converse.xcodeproj/project.pbxproj"; const projContent = fs.readFileSync(PROJ_PATH, "utf-8"); + // + // Update Xcode Project Bundle ID + // ---------------------------------------- const newProjContent = projContent .replace( /PRODUCT_BUNDLE_IDENTIFIER = com\.converse\.dev/g, @@ -17,6 +36,9 @@ const go = async () => { fs.writeFileSync(PROJ_PATH, newProjContent); + // + // Update Info.plist Files + // ---------------------------------------- const PLIST_APP_PATH = "ios/Converse/Info.plist"; const PLIST_EXTENSION_PATH = "ios/ConverseNotificationExtension/Info.plist"; @@ -30,6 +52,7 @@ const go = async () => { const newAppInfo = plist.build(appInfo); fs.writeFileSync(PLIST_APP_PATH, newAppInfo, "utf-8"); + // Update notification extension Info.plist const extensionInfo = plist.parse( fs.readFileSync(PLIST_EXTENSION_PATH, "utf8") ); @@ -38,6 +61,9 @@ const go = async () => { const newExtensionInfo = plist.build(extensionInfo); fs.writeFileSync(PLIST_EXTENSION_PATH, newExtensionInfo, "utf-8"); + // + // Update Entitlements Files + // ---------------------------------------- const ENTITLEMENTS_APP_PATH = "ios/Converse/Converse.entitlements"; const ENTITLEMENTS_EXTENSION_PATH = "ios/ConverseNotificationExtension/ConverseNotificationExtension.entitlements"; @@ -72,7 +98,8 @@ const go = async () => { "com.converse.dev", "com.converse.native" ); - entitlementsExtension["com.apple.developer.usernotifications.filtering"] = true; + entitlementsExtension["com.apple.developer.usernotifications.filtering"] = + true; const newEntitlementsApp = plist.build(entitlementsApp); fs.writeFileSync(ENTITLEMENTS_APP_PATH, newEntitlementsApp, "utf-8"); diff --git a/utils/api.constants.ts b/utils/api.constants.ts index 0eded4c49..994e42ecc 100644 --- a/utils/api.constants.ts +++ b/utils/api.constants.ts @@ -2,3 +2,4 @@ export const CONVERSE_ACCESS_TOKEN_STORAGE_KEY = "CONVERSE_ACCESS_TOKEN"; export const CONVERSE_REFRESH_TOKEN_STORAGE_KEY = "CONVERSE_REFRESH_TOKEN"; export const XMTP_IDENTITY_KEY = "XMTP_IDENTITY"; export const XMTP_API_ADDRESS_HEADER_KEY = "xmtp-api-address"; +export const FIREBASE_APP_CHECK_HEADER_KEY = "X-Firebase-AppCheck"; diff --git a/utils/api.ts b/utils/api.ts index a4e2953ea..e3691de93 100644 --- a/utils/api.ts +++ b/utils/api.ts @@ -30,9 +30,11 @@ import { getSecureMmkvForAccount } from "./mmkv"; import { CONVERSE_ACCESS_TOKEN_STORAGE_KEY, CONVERSE_REFRESH_TOKEN_STORAGE_KEY, + FIREBASE_APP_CHECK_HEADER_KEY, XMTP_API_ADDRESS_HEADER_KEY, XMTP_IDENTITY_KEY, } from "./api.constants"; +import { tryGetAppCheckToken } from "./appCheck"; export const api = axios.create({ baseURL: config.apiURI, @@ -117,7 +119,7 @@ type AuthParams = { inboxId: string; installationPublicKey: string; installationKeySignature: string; - appCheckToken?: string; + appCheckToken: string; account: string; }; @@ -144,6 +146,7 @@ export async function fetchAccessToken({ { headers: { [XMTP_API_ADDRESS_HEADER_KEY]: account, + [FIREBASE_APP_CHECK_HEADER_KEY]: appCheckToken, }, } ) @@ -170,8 +173,10 @@ export async function rotateAccessToken( ); } - const { data } = await dedupedFetch("/api/authenticate/token", () => - api.post("/api/authenticate/token", { token: refreshToken }) + const { data } = await dedupedFetch( + `/api/authenticate/token-${account}`, + () => + api.post("/api/authenticate/token", { token: refreshToken }) ); if (!data) { @@ -195,7 +200,7 @@ export const xmtpSignatureByAccount: { type XmtpApiHeaders = { [XMTP_API_ADDRESS_HEADER_KEY]: string; - + [FIREBASE_APP_CHECK_HEADER_KEY]: string; /** Bearer */ authorization: `Bearer ${string}`; }; @@ -203,9 +208,21 @@ type XmtpApiHeaders = { export async function getXmtpApiHeaders( account: string ): Promise { + if (!account) { + throw new Error("[getXmtpApiHeaders] No account provided"); + } const secureMmkv = await getSecureMmkvForAccount(account); let accessToken = secureMmkv.getString(CONVERSE_ACCESS_TOKEN_STORAGE_KEY); + const appCheckToken = await tryGetAppCheckToken(); + + if (!appCheckToken) { + throw new Error(` +No App Check Token Available. This indicates that we believe the app is not running on an authentic build of +our application on a device that has not been tampered with. +`); + } + if (!accessToken) { const installationKeySignature = xmtpSignatureByAccount[account] || @@ -219,8 +236,9 @@ export async function getXmtpApiHeaders( const inboxId = await getInboxId(account); const authTokensResponse = await fetchAccessToken({ inboxId, - ...installationKeySignature, account, + appCheckToken, + ...installationKeySignature, }); if (!authTokensResponse) { @@ -246,6 +264,7 @@ export async function getXmtpApiHeaders( return { [XMTP_API_ADDRESS_HEADER_KEY]: account, + [FIREBASE_APP_CHECK_HEADER_KEY]: appCheckToken, authorization: `Bearer ${accessToken}`, }; } @@ -375,6 +394,11 @@ export const getProfilesForInboxIds = async ({ logger.info("Fetching profiles for inboxIds", inboxIds); const { data } = await api.get("/api/inbox/", { params: { ids: inboxIds.join(",") }, + // todo(lustig) fix this request. it is 401ing after ephemeral account creation. + // why I'm delaying - its tied up in a batshit fetcher + // thing and I'll have to look into how that ties together with react-query and can't + // be bothered right now. + // headers: await getXmtpApiHeaders(account), }); return data; }; @@ -522,6 +546,7 @@ export const checkUsernameValid = async ( ): Promise => { const { data } = await api.get("/api/profile/username/valid", { params: { address, username }, + headers: await getXmtpApiHeaders(address), }); return data; }; diff --git a/utils/apiConfig.ts b/utils/apiConfig.ts new file mode 100644 index 000000000..9a55197a6 --- /dev/null +++ b/utils/apiConfig.ts @@ -0,0 +1,63 @@ +import Constants from "expo-constants"; +import logger from "./logger"; +import { isProd } from "./getEnv"; + +/** + * Determines the appropriate API URI for the current environment + * by examining Expo Constants and environment variables. + * + * This utility helps connect to a local dev server when running + * in development, handling different device scenarios: + * - Expo Go on physical device + * - Expo Go on emulator + * - Web browser + * - Production builds + * + * @see https://stackoverflow.com/questions/47417766/calling-locally-hosted-server-from-expo-app + * + * @returns {string} The configured API URI + * + * @example + * // When running in Expo Go on physical device + * getApiUri() + * /// Output: "http://192.168.1.100:9875" + * + * @example + * // When running in production + * getApiUri() + * /// Output: "https://api.production.com" + */ +export const getApiUri = () => { + // Get configured dev API URI + const envApiUri = process.env.EXPO_PUBLIC_DEV_API_URI; + + // In production, use the configured API + if (isProd) { + return envApiUri; + } + + // For development, replace localhost with device-accessible IP + if (envApiUri?.includes("localhost")) { + logger.info("Replacing localhost with device-accessible IP"); + // Try Expo host info first + const hostIp = Constants.expoConfig?.hostUri?.split(":")[0]; + logger.info("Host IP", { hostIp }); + + if (hostIp) { + logger.info("Replacing localhost with device-accessible IP", { + envApiUri, + hostIp, + }); + return envApiUri.replace("localhost", hostIp); + } + } + + // Fallback to original URI + return envApiUri; +}; + +declare const process: { + env: { + [key: string]: string; + }; +}; diff --git a/utils/appCheck.ts b/utils/appCheck.ts new file mode 100644 index 000000000..2af70e493 --- /dev/null +++ b/utils/appCheck.ts @@ -0,0 +1,44 @@ +// helpful medium article: https://medium.com/@vibhavguria07/level-up-your-app-security-implementing-firebase-app-check-in-react-native-9c7409d56504 +// dashboards: https://console.firebase.google.com/u/0/project/converse-appcheck/appcheck/products +// setup instructions: https://rnfirebase.io/app-check/usage +import { firebase } from "@react-native-firebase/app-check"; +import logger from "./logger"; +import { getConfig } from "@/config"; +const appCheck = firebase.appCheck(); + +export const tryGetAppCheckToken = async () => { + logger.debug("Getting token"); + try { + // App Check FAQ: + // Do we need/want to use the limited use token? + + // What endpoints are protected with app check? + // @see https://github.com/ephemeraHQ/converse-backend/blob/main/api/middlewares.ts#L27 + const { token } = await appCheck.getLimitedUseToken(); + // const { token } = await appCheck.getToken(); + return token; + } catch (error) { + logger.error("Error getting token", error); + return undefined; + } +}; + +export async function setupAppAttest() { + const rnfbProvider = appCheck.newReactNativeFirebaseAppCheckProvider(); + rnfbProvider.configure({ + android: { + provider: __DEV__ ? "debug" : "playIntegrity", + debugToken: getConfig().appCheckDebugToken, + }, + apple: { + provider: __DEV__ ? "debug" : "appAttestWithDeviceCheckFallback", + // Will be intentionally undefined in non-dev environments + debugToken: getConfig().appCheckDebugToken, + }, + }); + + appCheck.initializeAppCheck({ + provider: rnfbProvider, + isTokenAutoRefreshEnabled: true, + }); +} diff --git a/utils/capture-error.ts b/utils/capture-error.ts index b37f12c90..8345ad4e1 100644 --- a/utils/capture-error.ts +++ b/utils/capture-error.ts @@ -1,10 +1,10 @@ import { showSnackbar } from "@/components/Snackbar/Snackbar.service"; -import config from "@/config"; import logger from "@/utils/logger"; import { sentryTrackError } from "@/utils/sentry"; +import { isDev } from "@/utils/getEnv"; export function captureError(error: unknown) { - if (config.env === "dev") { + if (isDev) { logger.error(error); } diff --git a/utils/getEnv.ts b/utils/getEnv.ts new file mode 100644 index 000000000..199a2a27a --- /dev/null +++ b/utils/getEnv.ts @@ -0,0 +1,39 @@ +import Constants from "expo-constants"; + +export const Environments = { + dev: "dev", + preview: "preview", + prod: "prod", +} as const; + +export type Environment = (typeof Environments)[keyof typeof Environments]; + +/** + * Get the current environment + * + * @returns {string} The current environment + * + * @example + * // Input: + * getEnv() + * /// Output: + * // - 'dev' when in development + * // - 'preview' when in preview + * // - 'prod' when in production + */ +export const getEnv = (): Environment => { + // todo(lustig): type .env variables + // @ts-ignore + const isExpoEnvDev = process.env.EXPO_ENV === "dev"; + if (__DEV__ || isExpoEnvDev) { + return Environments.dev; + } else if (Constants.expoConfig?.extra?.ENV === "preview") { + return Environments.preview; + } else { + return Environments.prod; + } +}; + +export const isDev = getEnv() === Environments.dev; +export const isPreview = getEnv() === Environments.preview; +export const isProd = getEnv() === Environments.prod; diff --git a/utils/logger.ts b/utils/logger.ts index c66eca64f..5e042ce1e 100644 --- a/utils/logger.ts +++ b/utils/logger.ts @@ -10,7 +10,7 @@ import { import { v4 as uuidv4 } from "uuid"; import { sentryAddBreadcrumb, sentryTrackError } from "./sentry"; -import config from "../config"; +import { isDev } from "./getEnv"; export let loggingFilePath: string; @@ -54,7 +54,7 @@ export const rotateLoggingFile = async () => { const converseTransport: transportFunctionType = async (props) => { // Logs are subperformant, so only in dev - if (config.env === "dev") { + if (isDev) { consoleTransport(props); } if (props.level.severity >= 3) { diff --git a/utils/sentry.ts b/utils/sentry.ts index 779835a52..b387ee70c 100644 --- a/utils/sentry.ts +++ b/utils/sentry.ts @@ -4,6 +4,7 @@ import { Platform } from "react-native"; import appBuildNumbers from "../app.json"; import config from "../config"; +import { isDev } from "@/utils/getEnv"; const DISABLE_IOS_NATIVE_SENTRY = false; @@ -11,7 +12,7 @@ export const initSentry = () => { const sentryOptions: Sentry.ReactNativeOptions = { dsn: config.sentryDSN, debug: false, - enabled: config.env !== "dev", + enabled: !isDev, environment: config.env, beforeSend: (event: ErrorEvent, hint: EventHint) => { // Filtering out some errors diff --git a/utils/xmtpRN/messages.ts b/utils/xmtpRN/messages.ts index 2e1eaf8c7..14f80cc98 100644 --- a/utils/xmtpRN/messages.ts +++ b/utils/xmtpRN/messages.ts @@ -10,7 +10,7 @@ import type { ConversationTopic, GroupUpdatedContent, } from "@xmtp/react-native-sdk"; -import config from "../../config"; +import { isProd } from "@/utils/getEnv"; import { ConverseXmtpClientType, DecodedMessageWithCodecsType, @@ -27,7 +27,7 @@ export const streamAllMessages = async (account: string) => { await client.conversations.streamAllMessages(async (message) => { logger.info(`[XmtpRN] Received a message for ${client.address}`, { id: message.id, - text: config.env === "prod" ? "Redacted" : message.nativeContent.text, + text: isProd ? "Redacted" : message.nativeContent.text, topic: message.topic, }); diff --git a/yarn.lock b/yarn.lock index ed24ad446..4fb6ba605 100644 --- a/yarn.lock +++ b/yarn.lock @@ -678,7 +678,7 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/code-frame@^7.25.9": +"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -698,9 +698,9 @@ integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== "@babel/compat-data@^7.25.9": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" - integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.21.3", "@babel/core@^7.23.9": version "7.24.7" @@ -785,13 +785,13 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/generator@^7.25.9": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -881,12 +881,12 @@ semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26" - integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" - regexpu-core "^6.1.1" + regexpu-core "^6.2.0" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2": @@ -1160,12 +1160,12 @@ dependencies: "@babel/types" "^7.25.2" -"@babel/parser@^7.25.9", "@babel/parser@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== +"@babel/parser@^7.25.9", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/types" "^7.26.0" + "@babel/types" "^7.26.3" "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.20.7" @@ -1929,15 +1929,15 @@ globals "^11.1.0" "@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/types" "^7.26.3" debug "^4.3.1" globals "^11.1.0" @@ -1968,10 +1968,10 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" -"@babel/types@^7.25.9", "@babel/types@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@babel/types@^7.25.9", "@babel/types@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -3068,10 +3068,10 @@ mv "~2" safe-json-stringify "~1" -"@expo/cli@0.18.30": - version "0.18.30" - resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.18.30.tgz#0cb4829aa11e98ae350a5c15958b9816e9a1d2f0" - integrity sha512-V90TUJh9Ly8stYo8nwqIqNWCsYjE28GlVFWEhAFCUOp99foiQr8HSTpiiX5GIrprcPoWmlGoY+J5fQA29R4lFg== +"@expo/cli@0.18.31": + version "0.18.31" + resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.18.31.tgz#d07b7f1b2d10d146ec8b732ce1353b90912c56bd" + integrity sha512-v9llw9fT3Uv+TCM6Xllo54t672CuYtinEQZ2LPJ2EJsCwuTc4Cd2gXQaouuIVD21VoeGQnr5JtJuWbF97sBKzQ== dependencies: "@babel/runtime" "^7.20.0" "@expo/code-signing-certificates" "0.0.5" @@ -3159,7 +3159,7 @@ node-forge "^1.2.1" nullthrows "^1.1.1" -"@expo/config-plugins@8.0.10", "@expo/config-plugins@^4.0.2", "@expo/config-plugins@~8.0.0", "@expo/config-plugins@~8.0.0-beta.0", "@expo/config-plugins@~8.0.8": +"@expo/config-plugins@8.0.11", "@expo/config-plugins@^4.0.2", "@expo/config-plugins@~8.0.0", "@expo/config-plugins@~8.0.0-beta.0", "@expo/config-plugins@~8.0.8": version "8.0.6" resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.6.tgz#ab87eb4d2a6d1b40e95f74ed9ff3d849561f3f88" integrity sha512-Vmn/BSg/hBmliU/Bl+G4sExDoWd4iHXQG7ITUNR5Uar7uLko1A5vdVV+EOEUFA0f8jEZMHG3uZJUoXmr4LPaxA== @@ -3374,23 +3374,6 @@ semver "^7.6.0" xml2js "0.6.0" -"@expo/prebuild-config@7.0.8": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-7.0.8.tgz#8af72b19c92f05f1ab6c6c70d31f33159dacac39" - integrity sha512-wH9NVg6HiwF5y9x0TxiMEeBF+ITPGDXy5/i6OUheSrKpPgb0lF1Mwzl/f2fLPXBEpl+ZXOQ8LlLW32b7K9lrNg== - dependencies: - "@expo/config" "~9.0.0-beta.0" - "@expo/config-plugins" "~8.0.8" - "@expo/config-types" "^51.0.0-unreleased" - "@expo/image-utils" "^0.5.0" - "@expo/json-file" "^8.3.0" - "@react-native/normalize-colors" "0.74.85" - debug "^4.3.1" - fs-extra "^9.0.0" - resolve-from "^5.0.0" - semver "^7.6.0" - xml2js "0.6.0" - "@expo/prebuild-config@7.0.9": version "7.0.9" resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-7.0.9.tgz#7abd489e18ed6514a0c9cd214eb34c0d5efda799" @@ -3473,6 +3456,390 @@ resolved "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz" integrity sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw== +"@firebase/analytics-compat@0.2.14": + version "0.2.14" + resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.2.14.tgz#7e85a245317394a36523d08bccf5dd5bbe91b72d" + integrity sha512-unRVY6SvRqfNFIAA/kwl4vK+lvQAL2HVcgu9zTrUtTyYDmtIt/lOuHJynBMYEgLnKm39YKBDhtqdapP2e++ASw== + dependencies: + "@firebase/analytics" "0.10.8" + "@firebase/analytics-types" "0.8.2" + "@firebase/component" "0.6.9" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/analytics-types@0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.8.2.tgz#947f85346e404332aac6c996d71fd4a89cd7f87a" + integrity sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw== + +"@firebase/analytics@0.10.8": + version "0.10.8" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.10.8.tgz#73d4bfa1bdae5140907a94817cfdddf00d1dae22" + integrity sha512-CVnHcS4iRJPqtIDc411+UmFldk0ShSK3OB+D0bKD8Ck5Vro6dbK5+APZpkuWpbfdL359DIQUnAaMLE+zs/PVyA== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/installations" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/app-check-compat@0.3.15": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.3.15.tgz#78babc0575c34c9bb550601d2563438597dc56c2" + integrity sha512-zFIvIFFNqDXpOT2huorz9cwf56VT3oJYRFjSFYdSbGYEJYEaXjLJbfC79lx/zjx4Fh+yuN8pry3TtvwaevrGbg== + dependencies: + "@firebase/app-check" "0.8.8" + "@firebase/app-check-types" "0.5.2" + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/app-check-interop-types@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz#455b6562c7a3de3ef75ea51f72dfec5829ad6997" + integrity sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ== + +"@firebase/app-check-types@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.5.2.tgz#1221bd09b471e11bb149252f16640a0a51043cbc" + integrity sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA== + +"@firebase/app-check@0.8.8": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.8.8.tgz#78bdd5ba1745c5eecf284c3687a8b2902bfcb08c" + integrity sha512-O49RGF1xj7k6BuhxGpHmqOW5hqBIAEbt2q6POW0lIywx7emYtzPDeQI+ryQpC4zbKX646SoVZ711TN1DBLNSOQ== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/app-compat@0.2.41": + version "0.2.41" + resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.2.41.tgz#6cdc0b5c3248e8e04dcfa373e4895d5785e94f2b" + integrity sha512-ktJcObWKjlIWq31kXu6sHoqWlhQD5rx0a2F2ZC2JVuEE5A5f7F43VO1Z6lfeRZXMFZbGG/aqIfXqgsP3zD2JYg== + dependencies: + "@firebase/app" "0.10.11" + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/app-types@0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.9.2.tgz#8cbcceba784753a7c0066a4809bc22f93adee080" + integrity sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ== + +"@firebase/app@0.10.11": + version "0.10.11" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.10.11.tgz#25547f5bf815896dc08023f97138487948522092" + integrity sha512-DuI8c+p/ndPmV6V0i+mcSuaU9mK9Pi9h76WOYFkPNsbmkblEy8bpTOazjG7tnfar6Of1Wn5ohvyOHSRqnN6flQ== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/auth-compat@0.5.14": + version "0.5.14" + resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.5.14.tgz#d3bcb8e1bd992eb1850a025240397d94461ea179" + integrity sha512-2eczCSqBl1KUPJacZlFpQayvpilg3dxXLy9cSMTKtQMTQSmondUtPI47P3ikH3bQAXhzKLOE+qVxJ3/IRtu9pw== + dependencies: + "@firebase/auth" "1.7.9" + "@firebase/auth-types" "0.12.2" + "@firebase/component" "0.6.9" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + undici "6.19.7" + +"@firebase/auth-interop-types@0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz#927f1f2139a680b55fef0bddbff2c982b08587e8" + integrity sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ== + +"@firebase/auth-types@0.12.2": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.12.2.tgz#f12d890585866e53b6ab18b16fa4d425c52eee6e" + integrity sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w== + +"@firebase/auth@1.7.9": + version "1.7.9" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-1.7.9.tgz#00d40fbf49474a235bb1152ba5833074115300dd" + integrity sha512-yLD5095kVgDw965jepMyUrIgDklD6qH/BZNHeKOgvu7pchOKNjVM+zQoOVYJIKWMWOWBq8IRNVU6NXzBbozaJg== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + undici "6.19.7" + +"@firebase/component@0.6.9": + version "0.6.9" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.9.tgz#4248cfeab222245ada0d7f78ece95a87574532b4" + integrity sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q== + dependencies: + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/database-compat@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-1.0.8.tgz#69ab03d00e27a89f65486896ea219094aa38c27f" + integrity sha512-OpeWZoPE3sGIRPBKYnW9wLad25RaWbGyk7fFQe4xnJQKRzlynWeFBSRRAoLE2Old01WXwskUiucNqUUVlFsceg== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/database" "1.0.8" + "@firebase/database-types" "1.0.5" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/database-types@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-1.0.5.tgz#2d923f42e3d9911b9eec537ed8b5ecaa0ce95c37" + integrity sha512-fTlqCNwFYyq/C6W7AJ5OCuq5CeZuBEsEwptnVxlNPkWCo5cTTyukzAHRSO/jaQcItz33FfYrrFk1SJofcu2AaQ== + dependencies: + "@firebase/app-types" "0.9.2" + "@firebase/util" "1.10.0" + +"@firebase/database@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-1.0.8.tgz#01bb0d0cb5653ae6a6641523f6f085b4c1be9c2f" + integrity sha512-dzXALZeBI1U5TXt6619cv0+tgEhJiwlUtQ55WNZY7vGAjv7Q1QioV969iYwt1AQQ0ovHnEW0YW9TiBfefLvErg== + dependencies: + "@firebase/app-check-interop-types" "0.3.2" + "@firebase/auth-interop-types" "0.2.3" + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + faye-websocket "0.11.4" + tslib "^2.1.0" + +"@firebase/firestore-compat@0.3.37": + version "0.3.37" + resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.3.37.tgz#eab17138fc1a7484000807ad9921fbe1b686831a" + integrity sha512-YwjJePx+m2OGnpKTGFTkcRXQZ+z0+8t7/zuwyOsTmKERobn0kekOv8VAQQmITcC+3du8Ul98O2a0vMH3xwt7jQ== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/firestore" "4.7.2" + "@firebase/firestore-types" "3.0.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/firestore-types@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-3.0.2.tgz#75c301acc5fa33943eaaa9570b963c55398cad2a" + integrity sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg== + +"@firebase/firestore@4.7.2": + version "4.7.2" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-4.7.2.tgz#7fa7f6aaa844b53695daaf509da274b945372f65" + integrity sha512-WPkL/DEHuJg1PZPyHn81pNUhitG+7WkpLVdXmoYB23Za3eoM8VzuIn7zcD4Cji6wDCGA6eI1rvGYLtsXmE1OaQ== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + "@firebase/webchannel-wrapper" "1.0.1" + "@grpc/grpc-js" "~1.9.0" + "@grpc/proto-loader" "^0.7.8" + tslib "^2.1.0" + undici "6.19.7" + +"@firebase/functions-compat@0.3.14": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.3.14.tgz#0997de9c799912dd171758273238234b1b5a700d" + integrity sha512-dZ0PKOKQFnOlMfcim39XzaXonSuPPAVuzpqA4ONTIdyaJK/OnBaIEVs/+BH4faa1a2tLeR+Jy15PKqDRQoNIJw== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/functions" "0.11.8" + "@firebase/functions-types" "0.6.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/functions-types@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.6.2.tgz#03b4ec9259d2f57548a3909d6a35ae35ad243552" + integrity sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w== + +"@firebase/functions@0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.11.8.tgz#a85dcc843882dba8b17b974155b036da04f59576" + integrity sha512-Lo2rTPDn96naFIlSZKVd1yvRRqqqwiJk7cf9TZhUerwnPKgBzXy+aHE22ry+6EjCaQusUoNai6mU6p+G8QZT1g== + dependencies: + "@firebase/app-check-interop-types" "0.3.2" + "@firebase/auth-interop-types" "0.2.3" + "@firebase/component" "0.6.9" + "@firebase/messaging-interop-types" "0.2.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + undici "6.19.7" + +"@firebase/installations-compat@0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.2.9.tgz#0b169ad292d6ef4e1fdef453164d60c2d883eaa1" + integrity sha512-2lfdc6kPXR7WaL4FCQSQUhXcPbI7ol3wF+vkgtU25r77OxPf8F/VmswQ7sgIkBBWtymn5ZF20TIKtnOj9rjb6w== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/installations" "0.6.9" + "@firebase/installations-types" "0.5.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/installations-types@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.5.2.tgz#4d4949e0e83ced7f36cbee009355cd305a36e158" + integrity sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA== + +"@firebase/installations@0.6.9": + version "0.6.9" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.6.9.tgz#eb696577b4c5fb0a68836e167edd46fb4a39b7b2" + integrity sha512-hlT7AwCiKghOX3XizLxXOsTFiFCQnp/oj86zp1UxwDGmyzsyoxtX+UIZyVyH/oBF5+XtblFG9KZzZQ/h+dpy+Q== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/util" "1.10.0" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/logger@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.4.2.tgz#74dfcfeedee810deb8a7080d5b7eba56aa16ffa2" + integrity sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A== + dependencies: + tslib "^2.1.0" + +"@firebase/messaging-compat@0.2.11": + version "0.2.11" + resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.2.11.tgz#7a4c18bdb5b071bf762bd609e0dc14b0754b2f59" + integrity sha512-2NCkfE1L9jSn5OC+2n5rGAz5BEAQreK2lQGdPYQEJlAbKB2efoF+2FdiQ+LD8SlioSXz66REfeaEdesoLPFQcw== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/messaging" "0.12.11" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/messaging-interop-types@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.2.tgz#81042f7e9739733fa4571d17f6eb6869522754d0" + integrity sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA== + +"@firebase/messaging@0.12.11": + version "0.12.11" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.12.11.tgz#a9e5c50210f20919ce6b4eafe27fcac38967fa33" + integrity sha512-zn5zGhF46BmiZ7W9yAUoHlqzJGakmWn1FNp//roXHN62dgdEFIKfXY7IODA2iQiXpmUO3sBdI/Tf+Hsft1mVkw== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/installations" "0.6.9" + "@firebase/messaging-interop-types" "0.2.2" + "@firebase/util" "1.10.0" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/performance-compat@0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.2.9.tgz#f7f603ef9116162ccbe24ea9b00abc9b0de84faa" + integrity sha512-dNl95IUnpsu3fAfYBZDCVhXNkASE0uo4HYaEPd2/PKscfTvsgqFAOxfAXzBEDOnynDWiaGUnb5M1O00JQ+3FXA== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/performance" "0.6.9" + "@firebase/performance-types" "0.2.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/performance-types@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.2.2.tgz#7b78cd2ab2310bac89a63348d93e67e01eb06dd7" + integrity sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA== + +"@firebase/performance@0.6.9": + version "0.6.9" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.6.9.tgz#e8fc4ecc7c5be21acd3ed1ef1e0e123ea2e3b05f" + integrity sha512-PnVaak5sqfz5ivhua+HserxTJHtCar/7zM0flCX6NkzBNzJzyzlH4Hs94h2Il0LQB99roBqoE5QT1JqWqcLJHQ== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/installations" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/remote-config-compat@0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.2.9.tgz#2c8ca1c0cf86051df6998f3f7051065804dccaaa" + integrity sha512-AxzGpWfWFYejH2twxfdOJt5Cfh/ATHONegTd/a0p5flEzsD5JsxXgfkFToop+mypEL3gNwawxrxlZddmDoNxyA== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/remote-config" "0.4.9" + "@firebase/remote-config-types" "0.3.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/remote-config-types@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.3.2.tgz#a5d1009c6fd08036c5cd4f28764e3cd694f966d5" + integrity sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA== + +"@firebase/remote-config@0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.4.9.tgz#280d5ad2ed35e86187f058ecdd4bfdd2cf798e3e" + integrity sha512-EO1NLCWSPMHdDSRGwZ73kxEEcTopAxX1naqLJFNApp4hO8WfKfmEpmjxmP5TrrnypjIf2tUkYaKsfbEA7+AMmA== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/installations" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/storage-compat@0.3.12": + version "0.3.12" + resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.3.12.tgz#e24d004bb28b1c0fae9adccf120b71c371491c30" + integrity sha512-hA4VWKyGU5bWOll+uwzzhEMMYGu9PlKQc1w4DWxB3aIErWYzonrZjF0icqNQZbwKNIdh8SHjZlFeB2w6OSsjfg== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/storage" "0.13.2" + "@firebase/storage-types" "0.8.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/storage-types@0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.8.2.tgz#edb321b8a3872a9f74e1f27de046f160021c8e1f" + integrity sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g== + +"@firebase/storage@0.13.2": + version "0.13.2" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.13.2.tgz#33cd113a8c0904f7d2ab16142112046826f7ef00" + integrity sha512-fxuJnHshbhVwuJ4FuISLu+/76Aby2sh+44ztjF2ppoe0TELIDxPW6/r1KGlWYt//AD0IodDYYA8ZTN89q8YqUw== + dependencies: + "@firebase/component" "0.6.9" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + undici "6.19.7" + +"@firebase/util@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.10.0.tgz#9ec8ab54da82bfc31baff0c43cb281998cbeddab" + integrity sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ== + dependencies: + tslib "^2.1.0" + +"@firebase/vertexai-preview@0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@firebase/vertexai-preview/-/vertexai-preview-0.0.4.tgz#14327cb69e2f72462d1a32366c71aa0836ffc39e" + integrity sha512-EBSqyu9eg8frQlVU9/HjKtHN7odqbh9MtAcVz3WwHj4gLCLOoN9F/o+oxlq3CxvFrd3CNTZwu6d2mZtVlEInng== + dependencies: + "@firebase/app-check-interop-types" "0.3.2" + "@firebase/component" "0.6.9" + "@firebase/logger" "0.4.2" + "@firebase/util" "1.10.0" + tslib "^2.1.0" + +"@firebase/webchannel-wrapper@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.1.tgz#0b62c9f47f557a5b4adc073bb0a47542ce6af4c4" + integrity sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ== + "@floating-ui/core@^1.6.0": version "1.6.4" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.4.tgz#0140cf5091c8dee602bff9da5ab330840ff91df6" @@ -3581,6 +3948,24 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== +"@grpc/grpc-js@~1.9.0": + version "1.9.15" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.15.tgz#433d7ac19b1754af690ea650ab72190bd700739b" + integrity sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ== + dependencies: + "@grpc/proto-loader" "^0.7.8" + "@types/node" ">=12.12.47" + +"@grpc/proto-loader@^0.7.8": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -4481,7 +4866,7 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== -"@noble/hashes@1.5.0", "@noble/hashes@^1.3.3", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": +"@noble/hashes@1.5.0", "@noble/hashes@^1.4.0", "@noble/hashes@~1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== @@ -4491,6 +4876,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== +"@noble/hashes@^1.3.3": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" + integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@^1.3.0", "@noble/secp256k1@^1.5.2", "@noble/secp256k1@^1.7.1": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -5333,6 +5723,19 @@ resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-11.3.1.tgz#4539371a2f4bd402d932031be82c2449ed63a1a5" integrity sha512-UBnJxyV0b7i9Moa97Av+HKho1ByzX0DtbJXzUQS5E3xhQs6P2D/Os0iw3ouy7joY1TVd6uIhplPbr7l1SJNaNQ== +"@react-native-firebase/app-check@^21.4.0": + version "21.4.0" + resolved "https://registry.yarnpkg.com/@react-native-firebase/app-check/-/app-check-21.4.0.tgz#f875350a7062ac1b59ca35363fdeb7676527824f" + integrity sha512-X7Q0wAtQYXEHohLNI5L/Cg+jVAYqjAlJTg5n0vmGRe0clQKwtWK0lndLK6ok+aJkZwV2xyydD3ZNlBWNNgtE2A== + +"@react-native-firebase/app@^21.4.0": + version "21.4.0" + resolved "https://registry.yarnpkg.com/@react-native-firebase/app/-/app-21.4.0.tgz#c2ae775b717e517367abbbbe89f1516556832077" + integrity sha512-n3qwdxif/sAy983rSEFGFwfpZdQyCKT8E411BisHk7eDqwmFo9F+pEQRlHNffwVaN3NMFXjSBGF885XincIZhQ== + dependencies: + firebase "10.13.2" + superstruct "^0.6.2" + "@react-native-menu/menu@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@react-native-menu/menu/-/menu-1.1.2.tgz#972406d25296a0d01614dc36fae7884c2a08dafd" @@ -7299,6 +7702,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@>=12.12.47": + version "22.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== + dependencies: + undici-types "~6.20.0" + "@types/node@^12.12.54", "@types/node@^12.12.6", "@types/node@^12.7.1": version "12.20.55" resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" @@ -10147,9 +10557,9 @@ caniuse-lite@^1.0.30001646: integrity sha512-fgEc7hP/LB7iicdXHUI9VsBsMZmUmlVJeQP2qqQW+3lkqVhbmjEU8zp+h5stWeilX+G7uXuIUIIlWlDw9jdt8g== caniuse-lite@^1.0.30001669: - version "1.0.30001676" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz#fe133d41fe74af8f7cc93b8a714c3e86a86e6f04" - integrity sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw== + version "1.0.30001687" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz#d0ac634d043648498eedf7a3932836beba90ebae" + integrity sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ== carbites@^1.0.6: version "1.0.6" @@ -10410,6 +10820,16 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clone-deep@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ== + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.0" + shallow-clone "^1.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -11544,9 +11964,9 @@ electron-to-chromium@^1.5.4: integrity sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA== electron-to-chromium@^1.5.41: - version "1.5.50" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz#d9ba818da7b2b5ef1f3dd32bce7046feb7e93234" - integrity sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw== + version "1.5.72" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz#a732805986d3a5b5fedd438ddf4616c7d78ac2df" + integrity sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw== elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" @@ -12631,38 +13051,38 @@ expo-crypto@~13.0.2: base64-js "^1.3.0" expo-dev-client@~4.0.28: - version "4.0.28" - resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-4.0.28.tgz#3a345662ca2b2dfd7d0fa18e537cb75abd9a563c" - integrity sha512-wz5G4vY3Gbk5GuQTyijdqY4Hwr/NDt5OUTErbOu1vd4XRIAsI+8IkK5hsBUhGmqrdkYnP5NxxOxC/soFzX/9+w== + version "4.0.29" + resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-4.0.29.tgz#86683c584db6b787828b10e2a049f810a246441d" + integrity sha512-aANlw9dC4PJEPaRNpe+X5xwyYI+aCIcbZklAAsFlkv2/05gLrsvAFgmQpRtowAzF+VggHWde1eKUOeUccAYIEg== dependencies: - expo-dev-launcher "4.0.28" - expo-dev-menu "5.0.22" - expo-dev-menu-interface "1.8.3" + expo-dev-launcher "4.0.29" + expo-dev-menu "5.0.23" + expo-dev-menu-interface "1.8.4" expo-manifests "~0.14.0" expo-updates-interface "~0.16.2" -expo-dev-launcher@4.0.28: - version "4.0.28" - resolved "https://registry.yarnpkg.com/expo-dev-launcher/-/expo-dev-launcher-4.0.28.tgz#6097f4beb4d000bcc201f1b69dcd516e2b10247c" - integrity sha512-goE7jcaGVA2zu4gV3/hQ9RXqGhUZZAu339VYNLbwPdaNCzFaG6A8MZHg18gytCUnZ5QkRJsYi4q/8YcwUCASlQ== +expo-dev-launcher@4.0.29: + version "4.0.29" + resolved "https://registry.yarnpkg.com/expo-dev-launcher/-/expo-dev-launcher-4.0.29.tgz#c655d842802f696ad6a5e446c60d20c1e453d175" + integrity sha512-0a0SL8mc4FrqPeGxJHe9kf0kG+Di+38Gd+HP5DEL9dcOa8m2qffKnk22UcyujCT6+Qk0OUK1s53nnfqFB26uVw== dependencies: ajv "8.11.0" - expo-dev-menu "5.0.22" + expo-dev-menu "5.0.23" expo-manifests "~0.14.0" resolve-from "^5.0.0" semver "^7.6.0" -expo-dev-menu-interface@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/expo-dev-menu-interface/-/expo-dev-menu-interface-1.8.3.tgz#8c1262e29e0124fc5932a129c95b36de56656b20" - integrity sha512-QM0LRozeFT5Ek0N7XpV93M+HMdEKRLEOXn0aW5M3uoUlnqC1+PLtF3HMy3k3hMKTTE/kJ1y1Z7akH07T0lunCQ== +expo-dev-menu-interface@1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/expo-dev-menu-interface/-/expo-dev-menu-interface-1.8.4.tgz#fa23bf3228ea51cf412599fcb715c27259ffdd84" + integrity sha512-FpYI57EUu9qTSOOi+FZJ58xkCGJK7QD0mTiXK/y1I8lRdZGjCmdBqVvC4dAx2GcbIT78EPxaVf4/90tK/KRK6A== -expo-dev-menu@5.0.22: - version "5.0.22" - resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-5.0.22.tgz#30e16b6709759edb027e492fc96d262ee063b0c8" - integrity sha512-VzpdQReAtjbI1qIuwOf0sUzf91HsfGThojgJD9Ez0eca12qY5tTGYzHa1EM9V+zIcNuNZ7+A8bHJJdmZ4zvU6g== +expo-dev-menu@5.0.23: + version "5.0.23" + resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-5.0.23.tgz#7e6d6fd93c54ca955e8a69601a0b1991b64389b3" + integrity sha512-ztDvrSdFGkRbMoQlGLyKMS6CslMGylonVW4kQHUrBQApCL0c2NtRwLlr2bA1SXF0S7qYdPPg/ayLnj7DDR5X2w== dependencies: - expo-dev-menu-interface "1.8.3" + expo-dev-menu-interface "1.8.4" semver "^7.5.4" expo-device@~6.0.2: @@ -12844,11 +13264,11 @@ expo-splash-screen@0.27.5: "@expo/prebuild-config" "7.0.6" expo-splash-screen@~0.27.6: - version "0.27.6" - resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.27.6.tgz#d57f3f80d22f4ada90fd2edf573bbc148f956f67" - integrity sha512-joUwZQS48k3VMnucQ0Y8Dle1t1FyIvluQA4kjuPx2x7l2dRrfctbo34ahTnC0p1o2go5oN2iEnSTOElY4wRQHw== + version "0.27.7" + resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.27.7.tgz#52171be54d8c008880d928e802819d767fbd3c12" + integrity sha512-s+eGcG185878nixlrjhhLD6UDYrvoqBUaBkIEozBVWFg3pkdsKpONPiUAco4XR3h7I/9ODq4quN28RJLFO+s0Q== dependencies: - "@expo/prebuild-config" "7.0.8" + "@expo/prebuild-config" "7.0.9" expo-status-bar@~1.12.1: version "1.12.1" @@ -12907,14 +13327,14 @@ expo-web-browser@~13.0.3: integrity sha512-HXb7y82ApVJtqk8tManyudtTrCtx8xcUnVzmJECeHCB0SsWSQ+penVLZxJkcyATWoJOsFMnfVSVdrTcpKKGszQ== expo@~51.0.38: - version "51.0.38" - resolved "https://registry.yarnpkg.com/expo/-/expo-51.0.38.tgz#e4127b230454a34a507cfb9f1a2e4b3855cb0579" - integrity sha512-/B9npFkOPmv6WMIhdjQXEY0Z9k/67UZIVkodW8JxGIXwKUZAGHL+z1R5hTtWimpIrvVhyHUFU3f8uhfEKYhHNQ== + version "51.0.39" + resolved "https://registry.yarnpkg.com/expo/-/expo-51.0.39.tgz#d9efab081a91a0d3e925b0e4648722b13a8fceae" + integrity sha512-Cs/9xopyzJrpXWbyVUZnr37rprdFJorRgfSp6cdBfvbjxZeKnw2MEu7wJwV/s626i5lZTPGjZPHUF9uQvt51cg== dependencies: "@babel/runtime" "^7.20.0" - "@expo/cli" "0.18.30" + "@expo/cli" "0.18.31" "@expo/config" "9.0.4" - "@expo/config-plugins" "8.0.10" + "@expo/config-plugins" "8.0.11" "@expo/metro-config" "0.18.11" "@expo/vector-icons" "^14.0.3" babel-preset-expo "~11.0.15" @@ -13126,6 +13546,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +faye-websocket@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + fb-watchman@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" @@ -13299,6 +13726,39 @@ find-yarn-workspace-root@^2.0.0, find-yarn-workspace-root@~2.0.0: dependencies: micromatch "^4.0.2" +firebase@10.13.2: + version "10.13.2" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-10.13.2.tgz#f0adf725c74bf346386b4a50b7c00823028b13f9" + integrity sha512-YeI+TO5rJsoyZsVFx9WiN5ibdVCIigYTWwldRTMfCzrSPrJFVGao4acYj3x0EYGKDIgSgEyVBayD5BffD4Eyow== + dependencies: + "@firebase/analytics" "0.10.8" + "@firebase/analytics-compat" "0.2.14" + "@firebase/app" "0.10.11" + "@firebase/app-check" "0.8.8" + "@firebase/app-check-compat" "0.3.15" + "@firebase/app-compat" "0.2.41" + "@firebase/app-types" "0.9.2" + "@firebase/auth" "1.7.9" + "@firebase/auth-compat" "0.5.14" + "@firebase/database" "1.0.8" + "@firebase/database-compat" "1.0.8" + "@firebase/firestore" "4.7.2" + "@firebase/firestore-compat" "0.3.37" + "@firebase/functions" "0.11.8" + "@firebase/functions-compat" "0.3.14" + "@firebase/installations" "0.6.9" + "@firebase/installations-compat" "0.2.9" + "@firebase/messaging" "0.12.11" + "@firebase/messaging-compat" "0.2.11" + "@firebase/performance" "0.6.9" + "@firebase/performance-compat" "0.2.9" + "@firebase/remote-config" "0.4.9" + "@firebase/remote-config-compat" "0.2.9" + "@firebase/storage" "0.13.2" + "@firebase/storage-compat" "0.3.12" + "@firebase/util" "1.10.0" + "@firebase/vertexai-preview" "0.0.4" + flat-cache@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" @@ -13344,6 +13804,23 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g== + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg== + dependencies: + for-in "^1.0.1" + foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" @@ -14241,6 +14718,11 @@ http-https@^1.0.0: resolved "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz" integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" @@ -14377,6 +14859,11 @@ idb-keyval@^6.0.3, idb-keyval@^6.2.1: resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== +idb@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + identity-function@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/identity-function/-/identity-function-1.0.0.tgz#bea1159f0985239be3ca348edf40ce2f0dd2c21d" @@ -14930,7 +15417,7 @@ is-electron@^2.2.0: resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== -is-extendable@^0.1.0: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== @@ -16147,16 +16634,21 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsesc@^3.0.2, jsesc@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" @@ -16365,7 +16857,12 @@ keyvaluestorage-interface@^1.0.0: resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff" integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g== -kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.1, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -17595,6 +18092,14 @@ mipd@0.0.7, mipd@^0.0.7: resolved "https://registry.yarnpkg.com/mipd/-/mipd-0.0.7.tgz#bb5559e21fa18dc3d9fe1c08902ef14b7ce32fd9" integrity sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg== +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA== + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" @@ -19173,6 +19678,24 @@ protobufjs@^7.0.0, protobufjs@^7.1.2: "@types/node" ">=13.7.0" long "^5.0.0" +protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + protons-runtime@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/protons-runtime/-/protons-runtime-5.0.2.tgz#a262f69f962dc8709555f3282748de008c2934e9" @@ -19608,16 +20131,16 @@ react-native-image-viewing@^0.2.1: integrity sha512-osWieG+p/d2NPbAyonOMubttajtYEYiRGQaJA54slFxZ69j1V4/dCmcrVQry47ktVKy8/qpFwCpW1eT6MH5T2Q== react-native-ios-context-menu@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/react-native-ios-context-menu/-/react-native-ios-context-menu-2.5.2.tgz#a54a5a9848619f7a43e673ba4e6d119a76c99459" - integrity sha512-DlG/4uTaNqq2Gnz2bN2seLPyvZTptQ6UhftImvcVdsQyNqG9R9Bnmh4cD/JZVAyK732cyFgtFIE/EUXo0AstoQ== + version "2.5.1" + resolved "https://registry.yarnpkg.com/react-native-ios-context-menu/-/react-native-ios-context-menu-2.5.1.tgz#795a4722be706f39701f991ae455e105a141e900" + integrity sha512-Qt+0qeW/2x2Dc6aNUwsUR6BV0EozT5n2VNYIDKjdEQMF0xrN/o37p2+Oz6xhvWcA+15gAXqCbGq6omjPHLowRw== dependencies: "@dominicstop/ts-event-emitter" "^1.1.0" react-native-ios-utilities@^4.4.5: - version "4.5.1" - resolved "https://registry.yarnpkg.com/react-native-ios-utilities/-/react-native-ios-utilities-4.5.1.tgz#3d43f4fd3add5f0f6a2ff6c53f35c850226e2ead" - integrity sha512-A8PMME94PXv1Ui5WrTBcz69zVPAshvvIuYxJUkE09Nl1Ca6/ds6wCxys/A+KkNPtgeVCN7diBR/M5BTVnJbKDQ== + version "4.5.0" + resolved "https://registry.yarnpkg.com/react-native-ios-utilities/-/react-native-ios-utilities-4.5.0.tgz#c7d1b1d1b6b0b7c90ec9adf103c34ec0857f96e9" + integrity sha512-SslC5r+GSHijpaCOhp7043d+xzjwPf0qztcQqHv5LL5KftTUQN2HmByUEFJwjycDo1xzeH3SxKgtivtw/2Sj4w== react-native-is-edge-to-edge@^1.1.6: version "1.1.6" @@ -19625,9 +20148,9 @@ react-native-is-edge-to-edge@^1.1.6: integrity sha512-1pHnFTlBahins6UAajXUqeCOHew9l9C2C8tErnpGC3IyLJzvxD+TpYAixnCbrVS52f7+NvMttbiSI290XfwN0w== react-native-keyboard-controller@^1.13.4: - version "1.14.3" - resolved "https://registry.yarnpkg.com/react-native-keyboard-controller/-/react-native-keyboard-controller-1.14.3.tgz#283560a6dd1d4ca55ffbc26150cc74c3327338fd" - integrity sha512-E9yYD6Q6w+lCS0OFNXnWszoMlhcavdYJFMeYgmI5ydch3x8GtnQiNQwGhIATS2hxFbB1KY/TerVRxZBT+Zu5mQ== + version "1.14.5" + resolved "https://registry.yarnpkg.com/react-native-keyboard-controller/-/react-native-keyboard-controller-1.14.5.tgz#ec1e7d1fb8ee18b69ced4d8ddd6fd99bdaaf14bb" + integrity sha512-Cx7+SWI/P50i4PKJZN4T43RqoFkJ3GBoxjQ5ysrzZGoImHTF4j3atSwcBQGMmunKCem1yGOOQ84or+Vbcor6wQ== dependencies: react-native-is-edge-to-edge "^1.1.6" @@ -19652,9 +20175,9 @@ react-native-mmkv@^2.12.2: integrity sha512-6058Aq0p57chPrUutLGe9fYoiDVDNMU2PKV+lLFUJ3GhoHvUrLdsS1PDSCLr00yqzL4WJQ7TTzH+V8cpyrNcfg== react-native-otp-entry@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/react-native-otp-entry/-/react-native-otp-entry-1.7.3.tgz#16bc161eb9f30ab60840973fdaad629cb260e610" - integrity sha512-BN/oEpNMfA0cnw9tB9Oq6PZZQztOiq1Ow/M+rAFd0Nll9aO1gwfCwymgIGI89/+63FkmMbv39LcgsfkZNAYzWw== + version "1.8.1" + resolved "https://registry.yarnpkg.com/react-native-otp-entry/-/react-native-otp-entry-1.8.1.tgz#e9ee5df57cbd32580b23f55a6db5a37b991c11cd" + integrity sha512-uN5BZNzh5YkU9rNzUI1hFQxaz4R6PAVnDN+udB3fblt+XJgqTfVz+KEx8Z67/+Qga87m747oFysKOX1gI8UzLA== react-native-paper@^5.10.6: version "5.10.6" @@ -20211,15 +20734,15 @@ regexpu-core@^5.3.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regexpu-core@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" - integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.2.0" regjsgen "^0.8.0" - regjsparser "^0.11.0" + regjsparser "^0.12.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" @@ -20228,10 +20751,10 @@ regjsgen@^0.8.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== -regjsparser@^0.11.0: - version "0.11.2" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.2.tgz#7404ad42be00226d72bcf1f003f1f441861913d8" - integrity sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA== +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: jsesc "~3.0.2" @@ -20577,7 +21100,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -20824,6 +21347,15 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA== + dependencies: + is-extendable "^0.1.1" + kind-of "^5.0.0" + mixin-object "^2.0.1" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -21705,6 +22237,14 @@ superjson@^1.13.3: dependencies: copy-anything "^3.0.2" +superstruct@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.6.2.tgz#c5eb034806a17ff98d036674169ef85e4c7f6a1c" + integrity sha512-lvA97MFAJng3rfjcafT/zGTSWm6Tbpk++DP6It4Qg7oNaeM+2tdJMuVgGje21/bIpBEs6iQql1PJH6dKTjl4Ig== + dependencies: + clone-deep "^2.0.1" + kind-of "^6.0.1" + superstruct@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.3.tgz#de626a5b49c6641ff4d37da3c7598e7a87697046" @@ -22517,6 +23057,16 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +undici@6.19.7: + version "6.19.7" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.7.tgz#7d4cf26dc689838aa8b6753a3c5c4288fc1e0216" + integrity sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A== + undici@^5.8.1: version "5.22.1" resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b" @@ -22761,9 +23311,9 @@ use-context-selector@^2.0.0: integrity sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g== use-isomorphic-layout-effect@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.0.tgz#afb292eb284c39219e8cb8d3d62d71999361a21d" + integrity sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w== use-latest-callback@^0.1.5, use-latest-callback@^0.1.7: version "0.1.9" @@ -22784,9 +23334,9 @@ use-sync-external-store@1.2.0: integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== use-sync-external-store@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" - integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + version "1.4.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== utf-8-validate@^5.0.2: version "5.0.10" @@ -23478,6 +24028,20 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + websocket@^1.0.32: version "1.0.34" resolved "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz" @@ -23860,9 +24424,9 @@ xmlhttprequest-ssl@~2.0.0: integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== xstate@^5.18.2: - version "5.18.2" - resolved "https://registry.yarnpkg.com/xstate/-/xstate-5.18.2.tgz#924122af5102f3c3f7e172ebf20a09455ddb2963" - integrity sha512-hab5VOe29D0agy8/7dH1lGw+7kilRQyXwpaChoMu4fe6rDP+nsHYhDYKfS2O4iXE7myA98TW6qMEudj/8NXEkA== + version "5.19.0" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-5.19.0.tgz#619fdf00cef5de0552c4cb463fcba42ee482a149" + integrity sha512-Juh1MjeRaVWr1IRxXYvQMMRFMrei6vq6+AfP6Zk9D9YV0ZuvubN0aM6s2ITwUrq+uWtP1NTO8kOZmsM/IqeOiQ== xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2"