diff --git a/.github/scripts/compare-types/configs/analytics.ts b/.github/scripts/compare-types/configs/analytics.ts new file mode 100644 index 0000000000..a6d1069323 --- /dev/null +++ b/.github/scripts/compare-types/configs/analytics.ts @@ -0,0 +1,148 @@ +/** + * Known differences between the firebase-js-sdk public API and + * the @react-native-firebase/analytics modular API. + * + * Each entry must have a `name` and a `reason`. Undocumented drift fails CI. + */ + +import type { PackageConfig } from '../src/types'; + +const config: PackageConfig = { + nameMapping: {}, + + missingInRN: [ + { name: 'setCurrentScreen', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/analytics.' }, + { name: 'ControlParams', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/analytics.' }, + { name: 'CustomParams', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/analytics.' }, + ], + + extraInRN: [ + { name: 'logTransaction', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'setSessionTimeoutDuration', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for analytics.' }, + { name: 'getAppInstanceId', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for analytics.' }, + { name: 'getSessionId', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for analytics.' }, + { name: 'setUserProperty', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for analytics.' }, + { name: 'resetAnalyticsData', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for analytics.' }, + { name: 'logAddPaymentInfo', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logScreenView', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logAddShippingInfo', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logAddToCart', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logAddToWishlist', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logAppOpen', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logBeginCheckout', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logCampaignDetails', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logEarnVirtualCurrency', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logGenerateLead', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logJoinGroup', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logLevelEnd', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logLevelStart', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logLevelUp', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logLogin', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logPostScore', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logSelectContent', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logPurchase', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logRefund', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logRemoveFromCart', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logSearch', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logSelectItem', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logSetCheckoutOption', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logSelectPromotion', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logShare', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logSignUp', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logSpendVirtualCurrency', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logTutorialBegin', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logTutorialComplete', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logUnlockAchievement', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logViewCart', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logViewItem', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logViewItemList', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logViewPromotion', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'logViewSearchResults', reason: 'RN Firebase convenience method for a predefined Analytics event. The firebase-js-sdk modular API uses the generic `logEvent()` overloads instead.' }, + { name: 'initiateOnDeviceConversionMeasurementWithEmailAddress', reason: 'iOS-only on-device conversion measurement helper exposed by RN Firebase Analytics. No equivalent modular export exists in the firebase-js-sdk.' }, + { name: 'initiateOnDeviceConversionMeasurementWithHashedEmailAddress', reason: 'iOS-only on-device conversion measurement helper exposed by RN Firebase Analytics. No equivalent modular export exists in the firebase-js-sdk.' }, + { name: 'initiateOnDeviceConversionMeasurementWithPhoneNumber', reason: 'iOS-only on-device conversion measurement helper exposed by RN Firebase Analytics. No equivalent modular export exists in the firebase-js-sdk.' }, + { name: 'initiateOnDeviceConversionMeasurementWithHashedPhoneNumber', reason: 'iOS-only on-device conversion measurement helper exposed by RN Firebase Analytics. No equivalent modular export exists in the firebase-js-sdk.' }, + { name: 'AddPaymentInfoEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'AddShippingInfoParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'AddToCartEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'AddToWishlistEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'BeginCheckoutEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'CampaignDetailsEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'EarnVirtualCurrencyEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'GenerateLeadEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'JoinGroupEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'LevelEndEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'LevelStartEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'LevelUpEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'LoginEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'PostScoreEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'SelectContentEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'PurchaseEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'RefundEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'RemoveFromCartEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'SearchEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'SelectItemEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'SetCheckoutOptionEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'SelectPromotionEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'ShareEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'SignUpEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'SpendVirtualCurrencyEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'UnlockAchievementEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'ViewCartEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'ViewItemEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'ViewItemListEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'ViewPromotionEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'ViewSearchResultsParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'ScreenViewParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'SDK_VERSION', reason: 'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/analytics.' }, + { name: 'AddShippingInfoEventParameters', reason: 'RN Firebase re-exports this Analytics event parameter interface for convenience methods and typed `logEvent` overloads.' }, + { name: 'Statics', reason: 'RN Firebase statics namespace type used by the legacy namespaced API surface. Not part of the firebase-js-sdk modular public API.' }, + ], + + differentShape: [ + { + name: 'logEvent', + reason: + 'RN Firebase `logEvent` returns `Promise` and RN overloads omit the web `[key: string]: any` index signature on event params. ' + + 'Phase S hint: **Promise that could maybe sync-void+queue** (ordered native fire-and-forget; see PS-S2-gap).', + }, + { + name: 'setAnalyticsCollectionEnabled', + reason: + 'RN Firebase returns `Promise` whereas the firebase-js-sdk web modular API is synchronous. ' + + 'Phase S hint: **Promise that could maybe sync-void+queue** (see PS-S2-gap).', + }, + { + name: 'setConsent', + reason: + 'RN Firebase returns `Promise` whereas the firebase-js-sdk web modular API is synchronous. ' + + 'Phase S hint: **Promise that could maybe sync-void+queue** (see PS-S2-gap).', + }, + { + name: 'setDefaultEventParameters', + reason: + 'RN Firebase returns `Promise` whereas the firebase-js-sdk web modular API is synchronous. ' + + 'Phase S hint: **Promise that could maybe sync-void+queue** (see PS-S2-gap).', + }, + { + name: 'setUserId', + reason: + 'RN Firebase returns `Promise` whereas the firebase-js-sdk web modular API is synchronous. ' + + 'Phase S hint: **Promise that could maybe sync-void+queue** (see PS-S2-gap).', + }, + { + name: 'setUserProperties', + reason: + 'RN Firebase returns `Promise` whereas the firebase-js-sdk web modular API is synchronous. ' + + 'Phase S hint: **Promise that could maybe sync-void+queue** (see PS-S2-gap).', + }, + { name: 'Analytics', reason: 'RN Firebase extends the Analytics service interface with native bridge methods (collection toggles, predefined event helpers, and iOS on-device conversion measurement) that are not on the firebase-js-sdk web service type.' }, + { name: 'ConsentSettings', reason: 'RN Firebase maps most consent flags to native boolean toggles, while the firebase-js-sdk uses `ConsentStatusString` for web gtag consent modes.' }, + { name: 'Currency', reason: 'RN Firebase narrows Analytics currency values to `number` for native event payloads, while the firebase-js-sdk also allows string currency codes for web gtag events.' }, + { name: 'GtagConfigParams', reason: 'RN Firebase uses camelCase property names aligned with native Analytics settings instead of the quoted gtag config keys used by the web SDK.' }, + { name: 'Item', reason: 'RN Firebase event item/promotion shapes follow native Analytics parameter names and omit legacy web-only alias fields present in the firebase-js-sdk types.' }, + { name: 'Promotion', reason: 'RN Firebase event item/promotion shapes follow native Analytics parameter names and omit legacy web-only alias fields present in the firebase-js-sdk types.' }, + ], +}; + +export default config; diff --git a/.github/scripts/compare-types/configs/app-check.ts b/.github/scripts/compare-types/configs/app-check.ts index 78eabcf863..30f702ba3b 100644 --- a/.github/scripts/compare-types/configs/app-check.ts +++ b/.github/scripts/compare-types/configs/app-check.ts @@ -89,7 +89,8 @@ const config: PackageConfig = { { name: 'initializeAppCheck', reason: - 'RN Firebase returns `Promise` because App Check initialization crosses the native bridge, whereas the firebase-js-sdk returns `AppCheck` synchronously.', + 'RN Firebase returns `Promise` whereas the firebase-js-sdk returns `AppCheck` synchronously. ' + + 'Phase S hint: **Promise that could maybe sync-void+queue** after provider/refresh state is installed synchronously (see PS-S2-gap).', }, { name: 'AppCheckOptions', diff --git a/.github/scripts/compare-types/configs/app-distribution.ts b/.github/scripts/compare-types/configs/app-distribution.ts new file mode 100644 index 0000000000..0fad91589b --- /dev/null +++ b/.github/scripts/compare-types/configs/app-distribution.ts @@ -0,0 +1,31 @@ +/** + * Known differences between the firebase-js-sdk public API and + * the @react-native-firebase/app-distribution modular API. + * + * Each entry must have a `name` and a `reason`. Undocumented drift fails CI. + */ + +import type { PackageConfig } from '../src/types'; + +const config: PackageConfig = { + nameMapping: {}, + + missingInRN: [ + ], + + extraInRN: [ + { name: 'getAppDistribution', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'isTesterSignedIn', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'signInTester', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'checkForUpdate', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'signOutTester', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'SDK_VERSION', reason: 'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/app-distribution.' }, + { name: 'AppDistribution', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'AppDistributionRelease', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' }, + ], + + differentShape: [ + ], +}; + +export default config; diff --git a/.github/scripts/compare-types/configs/app.ts b/.github/scripts/compare-types/configs/app.ts new file mode 100644 index 0000000000..55e1f5b27a --- /dev/null +++ b/.github/scripts/compare-types/configs/app.ts @@ -0,0 +1,144 @@ +/** + * Known differences between firebase-js-sdk @firebase/app and + * @react-native-firebase/app modular API. + * + * Each entry must have a `name` and a `reason`. Any undocumented + * difference or stale entry will fail `yarn compare:types`. + */ + +import type { PackageConfig } from '../src/types'; + +const config: PackageConfig = { + nameMapping: {}, + + missingInRN: [ + { + name: 'initializeServerApp', + reason: + 'firebase-js-sdk server-side rendering entry point. Not applicable to React Native.', + }, + { + name: 'FirebaseAppSettings', + reason: + 'Settings type for firebase-js-sdk `FirebaseServerApp`. RN Firebase has no server-app API.', + }, + { + name: 'FirebaseError', + reason: + 'firebase-js-sdk base error class. RN Firebase uses `ReactNativeFirebase.NativeFirebaseError` from the native bridge instead.', + }, + { + name: 'FirebaseOptions', + reason: + 'firebase-js-sdk options interface. RN Firebase uses `ReactNativeFirebase.FirebaseAppOptions` (extends the same fields with RN-specific optional keys).', + }, + { + name: 'FirebaseServerApp', + reason: + 'firebase-js-sdk server-side app instance type. Not applicable to React Native.', + }, + { + name: 'FirebaseServerAppSettings', + reason: + 'Settings type for firebase-js-sdk server apps. Not applicable to React Native.', + }, + ], + + extraInRN: [ + { + name: 'setReactNativeAsyncStorage', + reason: + 'RN Firebase-specific hook to wire `@react-native-async-storage/async-storage` into the firebase-js-sdk Other/Hermes persistence path.', + }, + { + name: 'metaGetAll', + reason: + 'RN Firebase native bridge helper — reads all entries from the native Firebase metadata store.', + }, + { + name: 'jsonGetAll', + reason: + 'RN Firebase native bridge helper — reads all entries from the native JSON config store.', + }, + { + name: 'preferencesClearAll', + reason: + 'RN Firebase native bridge helper — clears native shared preferences used by Firebase.', + }, + { + name: 'preferencesGetAll', + reason: + 'RN Firebase native bridge helper — reads all native shared preference entries.', + }, + { + name: 'preferencesSetBool', + reason: + 'RN Firebase native bridge helper — sets a native boolean preference.', + }, + { + name: 'preferencesSetString', + reason: + 'RN Firebase native bridge helper — sets a native string preference.', + }, + { + name: 'getUtils', + reason: + 'RN Firebase entry point for the native Utils module (Play Services, file paths, etc.). No firebase-js-sdk modular equivalent.', + }, + { + name: 'FilePath', + reason: + 'RN Firebase native device file-path constants for Storage and similar file-based APIs.', + }, + { + name: 'LogCallbackParams', + reason: + 'RN Firebase log-handler callback payload type exported for modular `setLogLevel` wiring.', + }, + { + name: 'LogCallback', + reason: + 'RN Firebase log-handler callback type exported for modular logging configuration.', + }, + { + name: 'LogOptions', + reason: + 'RN Firebase log-handler options type exported for modular logging configuration.', + }, + ], + + differentShape: [ + { + name: 'deleteApp', + reason: + 'Parameter type is `ReactNativeFirebase.FirebaseApp` instead of firebase-js-sdk `FirebaseApp`. Runtime behavior matches.', + }, + { + name: 'getApp', + reason: + 'Return type is `ReactNativeFirebase.FirebaseApp` instead of firebase-js-sdk `FirebaseApp`. Runtime behavior matches.', + }, + { + name: 'getApps', + reason: + 'Return type is `ReactNativeFirebase.FirebaseApp[]` instead of firebase-js-sdk `FirebaseApp[]`. Runtime behavior matches.', + }, + { + name: 'initializeApp', + reason: + 'Returns `Promise` because initialization crosses the native bridge. Accepts `ReactNativeFirebase.FirebaseAppOptions` and optional `ReactNativeFirebase.FirebaseAppConfig` (name / auth domain) instead of firebase-js-sdk `(FirebaseOptions, string)` only.', + }, + { + name: 'setLogLevel', + reason: + 'Parameter type is `ReactNativeFirebase.LogLevelString` instead of firebase-js-sdk `LogLevelString`. Accepted values match (`debug`, `verbose`, `info`, `warn`, `error`, `silent`).', + }, + { + name: 'FirebaseApp', + reason: + 'RN Firebase exports the `ReactNativeFirebase.FirebaseApp` class/interface from shared app declarations instead of re-exporting firebase-js-sdk `FirebaseApp`.', + }, + ], +}; + +export default config; diff --git a/.github/scripts/compare-types/configs/auth.ts b/.github/scripts/compare-types/configs/auth.ts index 34ebdb00f5..1d1c8916d5 100644 --- a/.github/scripts/compare-types/configs/auth.ts +++ b/.github/scripts/compare-types/configs/auth.ts @@ -204,11 +204,6 @@ const config: PackageConfig = { reason: 'RN Firebase modular UserCredential includes optional enumerable additionalUserInfo (firebase-js-sdk core fields plus preserved native bridge keys). firebase-js-sdk keeps additionalUserInfo off the public UserCredential interface — use getAdditionalUserInfo there.', }, - { - name: 'isSignInWithEmailLink', - reason: - 'iOS/Android: Promise via native bridge. Other/All: not aligned yet; firebase-js-sdk synchronous boolean is possible on Other/Hermes and Other/Web.', - }, { name: 'linkWithRedirect', reason: @@ -241,8 +236,7 @@ const config: PackageConfig = { }, { name: 'TotpSecret', - reason: - 'iOS/Android: generateQrCodeUrl is Promise via native bridge; openInOtpApp is an RN-only helper. Other/All: js-sdk synchronous generateQrCodeUrl is possible when MFA is supported on Other.', + reason: 'RN Firebase extension: openInOtpApp is an RN-only helper.', }, { name: 'User', diff --git a/.github/scripts/compare-types/configs/crashlytics.ts b/.github/scripts/compare-types/configs/crashlytics.ts new file mode 100644 index 0000000000..799b39950e --- /dev/null +++ b/.github/scripts/compare-types/configs/crashlytics.ts @@ -0,0 +1,39 @@ +/** + * Known differences between the firebase-js-sdk public API and + * the @react-native-firebase/crashlytics modular API. + * + * Each entry must have a `name` and a `reason`. Undocumented drift fails CI. + */ + +import type { PackageConfig } from '../src/types'; + +const config: PackageConfig = { + nameMapping: {}, + + missingInRN: [ + ], + + extraInRN: [ + { name: 'getCrashlytics', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'checkForUnsentReports', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'deleteUnsentReports', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'didCrashOnPreviousExecution', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'crash', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'log', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'recordError', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'sendUnsentReports', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'setUserId', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'setAttribute', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'setAttributes', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'setCrashlyticsCollectionEnabled', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'SDK_VERSION', reason: 'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/crashlytics.' }, + { name: 'Crashlytics', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'Statics', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'FirebaseApp', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' }, + ], + + differentShape: [ + ], +}; + +export default config; diff --git a/.github/scripts/compare-types/configs/empty-sdk.d.ts b/.github/scripts/compare-types/configs/empty-sdk.d.ts new file mode 100644 index 0000000000..432525b1cc --- /dev/null +++ b/.github/scripts/compare-types/configs/empty-sdk.d.ts @@ -0,0 +1,2 @@ +// Intentionally empty — RN-only Firebase products have no firebase-js-sdk modular API to compare. +export {}; diff --git a/.github/scripts/compare-types/configs/firestore.ts b/.github/scripts/compare-types/configs/firestore.ts index d95eb73c1a..9e365659c9 100644 --- a/.github/scripts/compare-types/configs/firestore.ts +++ b/.github/scripts/compare-types/configs/firestore.ts @@ -273,26 +273,25 @@ const config: PackageConfig = { name: 'deleteAllPersistentCacheIndexes', reason: 'Returns `Promise` in RN Firebase vs `void` in the firebase-js-sdk. ' + - 'The RN implementation is async because it delegates to the native module.', + 'Phase S hint: **keep-async: deferred persistent-cache IO** (web void schedules disk/index work; see PS-S2-gap).', }, { name: 'disablePersistentCacheIndexAutoCreation', reason: 'Returns `Promise` in RN Firebase vs `void` in the firebase-js-sdk. ' + - 'The RN implementation is async because it delegates to the native module.', + 'Phase S hint: **keep-async: deferred persistent-cache IO** (see PS-S2-gap).', }, { name: 'enablePersistentCacheIndexAutoCreation', reason: 'Returns `Promise` in RN Firebase vs `void` in the firebase-js-sdk. ' + - 'The RN implementation is async because it delegates to the native module.', + 'Phase S hint: **keep-async: deferred persistent-cache IO** (see PS-S2-gap).', }, { name: 'initializeFirestore', reason: - 'Returns `Promise` in RN Firebase vs `Firestore` in the ' + - 'firebase-js-sdk. The RN implementation is async because it initialises ' + - 'the native Firestore module.', + 'Returns `Promise` in RN Firebase vs `Firestore` in the firebase-js-sdk. ' + + 'Phase S hint: **Promise that could maybe sync-void+gate** (in-memory settings visible before return; see PS-S2-gap).', }, { name: 'onSnapshotsInSync', diff --git a/.github/scripts/compare-types/configs/functions.ts b/.github/scripts/compare-types/configs/functions.ts new file mode 100644 index 0000000000..e879aac2eb --- /dev/null +++ b/.github/scripts/compare-types/configs/functions.ts @@ -0,0 +1,34 @@ +/** + * Known differences between the firebase-js-sdk public API and + * the @react-native-firebase/functions modular API. + * + * Each entry must have a `name` and a `reason`. Undocumented drift fails CI. + */ + +import type { PackageConfig } from '../src/types'; + +const config: PackageConfig = { + nameMapping: { + httpsCallableFromURL: 'httpsCallableFromUrl', + }, + + missingInRN: [ + { name: 'FunctionsError', reason: 'RN Firebase surfaces callable failures through the `HttpsError` class instead of the firebase-js-sdk `FunctionsError` export.' }, + { name: 'FunctionsErrorCodeCore', reason: 'Internal firebase-js-sdk error-code helper not re-exported by RN Firebase. Callable errors use `HttpsErrorCode` constants instead.' }, + ], + + extraInRN: [ + { name: 'HttpsErrorCode', reason: 'RN Firebase exposes callable error code constants as a standalone export. The firebase-js-sdk surfaces these through the `FunctionsErrorCode` enum instead.' }, + { name: 'SDK_VERSION', reason: 'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/functions.' }, + { name: 'HttpsError', reason: 'RN Firebase re-exports the callable `HttpsError` class from its modular entry point for ergonomic imports.' }, + { name: 'FunctionsStatics', reason: 'RN Firebase statics namespace type used by the legacy namespaced API surface. Not part of the firebase-js-sdk modular public API.' }, + { name: 'FirebaseApp', reason: 'RN Firebase re-exports `FirebaseApp` from the modular entry point for convenience.' }, + ], + + differentShape: [ + { name: 'Functions', reason: 'RN Firebase extends the Functions service interface with native region/custom-domain helpers and uses async callable factories.' }, + { name: 'FunctionsErrorCode', reason: 'RN Firebase `FunctionsErrorCode` enum includes additional native bridge error codes beyond the firebase-js-sdk set.' }, + ], +}; + +export default config; diff --git a/.github/scripts/compare-types/configs/in-app-messaging.ts b/.github/scripts/compare-types/configs/in-app-messaging.ts new file mode 100644 index 0000000000..0df02b98d9 --- /dev/null +++ b/.github/scripts/compare-types/configs/in-app-messaging.ts @@ -0,0 +1,31 @@ +/** + * Known differences between the firebase-js-sdk public API and + * the @react-native-firebase/in-app-messaging modular API. + * + * Each entry must have a `name` and a `reason`. Undocumented drift fails CI. + */ + +import type { PackageConfig } from '../src/types'; + +const config: PackageConfig = { + nameMapping: {}, + + missingInRN: [ + ], + + extraInRN: [ + { name: 'getInAppMessaging', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'isMessagesDisplaySuppressed', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'setMessagesDisplaySuppressed', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'isAutomaticDataCollectionEnabled', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'setAutomaticDataCollectionEnabled', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'triggerEvent', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'SDK_VERSION', reason: 'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/in-app-messaging.' }, + { name: 'InAppMessaging', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' }, + ], + + differentShape: [ + ], +}; + +export default config; diff --git a/.github/scripts/compare-types/configs/messaging.ts b/.github/scripts/compare-types/configs/messaging.ts new file mode 100644 index 0000000000..54bd7ca1e3 --- /dev/null +++ b/.github/scripts/compare-types/configs/messaging.ts @@ -0,0 +1,76 @@ +/** + * Known differences between the firebase-js-sdk public API and + * the @react-native-firebase/messaging modular API. + * + * Each entry must have a `name` and a `reason`. Undocumented drift fails CI. + */ + +import type { PackageConfig } from '../src/types'; + +const config: PackageConfig = { + nameMapping: {}, + + missingInRN: [ + { name: 'onRegistered', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + { name: 'onUnregistered', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + { name: 'register', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + { name: 'unregister', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + { name: 'MessagePayload', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + { name: 'NextFn', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + { name: 'NotificationPayload', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + { name: 'Observer', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + { name: 'RegisterOptions', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + { name: 'Unsubscribe', reason: 'Export from the firebase-js-sdk modular API that is intentionally absent from @react-native-firebase/messaging.' }, + ], + + extraInRN: [ + { name: 'onNotificationOpenedApp', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'onTokenRefresh', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'requestPermission', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'isAutoInitEnabled', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'setAutoInitEnabled', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'getInitialNotification', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'getDidOpenSettingsForNotification', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'getIsHeadless', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'registerDeviceForRemoteMessages', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'isDeviceRegisteredForRemoteMessages', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'unregisterDeviceForRemoteMessages', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'getAPNSToken', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'setAPNSToken', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'hasPermission', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'onDeletedMessages', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'onMessageSent', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'onSendError', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'setBackgroundMessageHandler', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'setOpenSettingsForNotificationsHandler', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'sendMessage', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'subscribeToTopic', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'unsubscribeFromTopic', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'isDeliveryMetricsExportToBigQueryEnabled', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'isNotificationDelegationEnabled', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'setNotificationDelegationEnabled', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'experimentalSetDeliveryMetricsExportedToBigQueryEnabled', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'SDK_VERSION', reason: 'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/messaging.' }, + { name: 'AuthorizationStatus', reason: 'RN Firebase re-exports this Messaging constant enum from the modular entry point for convenience.' }, + { name: 'NotificationAndroidPriority', reason: 'RN Firebase re-exports this Messaging constant enum from the modular entry point for convenience.' }, + { name: 'NotificationAndroidVisibility', reason: 'RN Firebase re-exports this Messaging constant enum from the modular entry point for convenience.' }, + { name: 'RemoteMessage', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'MessagePriority', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'NativeTokenOptions', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'Notification', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'NotificationIOSCriticalSound', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'IOSPermissions', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + { name: 'SendErrorEvent', reason: 'RN Firebase-specific export with no equivalent on the firebase-js-sdk modular public API for messaging.' }, + ], + + differentShape: [ + { name: 'deleteToken', reason: 'Export shares a name with the firebase-js-sdk but has a different public shape in @react-native-firebase/messaging.' }, + { name: 'getToken', reason: 'Export shares a name with the firebase-js-sdk but has a different public shape in @react-native-firebase/messaging.' }, + { name: 'isSupported', reason: 'Export shares a name with the firebase-js-sdk but has a different public shape in @react-native-firebase/messaging.' }, + { name: 'onMessage', reason: 'Export shares a name with the firebase-js-sdk but has a different public shape in @react-native-firebase/messaging.' }, + { name: 'GetTokenOptions', reason: 'Export shares a name with the firebase-js-sdk but has a different public shape in @react-native-firebase/messaging.' }, + { name: 'Messaging', reason: 'RN Firebase extends the Messaging service interface with native FCM APIs (token lifecycle, permissions, background handlers) beyond the firebase-js-sdk web push surface.' }, + ], +}; + +export default config; diff --git a/.github/scripts/compare-types/configs/ml.ts b/.github/scripts/compare-types/configs/ml.ts new file mode 100644 index 0000000000..4734b7fe9c --- /dev/null +++ b/.github/scripts/compare-types/configs/ml.ts @@ -0,0 +1,27 @@ +/** + * Known differences between the firebase-js-sdk public API and + * the @react-native-firebase/ml modular API. + * + * Each entry must have a `name` and a `reason`. Undocumented drift fails CI. + */ + +import type { PackageConfig } from '../src/types'; + +const config: PackageConfig = { + nameMapping: {}, + + missingInRN: [ + ], + + extraInRN: [ + { name: 'getML', reason: 'RN Firebase export for the native ml module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'SDK_VERSION', reason: 'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/ml.' }, + { name: 'FirebaseApp', reason: 'RN Firebase export for the native ml module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'FirebaseML', reason: 'RN Firebase export for the native ml module. The firebase-js-sdk does not ship a modular public API for this product.' }, + ], + + differentShape: [ + ], +}; + +export default config; diff --git a/.github/scripts/compare-types/configs/perf-config.ts b/.github/scripts/compare-types/configs/perf-config.ts index f0284e7518..0cbf941994 100644 --- a/.github/scripts/compare-types/configs/perf-config.ts +++ b/.github/scripts/compare-types/configs/perf-config.ts @@ -62,9 +62,9 @@ const config: PackageConfig = { { name: 'PerformanceTrace', reason: - 'React Native uses async `start`/`stop` (`Promise`) because work crosses the native bridge. ' + - 'The web SDK uses synchronous `start`/`stop` and exposes `record()`. RN Firebase exposes ' + - '`getMetrics` and `removeMetric` for native-backed custom metrics instead of the web shape.', + 'React Native uses synchronous `start`/`stop` (in-memory native calls via TurboModules), matching ' + + 'the firebase-js-sdk web `start`/`stop`. The web SDK additionally exposes `record()`, while RN Firebase ' + + 'exposes `getMetrics` and `removeMetric` for native-backed custom metrics instead.', }, ], }; diff --git a/.github/scripts/compare-types/configs/phone-number-verification.ts b/.github/scripts/compare-types/configs/phone-number-verification.ts new file mode 100644 index 0000000000..6f5217f72d --- /dev/null +++ b/.github/scripts/compare-types/configs/phone-number-verification.ts @@ -0,0 +1,33 @@ +/** + * Known differences between the firebase-js-sdk public API and + * the @react-native-firebase/phone-number-verification modular API. + * + * Each entry must have a `name` and a `reason`. Undocumented drift fails CI. + */ + +import type { PackageConfig } from '../src/types'; + +const config: PackageConfig = { + nameMapping: {}, + + missingInRN: [ + ], + + extraInRN: [ + { name: 'enableTestSession', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'getVerificationSupportInfo', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'getVerifiedPhoneNumber', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'getDigitalCredentialPayload', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'exchangeCredentialResponseForPhoneNumber', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'PnvErrorCode', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'VerificationSupportStatus', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'VerificationSupportResult', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'VerifiedPhoneNumberTokenResult', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + { name: 'PnvError', reason: 'RN Firebase export for the native phone-number-verification module. The firebase-js-sdk does not ship a modular public API for this product.' }, + ], + + differentShape: [ + ], +}; + +export default config; diff --git a/.github/scripts/compare-types/configs/storage.ts b/.github/scripts/compare-types/configs/storage.ts index 1b10da1c2a..4b9f18bbd4 100644 --- a/.github/scripts/compare-types/configs/storage.ts +++ b/.github/scripts/compare-types/configs/storage.ts @@ -54,14 +54,16 @@ const config: PackageConfig = { reason: 'RN Firebase-specific function for setting the maximum retry time for ' + 'non-upload/download operations on Android and iOS. The firebase-js-sdk ' + - 'exposes this as a writable property on the `FirebaseStorage` instance.', + 'exposes this as a writable property on the `FirebaseStorage` instance. ' + + 'Phase S hint: **Promise that could maybe sync-void+queue** (sync JS field + native setter; see PS-S2-gap).', }, { name: 'setMaxUploadRetryTime', reason: 'RN Firebase-specific function for setting the maximum upload retry time ' + 'on Android and iOS. The firebase-js-sdk exposes this as a writable property ' + - 'on the `FirebaseStorage` instance.', + 'on the `FirebaseStorage` instance. ' + + 'Phase S hint: **Promise that could maybe sync-void+queue** (see PS-S2-gap).', }, { name: 'setMaxDownloadRetryTime', @@ -144,9 +146,9 @@ const config: PackageConfig = { name: 'UploadTask', reason: 'RN Firebase returns `Promise` from `cancel()`, `pause()`, and ' + - '`resume()` to communicate asynchronously with the native iOS/Android modules, ' + - 'whereas the firebase-js-sdk returns a synchronous `boolean`. Error callback ' + - 'types also use `NativeFirebaseError` instead of `StorageError`.', + '`resume()` whereas the firebase-js-sdk returns a synchronous `boolean`. ' + + 'Error callback types also use `NativeFirebaseError` instead of `StorageError`. ' + + 'Phase S hint: **convert after native fix** (sync boolean from native task state; see PS-S2-gap).', }, { name: 'EmulatorMockTokenOptions', diff --git a/.github/scripts/compare-types/src/registry.ts b/.github/scripts/compare-types/src/registry.ts index be1e1ac19c..46afeb98c7 100644 --- a/.github/scripts/compare-types/src/registry.ts +++ b/.github/scripts/compare-types/src/registry.ts @@ -21,8 +21,18 @@ import remoteConfigConfig from '../configs/remote-config'; import authConfig from '../configs/auth'; import installationsConfig from '../configs/installations'; import perfConfig from '../configs/perf-config'; +import appConfig from '../configs/app'; +import analyticsConfig from '../configs/analytics'; +import crashlyticsConfig from '../configs/crashlytics'; +import inAppMessagingConfig from '../configs/in-app-messaging'; +import appDistributionConfig from '../configs/app-distribution'; +import mlConfig from '../configs/ml'; +import functionsConfig from '../configs/functions'; +import messagingConfig from '../configs/messaging'; +import phoneNumberVerificationConfig from '../configs/phone-number-verification'; const REPO_ROOT = path.resolve(__dirname, '..', '..', '..', '..'); +const EMPTY_SDK_PATH = path.join(__dirname, '..', 'configs', 'empty-sdk.d.ts'); export interface PackageEntry { /** Short name used in reports (e.g. "remote-config"). */ @@ -102,7 +112,30 @@ function optionalFirebasePackage( return typesPath ? [createEntry(typesPath)] : []; } +function rnOnlyPackage( + entry: Omit, +): PackageEntry { + return { + ...entry, + firebaseSdkTypesPaths: [EMPTY_SDK_PATH], + }; +} + export const packages: PackageEntry[] = [ + { + name: 'app', + firebaseSdkTypesPaths: [requiredFirebaseTypes('app')], + rnFirebaseModularFiles: [ + path.join(rnDist('app'), 'modular.d.ts'), + path.join(rnDist('app'), 'index.d.ts'), + ], + rnFirebaseSupportFiles: [ + path.join(rnDist('app'), 'types', 'app.d.ts'), + path.join(rnDist('app'), 'types', 'internal.d.ts'), + path.join(rnDist('app'), 'FirebaseApp.d.ts'), + ], + config: appConfig, + }, { name: 'auth', firebaseSdkTypesPaths: [requiredFirebaseTypes('auth')], @@ -298,4 +331,96 @@ export const packages: PackageEntry[] = [ rnFirebaseSupportFiles: [], config: perfConfig, }, + { + name: 'analytics', + firebaseSdkTypesPaths: [requiredFirebaseTypes('analytics')], + rnFirebaseModularFiles: [ + path.join(rnDist('analytics'), 'index.d.ts'), + path.join(rnDist('analytics'), 'types', 'analytics.d.ts'), + ], + rnFirebaseSupportFiles: [ + path.join(rnDist('analytics'), 'types', 'internal.d.ts'), + path.join(rnDist('analytics'), 'structs.d.ts'), + path.join(rnDist('analytics'), 'struct.d.ts'), + ], + config: analyticsConfig, + }, + rnOnlyPackage({ + name: 'crashlytics', + rnFirebaseModularFiles: [ + path.join(rnDist('crashlytics'), 'index.d.ts'), + path.join(rnDist('crashlytics'), 'types', 'crashlytics.d.ts'), + ], + rnFirebaseSupportFiles: [ + path.join(rnDist('crashlytics'), 'handlers.d.ts'), + path.join(rnDist('crashlytics'), 'types', 'internal.d.ts'), + ], + config: crashlyticsConfig, + }), + rnOnlyPackage({ + name: 'in-app-messaging', + rnFirebaseModularFiles: [ + path.join(rnDist('in-app-messaging'), 'index.d.ts'), + path.join(rnDist('in-app-messaging'), 'types', 'in-app-messaging.d.ts'), + ], + rnFirebaseSupportFiles: [ + path.join(rnDist('in-app-messaging'), 'types', 'internal.d.ts'), + ], + config: inAppMessagingConfig, + }), + rnOnlyPackage({ + name: 'app-distribution', + rnFirebaseModularFiles: [ + path.join(rnDist('app-distribution'), 'index.d.ts'), + path.join(rnDist('app-distribution'), 'types', 'app-distribution.d.ts'), + ], + rnFirebaseSupportFiles: [ + path.join(rnDist('app-distribution'), 'types', 'internal.d.ts'), + ], + config: appDistributionConfig, + }), + rnOnlyPackage({ + name: 'ml', + rnFirebaseModularFiles: [ + path.join(rnDist('ml'), 'index.d.ts'), + path.join(rnDist('ml'), 'types', 'ml.d.ts'), + ], + rnFirebaseSupportFiles: [path.join(rnDist('ml'), 'types', 'internal.d.ts')], + config: mlConfig, + }), + { + name: 'functions', + firebaseSdkTypesPaths: [requiredFirebaseTypes('functions')], + rnFirebaseModularFiles: [ + path.join(rnDist('functions'), 'index.d.ts'), + path.join(rnDist('functions'), 'types', 'functions.d.ts'), + ], + rnFirebaseSupportFiles: [ + path.join(rnDist('functions'), 'HttpsError.d.ts'), + path.join(rnDist('functions'), 'types', 'internal.d.ts'), + ], + config: functionsConfig, + }, + { + name: 'messaging', + firebaseSdkTypesPaths: [requiredFirebaseTypes('messaging')], + rnFirebaseModularFiles: [ + path.join(rnDist('messaging'), 'index.d.ts'), + path.join(rnDist('messaging'), 'types', 'messaging.d.ts'), + ], + rnFirebaseSupportFiles: [ + path.join(rnDist('messaging'), 'statics.d.ts'), + path.join(rnDist('messaging'), 'remoteMessageOptions.d.ts'), + path.join(rnDist('messaging'), 'types', 'internal.d.ts'), + ], + config: messagingConfig, + }, + rnOnlyPackage({ + name: 'phone-number-verification', + rnFirebaseModularFiles: [path.join(rnDist('phone-number-verification'), 'index.d.ts')], + rnFirebaseSupportFiles: [ + path.join(rnDist('phone-number-verification'), 'types', 'pnv.d.ts'), + ], + config: phoneNumberVerificationConfig, + }), ]; diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 622ec0d130..fc1bc75bbb 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -62,6 +62,14 @@ jobs: retry_wait_seconds: 10 max_attempts: 3 command: yarn lint + - name: Codegen verify + # https://github.com/nick-fields/retry/releases + uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v4.0.0 + with: + timeout_minutes: 10 + retry_wait_seconds: 10 + max_attempts: 3 + command: yarn codegen:verify # https://github.com/actions/cache/releases - uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 name: Yarn Cache Save diff --git a/.github/workflows/scripts/resource-monitor.sh b/.github/workflows/scripts/resource-monitor.sh old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore index c405f67dec..074c95edb1 100644 --- a/.gitignore +++ b/.gitignore @@ -547,6 +547,24 @@ tests/ios/resetXcode.sh google-services.json GoogleService-Info.plist +tests/harness.overrides.js + +# RNFB TurboModule codegen — misplaced iOS provider stubs under Android output paths +# (NewArch-AD-5: okf-bundle/new-architecture/architecture-decisions.md — commit generated +# code: real Android artifacts are Java specs + JNI/CMake under packages/*/android/**/generated; +# real iOS artifacts are ObjC/JSI/podspecs under packages/*/ios/generated, guarded by +# codegen:verify per NewArch-AD-17.3.) +# +# `@react-native-community/cli codegen --platform android` also writes iOS-only +# dependency-provider templates (RCT*Provider ObjC++, ReactAppDependencyProvider.podspec) +# into each package's Android --outputPath. The Android Gradle build does not compile or +# reference them; pilots commit the same templates under ios/generated/ only. Observed when +# pinned to React Native 0.78.3 — re-check on RN upgrades; codegen may stop emitting these +# here or change output layout. +packages/*/android/**/generated/RCT*Provider.h +packages/*/android/**/generated/RCT*Provider.mm +packages/*/android/**/generated/ReactAppDependencyProvider.podspec + # generated files RNFBVersion.m ReactNativeFirebaseVersion.java diff --git a/.spellcheck.dict.txt b/.spellcheck.dict.txt index 5e4d76e1cb..4d7ed610e2 100644 --- a/.spellcheck.dict.txt +++ b/.spellcheck.dict.txt @@ -235,6 +235,9 @@ TOTP triaging TurboModule TurboModules +Codegen +IndexedDB +pre-v26 typings TypeDoc UI diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a8f39c6c51..f5fae299ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -82,6 +82,18 @@ Working on your first Pull Request? You can learn how from this _free_ series, [ - Name your native code methods the same as the JS method name - e.g. the Android (`@ReactMethod`) implementation of `signInWithEmailAndPassword()` is named `signInWithEmailAndPassword` +### Updating React Native (or the Codegen toolchain) + +The New Architecture commits generated native code (CMake files, podspecs, JSI/spec C++/Java) under `packages/*/**/generated/`. These artifacts are **RN-version-specific templates**, so a React Native bump is a **coordinated breaking change**, not a routine dependency update. Do it in one change: + +1. **Bump the app RN and the pins together.** Update `tests/package.json` (`react-native`, `react-native-macos`) **and** the root `package.json` `resolutions` (`react-native`, `@react-native/codegen`, `@react-native-community/cli`) to the new line. Keep them equal — never let the root/codegen toolchain float ahead of the app (`latest`, `*`, `^x.y` are forbidden for the RN toolchain). Individual packages must not declare their own `react-native` devDependency. +2. `yarn install` and verify no stray RN versions remain: `node -e "console.log(require('react-native/package.json').version)"` at the repo root and in `tests/` should both report the new version; `rg 'react-native@npm:' yarn.lock` should show only the pinned line(s) (plus `react-native-macos`). +3. **Regenerate all native artifacts:** `yarn codegen:all`, then review the diff — macro/podspec/JSI churn is expected on an RN bump. +4. **Rebuild native on both platforms** (iOS + Android) and run the e2e suite; generated changes only take effect after a native rebuild. +5. `yarn codegen:verify` must pass (it re-runs codegen and fails on any drift). If it flags drift on an unchanged RN, the toolchain is mis-pinned — fix the pins, do not commit the drift. + +See [NewArch-AD-20](okf-bundle/new-architecture/architecture-decisions.md#newarch-ad-20--pin-the-rncodegen-toolchain-rn-bumps-are-coordinated-breaking-changes--accepted) for the rationale. + --- ## Local Setup diff --git a/docs/ai/usage/index.mdx b/docs/ai/usage/index.mdx index eb0bcc3204..2f0d988649 100644 --- a/docs/ai/usage/index.mdx +++ b/docs/ai/usage/index.mdx @@ -18,6 +18,13 @@ yarn add @react-native-firebase/app yarn add @react-native-firebase/ai ``` +# Platform support + +| | | +| -------------------- | ---------------------------------------------------------------------- | +| **Platforms** | Android, iOS, Web (firebase-js-sdk interop) | +| **New Architecture** | **Not required** — pure JavaScript package with no native TurboModule. | + # What does it do Firebase AI Logic gives you access to the latest generative AI models from Google. diff --git a/docs/analytics/usage/index.mdx b/docs/analytics/usage/index.mdx index 6ef12a380c..089fe7fb4e 100644 --- a/docs/analytics/usage/index.mdx +++ b/docs/analytics/usage/index.mdx @@ -24,6 +24,15 @@ cd ios/ && pod install If you're using an older version of React Native without autolinking support, or wish to integrate into an existing project, you can follow the manual installation steps for [iOS](/analytics/usage/installation/ios) and [Android](/analytics/usage/installation/android). +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** On-device conversion measurement helpers (`initiateOnDeviceConversionMeasurement*`) are **iOS only**; on Android and web the JS layer resolves without calling native (no-op). `logTransaction` (verified iOS in-app purchase events) is **iOS only** and **rejects** on other platforms. Analytics supports only the default Firebase app. + # What does it do Analytics collects usage and behavior data for your app. Its two primary concerns are: diff --git a/docs/app-check/usage/index.mdx b/docs/app-check/usage/index.mdx index 092cd8af0e..dc70d965ff 100644 --- a/docs/app-check/usage/index.mdx +++ b/docs/app-check/usage/index.mdx @@ -39,6 +39,15 @@ You may find excluding the `i386` architecture via an addition to the `ios/Podfi end ``` +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** Use `ReactNativeFirebaseAppCheckProvider` for native attestation (Device Check, App Attest, Play Integrity). firebase-js-sdk `ReCaptchaEnterpriseProvider` and `ReCaptchaV3Provider` are **web only**. + # What does it do App Check works alongside other Firebase services to help protect your backend resources from abuse, such as billing fraud or phishing. With App Check, devices running your app will use an app or device attestation provider that attests to one or both of the following: diff --git a/docs/app-distribution/usage/index.mdx b/docs/app-distribution/usage/index.mdx index c23df6d32d..7ea04ddf0a 100644 --- a/docs/app-distribution/usage/index.mdx +++ b/docs/app-distribution/usage/index.mdx @@ -44,6 +44,15 @@ apply plugin: 'com.android.application' apply plugin: 'com.google.firebase.appdistribution' ``` +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +> **React Native only:** There is no firebase-js-sdk web equivalent for App Distribution. + # What does it do Firebase App Distribution gives a holistic view of your beta testing program across iOS and Android, providing you with valuable feedback before a new release is in production. You can send pre-release versions of your app using the console or your CI servers, and installing your app is easy for testers. diff --git a/docs/app/usage.mdx b/docs/app/usage.mdx index 10885e2b62..04effba99e 100644 --- a/docs/app/usage.mdx +++ b/docs/app/usage.mdx @@ -11,6 +11,15 @@ The App module is available by default once you have installed the React Native - Creating [Secondary Firebase App Instances](/app/usage#secondary-apps). - Exposing [Utilities](/app/utils) to aid development. +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** `initializeApp` is async on React Native (native bridge). `registerVersion` is **web only** and throws on native platforms. + # Secondary Apps Unlike the Firebase Web SDK, there is no need to manually call the [`initializeApp`](https://firebase.google.com/docs/web/setup#add-sdks-initialize) diff --git a/docs/auth/usage/index.mdx b/docs/auth/usage/index.mdx index 9c0f1f9e46..3391b15f13 100644 --- a/docs/auth/usage/index.mdx +++ b/docs/auth/usage/index.mdx @@ -24,6 +24,15 @@ cd ios/ && pod install If you're using an older version of React Native without autolinking support, or wish to integrate into an existing project, you can follow the manual installation steps for [iOS](/auth/usage/installation/ios) and [Android](/auth/usage/installation/android). +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** Several firebase-js-sdk web helpers throw on React Native (`setPersistence`, `getRedirectResult`, `revokeAccessToken`, `useDeviceLanguage`, `linkWithPhoneNumber`, `reauthenticateWithPhoneNumber`). `useUserAccessGroup` is **iOS only**. See [Migrating to v26 — Platform behavior differences](/migrating-to-v26#platform-behavior-differences). + # What does it do Firebase Authentication provides backend services & easy-to-use SDKs to authenticate users to your app. It supports diff --git a/docs/crashlytics/usage/index.mdx b/docs/crashlytics/usage/index.mdx index fdef481abb..911d38f9d9 100644 --- a/docs/crashlytics/usage/index.mdx +++ b/docs/crashlytics/usage/index.mdx @@ -32,6 +32,15 @@ you can follow the manual installation steps for [iOS](/crashlytics/usage/instal > You may like reading a short article we wrote that explains how to configure and _most importantly_ verify your crashlytics installation so you are sure it is working. https://invertase.io/blog/react-native-firebase-crashlytics-configuration +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +> **React Native only:** There is no firebase-js-sdk web equivalent for Crashlytics. + # What does it do Crashlytics helps you to collect analytics and details about crashes and errors that occur in your app. It does this through three aspects: diff --git a/docs/database/usage/index.mdx b/docs/database/usage/index.mdx index cf1426dc23..8364a67f0c 100644 --- a/docs/database/usage/index.mdx +++ b/docs/database/usage/index.mdx @@ -24,6 +24,15 @@ cd ios/ && pod install && cd .. If you're using an older version of React Native without autolinking support, or wish to integrate into an existing project, you can follow the manual installation steps for [iOS](/database/usage/installation/ios) and [Android](/database/usage/installation/android). +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** `getServerTime`, `setPersistenceEnabled`, and `setPersistenceCacheSizeBytes` are RN-specific. `goOnline` / `goOffline` cross the async native bridge. `forceLongPolling` / `forceWebSockets` throw — transport is native-controlled. + # What does it do The Realtime Database is a cloud-hosted database. Data is stored as JSON and synchronized in realtime to every connected diff --git a/docs/firestore/usage/index.mdx b/docs/firestore/usage/index.mdx index 309f4a91c2..2abd98c64f 100644 --- a/docs/firestore/usage/index.mdx +++ b/docs/firestore/usage/index.mdx @@ -27,6 +27,15 @@ you can follow the manual installation steps for [iOS](/firestore/usage/installa If you have started to receive a `app:mergeDexDebug` error after adding Cloud Firestore, please read the [Enabling Multidex](/enabling-multidex) documentation for more information on how to resolve this error. +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK); macOS via firebase-js-sdk web interop | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** IndexedDB persistence and `memoryLocalCache` / `persistentLocalCache` are **web only**. Native persistence is controlled by the iOS/Android Firestore SDK. `initializeFirestore` is async on React Native. + # What does it do Firestore is a flexible, scalable NoSQL cloud database to store and sync data. It keeps your data in sync across client diff --git a/docs/functions/usage/index.mdx b/docs/functions/usage/index.mdx index 9b5d9e4d7f..e3614e9b50 100644 --- a/docs/functions/usage/index.mdx +++ b/docs/functions/usage/index.mdx @@ -24,6 +24,13 @@ cd ios/ && pod install If you're using an older version of React Native without autolinking support, or wish to integrate into an existing project, you can follow the manual installation steps for [iOS](/functions/usage/installation/ios) and [Android](/functions/usage/installation/android). +# Platform support and New Architecture + +| | | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** — since v24 for Functions, and for all native modules from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement) and [Migrating to v24 — Cloud Functions](/migrating-to-v24#cloud-functions). | + # What does it do Firebase Cloud Functions let you automatically run backend code in response to events triggered by Firebase features and diff --git a/docs/in-app-messaging/usage/index.mdx b/docs/in-app-messaging/usage/index.mdx index bbf762b4b0..232965e6c1 100644 --- a/docs/in-app-messaging/usage/index.mdx +++ b/docs/in-app-messaging/usage/index.mdx @@ -28,6 +28,15 @@ Note: in-app-messaging requires a minimum android gradle plugin version of 3.5.4 If you're using an older version of React Native without autolinking support, or wish to integrate into an existing project, you can follow the manual installation steps for [iOS](/in-app-messaging/usage/installation/ios) and [Android](/in-app-messaging/usage/installation/android). +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +> **React Native only:** There is no firebase-js-sdk web equivalent for In-App Messaging. + # What does it do Firebase In-App Messaging helps you to engage your apps active users by sending them targeted, contextual messages that encourage diff --git a/docs/installations/usage/index.mdx b/docs/installations/usage/index.mdx index 1c5745d44c..ccad3b811e 100644 --- a/docs/installations/usage/index.mdx +++ b/docs/installations/usage/index.mdx @@ -21,6 +21,15 @@ yarn add @react-native-firebase/installations cd ios/ && pod install ``` +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +> **React Native only:** There is no firebase-js-sdk web equivalent for Installations. + # What does it do The Firebase installations service: diff --git a/docs/messaging/usage/index.mdx b/docs/messaging/usage/index.mdx index c859abe6c7..4d5ba5aedd 100644 --- a/docs/messaging/usage/index.mdx +++ b/docs/messaging/usage/index.mdx @@ -73,6 +73,15 @@ You may re-enable notification delegation if your use case requires it and you c You may also use the new messaging APIs to get and set the notification delegation state for the app, as desired. +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** `getAPNSToken` / `setAPNSToken` are **iOS only**. FCM foreground/background listeners use the legacy native event proxy (same runtime behavior as pre-v26). See [Migrating to v26 — Platform behavior differences](/migrating-to-v26#platform-behavior-differences). + # What does it do React Native Firebase provides native integration of Firebase Cloud Messaging (FCM) for both Android & iOS. FCM is a cost diff --git a/docs/migrating-to-v26.mdx b/docs/migrating-to-v26.mdx index b7430cc8a9..67718dda7c 100644 --- a/docs/migrating-to-v26.mdx +++ b/docs/migrating-to-v26.mdx @@ -11,6 +11,7 @@ If you are upgrading from v24 or earlier, complete [Migrating to v25](/migrating ## Table of contents +- [New Architecture requirement](/migrating-to-v26#new-architecture-requirement) - [General pattern](/migrating-to-v26#general-pattern) - [App](/migrating-to-v26#app) - [Machine Learning (ML)](/migrating-to-v26#machine-learning-ml) @@ -30,6 +31,72 @@ If you are upgrading from v24 or earlier, complete [Migrating to v25](/migrating - [Cloud Firestore](/migrating-to-v26#cloud-firestore) - [Automated migration checklist](/migrating-to-v26#automated-migration-checklist) +## New Architecture requirement + +From v26 onward, **every React Native Firebase package with a native bridge** is implemented as a **Codegen TurboModule** and **requires React Native's New Architecture**. The legacy bridge modules were removed in the coordinated v26 break. + +If you cannot enable New Architecture yet, **stay on v25** (or v23 if you still depend on legacy-architecture Cloud Functions — see below). + +### Exceptions (no New Architecture requirement) + +| Package | Why | +| --------------------------------- | ------------------------------------------------------------------------------------ | +| `@react-native-firebase/ai` | Pure JavaScript — uses the firebase-js-sdk web interop layer; no native TurboModule. | +| `@react-native-firebase/vertexai` | Pure JavaScript — same as `ai`; deprecated in favor of `@react-native-firebase/ai`. | + +### Cloud Functions (already required since v24) + +`@react-native-firebase/functions` has required New Architecture **since v24** ([Migrating to v24 — Cloud Functions](/migrating-to-v24#cloud-functions)). v26 extends the same requirement to all remaining native modules. + +### Enable New Architecture + +**React Native CLI (Android)** — set in `android/gradle.properties`: + +```properties +newArchEnabled=true +``` + +**React Native CLI (iOS)** — New Architecture is enabled when `RCT_NEW_ARCH_ENABLED=1` during `pod install` (React Native sets this from `newArchEnabled` on recent templates). Follow the [React Native New Architecture guide](https://reactnative.dev/docs/the-new-architecture/landing-page) for your RN version. + +**Expo** — enable in your app config (Expo SDK 52+): + +```json +{ + "expo": { + "newArchEnabled": true + } +} +``` + +Rebuild native projects after changing this (`pod install`, clean Android build). + +### If New Architecture is disabled + +Native builds fail early with explicit guards: + +- **Android:** Gradle scripts print `New Architecture support is required for @react-native-firebase/` and fail the build. +- **iOS:** `pod install` fails with ` requires New Architecture. Enable New Architecture to use this module`. + +### Platform behavior differences + +When migrating from firebase-js-sdk web examples, watch for these high-impact runtime divergences: + +| Area | firebase-js-sdk (web) | React Native Firebase | +| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **Auth** | Browser persistence, redirects, reCAPTCHA, `revokeAccessToken`, `useDeviceLanguage`, `linkWithPhoneNumber` / `reauthenticateWithPhoneNumber` | Native iOS/Android SDKs manage persistence. Several web-only helpers **throw synchronously** on React Native (`setPersistence`, `getRedirectResult`, `revokeAccessToken`, `useDeviceLanguage`, `linkWithPhoneNumber`, `reauthenticateWithPhoneNumber`). Use native provider flows instead. | +| **Analytics** | Cross-platform modular API | On-device conversion measurement helpers (`initiateOnDeviceConversionMeasurement*`) are **iOS only**; on Android and web the JS layer resolves without calling native (no-op). `logTransaction` (verified iOS in-app purchase events) is **iOS only** and **rejects** on other platforms. | +| **Realtime Database** | `goOnline` / `goOffline` are synchronous; web transport toggles | `goOnline` / `goOffline` are **synchronous** through TurboModules, matching firebase-js-sdk. `getServerTime`, `setPersistenceEnabled`, and `setPersistenceCacheSizeBytes` are RN-specific. `forceLongPolling` / `forceWebSockets` **throw** — transport is native-controlled. | +| **Phone Number Verification** | N/A (Android SDK only) | **Android only** — all entry points throw on iOS and Web. | +| **Cloud Storage** | `uploadBytes` / `uploadString` from JS blobs | `putFile` and `writeToFile` are **native-only** file-path APIs with no firebase-js-sdk equivalent. Retry-time setters are modular functions on RN, not instance properties. | +| **Cloud Messaging** | Web push / service-worker surface | FCM token lifecycle, permissions, background handlers, and **APNs token APIs are iOS only**. Event delivery still uses the legacy native event proxy during the TurboModule migration; behavior matches pre-v26 releases but will change when Codegen events land in a future release. | +| **Remote Config** | `reset()` clears server and local state | `reset()` is **Android only** — iOS does not clear activated, fetched, or default Remote Config values. `setDefaultsFromResource` loads from native resource files (`.plist` / XML). | +| **Performance** | `initializePerformance` returns synchronously; trace `start`/`stop` are sync | `initializePerformance` is **synchronous** on RN (applies settings to the native instance). Trace, HTTP metric, and screen trace `start`/`stop` are **synchronous** through TurboModules, matching firebase-js-sdk. | +| **Firestore** | IndexedDB persistence, `memoryLocalCache`, `persistentLocalCache` | Local cache factories and IndexedDB APIs are **web only**. Persistence is controlled by the native Firestore SDK. `initializeFirestore` is **async** on RN. | +| **App Check** | reCAPTCHA version 3 / Enterprise web providers | Use `ReactNativeFirebaseAppCheckProvider` for Device Check, App Attest, Play Integrity, etc. Web reCAPTCHA provider classes have **no RN equivalent**. | +| **RN-native-only modules** | No web SDK | `crashlytics`, `in-app-messaging`, `app-distribution`, and `ml` are **React Native only** — no firebase-js-sdk modular surface. | + +Per-package notes also appear in each module's [usage](/) page under **Platform support**. + ## General pattern For each package listed in this guide: @@ -335,6 +402,11 @@ The namespaced API for `@react-native-firebase/perf` has been **removed**. This | `perf().newTrace()` | `trace(performance, name)` | | `perf().newHttpMetric()` | `httpMetric(performance, url, httpMethod)` | +## Signature changes + +- `Trace`, `HttpMetric`, and `ScreenTrace` `start()` / `stop()` now return `void` synchronously (previously `Promise`), matching the firebase-js-sdk web `PerformanceTrace`. The underlying native calls are in-memory, so no `await` is required — remove any `await` on these calls. +- `startScreenTrace(performance, screenName)` and the internal `startTrace(name)` helper now return the trace instance synchronously instead of a `Promise`. + # App Check The namespaced API for `@react-native-firebase/app-check` has been **removed**. This package is **modular-only** — use `getAppCheck()` / `initializeAppCheck()` and root-level helper functions. @@ -462,6 +534,10 @@ The namespaced API for `@react-native-firebase/database` has been **removed**. T | `database().ref()` | `ref(database, path?)` | | `database().refFromURL()` | `refFromURL(database, url)` | +## Signature changes + +- `goOnline(db)` and `goOffline(db)` (and the database instance methods) now return `void` synchronously (previously `Promise`), matching firebase-js-sdk. Remove any `await` on these calls. + # Cloud Storage The namespaced API for `@react-native-firebase/storage` has been **removed**. This package is **modular-only** — use `getStorage()` and root-level helper functions. @@ -491,6 +567,11 @@ The namespaced API for `@react-native-firebase/auth` has been **removed**. This | `auth().useEmulator(url)` | `connectAuthEmulator(getAuth(), url, options?)` | | `firebase.auth.EmailAuthProvider` | `EmailAuthProvider` (named export) | +## Signature changes + +- `isSignInWithEmailLink(auth, emailLink)` now returns `boolean` synchronously, matching firebase-js-sdk. +- `TotpSecret.generateQrCodeUrl(accountName?, issuer?)` now returns `string` synchronously, matching firebase-js-sdk. When `accountName` or `issuer` is omitted, React Native Firebase fills the same defaults from the current user email and Firebase app name. + ## Example ```js diff --git a/docs/ml/usage/index.mdx b/docs/ml/usage/index.mdx index 1cb227c115..7d73553e02 100644 --- a/docs/ml/usage/index.mdx +++ b/docs/ml/usage/index.mdx @@ -29,6 +29,15 @@ cd ios/ && pod install If you're using an older version of React Native without autolinking support, or wish to integrate into an existing project, you can follow the manual installation steps for [iOS](/ml/usage/installation/ios) and [Android](/ml/usage/installation/android). +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +> **React Native only:** There is no firebase-js-sdk web equivalent for the legacy Firebase ML custom-model API. + # What does it do All Firebase ML services are cloud-based, with on-device APIs handled by the new, separate [Google MLKit](https://developers.google.com/ml-kit/) (Usable in react-native diff --git a/docs/perf/axios-integration.mdx b/docs/perf/axios-integration.mdx index cb6c1858ff..bbfba44a7f 100644 --- a/docs/perf/axios-integration.mdx +++ b/docs/perf/axios-integration.mdx @@ -32,7 +32,7 @@ axios.interceptors.request.use(async function (config) { // add any extra metric attributes, if required // httpMetricInstance.putAttribute('userId', '12345678'); - await httpMetricInstance.start(); + httpMetricInstance.start(); } finally { return config; } @@ -62,7 +62,7 @@ axios.interceptors.response.use( httpMetric.setHttpResponseCode(response.status); httpMetric.setResponseContentType(response.headers['content-type']); - await httpMetric.stop(); + httpMetric.stop(); } finally { return response; } @@ -78,7 +78,7 @@ axios.interceptors.response.use( httpMetric.setHttpResponseCode(error.response.status); httpMetric.setResponseContentType(error.response.headers['content-type']); - await httpMetric.stop(); + httpMetric.stop(); } finally { // Ensure failed requests throw after interception return Promise.reject(error); diff --git a/docs/perf/ky-integration.mdx b/docs/perf/ky-integration.mdx index d1f2b3aa83..b1e3f15708 100644 --- a/docs/perf/ky-integration.mdx +++ b/docs/perf/ky-integration.mdx @@ -38,7 +38,7 @@ const api = ky.create({ // options.metric.putAttribute('userId', '12345678'); // options.metric.setRequestPayloadSize(1234) - await options.metric.start(); + options.metric.start(); }, ], }, @@ -73,7 +73,7 @@ const api = ky.create({ metric.setHttpResponseCode(status); metric.setResponseContentType(getHeader('Content-Type', headers)); metric.setResponsePayloadSize(getContentLength(headers)); - await metric.stop(); + metric.stop(); }, ], }, @@ -113,7 +113,7 @@ const api = ky.create({ // options.metric.putAttribute('userId', '12345678'); // options.metric.setRequestPayloadSize(1234) - await options.metric.start(); + options.metric.start(); }, ], @@ -124,7 +124,7 @@ const api = ky.create({ metric.setHttpResponseCode(status); metric.setResponseContentType(getHeader('Content-Type', headers)); metric.setResponsePayloadSize(getContentLength(headers)); - await metric.stop(); + metric.stop(); }, ], }, diff --git a/docs/perf/usage/index.mdx b/docs/perf/usage/index.mdx index fc678d8f66..aaf2e1c64e 100644 --- a/docs/perf/usage/index.mdx +++ b/docs/perf/usage/index.mdx @@ -48,6 +48,15 @@ apply plugin: 'com.android.application' apply plugin: 'com.google.firebase.firebase-perf' ``` +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** `initializePerformance` returns synchronously on RN. Trace, HTTP metric, and screen trace `start`/`stop` are synchronous through TurboModules, matching firebase-js-sdk. + # What does it do Performance Monitoring allows you to gain insight into key performance characteristics within your React Native application. @@ -72,14 +81,14 @@ Below is how you would measure the amount of time it would take to complete a sp ```jsx import { getPerformance, trace } from '@react-native-firebase/perf'; -async function customTrace() { +function customTrace() { const perf = getPerformance(); const t = trace(perf, 'custom_trace'); - await t.start(); + t.start(); t.putAttribute('user', 'abcd'); t.putMetric('credits', 30); - await t.stop(); + t.stop(); } ``` @@ -90,10 +99,10 @@ Record a custom screen rendering trace (slow frames / frozen frames) ```jsx import { getPerformance, startScreenTrace } from '@react-native-firebase/perf'; -async function screenTrace() { +function screenTrace() { try { - const screenTrace = await startScreenTrace(getPerformance(), 'FooScreen'); - await screenTrace.stop(); + const screenTrace = startScreenTrace(getPerformance(), 'FooScreen'); + screenTrace.stop(); } catch (e) { // rejects if iOS or (Android == 8 || Android == 8.1) // or if hardware acceleration is off @@ -113,14 +122,14 @@ async function getRequest(url) { metric.putAttribute('user', 'abcd'); - await metric.start(); + metric.start(); const response = await fetch(url); metric.setHttpResponseCode(response.status); metric.setResponseContentType(response.headers.get('Content-Type')); metric.setResponsePayloadSize(response.headers.get('Content-Length')); - await metric.stop(); + metric.stop(); return response.json(); } diff --git a/docs/phone-number-verification/usage/index.mdx b/docs/phone-number-verification/usage/index.mdx index 4347472b12..b2738285ea 100644 --- a/docs/phone-number-verification/usage/index.mdx +++ b/docs/phone-number-verification/usage/index.mdx @@ -20,6 +20,13 @@ yarn add @react-native-firebase/phone-number-verification > **Android only** - This module is only available on Android. The Firebase Phone Number Verification SDK does not support iOS or web platforms. Calling any method on a non-Android platform will throw an error. +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | **Android only** | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + # What does it do Firebase Phone Number Verification provides carrier-level phone number verification on Android devices without requiring SMS codes. It verifies the user's phone number directly through the device's SIM card and carrier network, providing a seamless and secure verification experience. diff --git a/docs/remote-config/usage/index.mdx b/docs/remote-config/usage/index.mdx index 1bfe291616..04701fd37e 100644 --- a/docs/remote-config/usage/index.mdx +++ b/docs/remote-config/usage/index.mdx @@ -26,6 +26,15 @@ cd ios/ && pod install If you're using an older version of React Native without autolinking support, or wish to integrate into an existing project, you can follow the manual installation steps for [iOS](/remote-config/usage/installation/ios) and [Android](/remote-config/usage/installation/android). +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** `reset()` is **Android only** — iOS does not clear activated, fetched, or default Remote Config values. `setDefaultsFromResource` loads from native `.plist` / XML resource files. + # What does it do Remote Config allows you to change the appearance and/or functionality of your app without requiring an app update. diff --git a/docs/storage/usage/index.mdx b/docs/storage/usage/index.mdx index a81482982c..19f1f00be7 100644 --- a/docs/storage/usage/index.mdx +++ b/docs/storage/usage/index.mdx @@ -24,6 +24,15 @@ cd ios/ && pod install If you're using an older version of React Native without autolinking support, or wish to integrate into an existing project, you can follow the manual installation steps for [iOS](/storage/usage/installation/ios) and [Android](/storage/usage/installation/android). +# Platform support and New Architecture + +| | | +| -------------------- | ---------------------------------------------------------------------------------------------- | +| **Platforms** | Android, iOS (native Firebase SDK) | +| **New Architecture** | **Required** from v26. See [Migrating to v26](/migrating-to-v26#new-architecture-requirement). | + +**Platform notes:** `putFile` and `writeToFile` are **native-only** file-path APIs with no firebase-js-sdk equivalent. Use `FilePath` from `@react-native-firebase/app` for device paths. + # What does it do Storage is built for app developers who need to store and serve user-generated content, such as photos or videos. diff --git a/docs/vertexai/usage/index.mdx b/docs/vertexai/usage/index.mdx index 8beb19ef61..8980b119bb 100644 --- a/docs/vertexai/usage/index.mdx +++ b/docs/vertexai/usage/index.mdx @@ -20,3 +20,12 @@ import { getVertexAI, getGenerativeModel } from 'firebase/vertexai'; // Remove t import { initializeApp } from 'firebase/app'; import { getAI, getGenerativeModel } from 'firebase/ai'; // Add this ``` + +# Platform support + +| | | +| -------------------- | ---------------------------------------------------------------------- | +| **Platforms** | Android, iOS, Web (firebase-js-sdk interop) | +| **New Architecture** | **Not required** — pure JavaScript package with no native TurboModule. | + +> **Deprecated:** Prefer `@react-native-firebase/ai` — see the [Firebase migration guide](https://firebase.google.com/docs/vertex-ai/migrate-to-latest-sdk). diff --git a/jest.setup.ts b/jest.setup.ts index 42f68e2e86..2d6c25fb4f 100644 --- a/jest.setup.ts +++ b/jest.setup.ts @@ -26,18 +26,9 @@ jest.doMock('react-native', () => { // make sure PlatformConstants is visible otherwise turbo modules default init fails ReactNative.NativeModules['PlatformConstants'] = {}; - return Object.setPrototypeOf( - { - Platform: { - OS: 'android', - select: () => {}, - }, - AppRegistry: { - registerHeadlessTask: jest.fn(), - }, - NativeModules: { - ...ReactNative.NativeModules, - RNFBAnalyticsModule: { + const turboModuleLookup: Record = { + ...ReactNative.NativeModules, + NativeRNFBTurboAnalytics: { logEvent: jest.fn(), setAnalyticsCollectionEnabled: jest.fn(), setSessionTimeoutDuration: jest.fn(), @@ -49,11 +40,79 @@ jest.doMock('react-native', () => { resetAnalyticsData: jest.fn(), setConsent: jest.fn(), setDefaultEventParameters: jest.fn(), + logTransaction: jest.fn(), initiateOnDeviceConversionMeasurementWithEmailAddress: jest.fn(), initiateOnDeviceConversionMeasurementWithHashedEmailAddress: jest.fn(), initiateOnDeviceConversionMeasurementWithPhoneNumber: jest.fn(), initiateOnDeviceConversionMeasurementWithHashedPhoneNumber: jest.fn(), }, + NativeRNFBTurboApp: { + getConstants: () => ({ + NATIVE_FIREBASE_APPS: [ + { + appConfig: { + name: '[DEFAULT]', + }, + options: {}, + }, + { + appConfig: { + name: 'secondaryFromNative', + }, + options: {}, + }, + ], + FIREBASE_RAW_JSON: '{}', + }), + NATIVE_FIREBASE_APPS: [ + { + appConfig: { + name: '[DEFAULT]', + }, + options: {}, + }, + + { + appConfig: { + name: 'secondaryFromNative', + }, + options: {}, + }, + ], + FIREBASE_RAW_JSON: '{}', + addListener: jest.fn(), + eventsAddListener: jest.fn(), + eventsNotifyReady: jest.fn(), + removeListeners: jest.fn(), + }, + NativeRNFBTurboUtils: { + getConstants: () => ({ + isRunningInTestLab: false, + MAIN_BUNDLE: '/', + CACHES_DIRECTORY: '/cache', + DOCUMENT_DIRECTORY: '/documents', + TEMP_DIRECTORY: '/tmp', + LIBRARY_DIRECTORY: '/library', + PICTURES_DIRECTORY: '/pictures', + MOVIES_DIRECTORY: '/movies', + }), + isRunningInTestLab: false, + MAIN_BUNDLE: '/', + CACHES_DIRECTORY: '/cache', + DOCUMENT_DIRECTORY: '/documents', + TEMP_DIRECTORY: '/tmp', + LIBRARY_DIRECTORY: '/library', + PICTURES_DIRECTORY: '/pictures', + MOVIES_DIRECTORY: '/movies', + androidGetPlayServicesStatus: jest.fn(() => + Promise.resolve({ + isAvailable: true, + status: 0, + hasResolution: false, + isUserResolvableError: false, + }), + ), + }, RNFBAppModule: { NATIVE_FIREBASE_APPS: [ { @@ -76,7 +135,15 @@ jest.doMock('react-native', () => { eventsNotifyReady: jest.fn(), removeListeners: jest.fn(), }, - RNFBAuthModule: { + NativeRNFBTurboAuth: { + getConstants: () => ({ + APP_LANGUAGE: { + '[DEFAULT]': 'en-US', + }, + APP_USER: { + '[DEFAULT]': null, + }, + }), APP_LANGUAGE: { '[DEFAULT]': 'en-US', }, @@ -112,7 +179,6 @@ jest.doMock('react-native', () => { useEmulator: jest.fn(), getCustomAuthDomain: jest.fn(() => Promise.resolve(null)), configureAuthDomain: jest.fn(() => Promise.resolve()), - // User methods delete: jest.fn(() => Promise.resolve()), getIdToken: jest.fn(() => Promise.resolve('mock-token')), getIdTokenResult: jest.fn(() => Promise.resolve({ token: 'mock-token' })), @@ -128,6 +194,32 @@ jest.doMock('react-native', () => { updatePhoneNumber: jest.fn(() => Promise.resolve(null)), updateProfile: jest.fn(() => Promise.resolve(null)), verifyBeforeUpdateEmail: jest.fn(() => Promise.resolve(null)), + forceRecaptchaFlowForTesting: jest.fn(() => Promise.resolve()), + setAppVerificationDisabledForTesting: jest.fn(() => Promise.resolve()), + setAutoRetrievedSmsCodeForPhoneNumber: jest.fn(() => Promise.resolve()), + removeAuthStateListener: jest.fn(), + removeIdTokenListener: jest.fn(), + getSession: jest.fn(() => Promise.resolve('session')), + unenrollMultiFactor: jest.fn(() => Promise.resolve()), + finalizeMultiFactorEnrollment: jest.fn(() => Promise.resolve()), + finalizeTotpEnrollment: jest.fn(() => Promise.resolve()), + generateTotpSecret: jest.fn(() => Promise.resolve({ secretKey: 'secret' })), + generateQrCodeUrl: jest.fn(() => 'qr-url'), + openInOtpApp: jest.fn(), + resolveMultiFactorSignIn: jest.fn(() => Promise.resolve({ user: null })), + confirmationResultConfirm: jest.fn(() => Promise.resolve({ user: null })), + verifyPhoneNumber: jest.fn(), + useDeviceLanguage: jest.fn(), + }, + NativeRNFBTurboAppCheck: { + activate: jest.fn(), + configureProvider: jest.fn(), + setTokenAutoRefreshEnabled: jest.fn(), + isTokenAutoRefreshEnabled: jest.fn(), + getToken: jest.fn(), + getLimitedUseToken: jest.fn(), + addAppCheckListener: jest.fn(), + removeAppCheckListener: jest.fn(), }, RNFBAppCheckModule: { initializeAppCheck: jest.fn(), @@ -138,80 +230,38 @@ jest.doMock('react-native', () => { addAppCheckListener: jest.fn(), removeAppCheckListener: jest.fn(), }, - RNFBAppDistributionModule: { + NativeRNFBTurboAppDistribution: { isTesterSignedIn: jest.fn(), signInTester: jest.fn(), checkForUpdate: jest.fn(), signOutTester: jest.fn(), }, - RNFBCrashlyticsModule: { + NativeRNFBTurboCrashlytics: { + getConstants: () => ({ + isCrashlyticsCollectionEnabled: false, + isErrorGenerationOnJSCrashEnabled: false, + isCrashlyticsJavascriptExceptionHandlerChainingEnabled: false, + }), isCrashlyticsCollectionEnabled: false, + isErrorGenerationOnJSCrashEnabled: false, + isCrashlyticsJavascriptExceptionHandlerChainingEnabled: false, checkForUnsentReports: jest.fn(), crash: jest.fn(), + crashWithStackPromise: jest.fn(), deleteUnsentReports: jest.fn(), didCrashOnPreviousExecution: jest.fn(), log: jest.fn(), + logPromise: jest.fn(), setAttribute: jest.fn(), setAttributes: jest.fn(), setUserId: jest.fn(), recordError: jest.fn(), + recordErrorPromise: jest.fn(), sendUnsentReports: jest.fn(), setCrashlyticsCollectionEnabled: jest.fn(), }, - RNFBDatabaseModule: { - constants: { - isDatabaseCollectionEnabled: true, - url: 'https://test.firebaseio.com', - ref: 'ref()', - }, - on: jest.fn(), - off: jest.fn(), - once: jest.fn( - (_appName: any, _customUrl: any, path: any, _modifiers: any, eventType: any) => { - // Database native methods receive (appName, customUrlOrRegion, ...actualArgs) - let key = 'test'; - if (path && typeof path === 'string') { - const parts = path.split('/').filter(p => p); - key = parts[parts.length - 1] || 'test'; - } - - const snapshotData = { - key, - value: null, - exists: false, - childKeys: [], - priority: null, - }; - - if (eventType === 'value') { - return Promise.resolve(snapshotData); - } - - return Promise.resolve({ - snapshot: snapshotData, - previousChildName: null, - }); - }, - ), - useEmulator: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - set: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - update: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - setWithPriority: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - remove: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - setPriority: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - keepSynced: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - transactionStart: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - transactionTryCommit: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - goOnline: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - goOffline: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - setPersistenceEnabled: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - setLoggingEnabled: jest.fn((_appName: any, _customUrl: any) => Promise.resolve()), - setPersistenceCacheSizeBytes: jest.fn((_appName: any, _customUrl: any) => - Promise.resolve(), - ), - getServerTime: jest.fn((_appName: any, _customUrl: any) => Promise.resolve(Date.now())), - }, - RNFBFirestoreModule: { + NativeRNFBTurboFirestore: { + setLogLevel: jest.fn(), loadBundle: jest.fn(() => Promise.resolve({ taskState: 'Success', @@ -230,9 +280,20 @@ jest.doMock('react-native', () => { settings: jest.fn(), addSnapshotsInSync: jest.fn(), removeSnapshotsInSync: jest.fn(), + persistenceCacheIndexManager: jest.fn(), + }, + NativeRNFBTurboFirestoreCollection: { collectionOffSnapshot: jest.fn(), namedQueryOnSnapshot: jest.fn(), collectionOnSnapshot: jest.fn(), + namedQueryGet: jest.fn(() => + Promise.resolve({ + source: 'cache', + changes: [], + documents: [], + metadata: {}, + }), + ), collectionGet: jest.fn(() => Promise.resolve({ source: 'cache', @@ -242,6 +303,15 @@ jest.doMock('react-native', () => { }), ), collectionCount: jest.fn(() => Promise.resolve({ count: 0 })), + aggregateQuery: jest.fn(() => Promise.resolve({})), + pipelineExecute: jest.fn(() => + Promise.resolve({ + results: [], + executionTime: Date.now(), + }), + ), + }, + NativeRNFBTurboFirestoreDocument: { documentDelete: jest.fn(() => Promise.resolve()), documentOffSnapshot: jest.fn(), documentOnSnapshot: jest.fn(), @@ -255,30 +325,86 @@ jest.doMock('react-native', () => { ), documentSet: jest.fn(() => Promise.resolve()), documentUpdate: jest.fn(() => Promise.resolve()), - persistenceCacheIndexManager: jest.fn(), documentBatch: jest.fn(), + }, + NativeRNFBTurboFirestoreTransaction: { transactionApplyBuffer: jest.fn(), transactionBegin: jest.fn(), transactionDispose: jest.fn(), + transactionGetDocument: jest.fn(() => + Promise.resolve({ + data: {}, + metadata: {}, + path: 'firestore/document', + exists: true, + }), + ), + }, + NativeRNFBTurboDatabase: { + goOnline: jest.fn(), + goOffline: jest.fn(), + setPersistenceEnabled: jest.fn(), + setLoggingEnabled: jest.fn(), + setPersistenceCacheSizeBytes: jest.fn(), + useEmulator: jest.fn(), + }, + NativeRNFBTurboDatabaseReference: { + set: jest.fn(() => Promise.resolve()), + update: jest.fn(() => Promise.resolve()), + setWithPriority: jest.fn(() => Promise.resolve()), + remove: jest.fn(() => Promise.resolve()), + setPriority: jest.fn(() => Promise.resolve()), + }, + NativeRNFBTurboDatabaseQuery: { + once: jest.fn(() => + Promise.resolve({ + value: null, + key: null, + exists: false, + childKeys: [], + }), + ), + on: jest.fn(), + off: jest.fn(), + keepSynced: jest.fn(() => Promise.resolve()), + }, + NativeRNFBTurboDatabaseOnDisconnect: { + onDisconnectCancel: jest.fn(() => Promise.resolve()), + onDisconnectRemove: jest.fn(() => Promise.resolve()), + onDisconnectSet: jest.fn(() => Promise.resolve()), + onDisconnectSetWithPriority: jest.fn(() => Promise.resolve()), + onDisconnectUpdate: jest.fn(() => Promise.resolve()), }, - RNFBFiamModule: { + NativeRNFBTurboDatabaseTransaction: { + transactionStart: jest.fn(), + transactionTryCommit: jest.fn(), + }, + NativeRNFBTurboFiam: { + getConstants: () => ({ + isMessagesDisplaySuppressed: false, + isAutomaticDataCollectionEnabled: true, + }), isMessagesDisplaySuppressed: false, isAutomaticDataCollectionEnabled: true, setMessagesDisplaySuppressed: jest.fn(), setAutomaticDataCollectionEnabled: jest.fn(), triggerEvent: jest.fn(), }, - RNFBInstallationsModule: { + NativeRNFBTurboInstallations: { getId: jest.fn(), getToken: jest.fn(), - delete: jest.fn(), + deleteInstallations: jest.fn(), }, - RNFBMessagingModule: { + NativeRNFBTurboMessaging: { + getConstants: () => ({ + isAutoInitEnabled: true, + isDeliveryMetricsExportToBigQueryEnabled: false, + isRegisteredForRemoteNotifications: false, + isNotificationDelegationEnabled: false, + }), isAutoInitEnabled: true, isDeliveryMetricsExportToBigQueryEnabled: false, isRegisteredForRemoteNotifications: false, - isNotificationDelegationEnabled: false, - onMessage: jest.fn(), completeNotificationProcessing: jest.fn(), setAutoInitEnabled: jest.fn(), getInitialNotification: jest.fn(() => Promise.resolve(null)), @@ -297,21 +423,60 @@ jest.doMock('react-native', () => { subscribeToTopic: jest.fn(), unsubscribeFromTopic: jest.fn(), setDeliveryMetricsExportToBigQuery: jest.fn(), + isNotificationDelegationEnabled: jest.fn(() => Promise.resolve(false)), setNotificationDelegationEnabled: jest.fn(), }, - RNFBPerfModule: { + NativeRNFBTurboPerf: { + getConstants: () => ({ + isPerformanceCollectionEnabled: true, + isInstrumentationEnabled: true, + }), isPerformanceCollectionEnabled: true, isInstrumentationEnabled: true, instrumentationEnabled: jest.fn(() => Promise.resolve()), setPerformanceCollectionEnabled: jest.fn(() => Promise.resolve()), - startScreenTrace: jest.fn(() => Promise.resolve()), - stopScreenTrace: jest.fn(() => Promise.resolve()), - startTrace: jest.fn(() => Promise.resolve()), - stopTrace: jest.fn(() => Promise.resolve()), - startHttpMetric: jest.fn(() => Promise.resolve()), - stopHttpMetric: jest.fn(() => Promise.resolve()), + startScreenTrace: jest.fn(), + stopScreenTrace: jest.fn(), + startTrace: jest.fn(), + stopTrace: jest.fn(), + startHttpMetric: jest.fn(), + stopHttpMetric: jest.fn(), }, - RNFBConfigModule: { + NativeRNFBTurboPnv: { + enableTestSession: jest.fn(() => Promise.resolve()), + getVerificationSupportInfo: jest.fn(() => Promise.resolve([])), + getVerificationSupportInfoForSimSlot: jest.fn(() => Promise.resolve([])), + getVerifiedPhoneNumber: jest.fn(() => + Promise.resolve({ + phoneNumber: '+15555550100', + token: 'jwt', + expirationTimestamp: 0, + issuedAtTimestamp: 0, + nonce: null, + claims: null, + }), + ), + getDigitalCredentialPayload: jest.fn(() => Promise.resolve('payload')), + exchangeCredentialResponseForPhoneNumber: jest.fn(() => + Promise.resolve({ + phoneNumber: '+15555550100', + token: 'jwt', + expirationTimestamp: 0, + issuedAtTimestamp: 0, + nonce: null, + claims: null, + }), + ), + }, + NativeRNFBTurboML: {}, + NativeRNFBTurboConfig: { + getConstants: () => ({ + lastFetchTime: Date.now(), + lastFetchStatus: 'success', + fetchTimeout: 60, + minimumFetchInterval: 43200, + values: {}, + }), onConfigUpdated: jest.fn(), reset: jest.fn(() => Promise.resolve({ @@ -409,8 +574,44 @@ jest.doMock('react-native', () => { }, }), ), + setCustomSignals: jest.fn(() => + Promise.resolve({ + result: true, + constants: { + lastFetchTime: Date.now(), + lastFetchStatus: 'success', + fetchTimeout: 60, + minimumFetchInterval: 43200, + values: {}, + }, + }), + ), removeConfigUpdateRegistration: jest.fn(), }, + NativeRNFBTurboStorage: { + getConstants: () => ({ + maxUploadRetryTime: 0, + maxDownloadRetryTime: 0, + maxOperationRetryTime: 0, + }), + maxUploadRetryTime: 0, + maxDownloadRetryTime: 0, + maxOperationRetryTime: 0, + setMaxOperationRetryTime: jest.fn(), + setMaxUploadRetryTime: jest.fn(), + setMaxDownloadRetryTime: jest.fn(), + useEmulator: jest.fn(), + deleteObject: jest.fn(() => Promise.resolve()), + getDownloadURL: jest.fn(() => Promise.resolve('https://example.com/file')), + getMetadata: jest.fn(() => Promise.resolve({})), + putString: jest.fn(() => Promise.resolve()), + updateMetadata: jest.fn(() => Promise.resolve({})), + writeToFile: jest.fn(() => Promise.resolve()), + putFile: jest.fn(() => Promise.resolve()), + setTaskStatus: jest.fn(() => Promise.resolve()), + list: jest.fn(() => Promise.resolve({ items: [], prefixes: [], pageToken: null })), + listAll: jest.fn(() => Promise.resolve({ items: [], prefixes: [], pageToken: null })), + }, RNFBStorageModule: { maxUploadRetryTime: 0, maxDownloadRetryTime: 0, @@ -419,7 +620,7 @@ jest.doMock('react-native', () => { setMaxUploadRetryTime: jest.fn(), setMaxDownloadRetryTime: jest.fn(), useEmulator: jest.fn(), - delete: jest.fn(() => Promise.resolve()), + deleteObject: jest.fn(() => Promise.resolve()), getDownloadURL: jest.fn(() => Promise.resolve('https://example.com/file')), getMetadata: jest.fn(() => Promise.resolve({})), putString: jest.fn(() => Promise.resolve()), @@ -430,7 +631,28 @@ jest.doMock('react-native', () => { list: jest.fn(() => Promise.resolve({ items: [], prefixes: [], pageToken: null })), listAll: jest.fn(() => Promise.resolve({ items: [], prefixes: [], pageToken: null })), }, + }; + + return Object.setPrototypeOf( + { + Platform: { + OS: 'android', + select: () => {}, + }, + TurboModuleRegistry: { + get: jest.fn((moduleName: string) => turboModuleLookup[moduleName]), + getEnforcing: jest.fn((moduleName: string) => { + const mod = turboModuleLookup[moduleName]; + if (!mod) { + throw new Error('TurboModuleRegistry.getEnforcing: module not found'); + } + return mod; + }), + }, + AppRegistry: { + registerHeadlessTask: jest.fn(), }, + NativeModules: turboModuleLookup, }, ReactNative, ); diff --git a/okf-bundle/ci-workflows/ios.md b/okf-bundle/ci-workflows/ios.md index 4b308a84cd..ffbc581e73 100644 --- a/okf-bundle/ci-workflows/ios.md +++ b/okf-bundle/ci-workflows/ios.md @@ -150,6 +150,8 @@ Long `datamigrator` activity with no `com.invertase.testing` means migration/pre Device type comes from `tests/.detoxrc.js`; boot script and Detox use it. No hard-coded UDID. +**Missing Detox framework cache** — if iOS `:test-cover` fails before tests with `Detox.framework could not be found`, rebuild the local cache: [running e2e § iOS Detox framework cache](../testing/running-e2e.md#ios-detox-framework-cache-blocking) (`yarn tests:ios:detox-framework-cache:rebuild`). CI restores `~/Library/Detox/ios` from Actions cache keyed by Xcode version. + ### Codecov (debug matrix only) Debug leg: `yarn tests:ios:test:process-coverage` + Codecov flags `e2e-ts-ios`, `ios-native`; `codecov/project/ios-native` blocks on missing native upload. Release skips coverage. diff --git a/okf-bundle/index.md b/okf-bundle/index.md index db0aed623f..9ddff16c09 100644 --- a/okf-bundle/index.md +++ b/okf-bundle/index.md @@ -25,6 +25,7 @@ okf_version: "0.1" * [Namespace API removal workflow](/namespace-api-removal-workflow.md) — modular-only migration checklist, factory design, removal greps * [Namespace API removal work queue](/namespace-api-removal-work-queue.md) — phase tracker and gate snapshots (ephemeral) +* [TurboModule migration](/new-architecture/index.md) — Codegen TurboModules, coordinated New Architecture break, phase queue # Packages diff --git a/okf-bundle/namespace-api-removal-work-queue.md b/okf-bundle/namespace-api-removal-work-queue.md index 986b260f3b..e468d7d6e2 100644 --- a/okf-bundle/namespace-api-removal-work-queue.md +++ b/okf-bundle/namespace-api-removal-work-queue.md @@ -40,7 +40,7 @@ Ephemeral tracker; see [OKF policy](documentation-policy.md). Work types / tiers Gate prerequisites before any `:test-cover` ([host rule](testing/change-authoring-workflow.md#host-rule)): -1. [Pre-flight](testing/running-e2e.md#pre-flight-is-the-host-clear-to-start): [host-clear probes](testing/running-e2e.md#host-clear-probes), [services ready](testing/running-e2e.md#2-services-ready), [harness matches validation tier](testing/running-e2e.md#3-harness-matches-validation-tier) — [area harness: both platform blocks](testing/running-e2e.md#tests-app-js-area-harness); [narrowing gate](testing/running-e2e.md#harness-narrowing-gate-blocking) — **unit-focused** and **area-focused** only); [serial `:test-cover`](testing/running-e2e.md#serialized-e2e-dispatch); [frozen tree](testing/change-authoring-workflow.md#frozen-tree) for `independent-review`. +1. [Pre-flight](testing/running-e2e.md#pre-flight-is-the-host-clear-to-start): [host-clear probes](testing/running-e2e.md#host-clear-probes), [services ready](testing/running-e2e.md#2-services-ready), [harness matches validation tier](testing/running-e2e.md#3-harness-matches-validation-tier) — [local harness overrides](testing/running-e2e.md#local-harness-overrides-harnessoverridesjs); [narrowing gate](testing/running-e2e.md#harness-narrowing-gate-blocking) — **unit-focused** and **area-focused** only); [serial `:test-cover`](testing/running-e2e.md#serialized-e2e-dispatch); [frozen tree](testing/change-authoring-workflow.md#frozen-tree) for `independent-review`. 2. Per-module checklist and removal greps: [namespace-api-removal-workflow.md](namespace-api-removal-workflow.md). User-facing namespace removal: [Migrating to v26](/migrating-to-v26). --- diff --git a/okf-bundle/namespace-api-removal-workflow.md b/okf-bundle/namespace-api-removal-workflow.md index 66ec79aadb..95bd6d9ba4 100644 --- a/okf-bundle/namespace-api-removal-workflow.md +++ b/okf-bundle/namespace-api-removal-workflow.md @@ -94,7 +94,7 @@ On a **frozen tree** — [change authoring § independent-review](testing/change ## Module area harness -Extends [change authoring § harness narrowing](testing/change-authoring-workflow.md#harness-narrowing). **Mechanics:** [running e2e § area harness — two platform blocks](testing/running-e2e.md#tests-app-js-area-harness). +Extends [change authoring § harness narrowing](testing/change-authoring-workflow.md#harness-narrowing). **Mechanics:** [running e2e § local harness overrides](testing/running-e2e.md#local-harness-overrides-harnessoverridesjs). When native e2e runs: load **only** the target package's e2e spec(s) in `tests/app.js`. Narrow **`platformSupportedModules` on both** `if (Platform.other)` and `if (!Platform.other)` (recommended: Pattern A — initial array + `if (false && …)` on **both** blocks). Set **`RNFBDebug = true`** locally per [running e2e § fail-fast](testing/running-e2e.md#fail-fast-rnfbdebug-and-sub-suite-narrowing) — **never commit** (`false` is the committed default). Revert **both** blocks before `commit` or **full** tier. Pass counts must match loaded scope — not full-app totals ([running e2e § gate](testing/running-e2e.md#harness-narrowing-gate-blocking), [platform coverage gate](testing/running-e2e.md#platform-coverage-gate-blocking)). diff --git a/okf-bundle/new-architecture/architecture-decisions.md b/okf-bundle/new-architecture/architecture-decisions.md new file mode 100644 index 0000000000..0bd74b127b --- /dev/null +++ b/okf-bundle/new-architecture/architecture-decisions.md @@ -0,0 +1,359 @@ +--- +type: Reference +title: New Architecture decisions (ADR) +description: Canonical owner of durable architectural decisions for the React Native Firebase TurboModule migration — the "what we decided and why". Other new-architecture docs reference this; they do not restate decisions. +tags: [new-architecture, turbomodule, architecture, decisions, adr] +timestamp: 2026-06-29T00:00:00Z +--- + +# New Architecture decisions (ADR) + +**Canonical owner of durable architectural decisions** for the TurboModule migration. Each entry is a decision plus a brief rationale. Procedure lives in [implementation workflow](turbomodule-implementation-workflow.md); ephemeral phase/gate state lives in the [migration work queue](migration-work-queue.md). Those docs **link here** for the "why" — they do not copy decisions. + +**Policy:** [OKF documentation and commit policy](../documentation-policy.md). Durable decisions belong here; never in the ephemeral work queue. + +## Decision ID convention + +All decisions in this document use the **`NewArch-AD-`** prefix (e.g. `NewArch-AD-7`, `NewArch-AD-14a`, `NewArch-AD-17.1`) so TurboModule migration ADRs are unambiguous from other architectural decision records elsewhere in the monorepo. Use this prefix in durable code comments and docs that cite these decisions — not bare `AD-`. + +## Status legend + +| Status | Meaning | +|--------|---------| +| **Accepted** | Decided; implement to this. | +| **Proposed** | Recommended, awaiting maintainer sign-off; safe to plan around. | +| **Open** | Under analysis; do not lock in code until resolved. | + +--- + +## NewArch-AD-1 — New Architecture only — **Accepted** + +One coordinated semver major across the monorepo. No dual old/new bridge per package (`functions` precedent: v24). The legacy bridge interop layer remains available to consumers via RN itself, but RNFB ships TurboModule-only. + +**Why:** A per-package dual-bridge would multiply native surface and testing. A single coordinated break is cheaper to build and reason about. + +--- + +## NewArch-AD-2 — Naming: `NativeRNFBTurbo*` — **Accepted** + +Codegen spec/module names use the `NativeRNFBTurbo*` prefix (`NativeRNFBTurboAuth`, `NativeRNFBTurboFirestore`, …). Spec files must be prefixed `Native` per RN Codegen. + +**Why:** Disambiguates from legacy `RNFB*` module names during transition; satisfies Codegen's `Native*` spec-file requirement. + +--- + +## NewArch-AD-3 — Strong Codegen typing — **Accepted** + +Strong Codegen types wherever the API allows. Source of truth: `packages/*/lib/types/internal.ts`, native method inventories, firebase-js-sdk shapes. Use `Object` / open maps only where payloads are genuinely dynamic. + +**Codegen-safe naming:** Spec methods and generated symbols must avoid language keywords or reserved identifiers across TypeScript, C++, Java, and ObjC++ targets. Known blockers from this migration: `delete` as a method name breaks generated native code, and TypeScript primitive `object` is rejected by RN Codegen for NativeModule specs (`TSObjectKeyword`). Procedure and the current reserved-word checklist live in [implementation workflow § Codegen-safe names and types](turbomodule-implementation-workflow.md#codegen-safe-names-and-types-blocking). + +--- + +## NewArch-AD-4 — Events deferred to Phase C — **Accepted** + +Keep the legacy event path (`RNFBNativeEventEmitter` → app-module proxy → `RNFBRCTEventEmitter` / `ReactNativeFirebaseEventEmitter` → `SharedEventEmitter` fan-out) under TurboModules. Defer Codegen EventEmitter cutover to [Phase C](migration-work-queue.md#deferred-cleanup-phase-eventemitter). + +**Deferral discriminator:** if area-focused e2e or device testing shows a package's events cannot work over the legacy proxy under TurboModules, escalate that package's event path into its own migration PR rather than waiting for Phase C. **Highest risk:** `messaging` (background/iOS AppDelegate, headless JS task). + +### messaging — defer EventEmitter cutover; migrate shell only in Phase 4 + +**Decision:** Phase 4 `messaging` migrates the **method-call TurboModule shell** only. Event emit/subscribe stays on the legacy proxy until [Phase C](migration-work-queue.md#deferred-cleanup-phase-eventemitter). + +| Assertion | Primary source | +|-----------|----------------| +| Native emit sites do not use the messaging module bridge | iOS categories/delegates (`RNFBMessaging+AppDelegate.m`, `+UNUserNotificationCenter.m`, `+FIRMessagingDelegate.m`) call `RNFBRCTEventEmitter`; Android receiver/service/module call `ReactNativeFirebaseEventEmitter` | +| JS subscribes via the app-module proxy, not the messaging shell | `packages/messaging/lib/index.ts` — `nativeEvents` array → `RNFBNativeEventEmitter` → `NativeRNFBTurboApp` ([NewArch-AD-18 E1](architecture-decisions.md#newarch-ad-18--raw-vs-wrapped-resolver-policy--accepted)) | +| Android background (quit/killed) is outside the event-proxy path | `ReactNativeFirebaseMessagingHeadlessService` (`HeadlessJsTaskService`); `AppRegistry.registerHeadlessTask('ReactNativeFirebaseMessagingHeadlessTask', …)` in `packages/messaging/lib/index.ts` | +| iOS background data messages couple shell method + event proxy | `RNFBMessaging+AppDelegate.m` — `signalBackgroundMessageHandlerSet` on shell, then `RNFBRCTEventEmitter` for `messaging_message_received_background` | +| iOS emitter implementation is legacy bridge API (Phase C debt) | `packages/app/ios/RNFBApp/RNFBRCTEventEmitter.m` — `bridge enqueueJSCall:@"RCTDeviceEventEmitter"` | + +The deferral discriminator is **not** satisfied by structure alone: nothing in the messaging native tree requires EventEmitter cutover when the shell becomes a TurboModule. + +**Testing requirement (Phase 4 review gate):** Messaging is the highest-risk legacy-proxy package. Area-focused e2e must be designed deliberately for **event delivery**, not only turbo method calls — foreground message receipt, token refresh, notification-opened, and (on iOS) background handler timing against `signalBackgroundMessageHandlerSet`. Device validation is required where the harness cannot automate FCM delivery or AppDelegate background races. Escalate event cutover into Phase 4 **only** if that testing proves the proxy fails. iOS `RCTRootView` / `addCustomPropsToUserProps` headless wiring is a separate shell implementation concern, not an event-path escalation trigger. + +--- + +## NewArch-AD-5 — Commit generated code — **Accepted** + +`includesGeneratedCode: true`; commit Codegen output under `android/.../generated` and `ios/generated`, mirroring `packages/functions`. + +**Guard (NewArch-AD-17.3):** CI runs `yarn codegen:verify` — re-running `yarn codegen` for every migrated package then `git diff --exit-code` on `**/generated/**` — so committed artifacts can't go stale. + +--- + +## NewArch-AD-6 — Unified native module resolver — **Accepted** + +`packages/app/lib/internal/nativeModuleAndroidIos.ts` resolves `TurboModuleRegistry.get(name) ?? NativeModules[name]`. + +**Why / semantics (researched, scope-limited):** In **bridgeless** mode with the **unified native-module proxy** (RN ≥ 0.74 New Architecture default; the repo's test app is RN 0.78 + `newArchEnabled`), both `TurboModuleRegistry.get(name)` and `NativeModules[name]` route through one unified, **cached** `nativeModuleProxy` (`BridgelessNativeModuleProxy` backing `global.nativeModuleProxy`, which *is* `NativeModules`) — so they return the **same instance** for a migrated module; the `??` cannot hand back two divergent wrappers. **Scope caveat (verified by design review):** this identity is confirmed for **bridgeless + unified proxy**; the bridged-New-Architecture path (`__turboModuleProxy` set without bridgeless) is a *different* lookup from bridged `NativeModules` lazy config and is **not verified** to share identity — RNFB targets bridgeless NA, so this is an untested edge, not a supported config. The `NativeModules` fallback is **load-bearing during Phases 1–5**: an unmigrated package's legacy module is null in `TurboModuleRegistry.get` and resolves via the interop-backed `NativeModules` (`legacyBinding_`). + +**Phase R action:** remove the `NativeModules` fallback once all packages are migrated, so a missing module throws instead of returning soft-undefined. + +--- + +## NewArch-AD-7 — `codegenConfig.name` = aggregate library name; one `codegenConfig` per package — **Accepted** + +Each package has **one** `codegenConfig` whose `name` is an **aggregate library name** of the form `RNFBTurboModules` (e.g. `RNFBAppTurboModules`, `RNFBFunctionsTurboModules`, `RNFBFirestoreTurboModules`), **not** a module name. Multiple TurboModules in a package are listed under iOS `modulesProvider` (spec name → ObjC class) and live in the `specs/` dir; Android registers each shell in the package class. **One rule for every package**, single- and multi-spec alike — no degenerate exceptions. + +**Why:** Multi-module packages (database ×5, firestore ×4) cannot name the library after one module, so the aggregate-library shape is mandatory for them; applying it everywhere gives a single rule reviewers can apply without thinking about spec count. The aggregate-library shape is the one RN documents and the one that generalizes. + +**`functions` correction (one-time):** `functions` shipped with `codegenConfig.name: "NativeRNFBTurboFunctions"` (the *module* name). Rename to `RNFBFunctionsTurboModules` for consistency. **Downside: effectively none.** `codegenConfig.name` is the *generated-library* identifier (drives generated file/JNI/CMake target names) — it is **internal**, not a public/consumer symbol, and is **distinct from the module name** `NativeRNFBTurboFunctions` (the `RCT_EXPORT_MODULE` / `TurboModuleRegistry.get('NativeRNFBTurboFunctions')` key), which **stays unchanged**. The rename is mechanical: change `name`, re-run `yarn codegen`, delete the old generated files, update `react-native.config.js` `cmakeListsPath` if it embeds the old name, commit. Only risk is a build-wiring reference to the old library name; a clean codegen + build catches it. Track as a small standalone follow-up (low risk, no consumer impact). + +**Gate:** every spec name appears as a `modulesProvider` key (iOS) and is registered in the package class (Android); `codegenConfig.name` matches `RNFBTurboModules`. + +Reference: [`packages/app/package.json`](../../../packages/app/package.json) `codegenConfig`. + +--- + +## NewArch-AD-8 — TurboModule JS enumeration: `for...in` + `Object.create` — **Accepted** + +When wrapping or extending a native module, enumerate methods with **`for...in`** (not `Object.keys`) and extend with **`Object.create(host, descriptors)`** (never copy the host into a plain `{}` / spread / `Object.assign({}, host)`). + +**Why:** TurboModules expose methods lazily on the **prototype**, which are non-own; `Object.keys`/spread see nothing and produce `XYZ is not a function`. Codegen methods **are** enumerable via `for...in` (confirmed), so `for...in` + `Object.create` both finds them and preserves the prototype. Reference: [RN enable-libraries § "XYZ is not a function"](https://github.com/reactwg/react-native-new-architecture/blob/main/docs/enable-libraries.md#javascript-xyz--is-not-a-function-it-is-undefined), [facebook/react-native#43221](https://github.com/facebook/react-native/issues/43221). + +Code: [`registry/nativeModule.ts`](../../../packages/app/lib/internal/registry/nativeModule.ts), [`nativeModuleAndroidIos.ts`](../../../packages/app/lib/internal/nativeModuleAndroidIos.ts). + +--- + +## NewArch-AD-9 — `requiresMainQueueSetup` returns `NO` — **Accepted** + +iOS TurboModule shells return `NO` from `+ requiresMainQueueSetup`. Any genuinely main-thread/UIKit work in `getConstants`/init is dispatched explicitly to the main queue, not by forcing whole-module main-queue setup. + +**Why:** Under TurboModules, `requiresMainQueueSetup = YES` makes the lazy module load run setup **synchronously on the main thread** — the JS thread blocks on main (deadlock risk under fling) **and synchronous methods are blocked** (which would block [NewArch-AD-16 Phase S](#newarch-ad-16--phase-s-asyncsync-conversion--open)). Reference: [RN #49957](https://github.com/facebook/react-native/pull/49957), [RN commit d7ac21c](https://github.com/facebook/react-native/commit/d7ac21cec5492e180fbf3817af7be64ab121cb75) (under TurboModules `getConstants` runs on the JS thread, not the main queue). + +**Per-package audit (part of gap-analysis):** inventory each shell's `getConstants`/init and any `methodQueue` override for genuine main-thread/UIKit dependencies; default to `NO`; dispatch only the specific main-thread work that needs it. + +**Phase 0 status — implemented (2026-06-29 re-implementation pass).** Both shells return `NO`; legacy `methodQueue = dispatch_get_main_queue()` overrides removed per [NewArch-AD-19](#newarch-ad-19--turbomodule-methodqueue-policy--accepted). Validate on-device during area-focused e2e if any method regresses. + +--- + +## NewArch-AD-10 — Cross-package native state is centralized in `app`, with testable APIs — **Accepted** + +`packages/app` is the home of cross-package native APIs and shared state (it always has been). This is acceptable; the goal is to **formalize** it: prefer explicit, testable accessors over bare `public static` fields, and ensure any inter-module state really is routed through `app` rather than duplicated per package. + +**Known shared state to keep centralized:** `authDomains` / iOS `customAuthDomains` (read by `auth` + `RCTConvertFirebase`); `ReactNativeFirebaseJSON` / `Meta` / `Preferences` / `UniversalFirebasePreferences` (read by database, firestore, messaging, crashlytics, app-check); the event emitters (NewArch-AD-4 / Phase C). When a package migrates, it must keep reaching these `app`-owned singletons; do not fork a second copy. + +**Direction:** treat the current `public static` maps as tolerated legacy carryover; a new cross-package channel should be an explicit app-owned API/singleton with tests, not a new public static. + +**Encapsulation cleanup ([Phase E](migration-work-queue.md#phase-e-shared-state-encapsulation-optional), optional):** a post-migration pass that refactors the un-encapsulated shared-state items (bare `public static` maps such as `authDomains`) behind explicit, testable `app`-owned accessor methods, and audits that all inter-module state is genuinely centralized in `app`. Optional and deferrable — it does not block the coordinated break — but the canonical home for that work. + +--- + +## NewArch-AD-11 — Multi-module method names are merged; uniqueness enforced by test — **Accepted** + +Multiple specs/modules in one package are **merged flat** into a single resolved native object (so JS keeps calling `native.documentGet(...)` etc.). Method names must therefore be **globally unique across a package's specs**. Follow the existing `` naming already in use (`documentGet`, `collectionGet`, `transactionBegin`, `aggregateQuery`, …) — which is why there are zero collisions today. + +**Enforcement:** a build/test-time uniqueness assertion (part of NewArch-AD-17's contract test) asserts the union of method names across a package's specs has no duplicates. Optional `__DEV__` runtime guard in the merge loop warns on overwrite. We do **not** namespace sub-modules on the wire (would churn every call site). + +--- + +## NewArch-AD-12 — One commit per package — **Accepted** + +Convert a whole package (all its legacy modules → all its specs) in one `implementation → independent-review → commit` loop; land it as one `feat()!: migrate to TurboModules` (breaking: New Architecture required). Multiple specs ≠ multiple commits — they share `codegenConfig`, generated artifacts, podspec/gradle guards, and JS wiring that only build and pass e2e together. + +--- + +## NewArch-AD-13 — Test harness: committed defaults + gitignored local overrides — **Accepted** + +`tests/globals.js` and `tests/app.js` keep the **committed defaults** (`RNFBDebug = false`, full `platformSupportedModules`, durable product wiring such as the `NativeRNFBTurbo*` resolver routing). Local per-run choices (`RNFBDebug = true`, a focused module list) live in a small **gitignored overrides file** that the harness reads if present. + +**Why:** Durable product wiring (e.g. routing `NativeRNFBTurbo*` through the resolver) currently shares files with ephemeral narrowing, so a `git checkout` revert of narrowing also drops product wiring — this already happened once. It also bites human developers who narrow locally and then lose or accidentally commit it. Separating committed defaults from a gitignored overrides file makes the durable wiring un-revertable and the local narrowing impossible to commit. + +**Mechanism:** + +- Committed **`tests/harness.overrides.example.js`** — the shape demonstrator. Heavily commented for a human or agent: what each field means, valid values, and exactly what to paste to narrow modules / enable `RNFBDebug`. Exports an empty/no-op override so copying it changes nothing until edited. +- Gitignored **`tests/harness.overrides.js`** — the real local file; developers/agents copy the example to this name and edit it. +- `tests/globals.js` / `tests/app.js` read `harness.overrides.js` if present, else fall back to committed defaults. Because `tests/app.js` uses `require.context` (Metro static analysis), the override must express module narrowing as a **filter list the harness applies to the static set**, not a dynamic `require`. + +**Ordering caution (do this in order):** add `tests/harness.overrides.js` to `.gitignore` **first** and verify it is ignored (`git check-ignore`), **then** create the local file — so the real overrides file can never be accidentally tracked. The committed example file (`harness.overrides.example.js`) must **not** be ignored. + +### NewArch-AD-13a — Optional overrides need a resolver stub (Metro dependency-map integrity) — **Accepted** + +The optional `require('./harness.overrides.js')` in `tests/app.js` / `tests/globals.js` sits in a `try/catch`, so Metro treats it as an **optional dependency**. When the gitignored file is **absent** (the default), Metro 0.81.x (RN 0.78) **omits the unresolved optional dependency from the requiring module's serialized dependency-id array** instead of inserting a placeholder. That shifts every later dependency index down by one and drops the module's **final** dependency — surfacing at runtime, during the very first `App()` render, as `Requiring unknown module "undefined"`. It is deterministic and independent of caches, `node_modules`, `lazy` bundling, and RN version; it was masked whenever a developer happened to have a local `harness.overrides.js` present, and it breaks any clean checkout / CI that runs e2e without one. + +**Decision:** `tests/metro.config.js` `resolveRequest` resolves `./harness.overrides.js` to a **committed empty stub** (`tests/harness.overrides.stub.js` → `module.exports = {}`) whenever the local file does not exist; a present local override resolves normally. The dependency then always resolves, so the dependency map stays intact. + +**Why not just commit a real `harness.overrides.js`:** keeping the override gitignored (AD-13) preserves "local narrowing can never be committed"; the resolver stub restores Metro integrity without giving that up. Keep the `try/catch` as defense-in-depth. The stub must never carry overrides. + +--- + +## NewArch-AD-14 — Native-module wrapper: memoizing lazy `Proxy` — **Accepted** + +The wrapper gives every native method: (1) **arg prepending** (`appName`, region/databaseId — the native bridge argument injection that lets product code call `firestore().collection(...)` without passing `appName`), (2) **error mapping** (native rejections → `NativeFirebaseError`), (3) **iOS null-encoding** for TurboModule object args. These responsibilities are mandatory product behavior. + +**Decision:** wrap via a **memoizing lazy `Proxy`** — each method is wrapped+bound **on first call** and cached, instead of eagerly materializing every method at first touch. + +**Why over eager:** eager builds all closures up front (auth ≈ 59, firestore ≈ 31 per cache key) and **defeats TurboModule prototype lazy loading**; the lazy Proxy preserves laziness (only pay for methods actually called), removes the eager `getConstants` rebuild on hot paths ([NewArch-AD-15](#newarch-ad-15--constant-memoization-scope-static-only--accepted)), and lets the `app`-path and `FirebaseModule`-path wrapping converge on one shape. The Proxy must enumerate via `for...in` and preserve the host prototype ([NewArch-AD-8](#newarch-ad-8--turbomodule-js-enumeration-forin--objectcreate--accepted)) — it must **not** flatten onto a frozen `{}` (that is the eager pattern being replaced). + +**Coupling note:** the current `initialiseNativeModule` flatten-onto-`{}` + `Object.freeze` only works because eager wrapping pre-materializes own-enumerable methods. Moving to the Proxy means returning the Proxy (or a Proxy-backed object), **not** an `Object.assign`-ed frozen plain object. Update both the multi-module merge and the single-module path together. + +### NewArch-AD-14a — Multi-host merge: routing composite Proxy (required for multi-module) + +A single `Proxy` has **one** target/`[[Prototype]]`, so it cannot represent N independent TurboModule hosts (firestore ×4, database ×5) whose lazy methods live on **separate** prototype chains. The single-host Proxy is insufficient for multi-module packages, which **Phase 1 hits immediately** (`FirestoreStatics`, `DatabaseSyncTree`). Design the merge as a **routing composite Proxy**, not a flattened object: + +1. **At init (metadata only, cheap):** `for...in` each raw host to build a `methodName → { host, key }` routing map. No wrapping/binding yet — just discover which host owns each name. (Method names are unique across a package's specs by [NewArch-AD-11](#newarch-ad-11--multi-module-method-names-are-merged-uniqueness-enforced-by-test--accepted), so the map has no collisions.) +2. **`get(name)` trap:** on first access, look up `{ host, key }`, wrap+bind from the **correct** host (arg-prepend + error-map + iOS null-encode), memoize the wrapped fn, return it. Preserves per-host prototype/laziness. +3. **`has` / `ownKeys` / `getOwnPropertyDescriptor`:** answer from the routing map (so `in`, `for...in`, and `Object.keys` over the merged surface behave). +4. **Drop the dead `multiModuleRoot[moduleName] = !!nativeModule` boolean flags** — they are written but never read in product code; if optional-module presence is ever needed, keep it in a side table, not on the callable surface. +5. **No `Object.freeze`** on the composite — immutability is provided by the Proxy traps (no `set`), not by freezing. + +The single-module path is the degenerate N=1 case of the same composite (one host in the routing map). Implement both through the one mechanism. **NewArch-AD-17.1's contract test must include a 2-host merge fixture** even before firestore ships, since Phase 0 (`app`/`utils` are resolved as *separate* single-host surfaces) does **not** exercise this path. + +--- + +## NewArch-AD-15 — Constant memoization scope: static only — **Accepted** + +Memoize constants that are **static after init** (e.g. app `NATIVE_FIREBASE_APPS`, `FIREBASE_RAW_JSON`; iOS/file-path constants). Do **not** memoize constants that can change at runtime; expose those as **methods**, not cached constants. + +**Why / coherency:** Memoization is JS-layer caching. For static native state a cached snapshot can't drift; for **dynamic** native state it can, with no native→JS invalidation signal. + +**Constant taxonomy (classify each before caching):** + +| Class | Examples | Caching rule | +|-------|----------|--------------| +| **bootstrap-only** | `NATIVE_FIREBASE_APPS` | Snapshot at bootstrap. JS never re-reads it today, so memoizing preserves current semantics — but document it as a bootstrap snapshot; runtime `initializeApp`/`deleteApp` will **not** be reflected (already true). | +| **build-time static** | `FIREBASE_RAW_JSON`, path constants (`DOCUMENT_DIRECTORY`, …) | Safe to memoize indefinitely. | +| **session-static** | `isRunningInTestLab` | Safe to memoize. | +| **dynamic** | `androidPlayServices` | **Never cache as a constant.** Expose as a method (`androidGetPlayServicesStatus()`); remove from the spec's `getConstants` typing when converted. | + +**Hot-path bug to fix in the same pass:** `withTurboConstants` calls `getConstants()` on **every** `getReactNativeModule()` resolve — the exact rebuild NewArch-AD-14/NewArch-AD-15 target. And `messaging.isSupported()` currently reads the Play Services value via the **legacy** module name `RNFBUtilsModule` and the static constant — under turbo-only resolution that name returns nothing, so `isSupported()` breaks. Fix it to resolve `NativeRNFBTurboUtils` **and** read via the dynamic method, not the constant. + +--- + +## NewArch-AD-16 — Phase S (async→sync conversion) — **Open** + +Some RNFB methods are `Promise` only because the legacy bridge forced async, while firebase-js-sdk is synchronous. TurboModules support sync JSI methods, so those can return to sync parity. Scope, discriminator, and the required gap-analysis live in [migration work queue § Phase S](migration-work-queue.md#phase-s-sync-conversion-forced-async--sync) and [implementation workflow § Phase S](turbomodule-implementation-workflow.md#phase-s-sync-conversion-forced-async--sync). + +**Open question driving the gap-analysis:** the "keep async if it does network/IO/disk" rule assumes firebase-js-sdk's sync methods do **not** do blocking IO for the same functionality. That must be verified per method (does the web SDK do the work in-memory, or defer it?), because if web is genuinely sync-and-non-blocking, RNFB may be able to be sync too. Do not lock the conversion list until that inventory exists. Blocked by NewArch-AD-9 (`requiresMainQueueSetup = NO`) — sync methods require it. + +--- + +## NewArch-AD-17 — Spec contract + parity tests — **Accepted** + +Jest-level tests, reused across packages: + +1. **Resolution/enumeration contract** — **Accepted.** A fixture that models a TurboModule (methods **non-own on the prototype**, constants own; `Object.keys(raw) === []`) and asserts every spec method is callable through the **real wrapper** (`getNativeModule`/`getAppModule`). Catches the NewArch-AD-8 enumeration class — and now the NewArch-AD-14 Proxy behavior — in sub-second Jest instead of 30-minute e2e. Build alongside the Phase 0 re-implementation. **Must include a 2-host merge fixture** (two mock TurboModule hosts, disjoint method sets) that exercises the [NewArch-AD-14a routing composite Proxy](#newarch-ad-14a--multi-host-merge-routing-composite-proxy-required-for-multi-module) — because Phase 0 (`app`/`utils` resolved as separate single-host surfaces) does not, yet Phase 1 (firestore/database) depends on it. + + + +### NewArch-AD-17.1 — Jest TurboModule contract test — **Accepted** + +**Canonical file:** [`packages/app/__tests__/nativeModuleContract.test.ts`](../../../packages/app/__tests__/nativeModuleContract.test.ts) + +**Describe block (grep anchor):** `TurboModule wrapper contract (NewArch-AD-17.1)` + +**Scoped Jest command (review / implementer handoff):** + +```bash +yarn tests:jest -- packages/app/__tests__/nativeModuleContract.test.ts +``` + +**Full suite** (`yarn tests:jest`) must also stay green — the contract test is part of the global Jest run, not a separate harness. + +**Fixtures required in that file:** + +| Case | Asserts | +|------|---------| +| TurboModule host shape | Methods non-own on prototype; `Object.keys(raw) === []` | +| Single-host wrapper | Every spec method callable via `getNativeModule()` | +| 2-host merge (NewArch-AD-14a) | Routing composite Proxy dispatches to the correct host per method name | + +**When required:** any change to [`nativeModule.ts`](../../../packages/app/lib/internal/registry/nativeModule.ts), `withTurboConstants`, or TurboModule wrapper behavior — re-run the scoped command above before closing `implementation_gate` or `review_gate`. +2. **Spec↔native parity** — **Accepted.** Assert each package's spec method-name set equals the union of Android `@ReactMethod` (generated Java spec) and iOS TurboModule protocol methods (generated ObjC spec header), and (NewArch-AD-11) the union across a package's specs has no duplicate names. + + + +### NewArch-AD-17.2 — Spec↔native parity test — **Accepted** + +**Canonical file:** [`packages/app/__tests__/turboModuleSpecNativeParity.test.ts`](../../../packages/app/__tests__/turboModuleSpecNativeParity.test.ts) + +**Describe block (grep anchor):** `Spec↔native parity (NewArch-AD-17.2)` + +**Scoped Jest command:** + +```bash +yarn tests:jest -- packages/app/__tests__/turboModuleSpecNativeParity.test.ts +``` + +**Helper:** [`specNativeParityHelper.ts`](../../../packages/app/__tests__/specNativeParityHelper.ts) — parses TS spec interfaces, Android generated `*Spec.java` `@ReactMethod` names, and iOS generated `@protocol NativeRNFBTurbo*Spec` method names. + +3. **Codegen-up-to-date CI** — **Accepted.** Root `yarn codegen:verify` runs [`scripts/codegen-verify.mjs`](../../../scripts/codegen-verify.mjs) (codegen for all 13 migrated packages via the `@react-native-firebase/app` React Native CLI context) then `git diff --exit-code` on `packages/*/android/**/generated/**` and `packages/*/ios/generated/**` (NewArch-AD-5 guard). Wired in the CI lint job ([`.github/workflows/linting.yml`](../../../.github/workflows/linting.yml)). + + + +### NewArch-AD-17.3 — Codegen verify CI — **Accepted** + +**Command:** `yarn codegen:verify` + +**When required:** any change to `packages/*/specs/**` or Codegen/RN version bumps that could regenerate native artifacts — run before closing `implementation_gate` or `review_gate`. + +**Why:** The current Jest mocks are plain enumerable objects and structurally cannot reproduce the enumeration bug that already cost an iteration; these tests close that blind spot and make iterations faster and higher quality. + +**Determinism requirement:** `codegen:verify` is only meaningful if `yarn codegen` is reproducible. It resolves the RN/Codegen toolchain at run time, so the toolchain **must** be pinned to the app's RN line ([NewArch-AD-20](#newarch-ad-20--pin-the-rncodegen-toolchain-rn-bumps-are-coordinated-breaking-changes--accepted)); otherwise a host/CI with a drifted `@react-native/codegen` or `react-native` emits spurious drift (0.82/0.80 macros, podspec path changes) or masks real drift. + +--- + +## NewArch-AD-18 — Raw vs wrapped resolver policy — **Accepted** + +Two resolution surfaces exist and must be used deliberately: + +- **Wrapped** (`getNativeModule(module)` / `getAppModule()` → the [NewArch-AD-14](#newarch-ad-14--native-module-wrapper-memoizing-lazy-proxy--accepted) Proxy): the **default** for all product calls. Gives arg-prepend, error mapping, iOS null-encoding. +- **Raw** (`getReactNativeModule(name)`): the **bare** native object from the unified resolver — no wrapping. + +**Default rule:** new product code uses the **wrapped** surface. Raw access is allowed **only** when listed in the canonical exception table below (or after a gap-analysis finds a new legitimate case, documents it here, and adds an in-code rationale comment). Raw callers must use the **turbo** module name ([NewArch-AD-2](#newarch-ad-2--naming-nativernfbturbo--accepted)). Raw callers do **not** get error mapping — they must handle native errors themselves. + +**Gap-analysis gate (every package):** as part of spec authoring, `grep` the repo for `getReactNativeModule(` in product code. For each hit: (1) is it already in the table below? (2) if not, is it a bug (legacy module name, should be wrapped)? (3) if genuinely new, add a row here with policy rationale **before** landing the PR. See [workflow § gap-analysis](turbomodule-implementation-workflow.md#spec-authoring-gap-analysis--pre-implementation). + +### Canonical exception table + +| # | Call site | Module name | Category | Why raw (policy) | Action | +|---|-----------|---------------|----------|------------------|--------| +| E1 | [`RNFBNativeEventEmitter.ts`](../../../packages/app/lib/internal/RNFBNativeEventEmitter.ts) (constructor, `addListener`, `removeAllListeners`, `removeSubscription`) | `NativeRNFBTurboApp` | **Permanent** | React Native's `NativeEventEmitter` must receive the **same raw host object** that implements `addListener` / `removeListeners` on the native side. Wrapping would break event subscription identity and the RN event-bridge contract. Deferred to [Phase C](migration-work-queue.md#deferred-cleanup-phase-eventemitter) for a typed Codegen event path. | Keep raw; turbo name. | +| E2 | [`nativeModule.ts`](../../../packages/app/lib/internal/registry/nativeModule.ts) `initialiseNativeModule` / `getAppModule` bootstrap | any | **Infrastructure** | The wrapper factory itself must read the bare host to build the [NewArch-AD-14](#newarch-ad-14--native-module-wrapper-memoizing-lazy-proxy--accepted) Proxy/composite. Not a product bypass. | N/A | +| E3 | [`nativeModuleAndroidIos.ts`](../../../packages/app/lib/internal/nativeModuleAndroidIos.ts) unified resolver | any | **Infrastructure** | Defines `getReactNativeModule`; applies `withTurboConstants` before returning. Not a product bypass. | N/A | +| E4 | [`tests/globals.js`](../../../tests/globals.js) `NativeModules` proxy getter | `RNF*` / `NativeRNFBTurbo*` | **Infrastructure** | E2e harness routes RNFB module names through the real unified resolver so specs that read `NativeModules.NativeRNFBTurboApp` (e.g. [`events.e2e.js`](../../../packages/app/e2e/events.e2e.js)) get a live module, not a stub. Durable product wiring — not harness narrowing. | Keep; part of Phase 0. | +| E5 | [`UtilsStatics.ts`](../../../packages/app/lib/utils/UtilsStatics.ts) `FilePath` getter | `NativeRNFBTurboUtils` | **Phase 0 fix** | Reads path **constants** synchronously from the utils host without a `FirebaseModule` instance (static getter on `Utils.Statics`). Raw was acceptable pre-turbo; under [NewArch-AD-15](#newarch-ad-15--constant-memoization-scope-static-only--accepted) migrate to a dedicated wrapped utils accessor (or memoized static read via resolver) so constants are not rebuilt per access. Turbo name is already correct. | Fix in Phase 0 re-implementation. | +| E6 | [`messaging/lib/index.ts`](../../../packages/messaging/lib/index.ts) `isSupported()` | ~~`RNFBUtilsModule`~~ → `NativeRNFBTurboUtils` | **Phase 0 fix (bug)** | Cross-package read of Play Services availability. Was using **legacy module name** (returns `undefined` under turbo-only) and a **dynamic constant** (`androidPlayServices`) that can go stale. Must use turbo name + **dynamic method** `androidGetPlayServicesStatus()` per [NewArch-AD-15](#newarch-ad-15--constant-memoization-scope-static-only--accepted). | **Must-fix** in Phase 0. | +| E7 | [`app/lib/modular.ts`](../../../packages/app/lib/modular.ts) `metaGetAll`, `jsonGetAll`, `preferences*` | `NativeRNFBTurboApp` | **Not an exception — migrate** | No policy reason for raw; these are app-module method calls with no arg-prepend skip. Should use **`getAppModule()`** (wrapped) for error mapping consistency. Listed here so gap-analysis catches them. | Migrate to `getAppModule()` in Phase 0. | +| E8 | [`FirestoreStatics.ts`](../../../packages/firestore/lib/FirestoreStatics.ts) `setLogLevel` | `NativeRNFBTurboFirestore` | **Phase 1 fix** | Cross-package static helper bypasses `FirebaseModule`/`getNativeModule`. Uses turbo main host via [`getStaticFirestoreMainModule()`](../../../packages/firestore/lib/internal/staticNativeModule.ts) (NewArch-AD-18 E8). Raw access retained — no wrapped surface for static helpers. | Done — firestore Phase 1. | +| E9 | [`DatabaseSyncTree.ts`](../../../packages/database/lib/DatabaseSyncTree.ts) `native` getter | `RNFBDatabaseQueryModule` | **Deferred — Phase 4** | Internal sync listener tree calls query module directly for low-latency sync ops, bypassing the merged multi-module surface. Acceptable until database migrates; then turbo name + evaluate whether wrapped merge surface suffices. | Fix when `database` migrates. | +| E10 | [`phone-number-verification/lib/index.ts`](../../../packages/phone-number-verification/lib/index.ts) `getNativeModule()` | `RNFBPnvModule` | **Deferred — Phase 5** | Package bypasses `createModuleNamespace` by design ([workflow § gotchas](turbomodule-implementation-workflow.md#gotchas)). Direct resolver is intentional; update to `NativeRNFBTurboPnv` on migration. | Fix when `phone-number-verification` migrates. | + +**Adding a new exception:** gap-analysis must justify why wrapping breaks (not merely "it's convenient"). Update this table and add a one-line `// NewArch-AD-18 E: ` comment at the call site. + +--- + +## NewArch-AD-19 — TurboModule `methodQueue` policy — **Accepted** + +Default: **do not override `methodQueue`.** Remove legacy `- (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); }` overrides (present on `RNFBAppModule` and `RNFBUtilsModule`) unless a specific method genuinely needs the main thread — in which case dispatch *that method's* main-thread work explicitly (the `RCTUnsafeExecuteOnMainQueueSync` pattern already used in `initializeApp`), rather than forcing the whole module onto main. + +**Why:** A module-wide `methodQueue = main_queue` couples every async method to the main thread (jank/contention) and is inconsistent with [NewArch-AD-9](#newarch-ad-9--requiresmainqueuesetup-returns-no--accepted) (`requiresMainQueueSetup = NO`). **Caveat (unverified):** how TurboModule JSI honors `methodQueue` for sync vs async methods is not documented; treat removal as a native change to validate on-device during Phase 0 re-implementation, not a blind delete. Keep explicit main dispatch only where UI (e.g. Play Services resolution dialogs) requires it. + +--- + +## NewArch-AD-20 — Pin the RN/Codegen toolchain; RN bumps are coordinated breaking changes — **Accepted** + +Committed generated native artifacts ([NewArch-AD-5](#newarch-ad-5--commit-generated-code--accepted)) are **RN-version-specific templates**: CMake `target_compile_options` vs `target_compile_reactnative_options`, podspec `RCT_SCRIPT_RN_DIR` paths / `add_rncore_dependency`, and JSI/spec signatures all change across RN releases. `yarn codegen` stamps whatever `@react-native/codegen` + `react-native` the toolchain resolves **at run time**. If that diverges from the test app's RN, codegen emits artifacts that mismatch the app → the native build breaks and [`codegen:verify`](#newarch-ad-173--codegen-verify-ci--accepted) becomes environment-nondeterministic. + +**This happened:** root `"@react-native-community/cli": "latest"` hoisted `@react-native/codegen@0.82` (and pulled `react-native@0.82`), while `packages/functions` carried a stray `"react-native": "^0.80.1"` devDep — together producing spurious 0.82/0.80 drift (CMake macro flip, functions podspec path/`add_rncore_dependency` changes) that would break the RN 0.78 build if committed. + +**Decision:** + +- Pin the RN/Codegen toolchain to the app's RN line via root `resolutions` — `react-native`, `@react-native/codegen`, and `@react-native-community/cli` fixed to the app's line (currently `0.78.3` / `0.78.3` / `15.1.3`). +- **No floating specifiers** (`latest`, `*`, `^0.80`, …) for the RN toolchain in any workspace `package.json`. Individual packages must **not** declare their own `react-native` devDependency — rely on the hoisted, pinned version (as `app-check` / `storage` do). +- Treat a React Native upgrade as **one coordinated breaking change**: bump the app RN **and** the pinned `resolutions` together, regenerate all `generated/**`, rebuild native on iOS + Android, and re-run `codegen:verify` — in a single change. See the **Updating React Native** checklist in [CONTRIBUTING.md](../../CONTRIBUTING.md). + +**Why:** makes generated output reproducible everywhere (local + CI), prevents silent native-build breaks, and makes the RN coupling explicit and auditable. + +--- + +## Related docs + +| Topic | Document | +|-------|----------| +| Procedure / how-to | [turbomodule-implementation-workflow.md](turbomodule-implementation-workflow.md) | +| Phase/gate/ephemeral state | [migration-work-queue.md](migration-work-queue.md) | +| Index | [index.md](index.md) | +| Change loop, gates, tiers | [change-authoring-workflow.md](../testing/change-authoring-workflow.md) | +| Doc/commit policy | [documentation-policy.md](../documentation-policy.md) | diff --git a/okf-bundle/new-architecture/index.md b/okf-bundle/new-architecture/index.md new file mode 100644 index 0000000000..142d357a6a --- /dev/null +++ b/okf-bundle/new-architecture/index.md @@ -0,0 +1,23 @@ +# New Architecture (TurboModules) + +TurboModule migration for React Native Firebase native bridge packages. + +**Policy:** [OKF documentation and commit policy](../documentation-policy.md). + +## Documents + +* [Architecture decisions (ADR)](architecture-decisions.md) — **canonical owner** of durable decisions (the "what + why"); other docs reference it +* [Migration work queue](migration-work-queue.md) — ephemeral gates, phase ordering, package inventory +* [TurboModule implementation workflow](turbomodule-implementation-workflow.md) — spec/codegen/native conversion, area harness; extends [change authoring](../testing/change-authoring-workflow.md) + +## Reference implementation + +* [`packages/functions`](../../../packages/functions/) — first TurboModule package ([PR #8603](https://github.com/invertase/react-native-firebase/pull/8603); new-arch-only from v24) +* [`packages/app`](../../../packages/app/) — Phase 0 foundation; first [multi-spec package](migration-work-queue.md#package-inventory) (`NativeRNFBTurboApp` + `NativeRNFBTurboUtils`); see [workflow § multi-spec / gotchas](turbomodule-implementation-workflow.md#multi-spec-packages-app-precedent) + +## Related repository files + +* [`packages/app/lib/internal/registry/nativeModule.ts`](../../../packages/app/lib/internal/registry/nativeModule.ts) — `turboModule` flag, null encoding, module wrapping +* [`packages/app/lib/internal/nullSerialization.ts`](../../../packages/app/lib/internal/nullSerialization.ts) — iOS null sentinel for TurboModule object args +* [`packages/functions/specs/NativeRNFBTurboFunctions.ts`](../../../packages/functions/specs/NativeRNFBTurboFunctions.ts) — Codegen spec pattern +* [`packages/functions/package.json`](../../../packages/functions/package.json) — `codegenConfig`, committed generated output diff --git a/okf-bundle/new-architecture/migration-work-queue.md b/okf-bundle/new-architecture/migration-work-queue.md new file mode 100644 index 0000000000..3995fa7f51 --- /dev/null +++ b/okf-bundle/new-architecture/migration-work-queue.md @@ -0,0 +1,440 @@ +--- +type: Reference +title: TurboModule migration work queue +description: Phase tracker for migrating React Native Firebase packages from legacy NativeModules to Codegen TurboModules under a coordinated New Architecture break. +tags: [new-architecture, turbomodule, codegen, migration, work-queue] +timestamp: 2026-06-26T00:00:00Z +--- + +# TurboModule migration — work queue + +> **IN PROGRESS (2026-07-03):** Phase **S** — `convert` inventory complete; **S2** native-change follow-up queued ([§ Phase S2](#phase-s2-native-change-follow-up-gap-analysis-2026-07-03)). Phases 0–5, Docs/PD, and R are complete. +> **Goal/order:** app foundation → hard probe → easy wins → remaining complex → sync conversion → coordinated break → cleanup (events, shared-state encapsulation). Decisions: [architecture-decisions.md](architecture-decisions.md). Links: [implementation workflow](turbomodule-implementation-workflow.md), [change authoring](../testing/change-authoring-workflow.md), [functions reference](../../../packages/functions/) ([PR #8603](https://github.com/invertase/react-native-firebase/pull/8603)). + +Ephemeral tracker; see [OKF policy](../documentation-policy.md). + +--- + +## Locked decisions + +Durable architectural decisions are owned by **[architecture-decisions.md](architecture-decisions.md)** (canonical, with rationale). Quick index of the *Accepted* ones: + +| ADR | Decision | +|-----|----------| +| [NewArch-AD-1](architecture-decisions.md#newarch-ad-1--new-architecture-only--accepted) | New Architecture only — one coordinated semver major | +| [NewArch-AD-2](architecture-decisions.md#newarch-ad-2--naming-nativernfbturbo--accepted) | Naming: `NativeRNFBTurbo*` prefix | +| [NewArch-AD-3](architecture-decisions.md#newarch-ad-3--strong-codegen-typing--accepted) | Strong Codegen typing | +| [NewArch-AD-4](architecture-decisions.md#newarch-ad-4--events-deferred-to-phase-c--accepted) | Events deferred to [Phase C](#deferred-cleanup-phase-eventemitter) | +| [NewArch-AD-5](architecture-decisions.md#newarch-ad-5--commit-generated-code--accepted) | Commit generated code | +| [NewArch-AD-6](architecture-decisions.md#newarch-ad-6--unified-native-module-resolver--accepted) | Unified resolver; Phase R final state is TurboModule-only (no `NativeModules` fallback) | +| [NewArch-AD-7](architecture-decisions.md#newarch-ad-7--codegenconfigname--aggregate-library-name-one-codegenconfig-per-package--accepted) | `codegenConfig.name` = `RNFBTurboModules` (all packages) | +| [NewArch-AD-8](architecture-decisions.md#newarch-ad-8--turbomodule-js-enumeration-forin--objectcreate--accepted) | Enumerate with `for...in` + `Object.create` | +| [NewArch-AD-9](architecture-decisions.md#newarch-ad-9--requiresmainqueuesetup-returns-no--accepted) | `requiresMainQueueSetup` returns `NO` | +| [NewArch-AD-10](architecture-decisions.md#newarch-ad-10--cross-package-native-state-is-centralized-in-app-with-testable-apis--accepted) | Cross-package state centralized in `app` | +| [NewArch-AD-11](architecture-decisions.md#newarch-ad-11--multi-module-method-names-are-merged-uniqueness-enforced-by-test--accepted) | Multi-module method names unique (test-enforced) | +| [NewArch-AD-12](architecture-decisions.md#newarch-ad-12--one-commit-per-package--accepted) | One commit per package | +| [NewArch-AD-13](architecture-decisions.md#newarch-ad-13--test-harness-committed-defaults--gitignored-local-overrides--accepted) | Harness: committed defaults + gitignored overrides | +| [NewArch-AD-14](architecture-decisions.md#newarch-ad-14--native-module-wrapper-memoizing-lazy-proxy--accepted) | Memoizing lazy Proxy wrapper (+ NewArch-AD-14a composite) | +| [NewArch-AD-15](architecture-decisions.md#newarch-ad-15--constant-memoization-scope-static-only--accepted) | Memoize static constants only; dynamic → method | +| [NewArch-AD-18](architecture-decisions.md#newarch-ad-18--raw-vs-wrapped-resolver-policy--accepted) | Raw vs wrapped resolver policy | +| [NewArch-AD-19](architecture-decisions.md#newarch-ad-19--turbomodule-methodqueue-policy--accepted) | No `methodQueue` override by default | +| [NewArch-AD-13a](architecture-decisions.md#newarch-ad-13a--optional-overrides-need-a-resolver-stub-metro-dependency-map-integrity--accepted) | Harness overrides: Metro resolver stub when local file absent | +| [NewArch-AD-20](architecture-decisions.md#newarch-ad-20--pin-the-rncodegen-toolchain-rn-bumps-are-coordinated-breaking-changes--accepted) | Pin RN/Codegen toolchain to app RN; RN bump = coordinated break | + +Implementation steps, harness, and commit rules: [turbomodule implementation workflow](turbomodule-implementation-workflow.md) — do not restate here. + +--- + +## Resume checklist + +Gate prerequisites before any `:test-cover` ([host rule](../testing/change-authoring-workflow.md#host-rule)): + +1. [Pre-flight](../testing/running-e2e.md#pre-flight-is-the-host-clear-to-start): [host-clear probes](../testing/running-e2e.md#host-clear-probes), [services ready](../testing/running-e2e.md#2-services-ready), [harness matches validation tier](../testing/running-e2e.md#3-harness-matches-validation-tier) ([narrowing gate](../testing/running-e2e.md#harness-narrowing-gate-blocking) — required for **unit-focused** and **area-focused**; not [push harness](#harness)); [serial `:test-cover`](../testing/running-e2e.md#serialized-e2e-dispatch); [frozen tree](../testing/change-authoring-workflow.md#frozen-tree) for `independent-review`. +2. New Architecture enabled on dev host / emulator for native bridge work. +3. Per-package protocol: [Phase iteration protocol](#phase-iteration-protocol) below. + +--- + +## What changes vs what stays + +| Layer | Stays | Changes | +|-------|-------|---------| +| JS product API | `modular.ts`, web shims, `FirebaseModule` subclasses, arg prepending | `nativeModuleName` → `NativeRNFBTurbo*`; `turboModule: true` | +| Events (Phases 0–5) | Compile-time event names, `SharedEventEmitter` fan-out, `nativeEvents` | Native emitters unchanged — see [Phase C](#deferred-cleanup-phase-eventemitter) | +| Native | Firebase SDK integration, business logic | Extend generated `*Spec`; iOS `getTurboModule()`; podspec new-arch guard | +| Release | Per-package semver today | **One coordinated major** when Phases 0–5 complete | + +--- + +## Reference pattern (`functions`) + +Brief index — full checklist: [turbomodule implementation workflow](turbomodule-implementation-workflow.md). + +Each migrated package repeats the [`functions`](../../../packages/functions/) shape: `specs/NativeRNFBTurbo*.ts` → `codegenConfig` + committed generated output → Android `NativeRNFBTurbo*` / iOS spec + `getTurboModule()` → JS `turboModule: true`. + +**Phase 0 still required:** unified module resolver; flip `getAppModule()` turbo TODO in [`nativeModule.ts`](../../../packages/app/lib/internal/registry/nativeModule.ts). + +--- + +## Deferred cleanup phase (EventEmitter) + +Follow-on **after** Phases 0–5 and coordinated break. Not in scope unless testing blocks deferral. + +| Topic | Current | Cleanup target | +|-------|---------|----------------| +| Event subscription | `RNFBNativeEventEmitter` + `RNFBAppModule` proxy | Codegen TurboModule events or RN New Architecture event emitters | +| Native emit | `RNFBRCTEventEmitter` / `ReactNativeFirebaseEventEmitter` | Align with chosen Codegen event pattern | +| JS fan-out | Fixed `nativeEvents` + `SharedEventEmitter` prefixes | Re-evaluate once native side supports typed events | + +**Deferral discriminator:** if **area-focused** e2e or device testing shows TurboModule migration **cannot** work with the legacy event proxy, escalate that package's event path into the active migration PR — do not wait for Phase C. + +**Messaging event-delivery e2e (Phase C — investigate before enabling):** `packages/messaging/e2e/messaging.e2e.js` foreground `onMessage()` delivery test stays **`xit`** (disabled since modular e2e consolidation, 2023). Un-skipping without a harness audit risks intermittent Android failures (`TestsAPI.messaging().sendToDevice` / FCM data payload; see [#8736](https://github.com/invertase/react-native-firebase/issues/8736), [#8670](https://github.com/invertase/react-native-firebase/issues/8670), [#8392](https://github.com/invertase/react-native-firebase/issues/8392)). Phase C must define stable pass criteria (device vs emulator, data-only vs notification+data, delegation settings) and broader event coverage (token refresh, notification-opened, iOS background timing vs `signalBackgroundMessageHandlerSet`) before re-enabling as a CI gate — per [NewArch-AD-4 § messaging testing requirement](architecture-decisions.md#messaging--defer-eventemitter-cutover-migrate-shell-only-in-phase-4). + +--- + +## Package inventory + +### No native bridge (out of scope) + +| Package | Notes | +|---------|-------| +| `@react-native-firebase/ai` | Pure JS | +| `@react-native-firebase/vertexai` | Re-export over `ai` | + +### Already migrated + +| Package | TurboModule(s) | Status | +|---------|----------------|--------| +| `@react-native-firebase/functions` | `NativeRNFBTurboFunctions` | ✅ reference (`codegenConfig.name`: `RNFBFunctionsTurboModules` per [NewArch-AD-7](architecture-decisions.md#newarch-ad-7--codegenconfigname--aggregate-library-name-one-codegenconfig-per-package--accepted)) | + +### Native packages — complexity summary + +Android `@ReactMethod` counts approximate spec surface area. Multi-module: **one spec per legacy module** ([workflow § multi-module](turbomodule-implementation-workflow.md#multi-module-packages)). + +#### Multi-module (Tier A) + +| Package | Legacy modules | Events | Methods ≈ | Notes | +|---------|----------------|--------|-----------|-------| +| **database** | 5 modules (`RNFBDatabase*`) | 2 | ~22 | Transaction + sync listeners | +| **firestore** | 4 modules (`RNFBFirestore*`) | 4 | ~31 | Pipelines via `pipelineExecute`; listener IDs | + +#### Single-module, high complexity (Tier B) + +| Package | Legacy module | Events | Methods ≈ | Notes | +|---------|---------------|--------|-----------|-------| +| **auth** | `RNFBAuthModule` | 3 | **59** | Largest single spec | +| **messaging** | `RNFBMessagingModule` | 5–7 | 11 | Platform-conditional events; background iOS | + +#### Single-module, moderate (Tier C) + +| Package | Legacy module | Events | Methods ≈ | +|---------|---------------|--------|-----------| +| **storage** | `RNFBStorageModule` | 1 | 14 | +| **crashlytics** | `RNFBCrashlyticsModule` | 0 | 14 | +| **analytics** | `RNFBAnalyticsModule` | 0 | 11 | +| **remote-config** | `RNFBConfigModule` | 1 | 11 | +| **app-check** | `RNFBAppCheckModule` | 1 | 7 | +| **perf** | `RNFBPerfModule` | 0 | 7 | + +#### Single-module, simple (Tier D) + +| Package | Legacy module | Events | Methods ≈ | Notes | +|---------|---------------|--------|-----------|-------| +| **installations** | `RNFBInstallationsModule` | 0 | 3 | Smallest | +| **in-app-messaging** | `RNFBFiamModule` | 0 | 3 | | +| **app-distribution** | `RNFBAppDistributionModule` | 0 | 4 | | +| **ml** | `RNFBMLModule` | 0 | ~0 | Stub | +| **phone-number-verification** | `RNFBPnvModule` | 0 | 6 | Android-only; direct resolver | + +#### Foundation (Phase 0) + +| Package | Legacy modules | Notes | +|---------|----------------|-------| +| **app** | `RNFBAppModule`, `RNFBUtilsModule` (+ Android utils) | Event proxy; **blocker** for migration complete; first [multi-spec package](turbomodule-implementation-workflow.md#multi-spec-packages-app-precedent) | + +--- + +## Phase ordering + +Strategy: **foundation → hard probe → easy wins → remaining complex → sync conversion → coordinated break → cleanup (events, shared-state encapsulation)**. + +Pick **one** of `firestore` or `auth` in Phase 1 (firestore = multi-module + pipelines; auth = max single-module spec). + +### Phase table + +| Phase | Focus | Status | Packages | +|-------|--------|--------|----------| +| **0** | App foundation + unified resolver | **done** | `app` | +| **0.1** | App modular type parity (`compare:types`) | **done** | `app` — [§ Phase 0.1](#phase-01-app-comparetypes) | +| **1** | Hard probe | **done** | `firestore` (multi-module + pipelines; NewArch-AD-14a composite) | +| **2** | Easy wins | **done** | `installations`, `perf`, `in-app-messaging`, `app-distribution`, `ml` | +| **3** | Moderate | **done** | `app-check`, `remote-config`, `analytics`, `crashlytics`, `storage` | +| **NB** | Interruption batch — JS infra/test/chore (standalone commits) | **done** | `app` resolver refactor+perf, shared contract-test helper, harness snapshot; `compare-types` **S0** — [§ interruption batch](#interruption-batch-standalone-commits) | +| **3.5** | Guardrails — spec↔native parity + codegen-drift CI (**gates 4**) | **done** | all migrated packages — [§ Phase 3.5](#phase-35-guardrails) | +| **4a** | messaging event decision — gap-analysis (**gates 4**) | **done** | `messaging` — [§ Phase 4a](#phase-4a-messaging-event-decision) | +| **Docs** | New-Architecture requirements + migration-doc consolidation | **done** | docs — [§ Phase Docs](#phase-docs-new-architecture-requirements-and-doc-consolidation) | +| **PD** | Platform-divergence documentation | **done** | multi-package JSDoc/docs — [§ Phase PD](#phase-pd-platform-divergence-documentation) | +| **4** | Remaining complex | **done** | `firestore`, `messaging`, `database`, `auth` | +| **5** | Android-only / misc | **done** | `phone-number-verification` | +| **S** | Sync conversion (forced-async → sync) | **convert done**; **S2** queued ([§ Phase S2](#phase-s2-native-change-follow-up-gap-analysis-2026-07-03)); prereq **S0** complete ([interruption batch](#interruption-batch-standalone-commits)) | [§ sync conversion](#phase-s-sync-conversion-forced-async--sync) | +| **R** | Pre-merge full validation | **done** | Revert harness narrowing; remove `NativeModules` fallback + throw test ([§ Phase R additions](#phase-r-additions)); [full tier](../testing/running-e2e.md#e2e-validation-tiers-unit-focused-area-focused-full) 3-platform before coordinated major | +| **C** | EventEmitter cleanup | deferred | All — [§ deferred cleanup](#deferred-cleanup-phase-eventemitter) | +| **E** | Shared-state encapsulation | deferred (optional) | `app` + readers — [§ Phase E](#phase-e-shared-state-encapsulation-optional) | + +**Coordinated break:** consumer-facing major when Phases 0–5, **S**, and **R** complete (`functions` already new-arch-only). Phases **C** and **E** are optional post-break cleanup and do not gate the major. + +--- + +## Phase S: sync conversion (forced-async → sync) + +**Runs after Phases 0–5** (every native package on TurboModules), **before R**. Owner doc for procedure/discriminator: [implementation workflow § Phase S](turbomodule-implementation-workflow.md#phase-s-sync-conversion-forced-async--sync). + +**Rationale:** Under the legacy bridge, *all* native calls were asynchronous. Some RNFB methods were therefore typed `Promise` purely because the bridge forced it — even though the corresponding **firebase-js-sdk** API is **synchronous**. These show up in `compare:types` configs as documented async-vs-sync differences. TurboModules support **synchronous** methods across the JSI boundary, so those forced-async APIs can return to sync parity with firebase-js-sdk. + +**Scope discriminator (only convert when ALL hold):** + +1. The difference exists **solely** because the legacy bridge forced async — not because the native work is genuinely asynchronous (I/O, network, disk). +2. firebase-js-sdk's equivalent is synchronous (the `compare:types` config records the async-vs-sync delta). +3. The TurboModule spec method can be declared sync (no `Promise`) and the native shell can return synchronously on the JS thread without blocking on real I/O. + +**Out of scope:** anything with real native latency (token fetches, network, disk, keychain). Forcing those sync would block JS — keep them `Promise`. + +**Per-package gate:** removing the corresponding `compare:types` config entry (the async-vs-sync difference is gone) is the completion signal for that package's Phase S item. + +This is a **coordinated public-API change** (async→sync is observable to consumers) and ships in the same major as the migration — see [implementation workflow § Phase S](turbomodule-implementation-workflow.md#phase-s-sync-conversion-forced-async--sync). + +### Gap-analysis (completed 2026-07-03) + +The "keep async if it does network/IO/disk" rule in the discriminator **assumes** that where firebase-js-sdk is synchronous, the work is genuinely in-memory and non-blocking. That assumption is **unverified** and is the core thing the gap-analysis must establish. Open question to resolve: + +> If firebase-js-sdk decided a method can be sync, why can't RNFB? Is it that the web SDK's sync method does **not** do blocking IO for that functionality (it works on in-memory/cached state, e.g. parsing a URL, returning a cached getter), whereas our native path would do real IO for the *same* result? Or could RNFB legitimately be sync too? + +**Why sync-blocking-on-IO is still bad even if a sync API "looks" fine:** a synchronous JSI method runs **on the JS thread**. If it blocks on network/disk/keychain, it freezes JS (UI jank / ANR) — the web SDK's sync getters do not do that because they return in-memory state. So the test is not "is the web API sync" alone; it is "is the underlying work in-memory on **both** sides". + +**The gap-analysis should produce, per candidate method, a table:** + +| Column | What to record | +|--------|----------------| +| Method | RNFB API + package | +| compare:types signal | Is it currently recorded as an async-vs-sync delta? (note: `app` is registered as of Phase **0.1**; other packages may still be unregistered — do not treat the config list as the full candidate set) | +| firebase-js-sdk behavior | What the web SDK actually does under the hood — **in-memory/cached** vs **deferred IO**. Cite the SDK source. | +| RNFB native behavior | What our native shell does for the same result — pure in-memory (SDK getter, parse, cached field) vs real IO (network, disk, keychain, Play Services). | +| Verdict | `convert` (both in-memory) / `keep-async` (either side does real IO) / `needs-native-change` (web is in-memory but our native is needlessly IO and could be made in-memory) | + +**Candidate sources:** the `compare:types` async-vs-sync entries **plus** a manual sweep of `Promise`-returning methods whose firebase-js-sdk equivalent is sync but which `compare:types` does not flag (e.g. unregistered packages or utils-only exports). The third verdict (`needs-native-change`) is the interesting one the user raised: cases where we are async only because our native implementation chose IO, not because the operation requires it. + +**Inventory result (2026-07-03):** + +| Verdict | Candidate(s) | Notes | +|---------|--------------|-------| +| `convert` | `app/registerVersion`; `auth/isSignInWithEmailLink`; `auth/TotpSecret.generateQrCodeUrl`; `perf` trace/http/screen `start`/`stop`; likely `database` `goOnline`/`goOffline` instance surface | Highest confidence: web/native behavior is parser, string construction, cached object, or in-memory SDK state. | +| `needs-native-change` | `analytics` fire-and-forget setters/events; `app-check/initializeAppCheck`; `firestore/initializeFirestore`; `storage` task controls; storage retry setters | Web APIs are sync or fire-and-forget, but RNFB native paths currently wrap async work or need behavior clarification before sync conversion. | +| `keep-async` | Firestore persistent cache index manager delete/enable/disable | Web returns `void` but starts real persistent-cache work; do not block JS thread. | + +**Next slice:** `convert` inventory complete (2026-07-03). Remaining gap-analysis verdicts (`needs-native-change`, `keep-async`) are out of Phase S scope until native behavior is clarified or documented only. + +### Phase S2: native-change follow-up (gap-analysis 2026-07-03) + +Deep read-only analysis of **`needs-native-change`** and **`keep-async`** candidates after the `convert` inventory shipped. Canonical evidence table for discussion and future implementation slices. Compare-types `differentShape` entries for these methods carry **Phase S hint** phrases (short pointers only — this table holds the real state). + +**Hint vocabulary (compare-types annotations):** + +| Phrase | Meaning | +|--------|---------| +| *(none — entry removed)* | Phase S `convert` complete; no async-vs-sync delta | +| **Promise that could maybe sync-void+queue** | Web is sync/fire-and-forget; RN may return void after sync local state update + ordered background native dispatch | +| **Promise that could maybe sync-void+gate** | Web returns sync instance/state; RN must not return until in-memory settings visible to all later native entry points (or gate ops until background work completes) | +| **convert after native fix** | Native shell close to sync; fix semantics first (e.g. boolean return), then drop Promise | +| **keep-async: deferred persistent-cache IO** | Web `void` schedules real disk/index work; do not block JS; Promise may mean dispatch-only today | + +**Executive summary:** Sync return while queueing background work is valid only when RNFB updates the same **synchronous observable state** web updates before return, or when the web API is truly fire-and-forget with no ordering dependency. Queue-only is insufficient when the next line of user code assumes the effect is visible (`initializeFirestore` settings, analytics ordering, upload retry times at task construction). Firestore persistent cache index manager methods are **`keep-async`**: web `void` schedules persistent-cache work; **`sync-void+gate`** would need a native completion signal RNFB does not expose today. + +| Method | Package | compare:types | Web SDK (sync state before return?) | RNFB today | Verdict | Recommended path | Risks if forced sync void | Notes | +|--------|---------|---------------|-------------------------------------|------------|---------|------------------|---------------------------|-------| +| `logEvent` | analytics | `differentShape` | `void`; async pipeline; init/measurement ordering internal | Android `Tasks.call`; iOS direct | needs-native-change → sync-void+queue | Ordered fire-and-forget queue or direct native if SDK proven cheap | Unordered queue races with setters | Web does not expose completion | +| `setAnalyticsCollectionEnabled` | analytics | `differentShape` | `void`; ga-disable after init | Android `Tasks.call`; iOS direct | needs-native-change → sync-void+queue | Same ordered path as events | Events logged with old collection flag | | +| `setConsent` | analytics | `differentShape` | Sync init stash or immediate gtag | Android `Tasks.call`; iOS direct | needs-native-change → sync-void+queue | Serial queue shared with analytics calls | Immediate logEvent uses old consent | | +| `setDefaultEventParameters` | analytics | `differentShape` | Sync init stash or immediate gtag | Android `Tasks.call`; iOS direct | needs-native-change → sync-void+queue | **Clearest ordering requirement** | Next event misses defaults | | +| `setUserId` / `setUserProperties` | analytics | `differentShape` | Init-ordered or immediate gtag | Android `Tasks.call`; iOS direct | needs-native-change → sync-void+queue | Same analytics queue | Stale id/properties on next event | Android SDK source dive for direct-call safety | +| RNFB-only analytics helpers | analytics | `extraInRN` | N/A | Same native path | Not Phase S parity | Align if core analytics goes fire-and-forget | Public API break without web signal | Out of compare-types completion criteria | +| `initializeAppCheck` | app-check | `differentShape` | Sync provider/state install; token fetch background | JS awaits native configure | needs-native-change → sync-void+queue | Sync return after provider/refresh state installed | getToken/listeners race before provider ready | Native provider install source dive | +| `initializeFirestore` | firestore | `differentShape` | Returns instance; lazy config but ordered internally | JS awaits settings(); native prefs write async | needs-native-change → sync-void+gate | In-memory settings registry visible before return | Immediate writes/listeners with old settings | Queue-only insufficient | +| `UploadTask.pause/resume/cancel` | storage | `UploadTask` `differentShape` | Sync state machine + boolean | Android bool via Promise; iOS bool path incomplete | convert after native fix | Sync boolean from native task state | Lying about pause/cancel state | iOS shell review needed | +| `setMaxOperationRetryTime` / `setMaxUploadRetryTime` | storage | `extraInRN` + `FirebaseStorage` shape | Sync in-memory field update | JS field then native resolve | sync-void+queue / convert | Sync void; native before return | Upload task captures stale retry at construction | Upload retry stronger ordering than operation retry | +| `setMaxDownloadRetryTime` | storage | `extraInRN` | N/A (RN-only) | Same pattern | Not parity | Consistency if siblings change | RN-only API | | +| `enablePersistentCacheIndexAutoCreation` | firestore | `differentShape` | `void`; schedules persistent-cache work | Native resolves immediately; no completion hook | **keep-async** | Keep Promise or document dispatch-only | Queries/listeners race index config | | +| `disablePersistentCacheIndexAutoCreation` | firestore | `differentShape` | same | same | **keep-async** | same | Stale auto-creation until SDK finishes | | +| `deleteAllPersistentCacheIndexes` | firestore | `differentShape` | `void` + deferred disk/index work | same | **keep-async** | Do not Phase S convert | Immediate queries use old indexes | sync-void+gate needs native completion signal | + +**Suggested implementation slices (when resumed):** PS-S2-storage-tasks (closest to convert) → PS-S2-analytics-queue → PS-S2-app-check-init → PS-S2-firestore-init; PS-S2-firestore-index = document/keep-async only. + +--- + +## Phase E: shared-state encapsulation (optional) + +**Optional post-break cleanup.** Decision owner: [NewArch-AD-10](architecture-decisions.md#newarch-ad-10--cross-package-native-state-is-centralized-in-app-with-testable-apis--accepted). Does **not** gate the coordinated major. + +**Goal:** refactor the un-encapsulated cross-package shared-state items — bare `public static` fields read across packages — behind explicit, testable `app`-owned accessor methods, and audit that all inter-module state is genuinely centralized in `app` (not duplicated per package). + +**Candidate state (from NewArch-AD-10):** `authDomains` / iOS `customAuthDomains`; and a survey of `ReactNativeFirebaseJSON` / `Meta` / `Preferences` / `UniversalFirebasePreferences` access patterns for anything that is a bare cross-package static rather than a method. + +**Per-item loop:** standard [phase iteration protocol](#phase-iteration-protocol) (gap-analysis to inventory the statics + their readers → implementation to add accessors and migrate readers → independent-review → commit). Pure native refactor with no public API change; **area-focused** tier on the affected packages (`app` + each reader, e.g. `auth`). One commit per encapsulated item or per package, maintainer discretion. + +**Completion signal:** no bare cross-package `public static` mutable shared state remains; every cross-package read goes through an `app`-owned accessor with a unit test. + +--- + +## Phase 0.1: app compare:types + +**Scope:** Register `@react-native-firebase/app` in [compare:types](../../../.github/scripts/compare-types/src/registry.ts); document all modular API deltas in [configs/app.ts](../../../.github/scripts/compare-types/configs/app.ts); fix reasonably fixable type drift in product code. + +**Not in scope:** Phase S async→sync conversion (`registerVersion`, etc.) — document only unless trivial. + +**Loop:** standard [phase iteration protocol](#phase-iteration-protocol) — `gap-analysis` (compare output) → `implementation` (config + type fixes) → `independent-review` (`yarn compare:types` green for `app`) → `commit`. + +**Completion signal:** `yarn compare:types` reports zero undocumented differences for package `app`. + +**Planned commit subject:** `test(app): add app module type comparison config` + +--- + +## Interruption batch + inserted phases (2026-07-01) + +Inserted before Phase 4 after a design/PR review. Ordering: **interruption batch** (standalone commits, any order — NB1 before NB2 as both touch `nativeModule.ts`) → **Phase 3.5** (gates 4) → **Phase 4a** (gates 4) → Phase 4. **Phase Docs** and **Phase PD** are opportunistic (Jest/markdown/typedoc only — no e2e host) and do **not** gate Phase 4. All items follow the [phase iteration protocol](#phase-iteration-protocol); one focused commit each ([one-commit-per-item](../testing/change-authoring-workflow.md#commit)). + +### Interruption batch (standalone commits) + +JS-layer / test / chore only — **no native bridge change** → `unit-focused` tier = **Jest** (+ `compare:types` for S0); **no e2e**. Run before Phase 3.5. + +- **NB1 — `refactor(app): unify single-host TurboModule composite creation`.** Fold `getAppModule()`, `getStaticUtilsModule()`, and the single-host branch of `initialiseNativeModule()` in [`registry/nativeModule.ts`](../../../packages/app/lib/internal/registry/nativeModule.ts) through one `createSingleHostComposite(namespace, moduleName)` helper (the N=1 case of the [NewArch-AD-14a](architecture-decisions.md#newarch-ad-14a--multi-host-merge-routing-composite-proxy-required-for-multi-module) routing composite). No behavior change. **Also stage the [`resource-monitor.sh`](../../../.github/workflows/scripts/resource-monitor.sh) `100644 → 100755` mode fix here** — it has no other natural home. Gate: `yarn tests:jest` (all `nativeModuleContract` + `app`) + `yarn lint:js`. +- **NB2 — `perf(app): reduce TurboModule resolver overhead`** (after NB1). In [`nativeModuleAndroidIos.ts`](../../../packages/app/lib/internal/nativeModuleAndroidIos.ts): cache the `RNFBDebug` debug `Proxy` per module instead of rebuilding it on every `getReactNativeModule()`; memoize non-function constant reads in the composite `get` trap ([`registry/nativeModule.ts`](../../../packages/app/lib/internal/registry/nativeModule.ts)); add a comment documenting the intentional per-call `encodeNullValues` walk (leave behavior). Dev/JS-only, low-risk. Gate: Jest + `lint:js`. +- **NB3 — `refactor(app): extract shared TurboModule contract-test helper`.** New shared helper `assertTurboContract(config, methodFixtures)` (colocate in `packages/app/__tests__/` or a test-utils path) consumed by all 11 `packages/*/__tests__/nativeModuleContract.test.ts`; each package keeps only its `SPEC_METHODS` + per-method arg fixtures, with the `@react-native-firebase/app/dist/module/...` import centralized in the helper. Gate: `yarn tests:jest` — all contract tests still pass with unchanged assertions. +- **NB5 — `test: snapshot committed harness defaults`** (decision A). Jest snapshot/assertion that [`tests/globals.js`](../../../tests/globals.js) `RNFBDebug === false` and [`tests/app.js`](../../../tests/app.js) `platformSupportedModules` equals the full module set — catches committed narrowing on tracked files (`harness.overrides.js` is gitignored and cannot be committed). Confirm `mocha/no-exclusive-tests` (already active in [`eslint.config.mjs`](../../../eslint.config.mjs)) covers `.only`; only add `tests/**` to eslint scope if the snapshot alone is insufficient. Gate: `yarn tests:jest` + `yarn lint:js`. +- **S0 — `chore(compare-types): register remaining migrated packages`** (decision E). Register every unregistered package in [`registry.ts`](../../../.github/scripts/compare-types/src/registry.ts) at its **current** state — `analytics`, `crashlytics`, `in-app-messaging`, `app-distribution`, `ml`, `functions`, plus legacy-state `messaging`, `database`, `phone-number-verification` — each with a `configs/.ts` documenting existing deltas so the run is green. Completes the Phase S candidate set ([§ Phase S gap-analysis](#gap-analysis-deferred--capture-only-do-not-size-yet)). Gate: `yarn compare:types` green. + +### Phase 3.5: Guardrails + +**Gates Phase 4.** Promotes [NewArch-AD-17](architecture-decisions.md#newarch-ad-17--spec-contract--parity-tests) items **#2 (spec↔native parity)** and **#3 (codegen-up-to-date)** from *Proposed* → *Accepted* (update the ADR statuses in this phase's commit). + +- **Codegen-drift (decision C):** add a committed **`yarn codegen:verify`** script — runs `yarn codegen` for every migrated package then `git diff --exit-code` on `**/generated/**` — and wire it as a **new step in the existing CI lint job** (alongside `lint:js` / `lint:android` / `lint:ios:check`). +- **Spec↔native parity:** per package assert the spec method-name set equals the union of Android `@ReactMethod` + iOS `RCT_EXPORT_METHOD`, and (NewArch-AD-11) the union across a package's specs has no duplicates. +- **Commit rule (decision C — single concern):** if regenerating produces drift **or** parity finds a mismatch needing repair → **one `fix:` commit** (even across multiple modules) **with the guard test/script included**; if everything is already clean → one **`test:` commit** adding the guard. Tier: **Jest-only** for a pure test/script addition; if any package's generated code is regenerated (native artifact change), run that package's **area-focused** e2e before closing `review_gate`. + +### Phase 4a: messaging event decision + +Runs **immediately before** Phase 4 `messaging`. `gap-analysis` (read-only, **no commit**): determine whether `messaging` events work over the legacy `RNFBNativeEventEmitter` → app-proxy path under TurboModules — including iOS background / AppDelegate and headless JS — per the [NewArch-AD-4](architecture-decisions.md#newarch-ad-4--events-deferred-to-phase-c--accepted) deferral discriminator. **Output:** a recorded decision — *escalate messaging events into the Phase 4 PR* vs *defer to Phase C* — written into NewArch-AD-4 and the arbiter row Notes. No product edits; feeds Phase 4 scope. + +### Phase Docs: New Architecture requirements and doc consolidation + +Opportunistic (`documentation`; Jest/markdown only, does not gate Phase 4). + +- **v26 New Architecture section:** grow [`docs/migrating-to-v26.mdx`](../../../docs/migrating-to-v26.mdx) (currently namespace-removal only) with a New Architecture section. First analyze whether a **single global notice** suffices — *"all native modules now require React Native's New Architecture; stay on the prior RNFB major if you cannot enable it"* — or whether any module needs a specific note. Include agent-usable enable steps (mirror the v24 `functions` section) and per-module notes only where a module deviates. +- **Consolidation (F5):** keep the **ADR + architecture** docs as the permanent set; consolidate the ephemeral "how-to-migrate" material where it reduces fragmentation without collapsing the durable/ephemeral split ([documentation policy](../documentation-policy.md)). One `docs:` commit. Gate: `yarn lint:markdown`, `yarn lint:spellcheck`. + +### Phase PD: platform-divergence documentation + +Opportunistic. `gap-analysis` → `documentation`. **Seed set (already known):** auth web-vs-native throwers + sync parsers (`getRedirectResult`, `setPersistence`, `ActionCodeURL.parseLink`, …); analytics/crashlytics **iOS-only** methods (`logTransaction`, `initiateOnDeviceConversionMeasurement*`); perf sync `initializePerformance`; database sync `goOffline`/`goOnline`/`getServerTime`. Gap-analysis completes the set across all packages. **Document each divergence in three places:** (1) JSDoc `@remarks` (flows through `yarn reference:api`), (2) the relevant migration guide, (3) the package `docs/` tree. Commit granularity: one `docs():` commit per package (or per batch). Gate: `yarn reference:api`, markdown lint. + +### Phase R additions + +Explicit Phase R gating requirements (decision B, [NewArch-AD-6](architecture-decisions.md#newarch-ad-6--unified-native-module-resolver--accepted) Phase R action): + +- Remove the `?? NativeModules[moduleName]` fallback in [`nativeModuleAndroidIos.ts`](../../../packages/app/lib/internal/nativeModuleAndroidIos.ts) so a missing module **throws** instead of returning soft-`undefined`. +- **Test (both):** a **Jest** unit test asserting `getReactNativeModule` throws for an unknown name once the fallback is removed, **plus** an `app` **e2e** "unknown module throws" case. Both run at **full** tier / 3-platform as part of Phase R. + +--- + +## Phase iteration protocol + +Each package (or one legacy module within a multi-module package) follows **one** serial loop. No overlap. Work types: [change authoring workflow § work types](../testing/change-authoring-workflow.md#work-types). + +| Step | Work type | Closes gate | Rules | +|------|-----------|-------------|-------| +| **1** | `gap-analysis` | — | Spec inventory + feasibility; read-only when export shape unclear | +| **2** | `baseline-capture` | — | Optional area-focused e2e baseline before large packages | +| **3** | `implementation` | `implementation` | Spec, codegen, native, JS; Jest + **unit-focused** tier on **every required platform** when native bridge touched ([platform coverage gate](../testing/running-e2e.md#platform-coverage-gate-blocking)); handoff includes e2e platform matrix or env blocker — Jest-only insufficient; `.only` / area narrowing OK locally; **no commit** | +| **4** | `independent-review` | `review` | **Frozen tree**; **area-focused** tier; no `.only`; [area harness](turbomodule-implementation-workflow.md#turbomodule-area-harness); serial [host rule](../testing/change-authoring-workflow.md#host-rule) | +| **5** | `documentation` | — | User docs + durable OKF when applicable | +| **6** | `commit` | `commit` | One focused commit only after `review_gate` closed | + +Canonical commands: [validation checklist](../testing/validation-checklist.md), [serialized dispatch](../testing/running-e2e.md#serialized-e2e-dispatch). + +Skip steps 1–2 when spec shape is known (most Tier D packages). + +--- + +## Current snapshot + +**Label:** `phase-s-sync-conversion` (2026-07-03) + +**Next item:** Phase **S2** native-change follow-up — analysis queued; pick slice when resumed ([§ Phase S2](#phase-s2-native-change-follow-up-gap-analysis-2026-07-03)) + +**Current gates:** Phase S `convert` inventory **complete** (four commits on `new-architecture`). PS-S2-gap analysis **done** — implementation deferred. + +**Host rule:** one `:test-cover` at a time — never parallel subagents with e2e. + +**Arbiter gate:** + + +| Item | Code | `implementation_gate` | `review_gate` | `commit_gate` | `next_work_type` | `validation_tier` | `commit_subject` | Notes | +|------|------|----------------------|---------------|---------------|------------------|-------------------|------------------|-------| +| Design review | DR | n/a | n/a | n/a | done | none | none | ✅ Adversarial review complete. | +| Phase 0 `app` TurboModules | P0 | **closed** | **closed** | **closed** | done | `full` | `feat(app)!: migrate app modules to TurboModules incl general migration infra` | Committed 2026-06-30. | +| Phase 0.1 `app` compare:types | P0.1 | **closed** | **closed** | **closed** | done | `none` | `test(app): add app module type comparison config` | Committed 2026-06-30. | +| Phase 1 `firestore` TurboModules | P1 | **closed** | **closed** | **closed** | done | `area-focused` | `feat(firestore)!: migrate firestore to TurboModules` | Committed 2026-06-30. | +| Phase 2 `installations` | P2a | **closed** | **closed** | **closed** | done | `area-focused` | `feat(installations)!: migrate installations to TurboModules` | Committed 2026-06-30. Remediation: iOS `invalidate` no-op. | +| Phase 2 `perf` | P2b | **closed** | **closed** | **closed** | done | `area-focused` | `feat(perf)!: migrate perf to TurboModules` | Committed 2026-06-30. | +| Phase 2 `in-app-messaging` | P2c | **closed** | **closed** | **closed** | done | `area-focused` | `feat(in-app-messaging)!: migrate in-app-messaging to TurboModules` | Committed 2026-06-30. | +| Phase 2 `app-distribution` | P2d | **closed** | **closed** | **closed** | done | `area-focused` | `feat(app-distribution)!: migrate app-distribution to TurboModules` | Committed 2026-06-30. | +| Phase 2 `ml` | P2e | **closed** | **closed** | **closed** | done | `area-focused` | `feat(ml)!: migrate ml to TurboModules` | Committed 2026-06-30. | +| Phase 3 `app-check` | P3a | **closed** | **closed** | **closed** | done | `area-focused` | `feat(app-check)!: migrate app-check to TurboModules` | Committed 2026-06-30. | +| Phase 3 `remote-config` | P3b | **closed** | **closed** | **closed** | done | `area-focused` | `feat(remote-config)!: migrate remote-config to TurboModules` | Committed 2026-06-30. | +| Phase 3 `analytics` | P3c | **closed** | **closed** | **closed** | done | `area-focused` | `feat(analytics)!: migrate analytics to TurboModules` | Committed 2026-06-30. | +| Phase 3 `crashlytics` | P3d | **closed** | **closed** | **closed** | done | `area-focused` | `feat(crashlytics)!: migrate crashlytics to TurboModules` | Committed 2026-06-30. | +| Phase 3 `storage` | P3e | **closed** | **closed** | **closed** | done | `area-focused` | `feat(storage)!: migrate storage to TurboModules` | Committed 2026-06-30. | +| Interruption NB1 composite + mode fix | NB1 | **closed** | **closed** | **closed** | done | `unit-focused` (Jest) | `refactor(app): unify single-host TurboModule composite creation` | Committed 2026-07-01. `createSingleHostComposite`; resource-monitor 0755. Jest 41/41. | +| Interruption NB2 resolver perf | NB2 | **closed** | **closed** | **closed** | done | `unit-focused` (Jest) | `perf(app): reduce TurboModule resolver overhead` | Committed 2026-07-01. Debug proxy cache + constant memoization. Jest 41/41. | +| Interruption NB3 contract-test helper | NB3 | **closed** | **closed** | **closed** | done | `unit-focused` (Jest) | `refactor(app): extract shared TurboModule contract-test helper` | Committed 2026-07-01. `turboModuleContractHelper.ts`; 12 contract tests. Jest 15/15. | +| Interruption NB5 harness snapshot | NB5 | **closed** | **closed** | **closed** | done | `unit-focused` (Jest) | `test: snapshot committed harness defaults` | Committed 2026-07-01. `harnessCommittedDefaults.test.ts` (4 tests). | +| Phase S0 compare-types registration | S0 | **closed** | **closed** | **closed** | done | `none` (`compare:types`) | `chore(compare-types): register remaining migrated packages` | Committed 2026-07-01. 8 pkgs registered; compare:types 19/19 green. | +| Phase 3.5 guardrails | P3.5 | **closed** | **closed** | **closed** | done | `full` | `fix: add codegen verify and spec-native parity tests` | Committed `64f99c53d` 2026-07-02. | +| Phase 4a messaging event decision | P4a | n/a | n/a | n/a | done | `none` | none | **Defer** events to Phase C — [NewArch-AD-4 § messaging](architecture-decisions.md#messaging--defer-eventemitter-cutover-migrate-shell-only-in-phase-4). | +| Phase 4 `messaging` TurboModules | P4m | **closed** | **closed** | **closed** | done | `area-focused` | `feat(messaging)!: migrate messaging to TurboModules` | Turbo shell only (AD-4 event path preserved). Jest 38/38 + parity 32/32; codegen:verify incl messaging; legacy Java removed. iOS/Android area e2e green on method-call + listener-registration scope. Foreground `onMessage` delivery test **left `xit`** — flaky FCM harness; re-enable in [Phase C](#deferred-cleanup-phase-eventemitter). | +| Phase 4 `database` TurboModules | P4d | **closed** | **closed** | **closed** | done | `area-focused` | `feat(database)!: migrate database to TurboModules` | 5 Turbo specs/shells + committed codegen; Jest 49 + parity 38; area e2e macOS 213 / iOS 219 / Android 220 (delta logs `/tmp/rnfb-e2e-*-database-delta-review.log`). Remediation: invalidate/teardown parity (Reference+Transaction), onComplete guard, contract test 22 methods, jest mock cleanup. Orchestration: macOS/Android `:8090` pre-flight in `firebase.test.js` + OKF. **Deferred minor:** void spec vs Promise JS API; silent Query `RejectedExecutionException` post-invalidate. | +| Phase 4 `auth` TurboModules | P4u | **closed** | **closed** | **closed** | done | `area-focused` | `feat(auth)!: migrate auth to TurboModules` | 60-method spec + shells; review e2e macOS 171 / iOS 185 / Android 192. Follow-up committed: `fix(auth): rename delete turbo method for C++ codegen compatibility`. | +| Phase 5 `phone-number-verification` TurboModules | P5pnv | **closed** | **closed** | **closed** | done | `area-focused` | `feat(phone-number-verification)!: migrate phone-number-verification to TurboModules` | Android-only 6-method spec; AD-18 E10 direct resolver. Parity registered; later full Android Phase R proof covered the package path. | +| Phase Docs — NA reqs + consolidation | PDoc | **closed** | **closed** | **closed** | done | `none` | `docs: document all API gaps / platform divergence / migration items` | v26 NA section + platform table; lint/reference:api green. | +| Phase PD — platform divergence | PPD | **closed** | **closed** | **closed** | done | `none` | `docs: document all API gaps / platform divergence / migration items` | 19 pkg usage notes + JSDoc @remarks; serious review findings remediated in same commit. | +| Phase R — remove `NativeModules` fallback | PR-fallback | **closed** | **closed** | **closed** | done | `full` + RNFBDebug | `refactor: cleanup legacy arch native module fallback` | Proof 683/823/849 (`/tmp/rnfb-e2e-phaseR-proof-*.log`). Review 2026-07-03: no critical/serious. Android cold boot committed separately. | +| Phase S gap-analysis | PS-gap | n/a | n/a | n/a | done | `none` | none | Completed 2026-07-03. First implementation slice: `app/registerVersion`; follow-ups: auth parser/TOTP URL, then perf metric controls. | +| Phase S `app/registerVersion` sync parity | PS-app-registerVersion | **closed** | **closed** | **closed** | done | `area-focused` | `refactor(app): return sync parity for registerVersion` | Implemented 2026-07-03: `registerVersion(): void`, sync throw Jest assertion, removed stale `configs/app.ts` async-vs-sync entry. Green: `lerna:prepare`, `tsc:compile`, `tsc:compile:consumer`, focused app Jest 10/10, `reference:api`, `compare:types`, `lint:js`. Independent review: no findings; no e2e needed for type-only scope. | +| Phase S auth parser/TOTP sync parity | PS-auth-parsers | **closed** | **closed** | **closed** | done | `area-focused` | `refactor(auth): return sync parity for auth parsers` | Committed 2026-07-03. Sync `isSignInWithEmailLink` + `TotpSecret.generateQrCodeUrl`; native sync error shape; jest.setup; tests + e2e sync calls; compare-types + v26 doc. Validation: Jest 91/91, compare:types, lint, reference:api, codegen:verify exit 0. Android area e2e 159/15/0 (`/tmp/rnfb-e2e-android-auth-phaseS-final.log`). | +| Phase S perf metric controls sync parity | PS-perf-metrics | **closed** | **closed** | **closed** | done | `area-focused` | `refactor(perf): return sync parity for metric controls` | Sync trace/http/screen start/stop; Android *Sync helpers; iOS sync shells. Jest 10/10; compare:types, lint, reference:api green. Review e2e iOS/Android 60/2/0 (`/tmp/rnfb-e2e-*-perf-review.log`). macOS N/A (module skip). Remediation: perf usage docs await removed. | +| Phase S database connection sync parity | PS-database-online | **closed** | **closed** | **closed** | done | `area-focused` | `refactor(database): return sync parity for connection controls` | Sync turbo + instance goOnline/goOffline; Android direct SDK calls; e2e await removed on modular calls. Jest 52/52; codegen:verify exit 0. Review e2e macOS 181/10/0, iOS 182/9/0, Android 183/8/0 (`/tmp/rnfb-e2e-*-database-review.log`). | +| Phase S2 native-change gap-analysis | PS-S2-gap | n/a | n/a | n/a | done | `none` | none | Completed 2026-07-03. Full table [§ Phase S2](#phase-s2-native-change-follow-up-gap-analysis-2026-07-03); compare-types hint phrases updated. Implementation slices deferred (storage tasks closest). | + +--- + +## Harness + +Local `:test-cover` harness rules: [running e2e § harness + narrowing gate](../testing/running-e2e.md#harness-narrowing-gate-blocking). Push state stays full until Phase **R**. + +--- + +## Workflow (each phase) + +1. Pick package(s) for the phase from [phase table](#phase-table). +2. Follow [Phase iteration protocol](#phase-iteration-protocol) — never commit before `review_gate` closed; never overlap `:test-cover` ([host rule](../testing/change-authoring-workflow.md#host-rule)). +3. Update arbiter gate row when item closes. +4. Phase **R:** `pre-merge-validation` at **full** tier before coordinated major. + +**Pitfalls:** iOS null-in-object on option maps ([workflow § gotchas](turbomodule-implementation-workflow.md#gotchas)); New Architecture must be enabled; do not combine language modernization (Kotlin/Swift) with bridge migration in the same PR. + +--- + +## Related links + +* [New Architecture index](index.md) +* [TurboModule implementation workflow](turbomodule-implementation-workflow.md) +* [Change authoring workflow](../testing/change-authoring-workflow.md) +* [Documentation policy](../documentation-policy.md) diff --git a/okf-bundle/new-architecture/turbomodule-implementation-workflow.md b/okf-bundle/new-architecture/turbomodule-implementation-workflow.md new file mode 100644 index 0000000000..552696edff --- /dev/null +++ b/okf-bundle/new-architecture/turbomodule-implementation-workflow.md @@ -0,0 +1,261 @@ +--- +type: Reference +title: TurboModule migration implementation workflow +description: New Architecture–specific artifacts for Codegen specs, native module conversion, area harness setup, and coordinated break validation — extends the cross-package change authoring workflow. +tags: [new-architecture, turbomodule, codegen, workflow, migration] +timestamp: 2026-06-26T00:00:00Z +--- + +# TurboModule migration implementation workflow + +Requirements for migrating **one package** (or one legacy native module within a multi-module package) from legacy `NativeModules` to Codegen TurboModules. **Shared loop:** [change authoring workflow](../testing/change-authoring-workflow.md). + +**Policy:** [OKF documentation and commit policy](../documentation-policy.md). + +## Read first + +| Topic | Document | +|-------|----------| +| **Change authoring loop** | [change-authoring-workflow.md](../testing/change-authoring-workflow.md) | +| **Architectural decisions (why)** | [architecture-decisions.md](architecture-decisions.md) — canonical owner; this doc is the *how* | +| Live phase/gate snapshots | [migration-work-queue.md](migration-work-queue.md) | +| Inventory, phase order | [migration-work-queue.md](migration-work-queue.md) | +| Work types, tiers, gates | [change-authoring-workflow.md](../testing/change-authoring-workflow.md); term ids: [iteration-vocabulary.md](../testing/iteration-vocabulary.md) | +| E2e commands | [running-e2e.md](../testing/running-e2e.md) | +| Validation commands | [validation-checklist.md](../testing/validation-checklist.md) | +| Reference implementation | [`packages/functions`](../../../packages/functions/) ([PR #8603](https://github.com/invertase/react-native-firebase/pull/8603)) | + +## TurboModule hard gates + +In addition to [change authoring gates](../testing/change-authoring-workflow.md#gates): + +| Gate | Requirement | +|------|-------------| +| Spec inventory | Native methods inventoried from Java/ObjC; mapped to typed spec using `packages//lib/types/internal.ts` where available | +| Codegen | `specs/NativeRNFBTurbo*.ts` + `codegenConfig`; generated android/ios artifacts **committed** (`includesGeneratedCode: true`) | +| Native shell | Android `NativeRNFBTurbo*` extends generated `*Spec`; iOS spec protocol + `getTurboModule()` | +| JS wiring | `nativeModuleName` → `NativeRNFBTurbo*`; `turboModule: true`; web shims via `setReactNativeModule` unchanged | +| Podspec / package | New-arch guard; exclude duplicate RN generated providers (see [`RNFBFunctions.podspec`](../../../packages/functions/RNFBFunctions.podspec)) | +| Implementation | Package Jest + **unit-focused** e2e on New Architecture build on **every required platform** ([platform coverage gate](../testing/running-e2e.md#platform-coverage-gate-blocking)). Native bridge / codegen / podspec / `build.gradle` touched → **blocking** before handoff; Jest-only does not close `implementation_gate`. Build or env failure keeps the gate open — handoff must include a platform matrix (exit code + pass counts + log path) or an explicit env blocker, not “Jest green”. | +| Review | Package e2e **area-focused** tier on frozen tree; no `.only`; native lint rows from [validation checklist](../testing/validation-checklist.md) where touched | +| Event deferral | Legacy event proxy retained unless [queue deferral discriminator](migration-work-queue.md#deferred-cleanup-phase-eventemitter) triggers escalation | + +### Multi-module packages + +One TurboModule spec **per legacy native module** — do not consolidate the *specs* in the first pass (database ×5, firestore ×4); each legacy module keeps its own `NativeRNFBTurbo*` spec and shell. + +**Commit granularity: one commit per package, not per spec.** Splitting a multi-module package across several commits adds little value and is often impractical — the specs share `codegenConfig`, generated artifacts, podspec/`build.gradle` guards, and JS wiring that only compile and pass e2e together. Convert the whole package (all its legacy modules → all its specs) in a single `implementation` → `independent-review` → `commit` loop and land it as **one** `feat()!: migrate to TurboModules` commit (breaking: New Architecture required). Per-spec commits are only warranted if a single legacy module is genuinely independently shippable and reviewable, which is rare. Multiple specs ≠ multiple commits. + +### Multi-spec packages (`app` precedent) + +Phase 0 `app` is the first package with **two TurboModule specs in one `codegenConfig`**: `NativeRNFBTurboApp` + `NativeRNFBTurboUtils`. Modular type parity is tracked separately in [Phase 0.1](migration-work-queue.md#phase-01-app-comparetypes) (`configs/app.ts`). Single `codegenConfig.name` = the **aggregate library name** `RNFBAppTurboModules` (not a module name; decision [NewArch-AD-7](architecture-decisions.md#newarch-ad-7--codegenconfigname--aggregate-library-name-one-codegenconfig-per-package--accepted)); iOS **`modulesProvider`** maps each spec name to its ObjC shell (`RNFBAppModule`, `RNFBUtilsModule`). Android registers both shells in the package class. Method names must be unique across the package's specs ([NewArch-AD-11](architecture-decisions.md#newarch-ad-11--multi-module-method-names-are-merged-uniqueness-enforced-by-test--accepted)). Reference: [`packages/app/package.json`](../../../packages/app/package.json), [`ReactNativeFirebaseAppPackage.java`](../../../packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java). + +## Spec authoring (`gap-analysis` / pre-`implementation`) + +1. Inventory `@ReactMethod` / `RCT_EXPORT_METHOD` from existing Java/ObjC sources. +2. Draft `specs/NativeRNFBTurbo*.ts` — strong types from `lib/types/internal.ts` and firebase-js-sdk shapes; `Object` / open maps only for genuinely dynamic payloads. Follow [Codegen-safe names and types](#codegen-safe-names-and-types-blocking) before running codegen. +3. Naming: `NativeRNFBTurbo*` prefix (decision [NewArch-AD-2](architecture-decisions.md#newarch-ad-2--naming-nativernfbturbo--accepted)). +4. Regenerate codegen output; commit under `android/.../generated` and `ios/generated` — [§ Running codegen](#running-codegen-canonical). +5. For Phase 0 (`app`): include unified module resolver work in `packages/app` ([queue § reference pattern](migration-work-queue.md#reference-pattern-functions)). +6. **NewArch-AD-18 raw-resolver audit:** `grep` product code for `getReactNativeModule(` (exclude `packages/app/lib/internal/nativeModule*.ts` infrastructure). For each hit, compare against the [NewArch-AD-18 canonical exception table](architecture-decisions.md#canonical-exception-table): existing row → confirm turbo module name + in-code `// NewArch-AD-18 E:` comment; unlisted → bug (legacy name / should be wrapped) or new exception (add ADR row + rationale **before** merge). Every package migration PR must leave no unlisted raw call sites in that package's scope. + +### Phase 0 re-implementation must-fix checklist + +Phase 0 is a **re-implementation pass** under the matured ADRs — light in line count but necessary for correctness. Full checklist (also in [queue P0 row](migration-work-queue.md#current-snapshot)): + +| # | ADR / item | Work | +|---|------------|------| +| 1 | **NewArch-AD-7** | Rename `functions` `codegenConfig.name` → `RNFBFunctionsTurboModules`; regen + commit generated artifacts (do **first** — prevents wrong precedent for single-spec packages). Module name `NativeRNFBTurboFunctions` unchanged. | +| 2 | **NewArch-AD-9** | iOS `RNFBAppModule` + `RNFBUtilsModule`: `requiresMainQueueSetup` → `NO`. | +| 3 | **NewArch-AD-19** | Remove `methodQueue = dispatch_get_main_queue()` from both shells unless on-device validation proves a specific method needs it. | +| 4 | **NewArch-AD-14 / NewArch-AD-14a** | Replace eager wrap + flatten-onto-`{}`+`Object.freeze` with memoizing lazy Proxy + routing composite Proxy in [`nativeModule.ts`](../../../packages/app/lib/internal/registry/nativeModule.ts). Drop dead `multiModuleRoot[moduleName]` boolean flags. | +| 5 | **NewArch-AD-15** | Stop calling `getConstants()` on every resolve in `withTurboConstants`; memoize static constants only; Play Services → dynamic method (remove from utils constants typing when converted). | +| 6 | **NewArch-AD-18 E6** | Fix `messaging.isSupported()`: `NativeRNFBTurboUtils` + `androidGetPlayServicesStatus()`. | +| 7 | **NewArch-AD-18 E5, E7** | `UtilsStatics.FilePath`: memoized static utils accessor; `app/lib/modular.ts` meta/json/preferences → `getAppModule()`. | +| 8 | **NewArch-AD-13** | Harness overrides: `.gitignore` `tests/harness.overrides.js` first, then `harness.overrides.example.js` + read hook in `tests/app.js` / `tests/globals.js`. | +| 9 | **NewArch-AD-17.1** | Jest TurboModule enumeration/Proxy contract test **including 2-host merge fixture** — file [`packages/app/__tests__/nativeModuleContract.test.ts`](../../../packages/app/__tests__/nativeModuleContract.test.ts); scoped run: `yarn tests:jest -- packages/app/__tests__/nativeModuleContract.test.ts` ([ADR §17.1](architecture-decisions.md#newarch-ad-171--jest-turbomodule-contract-test--accepted)). | +| 10 | **Keep** | NewArch-AD-8 `for...in`/`Object.create`, NewArch-AD-10 `authDomains` centralization, `tests/globals.js` `NativeRNFBTurbo*` proxy (E4). | + +**Out of scope for Phase 0 (deferred):** NewArch-AD-18 E8–E10 (firestore/database/pnv until those packages migrate); dead legacy Java shells; iOS `customAuthDomains` rename. + +## TurboModule `implementation` + +Per package, repeat the [`functions`](../../../packages/functions/) shape: + +1. **`specs/NativeRNFBTurbo*.ts`** — extends `TurboModule`. +2. **`package.json` `codegenConfig`** — `jsSrcsDir: "specs"`, android `javaPackageName`, ios `modulesProvider` (one entry per spec; see [multi-spec packages](#multi-spec-packages-app-precedent)). +3. **Android codegen wiring** — `react-native.config.js` → `platforms.android.cmakeListsPath` pointing at the **committed** generated JNI `CMakeLists.txt` (app package path differs from [`functions`](../../../packages/functions/react-native.config.js): under `src/reactnative/java/.../generated/jni/`). After `yarn codegen`, verify CMake uses the compile macro for the monorepo React Native version: **`target_compile_options`** on RN **0.78** (current test app), **`target_compile_reactnative_options`** on RN **0.81+** (current `@react-native/codegen` default). + + **Forward compatibility:** this is **not** a permanent fork. The committed generated `CMakeLists.txt` is reproduced by `yarn codegen` against whatever `@react-native/codegen` the monorepo resolves — when the test app moves to RN 0.81+, re-running codegen emits `target_compile_reactnative_options` and the artifact updates with it. There is no hand-maintained macro choice: the macro only has to match the RN version that generated it, and `functions` already proves the same pipeline regenerates cleanly across versions. Treat a macro mismatch as a *stale committed artifact* (re-run codegen), not as a code change to maintain. +4. **Android** — `NativeRNFBTurbo*` extends generated `*Spec`; register in package class. +5. **iOS** — `.mm` implements spec; `- (std::shared_ptr)getTurboModule:` returns generated JSI class. +6. **JS** — update namespace config; no public API changes unless unavoidable. +7. **Native business logic** — prefer keeping ObjC++/Java shell + existing Swift helpers; language modernization is out of scope ([queue rationale](migration-work-queue.md#reference-pattern-functions)). + +### Codegen-safe names and types (blocking) + +React Native Codegen turns `specs/NativeRNFBTurbo*.ts` into TypeScript, C++, Java, and ObjC++ artifacts. A name or type that is legal in TypeScript can still break generated native code. Check this list during **spec authoring** and before `yarn codegen`. + +| Category | Do not use | Use instead | Why | +|----------|------------|-------------|-----| +| Method names | `delete` | `deleteUser`, `deleteToken`, `deleteItem`, etc. | `delete` collides with generated C++ / native language keywords. | +| Type annotations | `object` | A shaped object type, `Object` for truly dynamic Codegen maps, or a named interface | RN Codegen rejects TypeScript `object` (`TSObjectKeyword`) in NativeModule specs. | +| Dynamic maps | Unshaped catch-all payloads when fields are known | A named `interface` with explicit fields | Strong typed specs are easier to review and catch native/JS drift. | +| Any generated symbol | Language keywords / reserved identifiers (`class`, `default`, `new`, `switch`, `case`, `try`, `catch`, `return`, `void`, `static`, `public`, `private`, `protected`, `namespace`, `operator`, `template`, `this`, `self`) | A domain-specific method or field name | Codegen emits bindings in multiple languages; avoid words reserved in any generated target. | + +If Codegen requires a wrapper-object type such as `Object`, add a narrow lint disable in the spec file with a comment or local scope; do **not** "fix" it to primitive `object`, because that breaks Codegen. If a legacy method already uses a reserved word, rename the TurboModule spec method and keep the public JS API stable via the wrapper layer. + +### TurboModule native registration checklist (blocking) + +Repeat for **every** package migration. Skipping any row is the usual cause of `TypeError: new Proxy target must be an Object` (Android) or `Native module NativeRNFBTurbo* is not registered` (iOS/macOS) at runtime. + +| # | Layer | Requirement | Reference | +|---|-------|-------------|-----------| +| 1 | **Spec** | `specs/NativeRNFBTurbo*.ts`; module name = `TurboModuleRegistry.get` key. When JS reads `this.native.` (e.g. `perf`, `in-app-messaging`, `app`, `utils`), declare **`getConstants(): { … }`** in the spec — without it, codegen omits `getConstants` from the JSI method map and `withTurboConstants` has nothing to merge (runtime **`undefined`** on both platforms). | [`app/specs/NativeRNFBTurboApp.ts`](../../../packages/app/specs/NativeRNFBTurboApp.ts) | +| 2 | **codegenConfig** | `name` = aggregate library `RNFBTurboModules` (not the module name); `includesGeneratedCode: true`; `ios.modulesProvider` maps spec name → ObjC shell class | [`firestore/package.json`](../../../packages/firestore/package.json) | +| 3 | **codegen output** | Regenerate and commit `android/.../generated/` + `ios/generated/` — see [§ Running codegen](#running-codegen-canonical) | [NewArch-AD-5](architecture-decisions.md#newarch-ad-5--commit-generated-code--accepted) | +| 4 | **react-native.config.js** | `platforms.android.cmakeListsPath` → committed `generated/jni/CMakeLists.txt` — path is **relative to package root** and must match `android:codegen` `outputPath` (no duplicate `android/` prefix) | [`firestore/react-native.config.js`](../../../packages/firestore/react-native.config.js) | +| 5 | **CMake macro** | Generated `CMakeLists.txt` must use the macro for the **test app's RN version** (`tests/package.json`): **`target_compile_options`** on RN **0.78**; **`target_compile_reactnative_options`** on RN **0.81+**. Wrong macro → Android CMake configure fails or JNI never links. After `yarn codegen`, diff against [`functions`](../../../packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/CMakeLists.txt) (0.78) or re-run codegen when the test app upgrades. | [§ Android codegen wiring](#turbomodule-implementation) step 3 | +| 6 | **Android shell** | `NativeRNFBTurbo*` extends generated `*Spec`; **only** turbo shells registered in `ReactPackage.createNativeModules`. When the spec declares `getConstants`, implement **`protected getTypedExportedConstants()`** (generated `*Spec` owns `public getConstants()`), not a standalone `public getConstants()` override. | [`perf/.../NativeRNFBTurboPerf.java`](../../../packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/NativeRNFBTurboPerf.java) | +| 7 | **Android build.gradle** | New-arch guard (`newArchEnabled`); `sourceSets { java.excludes = ['**/generated/jni/**'] }` when jni lives under `java.srcDirs` | [`firestore/android/build.gradle`](../../../packages/firestore/android/build.gradle) | +| 8 | **iOS shell** | `.mm`: `RCT_EXPORT_MODULE(NativeRNFBTurbo*)` (exact spec name); `getTurboModule:` → `NativeRNFBTurbo*SpecJSI`; `.h` imports `RNFBTurboModules.h` and conforms to `NativeRNFBTurbo*Spec` (class extension or header — see [`functions`](../../../packages/functions/ios/RNFBFunctions/RNFBFunctionsModule.h)). **Constants:** when the spec declares `getConstants`, use **typed** `facebook::react::ModuleConstants` + `[_RCTTypedModuleConstants newWithUnsafeDictionary:…]` — **not** legacy `- (NSDictionary *)getConstants` / `constantsToExport` (JSI never surfaces those to `TurboModuleRegistry.get`). | [`app/.../RNFBAppModule.mm`](../../../packages/app/ios/RNFBApp/RNFBAppModule.mm) | +| 9 | **Podspec** | `install_modules_dependencies(s)`; new-arch guard; `exclude_files` for duplicate RN codegen providers (`RCTModuleProviders.*`, etc.). Add `pod_target_xcconfig` `HEADER_SEARCH_PATHS` → `ios/generated/RNFBTurboModules` + `ios/generated` when Xcode cannot find generated spec headers (see [`firestore/RNFBFirestore.podspec`](../../../packages/firestore/RNFBFirestore.podspec)). | [`functions/RNFBFunctions.podspec`](../../../packages/functions/RNFBFunctions.podspec) | +| 10 | **JS** | `nativeModuleName` → turbo name; `turboModule: true`; web shim registers turbo name | [`firestore/lib/FirestoreModule.ts`](../../../packages/firestore/lib/FirestoreModule.ts) | +| 11 | **jest.setup.ts** | Mock `NativeRNFBTurbo*` (not legacy `RNFB*Module`) with methods on the correct host; include `getConstants: () => ({ … })` when the package reads constants | [`jest.setup.ts`](../../../jest.setup.ts) | +| 12 | **Native rebuild** | After steps 1–11: **`yarn tests:android:build`** and/or **`yarn tests:ios:build`** — Jest green alone does **not** prove native registration. **Android:** `autolinkLibrariesFromCommand` caches `tests/android/build/generated/autolinking/autolinking.json` keyed only on `tests/{package.json,yarn.lock,react-native.config.js}` — adding or changing a **package** `react-native.config.js` does **not** invalidate the cache; delete `autolinking.json` + `*.sha` under that folder (or touch `tests/package.json`) then rebuild, or JNI never links (`Proxy target must be an Object`). **iOS:** `yarn tests:ios:build` runs `pod install` + Xcode compile; required after codegen / `modulesProvider` / podspec changes. | [`tests/android/settings.gradle`](../../../tests/android/settings.gradle) | + +**Symptom → likely miss:** Android `Proxy target must be an object` → rows **4–7** or **12** (CMake not linked / **stale autolinking cache**). JS reads **`undefined`** for `this.native.isFoo` / constant-backed getters on **either platform** → row **1** (spec missing `getConstants`), row **6** (Android `getTypedExportedConstants`), row **8** (iOS still using `NSDictionary` constants). Metro redbox **`Requiring unknown module "undefined"`** at app load (before Jet connects) → **not** a registration miss — [stale JS/native toolchain](../testing/running-e2e.md#turbomodule-stale-toolchain-blocking); run checklist row **12** + Metro reset-cache; escalate to [full toolchain refresh](../testing/running-e2e.md#turbomodule-full-toolchain-refresh) if it persists. iOS `Native module NativeRNFBTurbo* is not registered` → rows **2**, **8**, **9**, **12**. iOS `unrecognized selector` on turbo method → row **8** (legacy `RCT_EXPORT_METHOD` signatures instead of spec protocol). iOS build missing generated header → row **9** (`HEADER_SEARCH_PATHS`). + +### Running codegen (canonical) + +Package `package.json` scripts (`yarn android:codegen` / `yarn ios:codegen`) are convenience wrappers; **`cd packages/ && yarn ios:codegen` often fails** after a clean install (`unknown command 'codegen'`) because `@react-native-community/cli` resolves from the **test app** workspace, not the library package cwd. + +**Canonical** — from repo root, `cd tests`, one platform at a time; `--outputPath` must match the package's `android:codegen` / `ios:codegen` script (paths differ per package — copy from [`functions/package.json`](../../../packages/functions/package.json)): + +```bash +cd tests +npx @react-native-community/cli codegen \ + --path ../packages/ \ + --platform android \ + --source library \ + --outputPath ../packages// + +npx @react-native-community/cli codegen \ + --path ../packages/ \ + --platform ios \ + --source library \ + --outputPath ../packages//ios/generated +``` + +Example (`perf` Android): `--outputPath ../packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated`. + +After regen: commit generated dirs, then [checklist row **12**](#turbomodule-native-registration-checklist-blocking) (`:build` + Metro reset-cache before `:test-cover`). + +**Unit-focused** tier per [change authoring § implementation inner loop](../testing/change-authoring-workflow.md#implementation-inner-loop) and [TurboModule area harness](#turbomodule-area-harness) below. + +Shared infrastructure (already landed for `functions`): + +* [`packages/app/lib/internal/registry/nativeModule.ts`](../../../packages/app/lib/internal/registry/nativeModule.ts) — `turboModule` flag, iOS null encoding +* [`packages/app/lib/internal/nullSerialization.ts`](../../../packages/app/lib/internal/nullSerialization.ts) + native interceptor + +## TurboModule `independent-review` + +On a **frozen tree** — full [change authoring § independent-review](../testing/change-authoring-workflow.md#independent-review), plus: + +* New Architecture build on each touched platform (native bridge change). +* Package e2e at **area-focused** tier with [area harness](#turbomodule-area-harness) applied locally before first `:test-cover`. +* iOS: exercise null-in-object payloads where the package passes option maps ([RN #52802](https://github.com/facebook/react-native/issues/52802)) — highest risk: `auth`, `firestore`, `database`, `storage`. + +## TurboModule area harness + +Extends [change authoring § harness narrowing](../testing/change-authoring-workflow.md#harness-narrowing). + +**Area setup (required for `unit-focused` and `area-focused` tiers):** copy [`tests/harness.overrides.example.js`](../../../tests/harness.overrides.example.js) to gitignored `tests/harness.overrides.js` — set `modules` to the package under migration and `RNFBDebug: true`. Load that package's full `packages//e2e/*.e2e.js` specs via committed `require.context` ([running e2e § local overrides](../testing/running-e2e.md#local-harness-overrides-harnessoverridesjs)). + +| Package | Harness `modules` key | Typical e2e entry | +|---------|----------------------|-------------------| +| `app` | `app` | `packages/app/e2e/` | +| `auth` | `auth` | `packages/auth/e2e/` | +| `firestore` | `firestore` | `packages/firestore/e2e/` (may coexist with Pipeline specs — load package module only) | +| `functions` | `functions` | `packages/functions/e2e/` (reference; already migrated) | +| `in-app-messaging` | `inAppMessaging` | `packages/in-app-messaging/e2e/` | +| `app-distribution` | `appDistribution` | `packages/app-distribution/e2e/` | +| `installations` | `installations` | `packages/installations/e2e/` | +| `perf` | `perf` | `packages/perf/e2e/` | +| `ml` | `ml` | `packages/ml/e2e/` | +| Others | match `platformSupportedModules` key in [`tests/app.js`](../../../tests/app.js) | `packages//e2e/` | + +**Harness key ≠ npm folder name** for camelCase entries (`inAppMessaging`, `appDistribution`, `remoteConfig`, …). Always copy the string from `tests/app.js` `platformSupportedModules` — wrong keys load zero specs or the wrong package ([Phase 2 review pitfall](migration-work-queue.md#current-snapshot)). + +**Sanity check:** pass counts must match loaded scope — not full-app totals ([running e2e § gate](../testing/running-e2e.md#harness-narrowing-gate-blocking)). + +**TurboModule `NativeModules` proxy:** package e2e that reads turbo shells directly (e.g. [`events.e2e.js`](../../../packages/app/e2e/events.e2e.js) → `NativeModules.NativeRNFBTurboApp`) requires the harness proxy in [`tests/globals.js`](../../../tests/globals.js) to route **`NativeRNFBTurbo*`** names through [`getReactNativeModule()`](../../../packages/app/lib/internal/nativeModuleAndroidIos.ts), not only the legacy `RNF*` prefix. Without that, the proxy returns a no-op stub and event tests hang. Durable committed wiring — not part of overrides narrowing ([NewArch-AD-13](architecture-decisions.md#newarch-ad-13)). + +**Push state (committed):** full test app remains default for CI. Local `:test-cover` during migration uses area narrowing even when git has full harness. + +**Phase R / coordinated break:** revert all narrowing; **full** tier 3-platform run before monorepo major ships ([change authoring § pre-merge-validation](../testing/change-authoring-workflow.md#work-types)). + +## Phase S: sync conversion (forced-async → sync) + +Runs **after** every native package is on TurboModules (Phases 0–5), **before** [Phase R](migration-work-queue.md#phase-table). Queue rationale and scope discriminator: [migration work queue § Phase S](migration-work-queue.md#phase-s-sync-conversion-forced-async--sync). This section owns the **procedure**. + +**What it fixes:** Some RNFB methods are typed `Promise` only because the legacy bridge made every call async — firebase-js-sdk's equivalent is synchronous. TurboModules support sync JSI methods, so those return to sync parity. These deltas are visible in `compare:types` configs as async-vs-sync differences. + +**Per-package loop** (same [change authoring](../testing/change-authoring-workflow.md) work types; one focused commit per package): + +1. **`gap-analysis`** — Read the package's `compare:types` config (`.github/scripts/compare-types/configs/.ts`) for documented async-vs-sync differences. For each, apply the [scope discriminator](migration-work-queue.md#phase-s-sync-conversion-forced-async--sync): keep `Promise` if the native work has real latency (network/disk/keychain/token); only convert pure bridge-forced async. +2. **`implementation`** — Declare the spec method sync (drop `Promise`) in `specs/NativeRNFBTurbo*.ts`; re-run `yarn codegen`; update the native shell to return synchronously (no resolver); update JS (`modular.ts`) to call sync; update types in `lib/`. **Unit-focused** tier. +3. **`independent-review`** — **area-focused** tier on a frozen tree; verify no consumer-visible behavior regressions beyond the intended async→sync change. +4. **`documentation`** — Remove the now-resolved entry from the package's `compare:types` config (the difference is gone); note the API change in the migration guide for the coordinated major. +5. **`commit`** — `refactor(): return sync parity for bridge-forced async APIs` (or `feat():` if the public type change is the headline). One commit per package. + +**Completion signal (per package):** the corresponding async-vs-sync entry is removed from the package's `compare:types` config and `yarn compare:types` is clean for that package ([validation checklist § type parity](../testing/validation-checklist.md#api-reference-and-type-parity)). + +**Caution:** sync across JSI runs on the JS thread — never convert a method that does real I/O. When unsure, keep it async; over-converting is a perf/ANR risk, under-converting is harmless. + +## TurboModule `documentation` + +Per package (or per phase batch), same commit when user-facing: + +**User docs** + +* Migration guide update for coordinated New Architecture break (final phase only unless package already ships new-arch-only like `functions`) +* Package install notes if podspec/build requirements change + +**OKF bundle maintenance** + +* Update [migration work queue](migration-work-queue.md) gate rows when items close +* Record non-obvious codegen or null-serialization choices here or in queue historical notes — not only commit messages + +## TurboModule `commit` + +```text +feat()!: migrate to TurboModules +``` + +Breaking change (`!`): TurboModule migration requires New Architecture; legacy bridge is removed per package. + +**Never stage:** `tests/harness.overrides.js`, any `.only`, temporary sub-suite edits in `tests/app.js`. + +## Gotchas + +* **macOS / web turbo name registration** — [`nativeModuleWeb.ts`](../../../packages/app/lib/internal/nativeModuleWeb.ts) registers JS-SDK shims by module name in the **registry object initializer** (not deferred to bottom-of-file calls) so `NativeRNFBTurbo*` names exist before `RNFBNativeEventEmitter` instantiates during circular imports. When [`APP_NATIVE_MODULE`](../../../packages/app/lib/internal/constants.ts) changes ([NewArch-AD-2](architecture-decisions.md#newarch-ad-2--naming-nativernfbturbo--accepted)), register **both** legacy `RNFBAppModule` and turbo keys. Missing registration → macOS **blank window** / `Native module NativeRNFBTurboApp is not registered` in `com.facebook.react.log:javascript`. +* **Events deferred** ([NewArch-AD-4](architecture-decisions.md#newarch-ad-4--events-deferred-to-phase-c--accepted)) — keep `RNFBRCTEventEmitter` / `nativeEvents` fan-out unless testing forces escalation. +* **Swift / ObjC interop** — TurboModule shell stays ObjC++; follow functions podspec patterns for `use_frameworks!` and non-framework builds. +* **Unified resolver** ([NewArch-AD-6](architecture-decisions.md#newarch-ad-6--unified-native-module-resolver--accepted)) — `TurboModuleRegistry.get` with `NativeModules` fallback in `packages/app`; fallback removed at Phase R. +* **`requiresMainQueueSetup` = `NO`** ([NewArch-AD-9](architecture-decisions.md#newarch-ad-9--requiresmainqueuesetup-returns-no--accepted)) — iOS shells must return `NO`; `YES` blocks sync methods and risks main-thread deadlock under TurboModules. Audit `getConstants`/init/`methodQueue` for genuine main-thread work as part of gap-analysis; dispatch only that work explicitly. +* **TurboModule JS enumeration & wrapping** ([NewArch-AD-8](architecture-decisions.md#newarch-ad-8--turbomodule-js-enumeration-forin--objectcreate--accepted) + [NewArch-AD-14](architecture-decisions.md#newarch-ad-14--native-module-wrapper-memoizing-lazy-proxy--accepted)) — prototype lazy loading means **`Object.keys` / spread / `Object.assign({}, host)` break method access** (`XYZ is not a function`). Enumerate with **`for...in`**; the module surface is a **memoizing lazy `Proxy`** (NewArch-AD-14), and multi-module packages use the **routing composite Proxy** ([NewArch-AD-14a](architecture-decisions.md#newarch-ad-14a--multi-host-merge-routing-composite-proxy-required-for-multi-module)) — **not** a flattened-onto-`{}` + `Object.freeze` object. Do not copy TurboModule hosts into `{}`. Use the wrapped surface by default; raw `getReactNativeModule` only per [NewArch-AD-18](architecture-decisions.md#newarch-ad-18--raw-vs-wrapped-resolver-policy--accepted). +* **Android cross-module native shared state** ([NewArch-AD-10](architecture-decisions.md#newarch-ad-10--cross-package-native-state-is-centralized-in-app-with-testable-apis--accepted)) — turbo shells may expose **`public static` fields** read by other packages' native code. Phase 0: **`NativeRNFBTurboApp.authDomains`** (populated on `initializeApp`; read by [`RCTConvertFirebase`](../../../packages/app/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java) and [`ReactNativeFirebaseAuthModule`](../../../packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthModule.java)). Unregistered legacy bridge classes may **delegate** to the turbo shell — do not duplicate the map on legacy classes. +* **iOS auth-domain naming** — iOS keeps historical **`customAuthDomains`** + `getCustomDomain:` on the turbo shell ([`RNFBAppModule.mm`](../../../packages/app/ios/RNFBApp/RNFBAppModule.mm)); Android uses **`authDomains`** on [`NativeRNFBTurboApp`](../../../packages/app/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java). Same semantics; intentional cross-platform naming carry-over. +* **Spec Promise typing (Android)** — Codegen Android methods take **`Promise` args** even when the legacy bridge was sync void. Example: Play Services helpers in [`NativeRNFBTurboUtils`](../../../packages/app/specs/NativeRNFBTurboUtils.ts) — declare `Promise` / `Promise`; native resolves the promise. +* **Android codegen output path families** — always copy `android:codegen` `outputPath` from the target `package.json` (do not assume one layout). **`src/reactnative/java/.../generated`**: `app`, `firestore`, `perf`, `in-app-messaging`, `ml`. **`src/main/java/.../generated`**: `functions`, `installations`, `app-distribution`. `react-native.config.js` `cmakeListsPath` must match the same tree. +* **Duplicate generated trees** — a wrong initial `outputPath` or regen into a second folder leaves **two** `generated/` trees (e.g. `src/main/java` + `src/reactnative/java`, or `fiam/` + `in_app_messaging/`). Android then fails with `duplicate class: NativeRNFBTurbo*Spec`. Keep **one** canonical tree; delete stale dirs; align shell imports, `build.gradle` `sourceSets`, and `cmakeListsPath`. +* **Dead legacy shells** — unregistered legacy Java modules (e.g. [`ReactNativeFirebaseAppModule`](../../../packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppModule.java)) may remain temporarily when the package registers turbo shells only. **Not a Phase 0 blocker** — track deletion as follow-on cleanup once the turbo path is verified. +* **CMake macro vs test-app RN version** — see [registration checklist § row 5](#turbomodule-native-registration-checklist-blocking). `yarn codegen` uses root `@react-native/codegen`; if it emits `target_compile_reactnative_options` but the test app is still RN 0.78, replace with `target_compile_options` (copy from [`functions` CMakeLists](../../../packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/CMakeLists.txt)) before first `:test-cover`. +* **TurboModule constants (both platforms)** — legacy bridge exposed constants as enumerable keys on the module object. TurboModules require the full chain in [checklist rows 1, 6, 8](#turbomodule-native-registration-checklist-blocking): spec `getConstants()` → codegen → Android `getTypedExportedConstants` → iOS typed `ModuleConstants` + `_RCTTypedModuleConstants` → `withTurboConstants` in [`nativeModuleAndroidIos.ts`](../../../packages/app/lib/internal/nativeModuleAndroidIos.ts). Skipping the spec or leaving iOS on `NSDictionary *` produces **`undefined`** in constructors like `this._foo = this.native.isFoo` even when methods work. Packages without constants (`functions`, `installations`, …) skip the constants rows. +* **Android autolinking cache** — see checklist row **12**. `npx react-native config` can show the correct `cmakeListsPath` while `tests/android/build/generated/autolinking/autolinking.json` is still stale. +* **Metro `Requiring unknown module "undefined"`** — Metro runtime error when `require()` gets module id `undefined`. **Not** the same as native constant `undefined` or `Proxy target must be an Object`. Usually **stale Metro cache and/or partial refresh** after spec/codegen/`lib/**`/podspec changes while iOS/Android debug still loads a **live** bundle from `:8081` ([running e2e § stale toolchain](../testing/running-e2e.md#turbomodule-stale-toolchain-blocking)). A static `index.bundle` fetch can succeed while the simulator still shows the redbox — treat as toolchain staleness, not a missing `import`. Escalation: [full toolchain refresh](../testing/running-e2e.md#turbomodule-full-toolchain-refresh). +* **Codegen CLI cwd** — see [§ Running codegen](#running-codegen-canonical). Do not debug `unknown command 'codegen'` by patching package scripts; run from `tests/`. +* **phone-number-verification** — bypasses `createModuleNamespace`; wire spec + resolver directly in `modular.ts`. + +Live phase status and arbiter gates: [migration work queue](migration-work-queue.md) (ephemeral). diff --git a/okf-bundle/packages/firestore/pipeline-implementation-workflow.md b/okf-bundle/packages/firestore/pipeline-implementation-workflow.md index 8b51684a2f..5b86dd681f 100644 --- a/okf-bundle/packages/firestore/pipeline-implementation-workflow.md +++ b/okf-bundle/packages/firestore/pipeline-implementation-workflow.md @@ -92,7 +92,7 @@ On a **frozen tree** — full [change authoring § independent-review](../../tes ## Pipeline area harness -Extends [change authoring § harness narrowing](../../testing/change-authoring-workflow.md#harness-narrowing). **Mechanics:** [running e2e § area harness — two platform blocks](../../testing/running-e2e.md#tests-app-js-area-harness). +Extends [change authoring § harness narrowing](../../testing/change-authoring-workflow.md#harness-narrowing). **Mechanics:** [running e2e § local harness overrides](../../testing/running-e2e.md#local-harness-overrides-harnessoverridesjs). **Area setup (required for `unit-focused` and `area-focused` tiers):** firestore-only `platformSupportedModules` with **both** `if (Platform.other)` and `if (!Platform.other)` disabled (`if (false && …)` on each) or trimmed inside each block; load `require('../packages/firestore/e2e/Pipeline.e2e.js')` or full firestore `require.context` per scope; **`RNFBDebug = true`** locally per [running e2e § fail-fast](../../testing/running-e2e.md#fail-fast-rnfbdebug-and-sub-suite-narrowing) — **never commit**. Revert **both** platform blocks before **full** tier or `commit`. diff --git a/okf-bundle/testing/agent-command-policy.md b/okf-bundle/testing/agent-command-policy.md index 63909c6a5e..a795391399 100644 --- a/okf-bundle/testing/agent-command-policy.md +++ b/okf-bundle/testing/agent-command-policy.md @@ -34,6 +34,7 @@ Single source for **which shell commands agents may run** in this repo. E2e is a | JS lint (implementation / review gate) | `yarn lint:js`, `yarn lint:js --fix` | package-scoped `eslint`, `npx eslint` | | Docs lint (when docs in diff) | `yarn lint:markdown`, `yarn lint:spellcheck` | ad-hoc prettier/eslint on single files | | E2e + coverage | [running e2e](running-e2e.md) — **only** `yarn tests:*` | `jet`, `npx jet`, `yarn jet`, `detox test`, `cd tests && …`, direct Metro/emulator starts | +| iOS Detox framework cache rebuild | `yarn tests:ios:detox-framework-cache:rebuild` | `cd tests && yarn detox clean-framework-cache`, `cd tests && yarn detox build-framework-cache`, bare `detox …` | | Host pre-flight (before each `:test-cover`) | [running e2e § host-clear probes](running-e2e.md#host-clear-probes) | `pgrep`, polling `:8090`, spawn probes of Jet/Detox | ### Prepare / transpile (detail) @@ -94,6 +95,12 @@ Single source for **which shell commands agents may run** in this repo. E2e is a - **`yarn jet --help`** working or failing in `tests/` is **not** a valid e2e or install gate. - Jet is started **internally** by `yarn tests::test-cover`. Stale `:8090` → [pre-flight recovery](running-e2e.md#pre-flight-recovery), then re-run the same `:test-cover` command. +### TurboModule codegen + +- **`cd packages/ && yarn ios:codegen`** (or `yarn android:codegen`) often fails with **`unknown command 'codegen'`** after a clean `yarn` — `@react-native-community/cli` resolves from the **test app** workspace. +- **Canonical:** [turbomodule workflow § Running codegen](../new-architecture/turbomodule-implementation-workflow.md#running-codegen-canonical) — `cd tests`, `npx @react-native-community/cli codegen --path ../packages/ …` with `--outputPath` copied from that package's `package.json` script. +- After regen: commit `android/.../generated` + `ios/generated`, then `:build` + Metro reset-cache before `:test-cover`. + ## Subagent handoff Paste into Task / explore / work-queue prompts: @@ -103,7 +110,8 @@ RNFB agent command policy: okf-bundle/testing/agent-command-policy.md ONLY. E2e: okf-bundle/testing/running-e2e.md yarn tests:* ONLY. Never: yarn workspace prepare, yarn jet, npx jet, cd packages/* && yarn prepare/build for diagnostics. Prepare/install: yarn or yarn lerna:prepare must exit 0 before ANY other command — never parallelize with e2e/Metro/build. -Area harness: okf-bundle/testing/running-e2e.md#tests-app-js-area-harness — edit BOTH Platform.other and !Platform.other blocks; revert both before commit. +Area harness: okf-bundle/testing/running-e2e.md#local-harness-overrides-harnessoverridesjs — copy harness.overrides.example.js to gitignored harness.overrides.js; set modules + RNFBDebug; delete overrides after run. +TurboModule contract test (NewArch-AD-17.1): packages/app/__tests__/nativeModuleContract.test.ts — yarn tests:jest -- packages/app/__tests__/nativeModuleContract.test.ts On failure: fix product code, re-run the same canonical command. ``` diff --git a/okf-bundle/testing/change-authoring-workflow.md b/okf-bundle/testing/change-authoring-workflow.md index b7fa2da66b..d68e46cfbe 100644 --- a/okf-bundle/testing/change-authoring-workflow.md +++ b/okf-bundle/testing/change-authoring-workflow.md @@ -97,7 +97,7 @@ E2e scope, pre-flight, and harness gate: [running e2e § agent rule](running-e2e | Gate | Closes when | |------|-------------| -| `implementation` | `implementation` work type complete — code plus **unit-focused**-tier checks green; [static analysis](validation-checklist.md#lint-and-formatting) green on the diff | +| `implementation` | `implementation` work type complete — code plus **unit-focused**-tier checks green on **every required platform** when native bridge or embed path changed ([platform coverage gate](running-e2e.md#platform-coverage-gate-blocking)); [static analysis](validation-checklist.md#lint-and-formatting) green on the diff | | `review` | `independent-review` complete — **area-focused**-tier checks green on frozen tree; applicable [validation checklist](validation-checklist.md) rows green (including static analysis) | | `commit` | Durable commit exists for the item | @@ -163,7 +163,7 @@ Before changing native bridge code that calls a **platform SDK** (Firebase Andro When **`unit-focused`** e2e fails and product cause is unclear: -1. Confirm [pre-flight](running-e2e.md#pre-flight-is-the-host-clear-to-start) was complete ([prepare completion gate](running-e2e.md#prepare-completion-gate-blocking) when `lib/**` changed, host-clear probes, services, area narrowing, **`RNFBDebug = true`**). +1. Confirm [pre-flight](running-e2e.md#pre-flight-is-the-host-clear-to-start) was complete ([prepare completion gate](running-e2e.md#prepare-completion-gate-blocking) when `lib/**` changed, host-clear probes, services, harness overrides, **`RNFBDebug: true`** via overrides). 2. If the **same failure repeats** on back-to-back runs with no assertion progress and the host is known clean → **sub-suite narrow** ([running e2e § fail-fast](running-e2e.md#fail-fast-rnfbdebug-and-sub-suite-narrowing)): one spec file or `describe.only` on the failing band (e.g. aggregate `count()` / `average()` / `sum()` only). Still **unit-focused**; never commit narrowing. 3. If sub-suite runs still fail without actionable assertion text → add **temporary native instrumentation** (NSLog, `adb logcat` tags, etc.) on the code path under test; use [running e2e § diagnosing hangs](running-e2e.md#diagnosing-hangs) for log commands. **Remove instrumentation before `commit`** and before **`area-focused`** gate closure on a frozen tree. 4. Do not treat Jet WS disconnect / orchestration timeout alone as product failure — [stalled run detection](running-e2e.md#stalled-run-detection) and pre-flight recovery first. @@ -184,12 +184,12 @@ Keep **`implementation`** and **`independent-review`** in separate passes ([§ f ## Harness narrowing -**Before the first `:test-cover` at `unit-focused` or `area-focused` tier:** apply package area narrowing in `tests/app.js` / `tests/globals.js` even when the branch commit has full harness. **`tests/app.js` has two platform populate blocks** — [running e2e § area harness (two platform blocks)](running-e2e.md#tests-app-js-area-harness): edit **both** `if (Platform.other)` and `if (!Platform.other)` (or disable both with Pattern A). Set **`RNFBDebug = true`** locally in `tests/globals.js` ([running e2e § fail-fast](running-e2e.md#fail-fast-rnfbdebug-and-sub-suite-narrowing)). Full app load is **`full`** tier only. +**Before the first `:test-cover` at `unit-focused` or `area-focused` tier:** create local [`tests/harness.overrides.js`](../../tests/harness.overrides.example.js) even when the branch commit has full harness — [running e2e § local harness overrides](running-e2e.md#local-harness-overrides-harnessoverridesjs). Set `modules` to the package area and **`RNFBDebug: true`**. Full app load is **`full`** tier only (delete overrides file). | Kind | `implementation` (**unit-focused**) | `independent-review` (**area-focused**) | `pre-merge-validation` (**full**) | `commit` | |------|-------------------------------------|------------------------------------------|-----------------------------------|----------| -| **Area narrowing** | Required before `:test-cover` | Required before `:test-cover` | Revert — all modules | Never | -| **`RNFBDebug = true`** | Required locally before `:test-cover` | Required locally before `:test-cover` | Revert — `false` | Never | +| **Area narrowing** | Required before `:test-cover` (overrides file) | Required before `:test-cover` | Delete overrides — all modules | Never commit overrides | +| **`RNFBDebug: true`** | Required in overrides before `:test-cover` | Required in overrides before `:test-cover` | Delete overrides / `false` | Never | | **Single-test** (`.only`) | Allowed (diagnosis) | Revert | Revert | Never | | **Single-suite** (`describe.only` / one spec file) | Allowed (diagnosis only — [escalation](#e2e-diagnosis-escalation)) | Revert | Revert | Never | @@ -200,7 +200,7 @@ Package workflows define **which module/spec** to load (e.g. Firestore → [pipe ## `commit` - One focused commit per item when gates close. -- **Never stage:** area narrowing, any `.only`, ad-hoc harness edits, or **`RNFBDebug = true`** in `tests/globals.js` ([running e2e § before merge](running-e2e.md#before-merge-pr-handoff), [platform coverage gate](running-e2e.md#platform-coverage-gate-blocking)). +- **Never stage:** `tests/harness.overrides.js`, any `.only`, temporary sub-suite edits in `tests/app.js`, or native instrumentation ([running e2e § before merge](running-e2e.md#before-merge-pr-handoff), [platform coverage gate](running-e2e.md#platform-coverage-gate-blocking)). - **Work queue:** before `git commit`, set the row's `commit_subject` to the commit's subject line, close `commit_gate`, and stage the queue doc **in the same commit** as the product change ([documentation policy § work queues](../documentation-policy.md#work-queue-documents)). Do not record SHAs in queue docs. ```bash @@ -214,6 +214,7 @@ rg '\.only\(' packages/ | Package / area | Adds to this loop | |----------------|-------------------| | Firestore Pipelines | Compare-types gap pick, serialization matrix, `Pipeline.e2e.js` setup, coverage snapshots — [pipeline implementation workflow](../packages/firestore/pipeline-implementation-workflow.md) | +| TurboModule migration | Spec inventory, codegen commit, New Architecture harness, multi-module spec split — [turbomodule implementation workflow](../new-architecture/turbomodule-implementation-workflow.md) | | Other packages | `okf-bundle/packages//` index when a workflow exists | Ephemeral coordination (gate rows, `next_work_type`, `commit_subject`): **work queues only** — not part of this workflow. diff --git a/okf-bundle/testing/running-e2e.md b/okf-bundle/testing/running-e2e.md index 7e075c209a..20c27c4b6c 100644 --- a/okf-bundle/testing/running-e2e.md +++ b/okf-bundle/testing/running-e2e.md @@ -43,6 +43,7 @@ yarn tests:emulator:start 3. **Rebuild when needed** - Native changed → `yarn tests:ios:build` / `yarn tests:android:build` before e2e. macOS uses firebase-js-sdk only — no native rebuild. - `packages/*/lib/**` changed → **`yarn lerna:prepare` must run to completion (exit 0) before anything else** — Metro serves `dist/module/**`, not `lib/**`. See [prepare completion gate](#prepare-completion-gate-blocking) and [agent command policy § prepare must finish first](agent-command-policy.md#prepare-must-finish-first). After prepare finishes, restart the packager with `yarn tests:packager:jet-reset-cache` when Metro was already running ([Rules §1](#rules)). + - TurboModule **codegen / spec / podspec / native shell** changed → same as native changed, plus regen codegen ([workflow § Running codegen](../new-architecture/turbomodule-implementation-workflow.md#running-codegen-canonical)) when specs changed; if app loads with Metro redbox `Requiring unknown module "undefined"`, see [TurboModule stale toolchain](#turbomodule-stale-toolchain-blocking). - TS coverage: iOS/Android embed JS at **build** time; run `:build` before `:test-cover` so Istanbul + patched test-runner coverage upload is in app. macOS loads from Metro live; after test-runner patch changes, restart the packager with `yarn tests:packager:jet-reset-cache` ([Rules §1](#rules)). 4. **Always run with coverage:** @@ -96,10 +97,11 @@ macOS: `yarn tests:macos:test-cover` only — same `:8090` transport, no Detox. **Launch gate (orchestration race fix)** — `firebase.test.js` starts the test runner with `RNFB_JET_DEFER_RUN=1`. It listens on 8090 and **defers** `server.run()` until the host signals launch success: -1. Host waits for TCP **8090**, then Metro (debug) if needed, then `launchAppWithRetry`. -2. Host `POST`s **`/orchestrate-state`** (`{ "phase": "launch-pending" | "launch-ok" | … }`) to the control port (best-effort diagnostics). -3. After `launchApp` succeeds, host `POST`s **`/launch-ready`** → test runner calls `server.run()` and the app may receive the mocha-remote `run` action. -4. Mocha tests must not start during a stuck or retried `launchApp`; on inner launch retry the host may kill and respawn the test runner before `terminateApp`/simulator reboot. +1. On Android, host force-stops both test packages and clears any stray **8090** listener before spawning Jet. +2. Host waits for TCP **8090**, then Metro (debug) if needed, then `launchAppWithRetry`. +3. Host `POST`s **`/orchestrate-state`** (`{ "phase": "launch-pending" | "launch-ok" | … }`) to the control port (best-effort diagnostics). +4. After `launchApp` succeeds, host `POST`s **`/launch-ready`** → test runner calls `server.run()` and the app may receive the mocha-remote `run` action. +5. Mocha tests must not start during a stuck or retried `launchApp`; on inner launch retry the host may kill and respawn the test runner before `terminateApp`/simulator reboot. **Log markers** — `[rnfb-e2e] orchestrate-state=…`, `[jet-control] deferring server.run until POST /launch-ready`, `[jet-control] launch-ready received`, `[jet-control] listening on http://…:8091`, `[jet-coverage] …`, `Jet client connected`. @@ -164,15 +166,34 @@ No in-flight test run on the target platform: | Platform | Clear when | |----------|------------| -| **Android** | [Host-clear probes](#host-clear-probes) pass (no instrumentation PID) | +| **Android** | [Android app reset](#android-app-reset-blocking) + [host-clear probes](#host-clear-probes) pass | | **iOS** | [Host-clear probes](#host-clear-probes) pass — **zero booted simulators** and no stray listener on `:8090`. Detox boots `iPhone 17` from `tests/.detoxrc.js`; do not pre-boot or leave simulators running. | | **macOS** | [Host-clear probes](#host-clear-probes) pass (no `io.invertase.testing` process) | Also wait for any visible unfinished `yarn tests:*:test-cover`. + + +**Android app reset (blocking)** — run **before every** Android `:test-cover`, not only after a failed run: + +```bash +adb -s emulator-5554 shell am force-stop com.invertase.testing +adb -s emulator-5554 shell am force-stop com.invertase.testing.test +``` + +The main app (`com.invertase.testing`) can sit on **“waiting for jet to start tests…”** while the [host-clear probe](#host-clear-probes) still passes (it only checks `com.invertase.testing.test`). A stale main app then connects as a **second Jet client** after Detox launches a fresh run → `Received a message from the client, but server wasn't running` and no Mocha summary. Force-stop **both** packages, then re-run the probe. + +On **darwin** hosts, also clear the macOS test app before Android `:test-cover` — macOS and Android share Jet **`:8090`**. Alternating macOS and Android runs without killing `io.invertase.testing` leaves a stale macOS Jet client that connects when Android starts → duplicate clients and `server wasn't running`. + +```bash +! pgrep -x io.invertase.testing >/dev/null 2>&1 +``` + +(`firebase.test.js` runs this automatically via `ensureAndroidJetHostClear` before spawning Android Jet; use the probe manually when prepping from the runbook.) + -**Host-clear probes** — run the block for your platform; **exit 0 = clear** (chain with `&&`): +**Host-clear probes** — run after [Android app reset](#android-app-reset-blocking) (Android) or directly (iOS/macOS); **exit 0 = clear** (chain with `&&`): ```bash # iOS — booted-device count must be 0 @@ -188,12 +209,13 @@ test -z "$(lsof -nP -iTCP:8090 -sTCP:LISTEN -t 2>/dev/null || true)" -**Pre-flight recovery** — when probes fail after abort, kill, or `EADDRINUSE` on `:8090`. Then re-run [host-clear probes](#host-clear-probes). +**Pre-flight recovery** — when probes fail **after** [Android app reset](#android-app-reset-blocking), abort, kill, or `EADDRINUSE` on `:8090`. Before any new `:test-cover`, kill the stray **8090** listener, re-run force-stop (Android) or the iOS/macOS steps below, then [host-clear probes](#host-clear-probes). ```bash -# Android +# Android — force-stop both apps, then clear the Jet WS listener adb -s emulator-5554 shell am force-stop com.invertase.testing adb -s emulator-5554 shell am force-stop com.invertase.testing.test +lsof -nP -iTCP:8090 -sTCP:LISTEN -t | xargs kill 2>/dev/null || true # iOS — Detox re-boots iPhone 17 after shutdown booted lsof -nP -iTCP:8090 -sTCP:LISTEN -t | xargs kill 2>/dev/null || true @@ -202,6 +224,8 @@ pkill -f 'jet.js --target=ios' 2>/dev/null || true xcrun simctl shutdown booted ``` +After Android recovery, verify `pidof com.invertase.testing.test` is empty and `:8090` is closed before rerunning `:test-cover`. + Do **not** use `boot-simulator.sh` or `simctl shutdown all` as routine prep ([what not to do](#what-not-to-do)). #### 2. Services ready @@ -219,15 +243,15 @@ A listener on `:8081` or `:8080` is **not** sufficient — HTTP checks must succ #### 3. Harness matches validation tier -Confirm `tests/app.js` / `tests/globals.js` match the item's **`validation_tier`** ([iteration vocabulary](iteration-vocabulary.md#work-queue-fields)), **not** the branch's committed harness. +Confirm local harness overrides (or committed files for **full** tier only) match the item's **`validation_tier`** ([iteration vocabulary](iteration-vocabulary.md#work-queue-fields)), **not** the branch's committed harness alone. | Tier | Harness before `:test-cover` | |------|------------------------------| -| **Unit-focused** (`implementation`) | **Area narrowing required** — trim modules + load only the spec under change (e.g. firestore + `Pipeline.e2e.js`); `.only` OK locally. Set **`RNFBDebug = true`** locally in `tests/globals.js` ([§ fail-fast](#fail-fast-rnfbdebug-and-sub-suite-narrowing)). | -| **Area-focused** (`independent-review`, `baseline-capture`) | **Area narrowing required** — same module/spec trim as unit-focused; load **full** spec file(s) for the package area; **no** `.only`. Set **`RNFBDebug = true`** locally ([§ fail-fast](#fail-fast-rnfbdebug-and-sub-suite-narrowing)). | -| **Full** (`pre-merge-validation`) | Revert all narrowing — full app (`require.context`, all modules); **`RNFBDebug = false`** (committed default). | +| **Unit-focused** (`implementation`) | **Area narrowing required** — [`tests/harness.overrides.js`](#local-harness-overrides-harnessoverridesjs) with `modules` + `RNFBDebug: true`; `.only` OK locally. | +| **Area-focused** (`independent-review`, `baseline-capture`) | **Area narrowing required** — same overrides file; load **full** spec file(s) for the package area; **no** `.only`; `RNFBDebug: true`. | +| **Full** (`pre-merge-validation`) | **No** `harness.overrides.js` (delete or `{}`); full app in committed `tests/app.js`; `RNFBDebug: false`. | -Committed full harness on the branch does **not** override **unit-focused** or **area-focused** tier for local runs. Package workflows define area setup (e.g. [pipelines § area harness](../packages/firestore/pipeline-implementation-workflow.md#pipeline-area-harness)). **How to edit `tests/app.js`:** [two platform blocks](#tests-app-js-area-harness). Never commit narrowing until **full** tier. +Committed full harness on the branch does **not** override **unit-focused** or **area-focused** tier for local runs. Package workflows define **which module/spec** (e.g. [pipelines § area harness](../packages/firestore/pipeline-implementation-workflow.md#pipeline-area-harness)). **How:** [local harness overrides](#local-harness-overrides-harnessoverridesjs). Never commit `harness.overrides.js`. See [Harness narrowing gate (blocking)](#harness-narrowing-gate-blocking) — a run that skips step 3 does **not** close `implementation_gate` or `review_gate`. @@ -249,17 +273,19 @@ Do not poll `pgrep`, process names, or `:8090` for *completion* ([above](#how-a- ### Harness narrowing gate (blocking) -**Both `unit-focused` and `area-focused` tiers require area narrowing in `tests/app.js` / `tests/globals.js` before the first `:test-cover`.** The only difference between those tiers is whether `.only` is allowed and whether the full package-area spec loads — not whether the harness stays at full app load. +**Both `unit-focused` and `area-focused` tiers require area narrowing before the first `:test-cover`.** The only difference between those tiers is whether `.only` is allowed and whether the full package-area spec loads — not whether the harness stays at full app load. + +**Primary mechanism:** create a local **`tests/harness.overrides.js`** (gitignored) from [`tests/harness.overrides.example.js`](../../tests/harness.overrides.example.js). Committed `tests/app.js` and `tests/globals.js` stay at full harness — do **not** edit them for module narrowing or `RNFBDebug`. See [local harness overrides](#local-harness-overrides-harnessoverridesjs). | Mistake | Symptom | Gate impact | |---------|---------|-------------| -| Run `:test-cover` on committed full harness during `implementation` or `independent-review` | macOS/iOS/Android pass counts in the **hundreds or thousands** (all modules via `require.context`) | Run is **invalid** — does not close `implementation_gate` or `review_gate` | -| Narrow **only** `if (Platform.other)` or only set initial `platformSupportedModules` while **`if (!Platform.other)`** still pushes full native list | macOS ~700 firestore tests pass; iOS/Android logs show `database`, `crashlytics`, etc.; thousands of tests / Jet WS 1006 under load | Run is **invalid** on iOS/Android — see [two platform blocks](#tests-app-js-area-harness) | -| Correct pipeline area harness | ~**100** passing per platform for `Pipeline.e2e.js` only ([pipeline workflow](../packages/firestore/pipeline-implementation-workflow.md#pipeline-area-harness)) | Expected for pipeline area runs | +| Run `:test-cover` with no overrides (full harness) during `implementation` or `independent-review` | macOS/iOS/Android pass counts in the **hundreds or thousands** (all modules via `require.context`) | Run is **invalid** — does not close `implementation_gate` or `review_gate` | +| Edit only one platform block in `tests/app.js` (legacy pattern) while the other still pushes full list | macOS ~700 firestore tests pass; iOS/Android logs show `database`, `crashlytics`, etc. | Run is **invalid** on iOS/Android — use [overrides file](#local-harness-overrides-harnessoverridesjs) instead | +| Correct area harness via overrides | Pass counts match loaded module/spec scope ([sanity table](#sanity-check-by-platform)) | Expected | -**Apply locally before every `:test-cover` at unit-focused or area-focused tier** — even when git shows the full push harness. Revert `tests/app.js` / `tests/globals.js` after the run if the branch commit keeps full harness (typical until phase **R**). +**Apply locally before every `:test-cover` at unit-focused or area-focused tier** — even when git shows the full push harness. **Remove** `tests/harness.overrides.js` (or export `{}`) after the run when the branch keeps full harness (typical until phase **R**). Never commit `harness.overrides.js`. -**Validation report must state:** harness narrowed (yes/no), which module/spec loads, whether pass counts match area scope, and **which platforms ran** with exit codes. A green full-app run is not a substitute. +**Validation report must state:** harness narrowed (yes/no), override file used (yes/no), which module/spec loads, whether pass counts match area scope, and **which platforms ran** with exit codes. A green full-app run is not a substitute. @@ -267,12 +293,12 @@ Do not poll `pgrep`, process names, or `:8090` for *completion* ([above](#how-a- **Both `unit-focused` (implementation) and `area-focused` (baseline-capture, independent-review) require e2e on every platform where the changed module loads in the committed harness** — not a subset for convenience. -Determine required platforms from `tests/app.js` ([two platform blocks](#tests-app-js-area-harness) — use **committed** lists when deciding macOS vs native requirement, not a narrowed local harness): +Determine required platforms from committed [`tests/app.js`](../../tests/app.js) platform blocks (use **committed** lists when deciding macOS vs native requirement, not a narrowed local harness): | Platform class | When required | |----------------|---------------| -| **macOS** (`Platform.other`) | Module appears in the committed `if (Platform.other)` list (or your narrowed list includes it on macOS) | -| **iOS** and **Android** | Module appears in the committed `if (!Platform.other)` list (or your narrowed list includes it on native) | +| **macOS** (`Platform.other`) | Module appears in the committed `if (Platform.other)` list (or overrides `modules` includes it) | +| **iOS** and **Android** | Module appears in the committed `if (!Platform.other)` list (or overrides `modules` includes it) | **Area-focused (`baseline-capture`, `independent-review`) — closes `review_gate` / baseline only when:** @@ -295,8 +321,8 @@ See also: [coverage design § platform parity](coverage-design.md#coverage-expec **Checklist (copy before first run):** -1. [Both platform blocks](#tests-app-js-area-harness) narrowed or disabled — not just macOS / not just initial array. -2. `platformSupportedModules` lists only the package under change (e.g. `firestore` + `app`). +1. `tests/harness.overrides.js` exists with correct `modules` (almost always include `'app'`) and `RNFBDebug: true`. +2. Overrides `modules` lists only the package under change (e.g. `['app', 'firestore']`). 3. Spec load uses direct `require` of the area spec — not `require.context` for all packages — when sub-suite narrowing applies; otherwise full package `require.context` is OK when the module list is narrowed. 4. No `.only` when tier is **area-focused**; `.only` optional when tier is **unit-focused**. 5. Grep log: pass count consistent with area scope (~100 for pipeline-only, ~700 for full firestore package on macOS), not full app (~141+ macOS baseline with full load per [work queue](../packages/firestore/pipeline-coverage-work-queue.md)). @@ -305,8 +331,8 @@ See also: [coverage design § platform parity](coverage-design.md#coverage-expec For `implementation` work type — validation tier **unit-focused** ([change authoring workflow](change-authoring-workflow.md#implementation-inner-loop)): -1. [Pre-flight](#pre-flight-is-the-host-clear-to-start) — [prepare completion gate](#prepare-completion-gate-blocking) when `lib/**` changed, [host-clear probes](#host-clear-probes), services ready, **harness narrowed** (step 3), **`RNFBDebug = true`** locally; if probes fail, [pre-flight recovery](#pre-flight-recovery) first. -2. Edit e2e/spec; add `.only` if needed; never commit narrowing. +1. [Pre-flight](#pre-flight-is-the-host-clear-to-start) — [prepare completion gate](#prepare-completion-gate-blocking) when `lib/**` changed, [host-clear probes](#host-clear-probes), services ready, **harness overrides in place** (step 3), **`RNFBDebug: true`** via overrides; if probes fail, [pre-flight recovery](#pre-flight-recovery) first. +2. Edit e2e/spec; add `.only` if needed; never commit overrides or `.only`. 3. macOS first when TS-only: `yarn tests:macos:test-cover 2>&1 | tee /tmp/rnfb-e2e-macos.log` — wait for exit code ([stalled run](#stalled-run-detection) if markers stop). 4. If macOS green and native touched: `yarn tests::build && yarn tests::test-cover 2>&1 | tee /tmp/rnfb-e2e-.log`; one platform at a time. 5. Grep log tail → fix → repeat from step 1. @@ -323,17 +349,13 @@ Never overlap runs that use `:test-cover`. See [host rule](change-authoring-work | **Clean pre-flight every run** | [Pre-flight](#pre-flight-is-the-host-clear-to-start) — [host-clear probes](#host-clear-probes), services, harness tier | | **Phase J loop** | `implementation` (Jest + **unit-focused**) → `independent-review` (**area-focused**, frozen tree) → `commit` — [work queue protocol](../packages/firestore/pipeline-coverage-work-queue.md#phase-j-iteration-protocol-strict) | -| Validation tier | E2e scope | Narrowing allowed | Typical work type | -|-----------------|-----------|-------------------|-------------------| -| **Unit-focused** | Backpressure while product code is changing | `it.only` / `describe.only` / tight area narrowing in `tests/app.js` — **never commit** | `implementation` | -| **Area-focused** | Full loaded spec(s) for the package/area under change | **Area narrowing required** in `tests/app.js` / `tests/globals.js`; **no** `.only` | `baseline-capture`, `independent-review` | -| **Full** | All modules, all platforms | None — revert all narrowing | `pre-merge-validation` | +Tier scope table: [E2e validation tiers](#e2e-validation-tiers-unit-focused-area-focused-full). Each run owns its blocking `:test-cover` and returns summaries only. ### Interrupted run (abort, killed terminal, EADDRINUSE on :8090) -Run [pre-flight recovery](#pre-flight-recovery), confirm [host-clear probes](#host-clear-probes) pass, then rerun from repo root: `yarn tests::build && yarn tests::test-cover` (foreground; tee if logging). +Run [pre-flight recovery](#pre-flight-recovery), confirm [host-clear probes](#host-clear-probes) pass, then rerun from repo root: `yarn tests::build && yarn tests::test-cover` (foreground; tee if logging). Keep one `:test-cover` active at a time on a host. ### What not to do @@ -367,85 +389,63 @@ Full e2e loads every package. Narrow locally; **never commit** narrowing. | Kind | Mechanism | Scope | |------|-----------|--------| -| **Area narrowing** | `tests/app.js` + `tests/globals.js` | Which modules/specs load (e.g. trim `platformSupportedModules`; `require` one spec file instead of `require.context`) | +| **Area narrowing** | [`tests/harness.overrides.js`](#local-harness-overrides-harnessoverridesjs) | Which modules load (filter `platformSupportedModules` on all platforms) | +| **Sub-suite narrowing** | Temporary edit to `tests/app.js` (`require` one spec instead of `require.context`) | Which spec files load within a module — **unit-focused diagnosis only** | | **Single-test narrowing** | `it.only(...)` | One case in a loaded file | | **Single-suite narrowing** | `describe.only(...)` | One block in a loaded file | -**Area narrowing** = `tests/app.js` / `tests/globals.js` only; not test-runner `--grep` or packager `--target`. - - - -### Area harness in `tests/app.js` (two platform blocks) +**Area narrowing** = overrides file for modules + `RNFBDebug`; not test-runner `--grep` or packager `--target`. -**Canonical owner** for how to narrow the test app. Package workflows name **which module/spec**; this section defines **how** to edit `tests/app.js` so narrowing works on **every** platform. + -#### Why two blocks +### Local harness overrides (`harness.overrides.js`) -Committed `tests/app.js` builds `platformSupportedModules` from **two separate blocks** — only one runs per platform at bundle time: +**Canonical owner** for module narrowing and fail-fast debug. Package workflows name **which module/spec**; this section defines **how** to focus the harness without editing committed files. -| Block | Runs on | Committed role | -|-------|---------|----------------| -| `if (Platform.other) { … push … }` | **macOS / Other** | Full macOS module list | -| `if (!Platform.other) { … push … }` | **iOS / Android** | Full native module list | +#### Setup -Committed shape: `const platformSupportedModules = []`, then **both** blocks push their full lists. - -**Common agent mistake:** set a narrowed initial array (e.g. `['app', 'firestore']`) but leave **`if (!Platform.other)`** pushing every native module → macOS looks narrowed (~700 firestore tests) while iOS/Android still run the **full app** (thousands of tests, unrelated modules like `database` appear in logs). That invalidates [harness narrowing gate](#harness-narrowing-gate-blocking) on native platforms. +```bash +cp tests/harness.overrides.example.js tests/harness.overrides.js +``` -#### Apply narrowing (pick one pattern) +Edit `tests/harness.overrides.js` (gitignored — never commit). Shape: -**Pattern A — initial array + disable both blocks (recommended for one area on all platforms):** +| Field | Purpose | +|-------|---------| +| `modules?: string[]` | After each platform block builds its list, filter to only these module names (works on macOS **and** iOS/Android — no dual-block edits) | +| `RNFBDebug?: boolean` | `true` = verbose RNFB logging + disabled test retries ([§ fail-fast](#fail-fast-rnfbdebug-and-sub-suite-narrowing)) | -1. Replace `const platformSupportedModules = []` with the narrowed list (almost always include `'app'`). -2. Change **both** populate blocks to `if (false && Platform.other)` and `if (false && !Platform.other)` so neither block re-expands the list. -3. Add `// TEMP: area harness — never commit` above your edits. +**Example — app package only, debug on:** ```javascript -// TEMP: firestore area harness — never commit -const platformSupportedModules = ['app', 'firestore']; - -if (false && Platform.other) { - // committed macOS list — disabled while narrowed - platformSupportedModules.push('app'); - // … -} - -if (false && !Platform.other) { - // committed iOS/Android list — disabled while narrowed - platformSupportedModules.push('app'); - // … -} +module.exports = { + RNFBDebug: true, + modules: ['app'], +}; ``` -**Pattern B — trim inside each block (when macOS and native lists must differ):** +Omit a field or export `{}` to keep committed defaults for that field. -1. Keep `const platformSupportedModules = []`. -2. Edit **`if (Platform.other)`** pushes to only the modules needed on macOS. -3. Edit **`if (!Platform.other)`** pushes to only the modules needed on iOS/Android. -4. **Both blocks must be edited** before `:test-cover` when the work item requires native platforms — editing only one block is invalid. +#### How it works -Do **not** use `if (false && Platform.other)` on one block while leaving the other block active unless that asymmetry is intentional. +Committed [`tests/app.js`](../../tests/app.js) still builds full `platformSupportedModules` per platform block. If `harness.overrides.js` exists, [`tests/globals.js`](../../tests/globals.js) reads `RNFBDebug` and `tests/app.js` filters the module list **after** the platform block runs — so one overrides file applies on every platform. #### Spec loading (optional second narrowing) -Module specs load later in `loadTests()` via `platformSupportedModules.includes('')` — usually `require.context('../packages//e2e', …)`. +Module specs load in `loadTests()` via `platformSupportedModules.includes('')` — usually `require.context('../packages//e2e', …)`. | Goal | Change | |------|--------| -| Full package area | Leave `require.context` as-is; narrowing the module list is enough | -| Single spec file | Replace `require.context` for that module with `require('../packages//e2e/.e2e.js')` ([sub-suite](#fail-fast-rnfbdebug-and-sub-suite-narrowing) — unit-focused diagnosis only unless package workflow says otherwise) | - -#### Revert before `full` tier or `commit` +| Full package area | Overrides `modules` only — leave `require.context` as-is | +| Single spec file | **Temporarily** replace `require.context` for that module with `require('../packages//e2e/.e2e.js')` in `tests/app.js` — **never commit** ([sub-suite](#fail-fast-rnfbdebug-and-sub-suite-narrowing); unit-focused diagnosis only unless package workflow says otherwise) | -Restore committed harness on **both** blocks: +#### Revert before `full` tier or commit -1. `const platformSupportedModules = []` -2. `if (Platform.other) { … }` — full macOS list, **no** `false &&` -3. `if (!Platform.other) { … }` — full native list, **no** `false &&` -4. Restore any `require.context` edits; remove `// TEMP` comments -5. Revert `tests/globals.js` (`RNFBDebug = false`) per [before merge](#before-merge-pr-handoff) +1. Delete `tests/harness.overrides.js` or set `module.exports = {}`. +2. Revert any temporary `require.context` → single `require` edits in `tests/app.js`. +3. Remove all `.only` and native instrumentation. -**Pre-flight check:** grep `tests/app.js` — if either block is `if (Platform.other)` / `if (!Platform.other)` **without** `false &&` and pushes modules outside your area, native or macOS runs are not narrowed. +Do **not** revert durable product wiring in committed `tests/globals.js` (e.g. `NativeRNFBTurbo*` proxy routing — [NewArch-AD-13](../new-architecture/architecture-decisions.md#newarch-ad-13)). #### Sanity check by platform @@ -454,9 +454,9 @@ Restore committed harness on **both** blocks: | macOS | ~**700** passing | ~**100** passing | | iOS / Android | Same order of magnitude as macOS for the same spec scope | ~**100** passing | -Pass counts in the **thousands** or unrelated suites (`database`, `crashlytics`, …) in the log → re-apply [both blocks](#tests-app-js-area-harness) and re-run. +Pass counts in the **thousands** or unrelated suites (`database`, `crashlytics`, …) in the log → confirm overrides file exists with correct `modules` and re-run. -**Area example (Pattern A):** firestore-only `platformSupportedModules` + both blocks disabled; full firestore specs via existing `require.context` in `loadTests`. +**Area example:** `modules: ['app', 'firestore']` + full firestore specs via existing `require.context`. Package-specific spec names: [Firestore pipeline harness](../packages/firestore/pipeline-implementation-workflow.md#pipeline-area-harness), [namespace removal § module area harness](../namespace-api-removal-workflow.md#module-area-harness). @@ -464,7 +464,7 @@ Package-specific spec names: [Firestore pipeline harness](../packages/firestore/ ### Fail-fast (`RNFBDebug`) and sub-suite narrowing -**`RNFBDebug`** (`tests/globals.js`): for **`unit-focused`** and **`area-focused`** tiers, set `globalThis.RNFBDebug = true` **locally before the first `:test-cover`** — not optional. It prints per-case start/finish and **disables Mocha retry/backoff**, so failures surface immediately instead of burning time on retries. **Committed default must stay `false`.** Revert to `false` with other harness edits before **`full`** tier or commit ([§ before merge](#before-merge-pr-handoff)). +**`RNFBDebug`:** for **`unit-focused`** and **`area-focused`** tiers, set **`RNFBDebug: true`** in `tests/harness.overrides.js` **before the first `:test-cover`** — not optional. It prints per-case start/finish and **disables Mocha retry/backoff**, so failures surface immediately instead of burning time on retries. Committed `tests/globals.js` default stays `false`. Remove overrides (or set `RNFBDebug: false`) before **`full`** tier or commit ([§ before merge](#before-merge-pr-handoff)). | Kind | Mechanism | When | |------|-----------|------| @@ -483,9 +483,9 @@ All tiers use [canonical commands](#rules), [host rule](change-authoring-workflo | Validation tier | E2e scope | Narrowing allowed | Typical work type | |-----------------|-----------|-------------------|-------------------| -| **Unit-focused** | Fast loop while product code is changing | `it.only` / `describe.only` / tight area narrowing in `tests/app.js` — **never commit** | `implementation` | -| **Area-focused** | Full loaded spec(s) for the package/area under change | **Area narrowing required** in `tests/app.js` / `tests/globals.js`; **no** `.only` | `baseline-capture`, `independent-review` | -| **Full** | Unfocused — all modules, all platforms | None — revert all narrowing | `pre-merge-validation` | +| **Unit-focused** | Fast loop while product code is changing | `harness.overrides.js` + optional `.only` / sub-suite `require` in `tests/app.js` — **never commit** | `implementation` | +| **Area-focused** | Full loaded spec(s) for the package/area under change | **`harness.overrides.js`** required; **no** `.only` | `baseline-capture`, `independent-review` | +| **Full** | Unfocused — all modules, all platforms | Delete overrides file — committed full harness only | `pre-merge-validation` | **Universal rules:** @@ -502,14 +502,120 @@ See also: [unit-focused-tier loop](#unit-focused-tier-iteration-loop), [dispatch - **adb empty** — `adb kill-server && adb start-server && adb devices` - **Stale processes** — one Metro (`:8081`), one emulator set (`:8080`, `:9099`, `:9000`, `:4400`, …). Stray listener on `:8090` after a run → [pre-flight recovery](#pre-flight-recovery), then restart background services with [Rules §1–2](#rules) (`yarn tests:packager:jet`, `yarn tests:emulator:start`). +### Android emulator gray screen / Quick Boot (blocking) + +Detox's default emulator launch **restores the AVD Quick Boot snapshot** unless told otherwise. On `TestingAVD` that can leave the device **`offline` on a gray screen** — `adb devices` shows `emulator-XXXX offline` and Detox hangs on `wait-for-device`. + +**Root cause:** warm boot paths — Quick Boot snapshot restore on Detox launch, and (pre-fix) `adb reboot` on Jet retry — skip a full cold boot. + +**Fix (committed):** [`tests/.detoxrc.js`](../../tests/.detoxrc.js) sets `bootArgs: '-no-snapshot-load -no-snapshot-save'` on the `TestingAVD` device. Jet retry in [`tests/e2e/firebase.test.js`](../../tests/e2e/firebase.test.js) cold-restarts the same emulator (kill + relaunch with the same args) instead of `adb reboot`. + +**Detect:** + +```bash +adb devices -l # emulator-XXXX offline +pgrep -fl 'qemu-system.*TestingAVD' +rg 'SPAWN_CMD.*@TestingAVD' /tmp/rnfb-e2e-android.log # no -no-snapshot-load → stale runbook / config +``` + +**Recovery before `:test-cover`:** + +```bash +adb -s emulator-5554 emu kill 2>/dev/null || true +pkill -f 'qemu-system.*TestingAVD' 2>/dev/null || true +adb kill-server && adb start-server && adb devices # must be empty +# If gray screen persists after cold-boot config, wipe Quick Boot snapshots: +# rm -rf ~/.android/avd/TestingAVD.avd/snapshots +``` + +Then rerun [pre-flight](#pre-flight-is-the-host-clear-to-start) and `yarn tests:android:test-cover`. Cold boot adds ~30–60s to the first Android launch vs Quick Boot — expected. + + +Detox injects a prebuilt **`Detox.framework`** and XCUITest runner from a versioned cache under **`~/Library/Detox/ios/`** (hashed by Xcode version). iOS `:test-cover` / `:build` **fail before any test runs** if that cache is missing or stale (common after Xcode upgrade, first checkout, or a failed Detox postinstall). + +**Detect (from a failed iOS run log):** + +```bash +rg 'Detox\.framework could not be found' /tmp/rnfb-e2e-ios.log +``` + +Typical error (Detox prints the fix inline): + +```text +DetoxRuntimeError: .../Library/Detox/ios/framework//Detox.framework could not be found, +this means either you changed a version of Xcode or Detox postinstall script was unsuccessful. +To attempt a fix try running 'detox clean-framework-cache && detox build-framework-cache' +``` + +**Detect (proactive, before `:test-cover`):** + +```bash +test -d ~/Library/Detox/ios/framework/*/Detox.framework && echo "Detox framework cache: OK" || echo "Detox framework cache: MISSING" +``` + +**Fix (canonical — repo root):** + +```bash +yarn tests:ios:detox-framework-cache:rebuild +``` + +This runs Detox's `rebuild-framework-cache` (clean + build of both the injected Detox library and the XCUITest runner) from the `tests/` workspace. Expect ~10–30s on a warm machine; first build after Xcode change may take longer. + +**Verify cache present after rebuild:** + +```bash +ls ~/Library/Detox/ios/framework/*/Detox.framework +ls ~/Library/Detox/ios/xcuitest-runner/*/ +``` + +Then resume the normal iOS loop: [pre-flight](#pre-flight-is-the-host-clear-to-start) → `yarn tests:ios:build` (if native/JS changed) → `yarn tests:ios:test-cover`. + +CI restores the same tree from `~/Library/Detox/ios` keyed by Xcode version ([iOS workflow § Detox Framework Cache Restore](../ci-workflows/ios.md)). Local developers must rebuild when the cache is missing — it is not committed to git. + + + +### TurboModule migration — stale JS/native toolchain (blocking) + +During TurboModule work, three different **`undefined`** / load failures are easy to confuse — only the third row below is fixed by the [native registration checklist](../new-architecture/turbomodule-implementation-workflow.md#turbomodule-native-registration-checklist-blocking): + +| Symptom | Likely cause | Fix (escalate in order) | +|---------|----------------|-------------------------| +| `this.native.isFoo` is **`undefined`** in JS | Spec/native **constants** chain incomplete (`getConstants`, `getTypedExportedConstants`, iOS typed constants) | [Workflow checklist rows 1, 6, 8](../new-architecture/turbomodule-implementation-workflow.md#turbomodule-native-registration-checklist-blocking) | +| Android `Proxy target must be an Object` | JNI not linked / **stale autolinking cache** | Delete `tests/android/build/generated/autolinking/autolinking.json` + `*.sha`, `:build` | +| Metro redbox **`Requiring unknown module "undefined"`** at app load | **Stale Metro and/or partial native refresh** after codegen / `lib/**` / podspec changes | Steps below; then [full refresh](#turbomodule-full-toolchain-refresh) if needed | + +**Detect:** app redbox before `Jet client connected`; `curl` of `index.bundle` may still return 200 — that does **not** rule out staleness. + +**Routine fix** (try first after codegen, podspec, or `packages/*/lib/**` edits): + +1. [Prepare completion gate](#prepare-completion-gate-blocking) — `yarn lerna:prepare` exit 0. +2. Regenerate codegen if specs changed — [workflow § Running codegen](../new-architecture/turbomodule-implementation-workflow.md#running-codegen-canonical) (`cd tests`, `npx @react-native-community/cli codegen …`). +3. **`yarn tests::build`** (includes `pod install` on iOS when needed). +4. **`yarn tests:packager:jet-reset-cache`** (Metro was running during the edits). +5. [Pre-flight](#pre-flight-is-the-host-clear-to-start) → **`yarn tests::test-cover`**. + + + +**Full toolchain refresh** — when the routine fix still shows `Requiring unknown module "undefined"` or you wiped `node_modules` mid-migration: + +1. [Pre-flight recovery](#pre-flight-recovery) — stop Metro, Jet, Detox; shutdown booted simulators. +2. Remove **all** `node_modules` (repo root, `tests/`, and under `packages/*` if present). +3. **`yarn`** at repo root (wait for exit 0 — includes `lerna:prepare`). +4. Regenerate **all** touched packages' codegen from `tests/` ([workflow § Running codegen](../new-architecture/turbomodule-implementation-workflow.md#running-codegen-canonical)). +5. **`yarn tests:ios:pod:install`** when iOS native/codegen changed. +6. **`yarn tests::build`**. +7. **`yarn tests:packager:jet-reset-cache`** → pre-flight → `:test-cover`. + +Do **not** treat this redbox as a missing TurboModule registration until the refresh sequence has been run once on a clean tree. + ## Diagnosing hangs **Local stalls** — see [stalled run detection](#stalled-run-detection) first (Metro `/status`, `Jet client connected` markers). **Native / device logs** (remove instrumentation before merge): -- **macOS** — `log show --predicate 'process == "io.invertase.testing"' --last 10m --style compact`; bundle errors → [other.md](../ci-workflows/other.md) -- **iOS** — `xcrun simctl spawn booted log stream --level debug --style compact --predicate 'process == "testing"'`; silent hangs: `sample ` on `testing` +- **macOS** — `log show --predicate 'process == "io.invertase.testing"' --last 10m --style compact`; filter `com.facebook.react.log:javascript` for bundle errors. **Blank window / Jet never connects:** often `Native module NativeRNFBTurboApp is not registered` — see [TurboModule workflow § gotchas — macOS web registration](../new-architecture/turbomodule-implementation-workflow.md#gotchas). Other bundle errors → [other.md](../ci-workflows/other.md) +- **iOS** — `xcrun simctl spawn booted log stream --level debug --style compact --predicate 'process == "testing"'`; silent hangs: `sample ` on `testing`. Metro redbox **`Requiring unknown module "undefined"`** → [TurboModule stale toolchain](#turbomodule-stale-toolchain-blocking), not registration checklist alone. - **Android** — `adb logcat` (filter your tags) **Benign noise:** iOS Detox `EXEC_FAIL "xcrun simctl terminate … com.invertase.testing" … found nothing to terminate` — app wasn't running; ignore. @@ -520,9 +626,9 @@ See also: [unit-focused-tier loop](#unit-focused-tier-iteration-loop), [dispatch Pre-merge applies once to the branch commit stream before merge/push intended for merge, not after every commit. -1. Revert all narrowing ([full tier](#e2e-validation-tiers-unit-focused-area-focused-full)): restore `tests/app.js` (`platformSupportedModules` + `require.context`), default `RNFBDebug` in `tests/globals.js`, remove all `.only`, remove native instrumentation. +1. Remove all narrowing ([full tier](#e2e-validation-tiers-unit-focused-area-focused-full)): delete `tests/harness.overrides.js` (or `{}`), revert any temporary `require.context` → single `require` edits in `tests/app.js`, remove all `.only`, remove native instrumentation. Committed `tests/globals.js` / `tests/app.js` stay at full harness defaults — do not revert durable product wiring (e.g. `NativeRNFBTurbo*` proxy). 2. [Pre-flight](#pre-flight-is-the-host-clear-to-start) — [host-clear probes](#host-clear-probes) pass before each platform run. -3. Rebuild if needed (`tests::build`; `yarn lerna:prepare` for `lib/**`). +3. Rebuild when needed (`tests::build`; `yarn lerna:prepare` for `lib/**`). After TurboModule codegen or native bridge edits, see [TurboModule stale toolchain](#turbomodule-stale-toolchain-blocking). 4. Full unfocused suite with coverage on **iOS, Android, macOS** — one platform at a time, all green. ## Notes diff --git a/okf-bundle/testing/validation-checklist.md b/okf-bundle/testing/validation-checklist.md index c7d2a40002..a555a41708 100644 --- a/okf-bundle/testing/validation-checklist.md +++ b/okf-bundle/testing/validation-checklist.md @@ -20,8 +20,8 @@ Work types and tiers: [change authoring workflow](change-authoring-workflow.md). |-----------|--------|-----------| | `gap-analysis` | `compare:types`, config read, SDK declarations | n/a | | `baseline-capture` | Full loaded spec(s) + e2e on [**every required platform**](running-e2e.md#platform-coverage-gate-blocking) | **area-focused** tier; [area narrowing required](running-e2e.md#harness-narrowing-gate-blocking); no `.only`, no `:test-cover-reuse`; **no platform shortcuts** | -| `implementation` | Unit-focused Jest + e2e on required platforms when native/TS path needs it | **unit-focused** tier; [area narrowing + RNFBDebug=true locally](running-e2e.md#fail-fast-rnfbdebug-and-sub-suite-narrowing) before `:test-cover`; optional `.only` / sub-suite for diagnosis; [platform coverage gate](running-e2e.md#platform-coverage-gate-blocking) when module loads on iOS and Android | -| `independent-review` | Full checklist; e2e on **every required platform** (macOS / iOS / Android per harness) | **area-focused** tier; [platform coverage gate](running-e2e.md#platform-coverage-gate-blocking) — **no shortcuts**; [frozen tree](change-authoring-workflow.md#frozen-tree); never commit narrowing, sub-suite `.only`, or `RNFBDebug = true` ([fail-fast §](running-e2e.md#fail-fast-rnfbdebug-and-sub-suite-narrowing)) | +| `implementation` | Unit-focused Jest + e2e on **every required platform** when native bridge, iOS/Android embed, or macOS TS/runtime path changed — **Jest-only does not close `implementation_gate`** | **unit-focused** tier; [harness overrides + RNFBDebug](running-e2e.md#local-harness-overrides-harnessoverridesjs) before `:test-cover`; optional `.only` / sub-suite for diagnosis; [platform coverage gate](running-e2e.md#platform-coverage-gate-blocking) — no platform shortcuts | +| `independent-review` | Full checklist; e2e on **every required platform** (macOS / iOS / Android per harness) | **area-focused** tier; [platform coverage gate](running-e2e.md#platform-coverage-gate-blocking) — **no shortcuts**; [frozen tree](change-authoring-workflow.md#frozen-tree); never commit overrides, sub-suite `.only`, or temporary `tests/app.js` edits ([fail-fast §](running-e2e.md#fail-fast-rnfbdebug-and-sub-suite-narrowing)) | | `pre-merge-validation` | Full unfocused suite | **full** tier — [running-e2e § merge](running-e2e.md#before-merge-pr-handoff); entire PR branch, once | ## Prepare and compile @@ -121,6 +121,7 @@ Goal: each iteration improves OKF and removes conflicting guidance. - [ ] `yarn reference:api` - [ ] Redirect audit when TypeDoc config changed ([documentation site maintenance § redirect audit](../documentation-site-maintenance.md#redirect-audit-required-when-typedoc-config-changes)) - [ ] `yarn tests:jest` +- [ ] TurboModule wrapper contract ([NewArch-AD-17.1](../new-architecture/architecture-decisions.md#newarch-ad-171--jest-turbomodule-contract-test--accepted)) when `packages/app/lib/internal/registry/nativeModule.ts`, `nativeModuleAndroidIos.ts`, or TurboModule wrapper behavior changed: `yarn tests:jest -- packages/app/__tests__/nativeModuleContract.test.ts` - [ ] `yarn compare:types` (stale config entries removed) - [ ] `yarn lint:js` (+ markdown/spellcheck if docs; + platform lint if native) - [ ] E2e green on **every required platform** for the changed module ([platform coverage gate](running-e2e.md#platform-coverage-gate-blocking); [harness narrowing gate](running-e2e.md#harness-narrowing-gate-blocking); no `.only`; committed `RNFBDebug` remains `false`) diff --git a/package.json b/package.json index 9589baa225..9b04e4b721 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "test:functions:build": "cd .github/workflows/scripts/functions && yarn build", "compare:types": "cd .github/scripts/compare-types && yarn install && yarn compare", "codegen:all": "lerna run codegen", + "codegen:verify": "node ./scripts/codegen-verify.mjs && git diff --exit-code -- 'packages/*/android/**/generated/**' 'packages/*/ios/generated/**'", "lint": "yarn lint:js && yarn lint:android && yarn lint:ios:check", "lint:js": "eslint packages/* --max-warnings=0", "lint:android": "(find packages/*/android/src -name '*.java' -not -path '*/generated/*' -print0 | xargs -0 google-java-format --set-exit-if-changed --replace || (echo \"\n\nandroid formatting error - please re-run\n\n\" && exit 1)) && (git diff --exit-code packages/*/android/src || (echo \"\n\nandroid files changed from linting, please examine and commit result\n\n\" && exit 1))", @@ -54,6 +55,7 @@ "tests:android:test:jacoco-report": "cd tests/android && ./gradlew jacocoAndroidTestReport", "tests:ios:build": "cd tests && yarn detox build --configuration ios.sim.debug", "tests:ios:build:release": "cd tests && yarn detox build --configuration ios.sim.release", + "tests:ios:detox-framework-cache:rebuild": "cd tests && yarn detox rebuild-framework-cache", "tests:ios:manual": "cd tests && SIMCTL_CHILD_GULGeneratedClassDisposeDisabled=1 CC=clang CPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ yarn react-native run-ios", "tests:ios:test": "cd tests && SIMCTL_CHILD_GULGeneratedClassDisposeDisabled=1 yarn detox test --configuration ios.sim.debug --loglevel warn", "tests:ios:test:release": "cd tests && SIMCTL_CHILD_GULGeneratedClassDisposeDisabled=1 yarn detox test --configuration ios.sim.release --loglevel warn", @@ -84,7 +86,7 @@ "@firebase/rules-unit-testing": "^5.0.0", "@inquirer/prompts": "^8.4.2", "@octokit/core": "^7.0.6", - "@react-native-community/cli": "latest", + "@react-native-community/cli": "15.1.3", "@tsconfig/node-lts": "^24.0.0", "@types/react": "~19.2.14", "@types/react-native": "^0.73.0", @@ -121,6 +123,9 @@ }, "resolutions": { "@types/react": "~19.0.0", + "react-native": "0.78.3", + "@react-native/codegen": "0.78.3", + "@react-native-community/cli": "15.1.3", "mocha-remote-client@npm:^1.13.0": "patch:mocha-remote-client@npm%3A1.13.2#~/.yarn/patches/mocha-remote-client-npm-1.13.2-a2e7596aba.patch", "mocha-remote-server@npm:^1.13.0": "patch:mocha-remote-server@npm%3A1.13.2#~/.yarn/patches/mocha-remote-server-npm-1.13.2-619a29d2e3.patch" }, diff --git a/packages/analytics/RNFBAnalytics.podspec b/packages/analytics/RNFBAnalytics.podspec index 9a03bd0a3f..cf9126360d 100644 --- a/packages/analytics/RNFBAnalytics.podspec +++ b/packages/analytics/RNFBAnalytics.podspec @@ -28,15 +28,19 @@ Pod::Spec.new do |s| s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.private_header_files = "ios/**/*.h" + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.swift_version = '5.0' + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ios/generated/RNFBAnalyticsTurboModules\" \"$(PODS_TARGET_SRCROOT)/ios/generated\"", + } s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/analytics/__tests__/nativeModuleContract.test.ts b/packages/analytics/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..d4b415464c --- /dev/null +++ b/packages/analytics/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,84 @@ +import { describe, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'logEvent', + 'setAnalyticsCollectionEnabled', + 'setSessionTimeoutDuration', + 'getAppInstanceId', + 'getSessionId', + 'setUserId', + 'setUserProperty', + 'setUserProperties', + 'resetAnalyticsData', + 'setDefaultEventParameters', + 'setConsent', + 'logTransaction', + 'initiateOnDeviceConversionMeasurementWithEmailAddress', + 'initiateOnDeviceConversionMeasurementWithHashedEmailAddress', + 'initiateOnDeviceConversionMeasurementWithPhoneNumber', + 'initiateOnDeviceConversionMeasurementWithHashedPhoneNumber', +] as const; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper', function () { + assertTurboContract( + { + namespace: 'analytics', + nativeModuleName: 'NativeRNFBTurboAnalytics', + nativeEvents: false, + hasMultiAppSupport: false, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + specMethods: SPEC_METHODS, + createMock: method => + jest.fn(() => + method.startsWith('get') + ? Promise.resolve(method === 'getSessionId' ? 1 : 'id') + : undefined, + ), + }, + { + logEvent: wrapped => { + void wrapped.logEvent('test_event', { foo: 'bar' }); + }, + setAnalyticsCollectionEnabled: wrapped => { + void wrapped.setAnalyticsCollectionEnabled(true); + }, + setSessionTimeoutDuration: wrapped => { + void wrapped.setSessionTimeoutDuration(1800000); + }, + setUserId: wrapped => { + void wrapped.setUserId('user-1'); + }, + setUserProperty: wrapped => { + void wrapped.setUserProperty('role', 'admin'); + }, + setUserProperties: wrapped => { + void wrapped.setUserProperties({ role: 'admin' }); + }, + setDefaultEventParameters: wrapped => { + void wrapped.setDefaultEventParameters({ campaign: 'spring' }); + }, + setConsent: wrapped => { + void wrapped.setConsent({ analytics_storage: true }); + }, + logTransaction: wrapped => { + void wrapped.logTransaction('txn-1'); + }, + initiateOnDeviceConversionMeasurementWithEmailAddress: wrapped => { + void wrapped.initiateOnDeviceConversionMeasurementWithEmailAddress('value'); + }, + initiateOnDeviceConversionMeasurementWithHashedEmailAddress: wrapped => { + void wrapped.initiateOnDeviceConversionMeasurementWithHashedEmailAddress('value'); + }, + initiateOnDeviceConversionMeasurementWithPhoneNumber: wrapped => { + void wrapped.initiateOnDeviceConversionMeasurementWithPhoneNumber('value'); + }, + initiateOnDeviceConversionMeasurementWithHashedPhoneNumber: wrapped => { + void wrapped.initiateOnDeviceConversionMeasurementWithHashedPhoneNumber('value'); + }, + }, + ); + }); +}); diff --git a/packages/analytics/android/build.gradle b/packages/analytics/android/build.gradle index a9a82566fd..67e60b6e6c 100644 --- a/packages/analytics/android/build.gradle +++ b/packages/analytics/android/build.gradle @@ -156,6 +156,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -175,3 +176,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/analytics") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsModule.java b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/NativeRNFBTurboAnalytics.java similarity index 81% rename from packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsModule.java rename to packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/NativeRNFBTurboAnalytics.java index 9eb0d4008b..db5dc3d2d2 100644 --- a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsModule.java +++ b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/NativeRNFBTurboAnalytics.java @@ -17,22 +17,23 @@ * */ +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithExceptionMap; + import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import com.facebook.fbreact.specs.NativeRNFBTurboAnalyticsSpec; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.google.firebase.analytics.FirebaseAnalytics; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import java.util.ArrayList; import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; import javax.annotation.Nullable; -public class ReactNativeFirebaseAnalyticsModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboAnalytics extends NativeRNFBTurboAnalyticsSpec { private static final String SERVICE_NAME = "Analytics"; private static final long GET_SESSION_ID_TIMEOUT_MS = 60_000L; @@ -53,12 +54,12 @@ public class ReactNativeFirebaseAnalyticsModule extends ReactNativeFirebaseModul private final UniversalFirebaseAnalyticsModule module; - ReactNativeFirebaseAnalyticsModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboAnalytics(ReactApplicationContext reactContext) { + super(reactContext); module = new UniversalFirebaseAnalyticsModule(reactContext, SERVICE_NAME); } - @ReactMethod + @Override public void logEvent(String name, @Nullable ReadableMap params, Promise promise) { module .logEvent(name, toBundle(params)) @@ -72,8 +73,8 @@ public void logEvent(String name, @Nullable ReadableMap params, Promise promise) }); } - @ReactMethod - public void setAnalyticsCollectionEnabled(Boolean enabled, Promise promise) { + @Override + public void setAnalyticsCollectionEnabled(boolean enabled, Promise promise) { module .setAnalyticsCollectionEnabled(enabled) .addOnCompleteListener( @@ -86,7 +87,7 @@ public void setAnalyticsCollectionEnabled(Boolean enabled, Promise promise) { }); } - @ReactMethod + @Override public void setSessionTimeoutDuration(double milliseconds, Promise promise) { module .setSessionTimeoutDuration((long) milliseconds) @@ -100,7 +101,7 @@ public void setSessionTimeoutDuration(double milliseconds, Promise promise) { }); } - @ReactMethod + @Override public void getAppInstanceId(Promise promise) { module .getAppInstanceId() @@ -114,7 +115,7 @@ public void getAppInstanceId(Promise promise) { }); } - @ReactMethod + @Override public void getSessionId(Promise promise) { final AtomicBoolean completed = new AtomicBoolean(false); final Handler handler = new Handler(Looper.getMainLooper()); @@ -143,8 +144,8 @@ public void getSessionId(Promise promise) { }); } - @ReactMethod - public void setUserId(String id, Promise promise) { + @Override + public void setUserId(@Nullable String id, Promise promise) { module .setUserId(id) .addOnCompleteListener( @@ -157,8 +158,8 @@ public void setUserId(String id, Promise promise) { }); } - @ReactMethod - public void setUserProperty(String name, String value, Promise promise) { + @Override + public void setUserProperty(String name, @Nullable String value, Promise promise) { module .setUserProperty(name, value) .addOnCompleteListener( @@ -171,7 +172,7 @@ public void setUserProperty(String name, String value, Promise promise) { }); } - @ReactMethod + @Override public void setUserProperties(ReadableMap properties, Promise promise) { module .setUserProperties(Arguments.toBundle(properties)) @@ -185,7 +186,7 @@ public void setUserProperties(ReadableMap properties, Promise promise) { }); } - @ReactMethod + @Override public void resetAnalyticsData(Promise promise) { module .resetAnalyticsData() @@ -199,7 +200,7 @@ public void resetAnalyticsData(Promise promise) { }); } - @ReactMethod + @Override public void setDefaultEventParameters(@Nullable ReadableMap params, Promise promise) { module .setDefaultEventParameters(toBundle(params)) @@ -213,7 +214,7 @@ public void setDefaultEventParameters(@Nullable ReadableMap params, Promise prom }); } - @ReactMethod + @Override public void setConsent(ReadableMap consentSettings, Promise promise) { module .setConsent(Arguments.toBundle(consentSettings)) @@ -227,6 +228,43 @@ public void setConsent(ReadableMap consentSettings, Promise promise) { }); } + @Override + public void logTransaction(String transactionId, Promise promise) { + promise.reject("platform-unsupported", "logTransaction is only supported on iOS"); + } + + @Override + public void initiateOnDeviceConversionMeasurementWithEmailAddress( + String emailAddress, Promise promise) { + promise.reject( + "platform-unsupported", + "initiateOnDeviceConversionMeasurementWithEmailAddress is only supported on iOS"); + } + + @Override + public void initiateOnDeviceConversionMeasurementWithHashedEmailAddress( + String hashedEmailAddress, Promise promise) { + promise.reject( + "platform-unsupported", + "initiateOnDeviceConversionMeasurementWithHashedEmailAddress is only supported on iOS"); + } + + @Override + public void initiateOnDeviceConversionMeasurementWithPhoneNumber( + String phoneNumber, Promise promise) { + promise.reject( + "platform-unsupported", + "initiateOnDeviceConversionMeasurementWithPhoneNumber is only supported on iOS"); + } + + @Override + public void initiateOnDeviceConversionMeasurementWithHashedPhoneNumber( + String hashedPhoneNumber, Promise promise) { + promise.reject( + "platform-unsupported", + "initiateOnDeviceConversionMeasurementWithHashedPhoneNumber is only supported on iOS"); + } + private Bundle toBundle(ReadableMap readableMap) { Bundle bundle = Arguments.toBundle(readableMap); if (bundle == null) { diff --git a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsPackage.java b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsPackage.java index 45f62f84bd..d3d6dfc1e8 100644 --- a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsPackage.java +++ b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsPackage.java @@ -30,7 +30,7 @@ public class ReactNativeFirebaseAnalyticsPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseAnalyticsModule(reactContext)); + modules.add(new NativeRNFBTurboAnalytics(reactContext)); return modules; } diff --git a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAnalyticsSpec.java b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAnalyticsSpec.java new file mode 100644 index 0000000000..142f098f76 --- /dev/null +++ b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAnalyticsSpec.java @@ -0,0 +1,100 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboAnalyticsSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboAnalytics"; + + public NativeRNFBTurboAnalyticsSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void logEvent(String name, @Nullable ReadableMap params, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setAnalyticsCollectionEnabled(boolean enabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setSessionTimeoutDuration(double milliseconds, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getAppInstanceId(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getSessionId(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setUserId(@Nullable String id, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setUserProperty(String name, @Nullable String value, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setUserProperties(ReadableMap properties, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void resetAnalyticsData(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setDefaultEventParameters(@Nullable ReadableMap params, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setConsent(ReadableMap consentSettings, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void logTransaction(String transactionId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void initiateOnDeviceConversionMeasurementWithEmailAddress(String emailAddress, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void initiateOnDeviceConversionMeasurementWithHashedEmailAddress(String hashedEmailAddress, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void initiateOnDeviceConversionMeasurementWithPhoneNumber(String phoneNumber, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(String hashedPhoneNumber, Promise promise); +} diff --git a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/CMakeLists.txt b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..28d3811c0d --- /dev/null +++ b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBAnalyticsTurboModules/*.cpp) + +add_library( + react_codegen_RNFBAnalyticsTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBAnalyticsTurboModules PUBLIC . react/renderer/components/RNFBAnalyticsTurboModules) + +target_link_libraries( + react_codegen_RNFBAnalyticsTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBAnalyticsTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/RNFBAnalyticsTurboModules-generated.cpp b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/RNFBAnalyticsTurboModules-generated.cpp new file mode 100644 index 0000000000..11fffe1246 --- /dev/null +++ b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/RNFBAnalyticsTurboModules-generated.cpp @@ -0,0 +1,122 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBAnalyticsTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_logEvent(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "logEvent", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setAnalyticsCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setAnalyticsCollectionEnabled", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setSessionTimeoutDuration(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setSessionTimeoutDuration", "(DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_getAppInstanceId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getAppInstanceId", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_getSessionId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getSessionId", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setUserId", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserProperty(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setUserProperty", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserProperties(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setUserProperties", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_resetAnalyticsData(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "resetAnalyticsData", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setDefaultEventParameters(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setDefaultEventParameters", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setConsent(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setConsent", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_logTransaction(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "logTransaction", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithEmailAddress(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "initiateOnDeviceConversionMeasurementWithEmailAddress", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithHashedEmailAddress(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "initiateOnDeviceConversionMeasurementWithHashedEmailAddress", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "initiateOnDeviceConversionMeasurementWithPhoneNumber", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "initiateOnDeviceConversionMeasurementWithHashedPhoneNumber", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboAnalyticsSpecJSI::NativeRNFBTurboAnalyticsSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["logEvent"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_logEvent}; + methodMap_["setAnalyticsCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setAnalyticsCollectionEnabled}; + methodMap_["setSessionTimeoutDuration"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setSessionTimeoutDuration}; + methodMap_["getAppInstanceId"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_getAppInstanceId}; + methodMap_["getSessionId"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_getSessionId}; + methodMap_["setUserId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserId}; + methodMap_["setUserProperty"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserProperty}; + methodMap_["setUserProperties"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserProperties}; + methodMap_["resetAnalyticsData"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_resetAnalyticsData}; + methodMap_["setDefaultEventParameters"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setDefaultEventParameters}; + methodMap_["setConsent"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setConsent}; + methodMap_["logTransaction"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_logTransaction}; + methodMap_["initiateOnDeviceConversionMeasurementWithEmailAddress"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithEmailAddress}; + methodMap_["initiateOnDeviceConversionMeasurementWithHashedEmailAddress"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithHashedEmailAddress}; + methodMap_["initiateOnDeviceConversionMeasurementWithPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithPhoneNumber}; + methodMap_["initiateOnDeviceConversionMeasurementWithHashedPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithHashedPhoneNumber}; +} + +std::shared_ptr RNFBAnalyticsTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboAnalytics") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/RNFBAnalyticsTurboModules.h b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/RNFBAnalyticsTurboModules.h new file mode 100644 index 0000000000..97339ce51f --- /dev/null +++ b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/RNFBAnalyticsTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboAnalytics' + */ +class JSI_EXPORT NativeRNFBTurboAnalyticsSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboAnalyticsSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBAnalyticsTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/react/renderer/components/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModulesJSI-generated.cpp b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/react/renderer/components/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..8cc05618d3 --- /dev/null +++ b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/react/renderer/components/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModulesJSI-generated.cpp @@ -0,0 +1,131 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAnalyticsTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_logEvent(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->logEvent( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setAnalyticsCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAnalyticsCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setSessionTimeoutDuration(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setSessionTimeoutDuration( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_getAppInstanceId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getAppInstanceId( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_getSessionId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getSessionId( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setUserId( + rt, + count <= 0 || args[0].isNull() || args[0].isUndefined() ? std::nullopt : std::make_optional(args[0].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserProperty(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setUserProperty( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserProperties(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setUserProperties( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_resetAnalyticsData(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->resetAnalyticsData( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setDefaultEventParameters(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setDefaultEventParameters( + rt, + count <= 0 || args[0].isNull() || args[0].isUndefined() ? std::nullopt : std::make_optional(args[0].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setConsent(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setConsent( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_logTransaction(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->logTransaction( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithEmailAddress(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initiateOnDeviceConversionMeasurementWithEmailAddress( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithHashedEmailAddress(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initiateOnDeviceConversionMeasurementWithHashedEmailAddress( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initiateOnDeviceConversionMeasurementWithPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initiateOnDeviceConversionMeasurementWithHashedPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} + +NativeRNFBTurboAnalyticsCxxSpecJSI::NativeRNFBTurboAnalyticsCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboAnalytics", jsInvoker) { + methodMap_["logEvent"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_logEvent}; + methodMap_["setAnalyticsCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setAnalyticsCollectionEnabled}; + methodMap_["setSessionTimeoutDuration"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setSessionTimeoutDuration}; + methodMap_["getAppInstanceId"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_getAppInstanceId}; + methodMap_["getSessionId"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_getSessionId}; + methodMap_["setUserId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserId}; + methodMap_["setUserProperty"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserProperty}; + methodMap_["setUserProperties"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserProperties}; + methodMap_["resetAnalyticsData"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_resetAnalyticsData}; + methodMap_["setDefaultEventParameters"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setDefaultEventParameters}; + methodMap_["setConsent"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setConsent}; + methodMap_["logTransaction"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_logTransaction}; + methodMap_["initiateOnDeviceConversionMeasurementWithEmailAddress"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithEmailAddress}; + methodMap_["initiateOnDeviceConversionMeasurementWithHashedEmailAddress"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithHashedEmailAddress}; + methodMap_["initiateOnDeviceConversionMeasurementWithPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithPhoneNumber}; + methodMap_["initiateOnDeviceConversionMeasurementWithHashedPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithHashedPhoneNumber}; +} + + +} // namespace facebook::react diff --git a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/react/renderer/components/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModulesJSI.h b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/react/renderer/components/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModulesJSI.h new file mode 100644 index 0000000000..5bbe11afa6 --- /dev/null +++ b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/generated/jni/react/renderer/components/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModulesJSI.h @@ -0,0 +1,206 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboAnalyticsCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAnalyticsCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value logEvent(jsi::Runtime &rt, jsi::String name, std::optional params) = 0; + virtual jsi::Value setAnalyticsCollectionEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value setSessionTimeoutDuration(jsi::Runtime &rt, double milliseconds) = 0; + virtual jsi::Value getAppInstanceId(jsi::Runtime &rt) = 0; + virtual jsi::Value getSessionId(jsi::Runtime &rt) = 0; + virtual jsi::Value setUserId(jsi::Runtime &rt, std::optional id) = 0; + virtual jsi::Value setUserProperty(jsi::Runtime &rt, jsi::String name, std::optional value) = 0; + virtual jsi::Value setUserProperties(jsi::Runtime &rt, jsi::Object properties) = 0; + virtual jsi::Value resetAnalyticsData(jsi::Runtime &rt) = 0; + virtual jsi::Value setDefaultEventParameters(jsi::Runtime &rt, std::optional params) = 0; + virtual jsi::Value setConsent(jsi::Runtime &rt, jsi::Object consentSettings) = 0; + virtual jsi::Value logTransaction(jsi::Runtime &rt, jsi::String transactionId) = 0; + virtual jsi::Value initiateOnDeviceConversionMeasurementWithEmailAddress(jsi::Runtime &rt, jsi::String emailAddress) = 0; + virtual jsi::Value initiateOnDeviceConversionMeasurementWithHashedEmailAddress(jsi::Runtime &rt, jsi::String hashedEmailAddress) = 0; + virtual jsi::Value initiateOnDeviceConversionMeasurementWithPhoneNumber(jsi::Runtime &rt, jsi::String phoneNumber) = 0; + virtual jsi::Value initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(jsi::Runtime &rt, jsi::String hashedPhoneNumber) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAnalyticsCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboAnalytics"; + +protected: + NativeRNFBTurboAnalyticsCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAnalyticsCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAnalyticsCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAnalyticsCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value logEvent(jsi::Runtime &rt, jsi::String name, std::optional params) override { + static_assert( + bridging::getParameterCount(&T::logEvent) == 3, + "Expected logEvent(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::logEvent, jsInvoker_, instance_, std::move(name), std::move(params)); + } + jsi::Value setAnalyticsCollectionEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setAnalyticsCollectionEnabled) == 2, + "Expected setAnalyticsCollectionEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setAnalyticsCollectionEnabled, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value setSessionTimeoutDuration(jsi::Runtime &rt, double milliseconds) override { + static_assert( + bridging::getParameterCount(&T::setSessionTimeoutDuration) == 2, + "Expected setSessionTimeoutDuration(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setSessionTimeoutDuration, jsInvoker_, instance_, std::move(milliseconds)); + } + jsi::Value getAppInstanceId(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getAppInstanceId) == 1, + "Expected getAppInstanceId(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getAppInstanceId, jsInvoker_, instance_); + } + jsi::Value getSessionId(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getSessionId) == 1, + "Expected getSessionId(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getSessionId, jsInvoker_, instance_); + } + jsi::Value setUserId(jsi::Runtime &rt, std::optional id) override { + static_assert( + bridging::getParameterCount(&T::setUserId) == 2, + "Expected setUserId(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setUserId, jsInvoker_, instance_, std::move(id)); + } + jsi::Value setUserProperty(jsi::Runtime &rt, jsi::String name, std::optional value) override { + static_assert( + bridging::getParameterCount(&T::setUserProperty) == 3, + "Expected setUserProperty(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setUserProperty, jsInvoker_, instance_, std::move(name), std::move(value)); + } + jsi::Value setUserProperties(jsi::Runtime &rt, jsi::Object properties) override { + static_assert( + bridging::getParameterCount(&T::setUserProperties) == 2, + "Expected setUserProperties(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setUserProperties, jsInvoker_, instance_, std::move(properties)); + } + jsi::Value resetAnalyticsData(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::resetAnalyticsData) == 1, + "Expected resetAnalyticsData(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::resetAnalyticsData, jsInvoker_, instance_); + } + jsi::Value setDefaultEventParameters(jsi::Runtime &rt, std::optional params) override { + static_assert( + bridging::getParameterCount(&T::setDefaultEventParameters) == 2, + "Expected setDefaultEventParameters(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setDefaultEventParameters, jsInvoker_, instance_, std::move(params)); + } + jsi::Value setConsent(jsi::Runtime &rt, jsi::Object consentSettings) override { + static_assert( + bridging::getParameterCount(&T::setConsent) == 2, + "Expected setConsent(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setConsent, jsInvoker_, instance_, std::move(consentSettings)); + } + jsi::Value logTransaction(jsi::Runtime &rt, jsi::String transactionId) override { + static_assert( + bridging::getParameterCount(&T::logTransaction) == 2, + "Expected logTransaction(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::logTransaction, jsInvoker_, instance_, std::move(transactionId)); + } + jsi::Value initiateOnDeviceConversionMeasurementWithEmailAddress(jsi::Runtime &rt, jsi::String emailAddress) override { + static_assert( + bridging::getParameterCount(&T::initiateOnDeviceConversionMeasurementWithEmailAddress) == 2, + "Expected initiateOnDeviceConversionMeasurementWithEmailAddress(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::initiateOnDeviceConversionMeasurementWithEmailAddress, jsInvoker_, instance_, std::move(emailAddress)); + } + jsi::Value initiateOnDeviceConversionMeasurementWithHashedEmailAddress(jsi::Runtime &rt, jsi::String hashedEmailAddress) override { + static_assert( + bridging::getParameterCount(&T::initiateOnDeviceConversionMeasurementWithHashedEmailAddress) == 2, + "Expected initiateOnDeviceConversionMeasurementWithHashedEmailAddress(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::initiateOnDeviceConversionMeasurementWithHashedEmailAddress, jsInvoker_, instance_, std::move(hashedEmailAddress)); + } + jsi::Value initiateOnDeviceConversionMeasurementWithPhoneNumber(jsi::Runtime &rt, jsi::String phoneNumber) override { + static_assert( + bridging::getParameterCount(&T::initiateOnDeviceConversionMeasurementWithPhoneNumber) == 2, + "Expected initiateOnDeviceConversionMeasurementWithPhoneNumber(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::initiateOnDeviceConversionMeasurementWithPhoneNumber, jsInvoker_, instance_, std::move(phoneNumber)); + } + jsi::Value initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(jsi::Runtime &rt, jsi::String hashedPhoneNumber) override { + static_assert( + bridging::getParameterCount(&T::initiateOnDeviceConversionMeasurementWithHashedPhoneNumber) == 2, + "Expected initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::initiateOnDeviceConversionMeasurementWithHashedPhoneNumber, jsInvoker_, instance_, std::move(hashedPhoneNumber)); + } + + private: + friend class NativeRNFBTurboAnalyticsCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/analytics/ios/RNFBAnalytics.xcodeproj/project.pbxproj b/packages/analytics/ios/RNFBAnalytics.xcodeproj/project.pbxproj index 6240c8e723..b92ee070d8 100644 --- a/packages/analytics/ios/RNFBAnalytics.xcodeproj/project.pbxproj +++ b/packages/analytics/ios/RNFBAnalytics.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBAnalyticsModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAnalyticsModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBAnalyticsModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAnalyticsModule.mm */; }; 2744B99021F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98F21F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift */; }; /* End PBXBuildFile section */ @@ -26,7 +26,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBAnalytics.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBAnalytics.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBAnalyticsModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBAnalyticsModule.h; path = RNFBAnalytics/RNFBAnalyticsModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBAnalyticsModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBAnalyticsModule.m; path = RNFBAnalytics/RNFBAnalyticsModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBAnalyticsModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = RNFBAnalyticsModule.mm; path = RNFBAnalytics/RNFBAnalyticsModule.mm; sourceTree = SOURCE_ROOT; }; 2744B98F21F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = RNFBAnalyticsLogTransaction.swift; path = RNFBAnalytics/RNFBAnalyticsLogTransaction.swift; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ @@ -55,7 +55,7 @@ 2744B9A121F48736004F8E3F /* converters */, 2744B98C21F45C64004F8E3F /* common */, 2744B98421F45429004F8E3F /* RNFBAnalyticsModule.h */, - 2744B98521F45429004F8E3F /* RNFBAnalyticsModule.m */, + 2744B98521F45429004F8E3F /* RNFBAnalyticsModule.mm */, 2744B98F21F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift */, ); path = RNFBAnalytics; @@ -127,7 +127,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBAnalyticsModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBAnalyticsModule.mm in Sources */, 2744B99021F45429004F8E3F /* RNFBAnalyticsLogTransaction.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.h b/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.h index 8f0268e224..bdf97245f3 100644 --- a/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.h +++ b/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.h @@ -17,8 +17,8 @@ #import -#import +#import "RNFBAnalyticsTurboModules.h" -@interface RNFBAnalyticsModule : NSObject +@interface RNFBAnalyticsModule : NSObject @end diff --git a/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.m b/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.mm similarity index 75% rename from packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.m rename to packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.mm index 7ecfb5bbb6..f923eb3ba5 100644 --- a/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.m +++ b/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.mm @@ -54,20 +54,24 @@ @implementation RNFBAnalyticsModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboAnalytics) -- (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); ++ (BOOL)requiresMainQueueSetup { + return NO; +} + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); } #pragma mark - #pragma mark Firebase Analytics Methods -RCT_EXPORT_METHOD(logEvent - : (NSString *)name params - : (NSDictionary *)params resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)logEvent:(NSString *)name + params:(NSDictionary *)params + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { [FIRAnalytics logEventWithName:name parameters:[self cleanJavascriptParams:params]]; } @catch (NSException *exception) { @@ -77,10 +81,9 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(setAnalyticsCollectionEnabled - : (BOOL)enabled resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setAnalyticsCollectionEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { [FIRAnalytics setAnalyticsCollectionEnabled:enabled]; } @catch (NSException *exception) { @@ -90,10 +93,9 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(setUserId - : (NSString *)id resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setUserId:(NSString *)id + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { [FIRAnalytics setUserID:[self convertNSNullToNil:id]]; } @catch (NSException *exception) { @@ -102,11 +104,10 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(setUserProperty - : (NSString *)name value - : (NSString *)value resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setUserProperty:(NSString *)name + value:(NSString *)value + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { [FIRAnalytics setUserPropertyString:[self convertNSNullToNil:value] forName:name]; } @catch (NSException *exception) { @@ -115,10 +116,9 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(setUserProperties - : (NSDictionary *)properties resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setUserProperties:(NSDictionary *)properties + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { [properties enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { [FIRAnalytics setUserPropertyString:[self convertNSNullToNil:value] forName:key]; @@ -129,9 +129,7 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(resetAnalyticsData - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)resetAnalyticsData:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { @try { [FIRAnalytics resetAnalyticsData]; } @catch (NSException *exception) { @@ -140,23 +138,18 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(setSessionTimeoutDuration - : (double)milliseconds resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setSessionTimeoutDuration:(double)milliseconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [FIRAnalytics setSessionTimeoutInterval:milliseconds / 1000]; return resolve([NSNull null]); } -RCT_EXPORT_METHOD(getAppInstanceId - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)getAppInstanceId:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { return resolve([FIRAnalytics appInstanceID]); } -RCT_EXPORT_METHOD(getSessionId - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)getSessionId:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { __block BOOL completed = NO; const int64_t timeoutNs = (int64_t)(60 * NSEC_PER_SEC); @@ -193,10 +186,9 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(setDefaultEventParameters - : (NSDictionary *)params resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setDefaultEventParameters:(NSDictionary *)params + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { [FIRAnalytics setDefaultEventParameters:[self cleanJavascriptParams:params]]; } @catch (NSException *exception) { @@ -206,10 +198,9 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(initiateOnDeviceConversionMeasurementWithEmailAddress - : (NSString *)emailAddress resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(NSString *)emailAddress + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { [FIRAnalytics initiateOnDeviceConversionMeasurementWithEmailAddress:emailAddress]; } @catch (NSException *exception) { @@ -219,10 +210,9 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(initiateOnDeviceConversionMeasurementWithHashedEmailAddress - : (NSString *)hashedEmailAddress resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)initiateOnDeviceConversionMeasurementWithHashedEmailAddress:(NSString *)hashedEmailAddress + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { NSData *emailAddress = [self dataFromHexString:hashedEmailAddress]; [FIRAnalytics initiateOnDeviceConversionMeasurementWithHashedEmailAddress:emailAddress]; @@ -233,10 +223,9 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(initiateOnDeviceConversionMeasurementWithPhoneNumber - : (NSString *)phoneNumber resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)initiateOnDeviceConversionMeasurementWithPhoneNumber:(NSString *)phoneNumber + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { [FIRAnalytics initiateOnDeviceConversionMeasurementWithPhoneNumber:phoneNumber]; } @catch (NSException *exception) { @@ -246,10 +235,9 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(initiateOnDeviceConversionMeasurementWithHashedPhoneNumber - : (NSString *)hashedPhoneNumber resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:(NSString *)hashedPhoneNumber + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { NSData *phoneNumber = [self dataFromHexString:hashedPhoneNumber]; [FIRAnalytics initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:phoneNumber]; @@ -260,10 +248,9 @@ - (dispatch_queue_t)methodQueue { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(logTransaction - : (NSString *)transactionId resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)logTransaction:(NSString *)transactionId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { if (@available(iOS 15.0, macOS 12.0, *)) { RNFBAnalyticsLogTransaction *handler = [[RNFBAnalyticsLogTransaction alloc] init]; [handler logTransactionWithTransactionId:transactionId resolve:resolve reject:reject]; @@ -272,10 +259,9 @@ - (dispatch_queue_t)methodQueue { } } -RCT_EXPORT_METHOD(setConsent - : (NSDictionary *)consentSettings resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setConsent:(NSDictionary *)consentSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { BOOL analyticsStorage = [consentSettings[@"analytics_storage"] boolValue]; BOOL adStorage = [consentSettings[@"ad_storage"] boolValue]; diff --git a/packages/analytics/ios/generated/RCTAppDependencyProvider.h b/packages/analytics/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/analytics/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/analytics/ios/generated/RCTAppDependencyProvider.mm b/packages/analytics/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/analytics/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/analytics/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/analytics/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/analytics/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/analytics/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/analytics/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/analytics/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/analytics/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/analytics/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/analytics/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/analytics/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/analytics/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/analytics/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/analytics/ios/generated/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModules-generated.mm b/packages/analytics/ios/generated/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModules-generated.mm new file mode 100644 index 0000000000..bf8ed25104 --- /dev/null +++ b/packages/analytics/ios/generated/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModules-generated.mm @@ -0,0 +1,144 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBAnalyticsTurboModules.h" + + +@implementation NativeRNFBTurboAnalyticsSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_logEvent(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "logEvent", @selector(logEvent:params:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setAnalyticsCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setAnalyticsCollectionEnabled", @selector(setAnalyticsCollectionEnabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setSessionTimeoutDuration(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setSessionTimeoutDuration", @selector(setSessionTimeoutDuration:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_getAppInstanceId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getAppInstanceId", @selector(getAppInstanceId:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_getSessionId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getSessionId", @selector(getSessionId:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setUserId", @selector(setUserId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserProperty(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setUserProperty", @selector(setUserProperty:value:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserProperties(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setUserProperties", @selector(setUserProperties:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_resetAnalyticsData(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "resetAnalyticsData", @selector(resetAnalyticsData:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setDefaultEventParameters(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setDefaultEventParameters", @selector(setDefaultEventParameters:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setConsent(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setConsent", @selector(setConsent:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_logTransaction(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "logTransaction", @selector(logTransaction:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithEmailAddress(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "initiateOnDeviceConversionMeasurementWithEmailAddress", @selector(initiateOnDeviceConversionMeasurementWithEmailAddress:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithHashedEmailAddress(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "initiateOnDeviceConversionMeasurementWithHashedEmailAddress", @selector(initiateOnDeviceConversionMeasurementWithHashedEmailAddress:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "initiateOnDeviceConversionMeasurementWithPhoneNumber", @selector(initiateOnDeviceConversionMeasurementWithPhoneNumber:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "initiateOnDeviceConversionMeasurementWithHashedPhoneNumber", @selector(initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:resolve:reject:), args, count); + } + + NativeRNFBTurboAnalyticsSpecJSI::NativeRNFBTurboAnalyticsSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["logEvent"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_logEvent}; + + + methodMap_["setAnalyticsCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setAnalyticsCollectionEnabled}; + + + methodMap_["setSessionTimeoutDuration"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setSessionTimeoutDuration}; + + + methodMap_["getAppInstanceId"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_getAppInstanceId}; + + + methodMap_["getSessionId"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_getSessionId}; + + + methodMap_["setUserId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserId}; + + + methodMap_["setUserProperty"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserProperty}; + + + methodMap_["setUserProperties"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setUserProperties}; + + + methodMap_["resetAnalyticsData"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_resetAnalyticsData}; + + + methodMap_["setDefaultEventParameters"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setDefaultEventParameters}; + + + methodMap_["setConsent"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_setConsent}; + + + methodMap_["logTransaction"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_logTransaction}; + + + methodMap_["initiateOnDeviceConversionMeasurementWithEmailAddress"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithEmailAddress}; + + + methodMap_["initiateOnDeviceConversionMeasurementWithHashedEmailAddress"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithHashedEmailAddress}; + + + methodMap_["initiateOnDeviceConversionMeasurementWithPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithPhoneNumber}; + + + methodMap_["initiateOnDeviceConversionMeasurementWithHashedPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsSpecJSI_initiateOnDeviceConversionMeasurementWithHashedPhoneNumber}; + + } +} // namespace facebook::react diff --git a/packages/analytics/ios/generated/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModules.h b/packages/analytics/ios/generated/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModules.h new file mode 100644 index 0000000000..99a9515499 --- /dev/null +++ b/packages/analytics/ios/generated/RNFBAnalyticsTurboModules/RNFBAnalyticsTurboModules.h @@ -0,0 +1,108 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBAnalyticsTurboModules symbols +#ifndef RNFBAnalyticsTurboModules_H +#define RNFBAnalyticsTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@protocol NativeRNFBTurboAnalyticsSpec + +- (void)logEvent:(NSString *)name + params:(NSDictionary * _Nullable)params + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setAnalyticsCollectionEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setSessionTimeoutDuration:(double)milliseconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getAppInstanceId:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getSessionId:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setUserId:(NSString * _Nullable)id + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setUserProperty:(NSString *)name + value:(NSString * _Nullable)value + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setUserProperties:(NSDictionary *)properties + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)resetAnalyticsData:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setDefaultEventParameters:(NSDictionary * _Nullable)params + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setConsent:(NSDictionary *)consentSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)logTransaction:(NSString *)transactionId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)initiateOnDeviceConversionMeasurementWithEmailAddress:(NSString *)emailAddress + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)initiateOnDeviceConversionMeasurementWithHashedEmailAddress:(NSString *)hashedEmailAddress + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)initiateOnDeviceConversionMeasurementWithPhoneNumber:(NSString *)phoneNumber + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:(NSString *)hashedPhoneNumber + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end + +@interface NativeRNFBTurboAnalyticsSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboAnalytics' + */ + class JSI_EXPORT NativeRNFBTurboAnalyticsSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboAnalyticsSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +NS_ASSUME_NONNULL_END +#endif // RNFBAnalyticsTurboModules_H diff --git a/packages/analytics/ios/generated/RNFBAnalyticsTurboModulesJSI-generated.cpp b/packages/analytics/ios/generated/RNFBAnalyticsTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..8cc05618d3 --- /dev/null +++ b/packages/analytics/ios/generated/RNFBAnalyticsTurboModulesJSI-generated.cpp @@ -0,0 +1,131 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAnalyticsTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_logEvent(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->logEvent( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setAnalyticsCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAnalyticsCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setSessionTimeoutDuration(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setSessionTimeoutDuration( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_getAppInstanceId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getAppInstanceId( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_getSessionId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getSessionId( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setUserId( + rt, + count <= 0 || args[0].isNull() || args[0].isUndefined() ? std::nullopt : std::make_optional(args[0].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserProperty(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setUserProperty( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserProperties(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setUserProperties( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_resetAnalyticsData(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->resetAnalyticsData( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setDefaultEventParameters(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setDefaultEventParameters( + rt, + count <= 0 || args[0].isNull() || args[0].isUndefined() ? std::nullopt : std::make_optional(args[0].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setConsent(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setConsent( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_logTransaction(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->logTransaction( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithEmailAddress(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initiateOnDeviceConversionMeasurementWithEmailAddress( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithHashedEmailAddress(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initiateOnDeviceConversionMeasurementWithHashedEmailAddress( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initiateOnDeviceConversionMeasurementWithPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initiateOnDeviceConversionMeasurementWithHashedPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} + +NativeRNFBTurboAnalyticsCxxSpecJSI::NativeRNFBTurboAnalyticsCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboAnalytics", jsInvoker) { + methodMap_["logEvent"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_logEvent}; + methodMap_["setAnalyticsCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setAnalyticsCollectionEnabled}; + methodMap_["setSessionTimeoutDuration"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setSessionTimeoutDuration}; + methodMap_["getAppInstanceId"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_getAppInstanceId}; + methodMap_["getSessionId"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_getSessionId}; + methodMap_["setUserId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserId}; + methodMap_["setUserProperty"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserProperty}; + methodMap_["setUserProperties"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setUserProperties}; + methodMap_["resetAnalyticsData"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_resetAnalyticsData}; + methodMap_["setDefaultEventParameters"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setDefaultEventParameters}; + methodMap_["setConsent"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_setConsent}; + methodMap_["logTransaction"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_logTransaction}; + methodMap_["initiateOnDeviceConversionMeasurementWithEmailAddress"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithEmailAddress}; + methodMap_["initiateOnDeviceConversionMeasurementWithHashedEmailAddress"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithHashedEmailAddress}; + methodMap_["initiateOnDeviceConversionMeasurementWithPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithPhoneNumber}; + methodMap_["initiateOnDeviceConversionMeasurementWithHashedPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAnalyticsCxxSpecJSI_initiateOnDeviceConversionMeasurementWithHashedPhoneNumber}; +} + + +} // namespace facebook::react diff --git a/packages/analytics/ios/generated/RNFBAnalyticsTurboModulesJSI.h b/packages/analytics/ios/generated/RNFBAnalyticsTurboModulesJSI.h new file mode 100644 index 0000000000..5bbe11afa6 --- /dev/null +++ b/packages/analytics/ios/generated/RNFBAnalyticsTurboModulesJSI.h @@ -0,0 +1,206 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboAnalyticsCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAnalyticsCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value logEvent(jsi::Runtime &rt, jsi::String name, std::optional params) = 0; + virtual jsi::Value setAnalyticsCollectionEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value setSessionTimeoutDuration(jsi::Runtime &rt, double milliseconds) = 0; + virtual jsi::Value getAppInstanceId(jsi::Runtime &rt) = 0; + virtual jsi::Value getSessionId(jsi::Runtime &rt) = 0; + virtual jsi::Value setUserId(jsi::Runtime &rt, std::optional id) = 0; + virtual jsi::Value setUserProperty(jsi::Runtime &rt, jsi::String name, std::optional value) = 0; + virtual jsi::Value setUserProperties(jsi::Runtime &rt, jsi::Object properties) = 0; + virtual jsi::Value resetAnalyticsData(jsi::Runtime &rt) = 0; + virtual jsi::Value setDefaultEventParameters(jsi::Runtime &rt, std::optional params) = 0; + virtual jsi::Value setConsent(jsi::Runtime &rt, jsi::Object consentSettings) = 0; + virtual jsi::Value logTransaction(jsi::Runtime &rt, jsi::String transactionId) = 0; + virtual jsi::Value initiateOnDeviceConversionMeasurementWithEmailAddress(jsi::Runtime &rt, jsi::String emailAddress) = 0; + virtual jsi::Value initiateOnDeviceConversionMeasurementWithHashedEmailAddress(jsi::Runtime &rt, jsi::String hashedEmailAddress) = 0; + virtual jsi::Value initiateOnDeviceConversionMeasurementWithPhoneNumber(jsi::Runtime &rt, jsi::String phoneNumber) = 0; + virtual jsi::Value initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(jsi::Runtime &rt, jsi::String hashedPhoneNumber) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAnalyticsCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboAnalytics"; + +protected: + NativeRNFBTurboAnalyticsCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAnalyticsCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAnalyticsCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAnalyticsCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value logEvent(jsi::Runtime &rt, jsi::String name, std::optional params) override { + static_assert( + bridging::getParameterCount(&T::logEvent) == 3, + "Expected logEvent(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::logEvent, jsInvoker_, instance_, std::move(name), std::move(params)); + } + jsi::Value setAnalyticsCollectionEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setAnalyticsCollectionEnabled) == 2, + "Expected setAnalyticsCollectionEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setAnalyticsCollectionEnabled, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value setSessionTimeoutDuration(jsi::Runtime &rt, double milliseconds) override { + static_assert( + bridging::getParameterCount(&T::setSessionTimeoutDuration) == 2, + "Expected setSessionTimeoutDuration(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setSessionTimeoutDuration, jsInvoker_, instance_, std::move(milliseconds)); + } + jsi::Value getAppInstanceId(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getAppInstanceId) == 1, + "Expected getAppInstanceId(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getAppInstanceId, jsInvoker_, instance_); + } + jsi::Value getSessionId(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getSessionId) == 1, + "Expected getSessionId(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getSessionId, jsInvoker_, instance_); + } + jsi::Value setUserId(jsi::Runtime &rt, std::optional id) override { + static_assert( + bridging::getParameterCount(&T::setUserId) == 2, + "Expected setUserId(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setUserId, jsInvoker_, instance_, std::move(id)); + } + jsi::Value setUserProperty(jsi::Runtime &rt, jsi::String name, std::optional value) override { + static_assert( + bridging::getParameterCount(&T::setUserProperty) == 3, + "Expected setUserProperty(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setUserProperty, jsInvoker_, instance_, std::move(name), std::move(value)); + } + jsi::Value setUserProperties(jsi::Runtime &rt, jsi::Object properties) override { + static_assert( + bridging::getParameterCount(&T::setUserProperties) == 2, + "Expected setUserProperties(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setUserProperties, jsInvoker_, instance_, std::move(properties)); + } + jsi::Value resetAnalyticsData(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::resetAnalyticsData) == 1, + "Expected resetAnalyticsData(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::resetAnalyticsData, jsInvoker_, instance_); + } + jsi::Value setDefaultEventParameters(jsi::Runtime &rt, std::optional params) override { + static_assert( + bridging::getParameterCount(&T::setDefaultEventParameters) == 2, + "Expected setDefaultEventParameters(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setDefaultEventParameters, jsInvoker_, instance_, std::move(params)); + } + jsi::Value setConsent(jsi::Runtime &rt, jsi::Object consentSettings) override { + static_assert( + bridging::getParameterCount(&T::setConsent) == 2, + "Expected setConsent(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setConsent, jsInvoker_, instance_, std::move(consentSettings)); + } + jsi::Value logTransaction(jsi::Runtime &rt, jsi::String transactionId) override { + static_assert( + bridging::getParameterCount(&T::logTransaction) == 2, + "Expected logTransaction(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::logTransaction, jsInvoker_, instance_, std::move(transactionId)); + } + jsi::Value initiateOnDeviceConversionMeasurementWithEmailAddress(jsi::Runtime &rt, jsi::String emailAddress) override { + static_assert( + bridging::getParameterCount(&T::initiateOnDeviceConversionMeasurementWithEmailAddress) == 2, + "Expected initiateOnDeviceConversionMeasurementWithEmailAddress(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::initiateOnDeviceConversionMeasurementWithEmailAddress, jsInvoker_, instance_, std::move(emailAddress)); + } + jsi::Value initiateOnDeviceConversionMeasurementWithHashedEmailAddress(jsi::Runtime &rt, jsi::String hashedEmailAddress) override { + static_assert( + bridging::getParameterCount(&T::initiateOnDeviceConversionMeasurementWithHashedEmailAddress) == 2, + "Expected initiateOnDeviceConversionMeasurementWithHashedEmailAddress(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::initiateOnDeviceConversionMeasurementWithHashedEmailAddress, jsInvoker_, instance_, std::move(hashedEmailAddress)); + } + jsi::Value initiateOnDeviceConversionMeasurementWithPhoneNumber(jsi::Runtime &rt, jsi::String phoneNumber) override { + static_assert( + bridging::getParameterCount(&T::initiateOnDeviceConversionMeasurementWithPhoneNumber) == 2, + "Expected initiateOnDeviceConversionMeasurementWithPhoneNumber(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::initiateOnDeviceConversionMeasurementWithPhoneNumber, jsInvoker_, instance_, std::move(phoneNumber)); + } + jsi::Value initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(jsi::Runtime &rt, jsi::String hashedPhoneNumber) override { + static_assert( + bridging::getParameterCount(&T::initiateOnDeviceConversionMeasurementWithHashedPhoneNumber) == 2, + "Expected initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::initiateOnDeviceConversionMeasurementWithHashedPhoneNumber, jsInvoker_, instance_, std::move(hashedPhoneNumber)); + } + + private: + friend class NativeRNFBTurboAnalyticsCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/analytics/ios/generated/ReactAppDependencyProvider.podspec b/packages/analytics/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/analytics/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/analytics/lib/index.ts b/packages/analytics/lib/index.ts index dbb01d7554..053e650e47 100644 --- a/packages/analytics/lib/index.ts +++ b/packages/analytics/lib/index.ts @@ -172,7 +172,7 @@ const ReservedEventNames: readonly string[] = [ const namespace = 'analytics'; -const nativeModuleName = 'RNFBAnalyticsModule'; +const nativeModuleName = 'NativeRNFBTurboAnalytics' as const; class FirebaseAnalyticsModule extends FirebaseModule { logEvent( @@ -927,6 +927,7 @@ const config: ModuleConfig = { nativeEvents: false, hasMultiAppSupport: false, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; export const SDK_VERSION: string = version; @@ -1298,9 +1299,13 @@ export function logEvent( return analytics.logEvent(name, params, options); } -/** Logs verified in-app purchase events in Google Analytics for Firebase - * after a purchase is successful. - * Modular API only; iOS only (StoreKit 2). Throws on Android and web before reaching native. +/** + * Logs verified in-app purchase events in Google Analytics for Firebase after a purchase is + * successful. + * + * @remarks iOS only (StoreKit 2). On Android and web the promise **rejects** before reaching + * native — unlike `initiateOnDeviceConversionMeasurement*`, which resolve as a no-op on + * non-iOS platforms. */ export function logTransaction(analytics: Analytics, transaction_id: string): Promise { if (Platform.OS !== 'ios') { @@ -1800,6 +1805,10 @@ export function setDefaultEventParameters( /** * start privacy-sensitive on-device conversion management. * This is iOS-only. + * + * @remarks On Android and web the promise resolves without calling native (no-op). Unlike + * `logTransaction`, non-iOS platforms do not reject. + * * @param {FirebaseAnalytics} analytics - Analytics instance. * @param {string} emailAddress - Email address, properly formatted complete with domain name e.g, 'user@example.com'. * @returns {Promise} @@ -1817,6 +1826,9 @@ export function initiateOnDeviceConversionMeasurementWithEmailAddress( * This is a no-op if you do not include '$RNFirebaseAnalyticsGoogleAppMeasurementOnDeviceConversion = true' in your Podfile * {@link https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3#use-hashed-credentials} * + * @remarks On Android and web the promise resolves without calling native (no-op). Unlike + * `logTransaction`, non-iOS platforms do not reject. + * * @param analytics Analytics instance. * @param hashedEmailAddress sha256-hashed of normalized email address, properly formatted complete with domain name e.g, 'user@example.com' */ @@ -1830,6 +1842,10 @@ export function initiateOnDeviceConversionMeasurementWithHashedEmailAddress( /** * start privacy-sensitive on-device conversion management. * This is iOS-only. + * + * @remarks On Android and web the promise resolves without calling native (no-op). Unlike + * `logTransaction`, non-iOS platforms do not reject. + * * @param {FirebaseAnalytics} analytics - Analytics instance. * @param {string} phoneNumber - Phone number in E.164 format - that is a leading + sign, then up to 15 digits, no dashes or spaces. * @returns {Promise} @@ -1847,6 +1863,9 @@ export function initiateOnDeviceConversionMeasurementWithPhoneNumber( * This is a no-op if you do not include '$RNFirebaseAnalyticsGoogleAppMeasurementOnDeviceConversion = true' in your Podfile * {@link https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3#use-hashed-credentials} * + * @remarks On Android and web the promise resolves without calling native (no-op). Unlike + * `logTransaction`, non-iOS platforms do not reject. + * * @param analytics Analytics instance. * @param hashedPhoneNumber sha256-hashed of normalized phone number in E.164 format - that is a leading + sign, then up to 15 digits, no dashes or spaces. */ diff --git a/packages/analytics/lib/types/internal.ts b/packages/analytics/lib/types/internal.ts index ab23597402..c25401618d 100644 --- a/packages/analytics/lib/types/internal.ts +++ b/packages/analytics/lib/types/internal.ts @@ -52,7 +52,7 @@ export interface RNFBAnalyticsModule { declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBAnalyticsModule: RNFBAnalyticsModule; + NativeRNFBTurboAnalytics: RNFBAnalyticsModule; } } diff --git a/packages/analytics/package.json b/packages/analytics/package.json index d4a04d0706..b96e75ded3 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -5,13 +5,30 @@ "description": "React Native Firebase - The analytics module provides out of the box support with Google Analytics for Firebase. Integration with the Android & iOS allows for in-depth analytical insight reporting, such as device information, location, user actions and more.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBAnalyticsTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.analytics" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboAnalytics": "RNFBAnalyticsModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "build:plugin": "rimraf plugin/build && tsc --build plugin", "lint:plugin": "eslint \"plugin/src/**/*.{ts,js}\"", "compile": "bob build", - "prepare": "yarn run build && yarn run build:plugin && yarn compile" + "prepare": "yarn run build && yarn run build:plugin && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/reactnative/java/io/invertase/firebase/analytics/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/analytics/react-native.config.js b/packages/analytics/react-native.config.js new file mode 100644 index 0000000000..319861fdc7 --- /dev/null +++ b/packages/analytics/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/reactnative/java/io/invertase/firebase/analytics/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/analytics/specs/NativeRNFBTurboAnalytics.ts b/packages/analytics/specs/NativeRNFBTurboAnalytics.ts new file mode 100644 index 0000000000..7ecdc57f7b --- /dev/null +++ b/packages/analytics/specs/NativeRNFBTurboAnalytics.ts @@ -0,0 +1,33 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + logEvent(name: string, params?: Object | null): Promise; + setAnalyticsCollectionEnabled(enabled: boolean): Promise; + setSessionTimeoutDuration(milliseconds: number): Promise; + getAppInstanceId(): Promise; + getSessionId(): Promise; + setUserId(id: string | null): Promise; + setUserProperty(name: string, value: string | null): Promise; + setUserProperties(properties: Object): Promise; + resetAnalyticsData(): Promise; + setDefaultEventParameters(params?: Object | null): Promise; + setConsent(consentSettings: Object): Promise; + /** iOS only (StoreKit 2). Android rejects at runtime. */ + logTransaction(transactionId: string): Promise; + /** iOS only. Android rejects at runtime. */ + initiateOnDeviceConversionMeasurementWithEmailAddress(emailAddress: string): Promise; + /** iOS only. Android rejects at runtime. */ + initiateOnDeviceConversionMeasurementWithHashedEmailAddress( + hashedEmailAddress: string, + ): Promise; + /** iOS only. Android rejects at runtime. */ + initiateOnDeviceConversionMeasurementWithPhoneNumber(phoneNumber: string): Promise; + /** iOS only. Android rejects at runtime. */ + initiateOnDeviceConversionMeasurementWithHashedPhoneNumber( + hashedPhoneNumber: string, + ): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboAnalytics'); diff --git a/packages/app-check/RNFBAppCheck.podspec b/packages/app-check/RNFBAppCheck.podspec index d1d65d0636..261264aca2 100644 --- a/packages/app-check/RNFBAppCheck.podspec +++ b/packages/app-check/RNFBAppCheck.podspec @@ -27,15 +27,15 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/app-check/__tests__/nativeModuleContract.test.ts b/packages/app-check/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..d91318aa55 --- /dev/null +++ b/packages/app-check/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,47 @@ +import { describe, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'activate', + 'configureProvider', + 'setTokenAutoRefreshEnabled', + 'isTokenAutoRefreshEnabled', + 'getToken', + 'getLimitedUseToken', + 'addAppCheckListener', + 'removeAppCheckListener', +] as const; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper', function () { + assertTurboContract( + { + namespace: 'appCheck', + nativeModuleName: 'NativeRNFBTurboAppCheck', + nativeEvents: ['appCheck_token_changed'], + hasMultiAppSupport: true, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + specMethods: SPEC_METHODS, + createMock: method => + jest.fn(() => + method.startsWith('get') ? Promise.resolve({ token: method }) : undefined, + ), + }, + { + setTokenAutoRefreshEnabled: wrapped => { + wrapped.setTokenAutoRefreshEnabled(true); + }, + getToken: wrapped => { + void wrapped.getToken(false); + }, + configureProvider: wrapped => { + void wrapped.configureProvider('debug', 'token'); + }, + activate: wrapped => { + void wrapped.activate('siteKey', true); + }, + }, + ); + }); +}); diff --git a/packages/app-check/android/build.gradle b/packages/app-check/android/build.gradle index e6f639bb2d..46d6851a4f 100644 --- a/packages/app-check/android/build.gradle +++ b/packages/app-check/android/build.gradle @@ -88,6 +88,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -108,3 +109,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency('api') + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/app-check") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/ReactNativeFirebaseAppCheckModule.java b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/NativeRNFBTurboAppCheck.java similarity index 85% rename from packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/ReactNativeFirebaseAppCheckModule.java rename to packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/NativeRNFBTurboAppCheck.java index 3c9b61dff4..bfe27a938b 100644 --- a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/ReactNativeFirebaseAppCheckModule.java +++ b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/NativeRNFBTurboAppCheck.java @@ -17,10 +17,16 @@ * */ +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage; + import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.util.Log; -import com.facebook.react.bridge.*; +import com.facebook.fbreact.specs.NativeRNFBTurboAppCheckSpec; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.WritableMap; import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; import com.google.firebase.appcheck.FirebaseAppCheck; @@ -28,13 +34,14 @@ import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter; import io.invertase.firebase.common.ReactNativeFirebaseJSON; import io.invertase.firebase.common.ReactNativeFirebaseMeta; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import io.invertase.firebase.common.ReactNativeFirebasePreferences; +import io.invertase.firebase.common.TaskExecutorService; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.concurrent.ExecutorService; -public class ReactNativeFirebaseAppCheckModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboAppCheck extends NativeRNFBTurboAppCheckSpec { private static final String TAG = "AppCheck"; private static final String LOGTAG = "RNFBAppCheck"; private static final String KEY_APPCHECK_TOKEN_REFRESH_ENABLED = "app_check_token_auto_refresh"; @@ -42,7 +49,8 @@ public class ReactNativeFirebaseAppCheckModule extends ReactNativeFirebaseModule private static HashMap mAppCheckListeners = new HashMap<>(); - ReactNativeFirebaseAppCheckProviderFactory providerFactory = + private final TaskExecutorService executorService; + private final ReactNativeFirebaseAppCheckProviderFactory providerFactory = new ReactNativeFirebaseAppCheckProviderFactory(); static boolean isAppCheckTokenRefreshEnabled() { @@ -78,27 +86,31 @@ static boolean isAppCheckTokenRefreshEnabled() { return enabled; } + public NativeRNFBTurboAppCheck(ReactApplicationContext reactContext) { + super(reactContext); + this.executorService = new TaskExecutorService("UniversalAppCheckModule"); + + FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance(); + firebaseAppCheck.setTokenAutoRefreshEnabled(isAppCheckTokenRefreshEnabled()); + } + + private ExecutorService getExecutor() { + return executorService.getExecutor(); + } + private boolean isAppDebuggable() throws Exception { boolean isDebuggable = false; - PackageManager pm = getContext().getPackageManager(); + PackageManager pm = getReactApplicationContext().getPackageManager(); if (pm != null) { isDebuggable = (0 - != (pm.getApplicationInfo(getContext().getPackageName(), 0).flags + != (pm.getApplicationInfo(getReactApplicationContext().getPackageName(), 0).flags & ApplicationInfo.FLAG_DEBUGGABLE)); } Log.d(LOGTAG, "debuggable status? " + isDebuggable); return isDebuggable; } - ReactNativeFirebaseAppCheckModule(ReactApplicationContext reactContext) { - super(reactContext, TAG); - - // Our default token refresh config comes from config files, set it - FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance(); - firebaseAppCheck.setTokenAutoRefreshEnabled(isAppCheckTokenRefreshEnabled()); - } - @Override public void invalidate() { super.invalidate(); @@ -116,9 +128,11 @@ public void invalidate() { firebaseAppCheck.removeAppCheckListener(mAppCheckListener); appCheckListenerIterator.remove(); } + + executorService.shutdown(); } - @ReactMethod + @Override public void configureProvider( String appName, String providerName, String debugToken, Promise promise) { Log.d( @@ -138,16 +152,14 @@ public void configureProvider( } } - @ReactMethod + @Override public void activate( String appName, String siteKeyProvider, boolean isTokenAutoRefreshEnabled, Promise promise) { try { - FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance(FirebaseApp.getInstance(appName)); firebaseAppCheck.setTokenAutoRefreshEnabled(isTokenAutoRefreshEnabled); - // Configure our new proxy factory in a backwards-compatible way for old API if (isAppDebuggable()) { Log.d(LOGTAG, "app is debuggable, configuring AppCheck for testing mode"); if (BuildConfig.FIREBASE_APP_CHECK_DEBUG_TOKEN != "null") { @@ -172,22 +184,26 @@ public void activate( } } - @ReactMethod + @Override + public void isTokenAutoRefreshEnabled(String appName, Promise promise) { + promise.reject("platform-unsupported", "isTokenAutoRefreshEnabled is only supported on iOS"); + } + + @Override public void setTokenAutoRefreshEnabled(String appName, boolean isTokenAutoRefreshEnabled) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAppCheck.getInstance(firebaseApp).setTokenAutoRefreshEnabled(isTokenAutoRefreshEnabled); } - @ReactMethod + @Override public void getToken(String appName, boolean forceRefresh, Promise promise) { Log.d(LOGTAG, "getToken appName/forceRefresh: " + appName + "/" + forceRefresh); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); Tasks.call( getExecutor(), - () -> { - return Tasks.await( - FirebaseAppCheck.getInstance(firebaseApp).getAppCheckToken(forceRefresh)); - }) + () -> + Tasks.await( + FirebaseAppCheck.getInstance(firebaseApp).getAppCheckToken(forceRefresh))) .addOnCompleteListener( getExecutor(), (task) -> { @@ -206,17 +222,15 @@ public void getToken(String appName, boolean forceRefresh, Promise promise) { }); } - @ReactMethod + @Override public void getLimitedUseToken(String appName, Promise promise) { Log.d(LOGTAG, "getLimitedUseToken appName: " + appName); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); Tasks.call( getExecutor(), - () -> { - return Tasks.await( - FirebaseAppCheck.getInstance(firebaseApp).getLimitedUseAppCheckToken()); - }) + () -> + Tasks.await(FirebaseAppCheck.getInstance(firebaseApp).getLimitedUseAppCheckToken())) .addOnCompleteListener( getExecutor(), (task) -> { @@ -235,8 +249,7 @@ public void getLimitedUseToken(String appName, Promise promise) { }); } - /** Add a new token change listener - if one doesn't exist already */ - @ReactMethod + @Override public void addAppCheckListener(final String appName) { Log.d(TAG, "addAppCheckListener " + appName); @@ -247,7 +260,7 @@ public void addAppCheckListener(final String appName) { FirebaseAppCheck.AppCheckListener newAppCheckListener = appCheckToken -> { WritableMap eventBody = Arguments.createMap(); - eventBody.putString("appName", appName); // for js side distribution + eventBody.putString("appName", appName); eventBody.putString("token", appCheckToken.getToken()); eventBody.putDouble("expireTimeMillis", appCheckToken.getExpireTimeMillis()); @@ -263,8 +276,7 @@ public void addAppCheckListener(final String appName) { } } - /** Removes the current token change listener */ - @ReactMethod + @Override public void removeAppCheckListener(String appName) { Log.d(TAG, "removeAppCheckListener " + appName); diff --git a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/ReactNativeFirebaseAppCheckPackage.java b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/ReactNativeFirebaseAppCheckPackage.java index e3f5ce99dc..6e44e26a0b 100644 --- a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/ReactNativeFirebaseAppCheckPackage.java +++ b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/ReactNativeFirebaseAppCheckPackage.java @@ -30,7 +30,7 @@ public class ReactNativeFirebaseAppCheckPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseAppCheckModule(reactContext)); + modules.add(new NativeRNFBTurboAppCheck(reactContext)); return modules; } diff --git a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAppCheckSpec.java b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAppCheckSpec.java new file mode 100644 index 0000000000..3e4cfb33bd --- /dev/null +++ b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAppCheckSpec.java @@ -0,0 +1,67 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboAppCheckSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboAppCheck"; + + public NativeRNFBTurboAppCheckSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void activate(String appName, String siteKeyProvider, boolean isTokenAutoRefreshEnabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void configureProvider(String appName, String providerName, @Nullable String debugToken, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setTokenAutoRefreshEnabled(String appName, boolean isTokenAutoRefreshEnabled); + + @ReactMethod + @DoNotStrip + public abstract void isTokenAutoRefreshEnabled(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getToken(String appName, boolean forceRefresh, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getLimitedUseToken(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void addAppCheckListener(String appName); + + @ReactMethod + @DoNotStrip + public abstract void removeAppCheckListener(String appName); +} diff --git a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/CMakeLists.txt b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..e7e44d4ab2 --- /dev/null +++ b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBAppCheckTurboModules/*.cpp) + +add_library( + react_codegen_RNFBAppCheckTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBAppCheckTurboModules PUBLIC . react/renderer/components/RNFBAppCheckTurboModules) + +target_link_libraries( + react_codegen_RNFBAppCheckTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBAppCheckTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/RNFBAppCheckTurboModules-generated.cpp b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/RNFBAppCheckTurboModules-generated.cpp new file mode 100644 index 0000000000..5400ea8155 --- /dev/null +++ b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/RNFBAppCheckTurboModules-generated.cpp @@ -0,0 +1,74 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBAppCheckTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_activate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "activate", "(Ljava/lang/String;Ljava/lang/String;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_configureProvider(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "configureProvider", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_setTokenAutoRefreshEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "setTokenAutoRefreshEnabled", "(Ljava/lang/String;Z)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_isTokenAutoRefreshEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "isTokenAutoRefreshEnabled", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_getToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getToken", "(Ljava/lang/String;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_getLimitedUseToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getLimitedUseToken", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_addAppCheckListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "addAppCheckListener", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_removeAppCheckListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeAppCheckListener", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboAppCheckSpecJSI::NativeRNFBTurboAppCheckSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["activate"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_activate}; + methodMap_["configureProvider"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_configureProvider}; + methodMap_["setTokenAutoRefreshEnabled"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_setTokenAutoRefreshEnabled}; + methodMap_["isTokenAutoRefreshEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_isTokenAutoRefreshEnabled}; + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_getToken}; + methodMap_["getLimitedUseToken"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_getLimitedUseToken}; + methodMap_["addAppCheckListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_addAppCheckListener}; + methodMap_["removeAppCheckListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_removeAppCheckListener}; +} + +std::shared_ptr RNFBAppCheckTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboAppCheck") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/RNFBAppCheckTurboModules.h b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/RNFBAppCheckTurboModules.h new file mode 100644 index 0000000000..691baaee04 --- /dev/null +++ b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/RNFBAppCheckTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboAppCheck' + */ +class JSI_EXPORT NativeRNFBTurboAppCheckSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboAppCheckSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBAppCheckTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/react/renderer/components/RNFBAppCheckTurboModules/RNFBAppCheckTurboModulesJSI-generated.cpp b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/react/renderer/components/RNFBAppCheckTurboModules/RNFBAppCheckTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..e4b02313ca --- /dev/null +++ b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/react/renderer/components/RNFBAppCheckTurboModules/RNFBAppCheckTurboModulesJSI-generated.cpp @@ -0,0 +1,85 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAppCheckTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_activate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->activate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_configureProvider(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->configureProvider( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 || args[2].isNull() || args[2].isUndefined() ? std::nullopt : std::make_optional(args[2].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_setTokenAutoRefreshEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setTokenAutoRefreshEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_isTokenAutoRefreshEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->isTokenAutoRefreshEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_getToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_getLimitedUseToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getLimitedUseToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_addAppCheckListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addAppCheckListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_removeAppCheckListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeAppCheckListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboAppCheckCxxSpecJSI::NativeRNFBTurboAppCheckCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboAppCheck", jsInvoker) { + methodMap_["activate"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_activate}; + methodMap_["configureProvider"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_configureProvider}; + methodMap_["setTokenAutoRefreshEnabled"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_setTokenAutoRefreshEnabled}; + methodMap_["isTokenAutoRefreshEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_isTokenAutoRefreshEnabled}; + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_getToken}; + methodMap_["getLimitedUseToken"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_getLimitedUseToken}; + methodMap_["addAppCheckListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_addAppCheckListener}; + methodMap_["removeAppCheckListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_removeAppCheckListener}; +} + + +} // namespace facebook::react diff --git a/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/react/renderer/components/RNFBAppCheckTurboModules/RNFBAppCheckTurboModulesJSI.h b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/react/renderer/components/RNFBAppCheckTurboModules/RNFBAppCheckTurboModulesJSI.h new file mode 100644 index 0000000000..a7687261b9 --- /dev/null +++ b/packages/app-check/android/src/main/java/io/invertase/firebase/appcheck/generated/jni/react/renderer/components/RNFBAppCheckTurboModules/RNFBAppCheckTurboModulesJSI.h @@ -0,0 +1,174 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboAppCheckAppCheckTokenResult + +template +struct NativeRNFBTurboAppCheckAppCheckTokenResult { + P0 token; + bool operator==(const NativeRNFBTurboAppCheckAppCheckTokenResult &other) const { + return token == other.token; + } +}; + +template +struct NativeRNFBTurboAppCheckAppCheckTokenResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "token"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String tokenToJs(jsi::Runtime &rt, decltype(types.token) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "token", bridging::toJs(rt, value.token, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboAppCheckCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAppCheckCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value activate(jsi::Runtime &rt, jsi::String appName, jsi::String siteKeyProvider, bool isTokenAutoRefreshEnabled) = 0; + virtual jsi::Value configureProvider(jsi::Runtime &rt, jsi::String appName, jsi::String providerName, std::optional debugToken) = 0; + virtual void setTokenAutoRefreshEnabled(jsi::Runtime &rt, jsi::String appName, bool isTokenAutoRefreshEnabled) = 0; + virtual jsi::Value isTokenAutoRefreshEnabled(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) = 0; + virtual jsi::Value getLimitedUseToken(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void addAppCheckListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void removeAppCheckListener(jsi::Runtime &rt, jsi::String appName) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAppCheckCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboAppCheck"; + +protected: + NativeRNFBTurboAppCheckCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAppCheckCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAppCheckCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAppCheckCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value activate(jsi::Runtime &rt, jsi::String appName, jsi::String siteKeyProvider, bool isTokenAutoRefreshEnabled) override { + static_assert( + bridging::getParameterCount(&T::activate) == 4, + "Expected activate(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::activate, jsInvoker_, instance_, std::move(appName), std::move(siteKeyProvider), std::move(isTokenAutoRefreshEnabled)); + } + jsi::Value configureProvider(jsi::Runtime &rt, jsi::String appName, jsi::String providerName, std::optional debugToken) override { + static_assert( + bridging::getParameterCount(&T::configureProvider) == 4, + "Expected configureProvider(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::configureProvider, jsInvoker_, instance_, std::move(appName), std::move(providerName), std::move(debugToken)); + } + void setTokenAutoRefreshEnabled(jsi::Runtime &rt, jsi::String appName, bool isTokenAutoRefreshEnabled) override { + static_assert( + bridging::getParameterCount(&T::setTokenAutoRefreshEnabled) == 3, + "Expected setTokenAutoRefreshEnabled(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setTokenAutoRefreshEnabled, jsInvoker_, instance_, std::move(appName), std::move(isTokenAutoRefreshEnabled)); + } + jsi::Value isTokenAutoRefreshEnabled(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::isTokenAutoRefreshEnabled) == 2, + "Expected isTokenAutoRefreshEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::isTokenAutoRefreshEnabled, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) override { + static_assert( + bridging::getParameterCount(&T::getToken) == 3, + "Expected getToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getToken, jsInvoker_, instance_, std::move(appName), std::move(forceRefresh)); + } + jsi::Value getLimitedUseToken(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::getLimitedUseToken) == 2, + "Expected getLimitedUseToken(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getLimitedUseToken, jsInvoker_, instance_, std::move(appName)); + } + void addAppCheckListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::addAppCheckListener) == 2, + "Expected addAppCheckListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::addAppCheckListener, jsInvoker_, instance_, std::move(appName)); + } + void removeAppCheckListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::removeAppCheckListener) == 2, + "Expected removeAppCheckListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeAppCheckListener, jsInvoker_, instance_, std::move(appName)); + } + + private: + friend class NativeRNFBTurboAppCheckCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/app-check/e2e/appcheck.e2e.js b/packages/app-check/e2e/appcheck.e2e.js index 0da24a314b..7d886aed28 100644 --- a/packages/app-check/e2e/appcheck.e2e.js +++ b/packages/app-check/e2e/appcheck.e2e.js @@ -142,14 +142,14 @@ describe('appCheck()', function () { // Only iOS lets us assert on this unfortunately, other platforms have no accessor if (Platform.ios) { let tokenRefresh = - await NativeModules.RNFBAppCheckModule.isTokenAutoRefreshEnabled('[DEFAULT]'); + await NativeModules.NativeRNFBTurboAppCheck.isTokenAutoRefreshEnabled('[DEFAULT]'); tokenRefresh.should.equal(false); } setTokenAutoRefreshEnabled(appCheckInstance, true); // Only iOS lets us assert on this unfortunately, other platforms have no accessor if (Platform.ios) { tokenRefresh = - await NativeModules.RNFBAppCheckModule.isTokenAutoRefreshEnabled('[DEFAULT]'); + await NativeModules.NativeRNFBTurboAppCheck.isTokenAutoRefreshEnabled('[DEFAULT]'); tokenRefresh.should.equal(true); } }); diff --git a/packages/app-check/ios/RNFBAppCheck.xcodeproj/project.pbxproj b/packages/app-check/ios/RNFBAppCheck.xcodeproj/project.pbxproj index e27612c683..df2e46f78e 100644 --- a/packages/app-check/ios/RNFBAppCheck.xcodeproj/project.pbxproj +++ b/packages/app-check/ios/RNFBAppCheck.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBAppCheckModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAppCheckModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBAppCheckModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAppCheckModule.mm */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -25,7 +25,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBAppCheck.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBAppCheck.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBAppCheckModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBAppCheckModule.h; path = RNFBAppCheck/RNFBAppCheckModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBAppCheckModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBAppCheckModule.m; path = RNFBAppCheck/RNFBAppCheckModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBAppCheckModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = RNFBAppCheckModule.mm; path = RNFBAppCheck/RNFBAppCheckModule.mm; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,7 +53,7 @@ 2744B9A121F48736004F8E3F /* converters */, 2744B98C21F45C64004F8E3F /* common */, 2744B98421F45429004F8E3F /* RNFBAppCheckModule.h */, - 2744B98521F45429004F8E3F /* RNFBAppCheckModule.m */, + 2744B98521F45429004F8E3F /* RNFBAppCheckModule.mm */, ); path = RNFBAppCheck; sourceTree = ""; @@ -124,7 +124,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBAppCheckModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBAppCheckModule.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.h b/packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.h index 999f403a6e..e768cba712 100644 --- a/packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.h +++ b/packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.h @@ -16,12 +16,11 @@ */ #import - -#import - +#import #import "RNFBAppCheckProviderFactory.h" +#import "RNFBAppCheckTurboModules.h" -@interface RNFBAppCheckModule : NSObject +@interface RNFBAppCheckModule : NSObject @property RNFBAppCheckProviderFactory* _Nullable providerFactory; diff --git a/packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.m b/packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.mm similarity index 73% rename from packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.m rename to packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.mm index f1121678a0..f3027d9fe9 100644 --- a/packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.m +++ b/packages/app-check/ios/RNFBAppCheck/RNFBAppCheckModule.mm @@ -20,17 +20,21 @@ #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBApp/RNFBSharedUtils.h" #import "RNFBAppCheckModule.h" @implementation RNFBAppCheckModule -#pragma mark - -#pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboAppCheck) -- (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); ++ (BOOL)requiresMainQueueSetup { + return NO; +} + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); } + (instancetype)sharedInstance { @@ -44,15 +48,15 @@ + (instancetype)sharedInstance { return sharedInstance; } -#pragma mark - -#pragma mark Firebase AppCheck Methods +- (void)invalidate { +} -RCT_EXPORT_METHOD(activate - : (FIRApp *)firebaseApp - : (nonnull NSString *)siteKeyOrProvider - : (BOOL)isTokenAutoRefreshEnabled - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)activate:(NSString *)appName + siteKeyProvider:(NSString *)siteKeyProvider + isTokenAutoRefreshEnabled:(BOOL)isTokenAutoRefreshEnabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; DLog(@"deprecated API, provider will be deviceCheck / token refresh %d for app %@", isTokenAutoRefreshEnabled, firebaseApp.name); [[RNFBAppCheckModule sharedInstance].providerFactory configure:firebaseApp @@ -64,12 +68,12 @@ + (instancetype)sharedInstance { resolve([NSNull null]); } -RCT_EXPORT_METHOD(configureProvider - : (FIRApp *)firebaseApp - : (nonnull NSString *)providerName - : (nullable NSString *)debugToken - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)configureProvider:(NSString *)appName + providerName:(NSString *)providerName + debugToken:(NSString *)debugToken + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; DLog(@"appName/providerName/debugToken: %@/%@/%@", firebaseApp.name, providerName, (debugToken == nil ? @"null" : @"(not shown)")); [[RNFBAppCheckModule sharedInstance].providerFactory configure:firebaseApp @@ -78,38 +82,35 @@ + (instancetype)sharedInstance { resolve([NSNull null]); } -RCT_EXPORT_METHOD(setTokenAutoRefreshEnabled - : (FIRApp *)firebaseApp - : (BOOL)isTokenAutoRefreshEnabled) { +- (void)setTokenAutoRefreshEnabled:(NSString *)appName + isTokenAutoRefreshEnabled:(BOOL)isTokenAutoRefreshEnabled { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; DLog(@"app/isTokenAutoRefreshEnabled: %@/%d", firebaseApp.name, isTokenAutoRefreshEnabled); FIRAppCheck *appCheck = [FIRAppCheck appCheckWithApp:firebaseApp]; appCheck.isTokenAutoRefreshEnabled = isTokenAutoRefreshEnabled; } -// Not present in JS or Android - it is iOS-specific so we only call this in testing - it is not in -// index.d.ts -RCT_EXPORT_METHOD(isTokenAutoRefreshEnabled - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)isTokenAutoRefreshEnabled:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRAppCheck *appCheck = [FIRAppCheck appCheckWithApp:firebaseApp]; BOOL isTokenAutoRefreshEnabled = appCheck.isTokenAutoRefreshEnabled; DLog(@"app/isTokenAutoRefreshEnabled: %@/%d", firebaseApp.name, isTokenAutoRefreshEnabled); resolve([NSNumber numberWithBool:isTokenAutoRefreshEnabled]); } -RCT_EXPORT_METHOD(getToken - : (FIRApp *)firebaseApp - : (BOOL)forceRefresh - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getToken:(NSString *)appName + forceRefresh:(BOOL)forceRefresh + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRAppCheck *appCheck = [FIRAppCheck appCheckWithApp:firebaseApp]; DLog(@"appName %@", firebaseApp.name); [appCheck tokenForcingRefresh:forceRefresh completion:^(FIRAppCheckToken *_Nullable token, NSError *_Nullable error) { if (error != nil) { - // Handle any errors if the token was not retrieved. DLog(@"RNFBAppCheck - getToken - Unable to retrieve App Check token: %@", error); [RNFBSharedUtils rejectPromiseWithUserInfo:reject userInfo:(NSMutableDictionary *)@{ @@ -134,16 +135,15 @@ + (instancetype)sharedInstance { }]; } -RCT_EXPORT_METHOD(getLimitedUseToken - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getLimitedUseToken:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRAppCheck *appCheck = [FIRAppCheck appCheckWithApp:firebaseApp]; DLog(@"appName %@", firebaseApp.name); [appCheck limitedUseTokenWithCompletion:^(FIRAppCheckToken *_Nullable token, NSError *_Nullable error) { if (error != nil) { - // Handle any errors if the token was not retrieved. DLog(@"RNFBAppCheck - getLimitedUseToken - Unable to retrieve App Check token: %@", error); [RNFBSharedUtils rejectPromiseWithUserInfo:reject userInfo:(NSMutableDictionary *)@{ @@ -168,4 +168,10 @@ + (instancetype)sharedInstance { }]; } +- (void)addAppCheckListener:(NSString *)appName { +} + +- (void)removeAppCheckListener:(NSString *)appName { +} + @end diff --git a/packages/app-check/ios/generated/RCTAppDependencyProvider.h b/packages/app-check/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/app-check/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/app-check/ios/generated/RCTAppDependencyProvider.mm b/packages/app-check/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/app-check/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/app-check/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/app-check/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/app-check/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/app-check/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/app-check/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/app-check/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/app-check/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/app-check/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/app-check/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/app-check/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/app-check/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/app-check/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/app-check/ios/generated/RNFBAppCheckTurboModules/RNFBAppCheckTurboModules-generated.mm b/packages/app-check/ios/generated/RNFBAppCheckTurboModules/RNFBAppCheckTurboModules-generated.mm new file mode 100644 index 0000000000..0763ffa339 --- /dev/null +++ b/packages/app-check/ios/generated/RNFBAppCheckTurboModules/RNFBAppCheckTurboModules-generated.mm @@ -0,0 +1,88 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBAppCheckTurboModules.h" + + +@implementation NativeRNFBTurboAppCheckSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_activate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "activate", @selector(activate:siteKeyProvider:isTokenAutoRefreshEnabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_configureProvider(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "configureProvider", @selector(configureProvider:providerName:debugToken:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_setTokenAutoRefreshEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setTokenAutoRefreshEnabled", @selector(setTokenAutoRefreshEnabled:isTokenAutoRefreshEnabled:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_isTokenAutoRefreshEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "isTokenAutoRefreshEnabled", @selector(isTokenAutoRefreshEnabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_getToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getToken", @selector(getToken:forceRefresh:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_getLimitedUseToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getLimitedUseToken", @selector(getLimitedUseToken:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_addAppCheckListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "addAppCheckListener", @selector(addAppCheckListener:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppCheckSpecJSI_removeAppCheckListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "removeAppCheckListener", @selector(removeAppCheckListener:), args, count); + } + + NativeRNFBTurboAppCheckSpecJSI::NativeRNFBTurboAppCheckSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["activate"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_activate}; + + + methodMap_["configureProvider"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_configureProvider}; + + + methodMap_["setTokenAutoRefreshEnabled"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_setTokenAutoRefreshEnabled}; + + + methodMap_["isTokenAutoRefreshEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_isTokenAutoRefreshEnabled}; + + + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_getToken}; + + + methodMap_["getLimitedUseToken"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_getLimitedUseToken}; + + + methodMap_["addAppCheckListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_addAppCheckListener}; + + + methodMap_["removeAppCheckListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckSpecJSI_removeAppCheckListener}; + + } +} // namespace facebook::react diff --git a/packages/app-check/ios/generated/RNFBAppCheckTurboModules/RNFBAppCheckTurboModules.h b/packages/app-check/ios/generated/RNFBAppCheckTurboModules/RNFBAppCheckTurboModules.h new file mode 100644 index 0000000000..4900831fd2 --- /dev/null +++ b/packages/app-check/ios/generated/RNFBAppCheckTurboModules/RNFBAppCheckTurboModules.h @@ -0,0 +1,85 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBAppCheckTurboModules symbols +#ifndef RNFBAppCheckTurboModules_H +#define RNFBAppCheckTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@protocol NativeRNFBTurboAppCheckSpec + +- (void)activate:(NSString *)appName + siteKeyProvider:(NSString *)siteKeyProvider +isTokenAutoRefreshEnabled:(BOOL)isTokenAutoRefreshEnabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)configureProvider:(NSString *)appName + providerName:(NSString *)providerName + debugToken:(NSString * _Nullable)debugToken + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setTokenAutoRefreshEnabled:(NSString *)appName + isTokenAutoRefreshEnabled:(BOOL)isTokenAutoRefreshEnabled; +- (void)isTokenAutoRefreshEnabled:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getToken:(NSString *)appName + forceRefresh:(BOOL)forceRefresh + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getLimitedUseToken:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)addAppCheckListener:(NSString *)appName; +- (void)removeAppCheckListener:(NSString *)appName; + +@end + +@interface NativeRNFBTurboAppCheckSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboAppCheck' + */ + class JSI_EXPORT NativeRNFBTurboAppCheckSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboAppCheckSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +NS_ASSUME_NONNULL_END +#endif // RNFBAppCheckTurboModules_H diff --git a/packages/app-check/ios/generated/RNFBAppCheckTurboModulesJSI-generated.cpp b/packages/app-check/ios/generated/RNFBAppCheckTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..e4b02313ca --- /dev/null +++ b/packages/app-check/ios/generated/RNFBAppCheckTurboModulesJSI-generated.cpp @@ -0,0 +1,85 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAppCheckTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_activate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->activate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_configureProvider(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->configureProvider( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 || args[2].isNull() || args[2].isUndefined() ? std::nullopt : std::make_optional(args[2].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_setTokenAutoRefreshEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setTokenAutoRefreshEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_isTokenAutoRefreshEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->isTokenAutoRefreshEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_getToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_getLimitedUseToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getLimitedUseToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_addAppCheckListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addAppCheckListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_removeAppCheckListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeAppCheckListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboAppCheckCxxSpecJSI::NativeRNFBTurboAppCheckCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboAppCheck", jsInvoker) { + methodMap_["activate"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_activate}; + methodMap_["configureProvider"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_configureProvider}; + methodMap_["setTokenAutoRefreshEnabled"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_setTokenAutoRefreshEnabled}; + methodMap_["isTokenAutoRefreshEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_isTokenAutoRefreshEnabled}; + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_getToken}; + methodMap_["getLimitedUseToken"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_getLimitedUseToken}; + methodMap_["addAppCheckListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_addAppCheckListener}; + methodMap_["removeAppCheckListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCheckCxxSpecJSI_removeAppCheckListener}; +} + + +} // namespace facebook::react diff --git a/packages/app-check/ios/generated/RNFBAppCheckTurboModulesJSI.h b/packages/app-check/ios/generated/RNFBAppCheckTurboModulesJSI.h new file mode 100644 index 0000000000..a7687261b9 --- /dev/null +++ b/packages/app-check/ios/generated/RNFBAppCheckTurboModulesJSI.h @@ -0,0 +1,174 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboAppCheckAppCheckTokenResult + +template +struct NativeRNFBTurboAppCheckAppCheckTokenResult { + P0 token; + bool operator==(const NativeRNFBTurboAppCheckAppCheckTokenResult &other) const { + return token == other.token; + } +}; + +template +struct NativeRNFBTurboAppCheckAppCheckTokenResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "token"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String tokenToJs(jsi::Runtime &rt, decltype(types.token) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "token", bridging::toJs(rt, value.token, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboAppCheckCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAppCheckCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value activate(jsi::Runtime &rt, jsi::String appName, jsi::String siteKeyProvider, bool isTokenAutoRefreshEnabled) = 0; + virtual jsi::Value configureProvider(jsi::Runtime &rt, jsi::String appName, jsi::String providerName, std::optional debugToken) = 0; + virtual void setTokenAutoRefreshEnabled(jsi::Runtime &rt, jsi::String appName, bool isTokenAutoRefreshEnabled) = 0; + virtual jsi::Value isTokenAutoRefreshEnabled(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) = 0; + virtual jsi::Value getLimitedUseToken(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void addAppCheckListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void removeAppCheckListener(jsi::Runtime &rt, jsi::String appName) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAppCheckCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboAppCheck"; + +protected: + NativeRNFBTurboAppCheckCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAppCheckCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAppCheckCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAppCheckCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value activate(jsi::Runtime &rt, jsi::String appName, jsi::String siteKeyProvider, bool isTokenAutoRefreshEnabled) override { + static_assert( + bridging::getParameterCount(&T::activate) == 4, + "Expected activate(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::activate, jsInvoker_, instance_, std::move(appName), std::move(siteKeyProvider), std::move(isTokenAutoRefreshEnabled)); + } + jsi::Value configureProvider(jsi::Runtime &rt, jsi::String appName, jsi::String providerName, std::optional debugToken) override { + static_assert( + bridging::getParameterCount(&T::configureProvider) == 4, + "Expected configureProvider(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::configureProvider, jsInvoker_, instance_, std::move(appName), std::move(providerName), std::move(debugToken)); + } + void setTokenAutoRefreshEnabled(jsi::Runtime &rt, jsi::String appName, bool isTokenAutoRefreshEnabled) override { + static_assert( + bridging::getParameterCount(&T::setTokenAutoRefreshEnabled) == 3, + "Expected setTokenAutoRefreshEnabled(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setTokenAutoRefreshEnabled, jsInvoker_, instance_, std::move(appName), std::move(isTokenAutoRefreshEnabled)); + } + jsi::Value isTokenAutoRefreshEnabled(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::isTokenAutoRefreshEnabled) == 2, + "Expected isTokenAutoRefreshEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::isTokenAutoRefreshEnabled, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) override { + static_assert( + bridging::getParameterCount(&T::getToken) == 3, + "Expected getToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getToken, jsInvoker_, instance_, std::move(appName), std::move(forceRefresh)); + } + jsi::Value getLimitedUseToken(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::getLimitedUseToken) == 2, + "Expected getLimitedUseToken(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getLimitedUseToken, jsInvoker_, instance_, std::move(appName)); + } + void addAppCheckListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::addAppCheckListener) == 2, + "Expected addAppCheckListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::addAppCheckListener, jsInvoker_, instance_, std::move(appName)); + } + void removeAppCheckListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::removeAppCheckListener) == 2, + "Expected removeAppCheckListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeAppCheckListener, jsInvoker_, instance_, std::move(appName)); + } + + private: + friend class NativeRNFBTurboAppCheckCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/app-check/ios/generated/ReactAppDependencyProvider.podspec b/packages/app-check/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/app-check/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/app-check/lib/index.ts b/packages/app-check/lib/index.ts index 09d791b24e..f01a828d50 100644 --- a/packages/app-check/lib/index.ts +++ b/packages/app-check/lib/index.ts @@ -47,7 +47,7 @@ import type { AppCheckInternal, ProviderWithOptions } from './types/internal'; import type { ReactNativeFirebase } from '@react-native-firebase/app'; import { ReactNativeFirebaseAppCheckProvider } from './providers'; -const nativeModuleName = 'RNFBAppCheckModule'; +const nativeModuleName = 'NativeRNFBTurboAppCheck'; /** * Type guard to check if a provider has providerOptions. @@ -244,6 +244,7 @@ const config: ModuleConfig = { nativeEvents: ['appCheck_token_changed'], hasMultiAppSupport: true, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; export const SDK_VERSION = version; @@ -254,6 +255,13 @@ function getModularAppCheck(app?: FirebaseApp): AppCheck { return getOrCreateModularInstance(FirebaseAppCheckModule, config, app) as unknown as AppCheck; } +/** + * Initializes App Check for the given Firebase app. + * + * @remarks On native platforms use {@link ReactNativeFirebaseAppCheckProvider} to configure + * Device Check, App Attest, Play Integrity, or debug providers. firebase-js-sdk + * `ReCaptchaEnterpriseProvider` / `ReCaptchaV3Provider` are **web only** and have no RN equivalent. + */ export async function initializeAppCheck( app?: FirebaseApp, options?: AppCheckOptions, diff --git a/packages/app-check/lib/types/internal.ts b/packages/app-check/lib/types/internal.ts index 8c24672710..b7045edb29 100644 --- a/packages/app-check/lib/types/internal.ts +++ b/packages/app-check/lib/types/internal.ts @@ -157,6 +157,6 @@ export interface RNFBAppCheckModule { declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBAppCheckModule: RNFBAppCheckModule; + NativeRNFBTurboAppCheck: RNFBAppCheckModule; } } diff --git a/packages/app-check/package.json b/packages/app-check/package.json index 7a19efd28e..3bdcb78014 100644 --- a/packages/app-check/package.json +++ b/packages/app-check/package.json @@ -5,13 +5,30 @@ "description": "React Native Firebase - App Check", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBAppCheckTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.appcheck" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboAppCheck": "RNFBAppCheckModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "build:plugin": "rimraf plugin/build && tsc --build plugin", "lint:plugin": "eslint plugin/src/*", "compile": "bob build", - "prepare": "yarn run build && yarn compile && yarn run build:plugin" + "prepare": "yarn run build && yarn compile && yarn run build:plugin", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/main/java/io/invertase/firebase/appcheck/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/app-check/react-native.config.js b/packages/app-check/react-native.config.js new file mode 100644 index 0000000000..10c00e5535 --- /dev/null +++ b/packages/app-check/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/main/java/io/invertase/firebase/appcheck/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/app-check/specs/NativeRNFBTurboAppCheck.ts b/packages/app-check/specs/NativeRNFBTurboAppCheck.ts new file mode 100644 index 0000000000..7015dd3f65 --- /dev/null +++ b/packages/app-check/specs/NativeRNFBTurboAppCheck.ts @@ -0,0 +1,27 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface AppCheckTokenResult { + token: string; +} + +export interface Spec extends TurboModule { + activate( + appName: string, + siteKeyProvider: string, + isTokenAutoRefreshEnabled: boolean, + ): Promise; + configureProvider( + appName: string, + providerName: string, + debugToken?: string | null, + ): Promise; + setTokenAutoRefreshEnabled(appName: string, isTokenAutoRefreshEnabled: boolean): void; + isTokenAutoRefreshEnabled(appName: string): Promise; + getToken(appName: string, forceRefresh: boolean): Promise; + getLimitedUseToken(appName: string): Promise; + addAppCheckListener(appName: string): void; + removeAppCheckListener(appName: string): void; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboAppCheck'); diff --git a/packages/app-distribution/RNFBAppDistribution.podspec b/packages/app-distribution/RNFBAppDistribution.podspec index f3e0b6e240..2aa00086d4 100644 --- a/packages/app-distribution/RNFBAppDistribution.podspec +++ b/packages/app-distribution/RNFBAppDistribution.podspec @@ -25,15 +25,16 @@ Pod::Spec.new do |s| s.social_media_url = 'http://twitter.com/invertaseio' s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.private_header_files = "ios/**/*.h" + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/app-distribution/__tests__/nativeModuleContract.test.ts b/packages/app-distribution/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..c2f506ddca --- /dev/null +++ b/packages/app-distribution/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,24 @@ +import { describe, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'isTesterSignedIn', + 'signInTester', + 'signOutTester', + 'checkForUpdate', +] as const; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper', function () { + assertTurboContract({ + namespace: 'appDistribution', + nativeModuleName: 'NativeRNFBTurboAppDistribution', + nativeEvents: false, + hasMultiAppSupport: false, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + specMethods: SPEC_METHODS, + createMock: () => jest.fn(() => Promise.resolve(null)), + }); + }); +}); diff --git a/packages/app-distribution/android/build.gradle b/packages/app-distribution/android/build.gradle index 56199353bb..f102800890 100644 --- a/packages/app-distribution/android/build.gradle +++ b/packages/app-distribution/android/build.gradle @@ -81,6 +81,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -105,3 +106,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/app-distribution") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/ReactNativeFirebaseAppDistributionModule.java b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/NativeRNFBTurboAppDistribution.java similarity index 52% rename from packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/ReactNativeFirebaseAppDistributionModule.java rename to packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/NativeRNFBTurboAppDistribution.java index 8ea25f332b..3543add12e 100644 --- a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/ReactNativeFirebaseAppDistributionModule.java +++ b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/NativeRNFBTurboAppDistribution.java @@ -17,37 +17,34 @@ * */ -import com.facebook.react.bridge.*; -import io.invertase.firebase.common.ReactNativeFirebaseModule; +import com.facebook.fbreact.specs.NativeRNFBTurboAppDistributionSpec; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; -public class ReactNativeFirebaseAppDistributionModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboAppDistribution extends NativeRNFBTurboAppDistributionSpec { private static final String TAG = "AppDistribution"; - ReactNativeFirebaseAppDistributionModule(ReactApplicationContext reactContext) { - super(reactContext, TAG); + public NativeRNFBTurboAppDistribution(ReactApplicationContext reactContext) { + super(reactContext); } - @ReactMethod + @Override public void isTesterSignedIn(Promise promise) { - rejectPromiseWithCodeAndMessage( - promise, "platform-unsupported", "Android is not supported for App Distribution"); + promise.reject("platform-unsupported", "Android is not supported for App Distribution"); } - @ReactMethod + @Override public void signInTester(Promise promise) { - rejectPromiseWithCodeAndMessage( - promise, "platform-unsupported", "Android is not supported for App Distribution"); + promise.reject("platform-unsupported", "Android is not supported for App Distribution"); } - @ReactMethod + @Override public void checkForUpdate(Promise promise) { - rejectPromiseWithCodeAndMessage( - promise, "platform-unsupported", "Android is not supported for App Distribution"); + promise.reject("platform-unsupported", "Android is not supported for App Distribution"); } - @ReactMethod + @Override public void signOutTester(Promise promise) { - rejectPromiseWithCodeAndMessage( - promise, "platform-unsupported", "Android is not supported for App Distribution"); + promise.reject("platform-unsupported", "Android is not supported for App Distribution"); } } diff --git a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/ReactNativeFirebaseAppDistributionPackage.java b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/ReactNativeFirebaseAppDistributionPackage.java index 0cf7521a93..6234b97387 100644 --- a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/ReactNativeFirebaseAppDistributionPackage.java +++ b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/ReactNativeFirebaseAppDistributionPackage.java @@ -30,7 +30,7 @@ public class ReactNativeFirebaseAppDistributionPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseAppDistributionModule(reactContext)); + modules.add(new NativeRNFBTurboAppDistribution(reactContext)); return modules; } diff --git a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAppDistributionSpec.java b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAppDistributionSpec.java new file mode 100644 index 0000000000..d14f2af706 --- /dev/null +++ b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAppDistributionSpec.java @@ -0,0 +1,50 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboAppDistributionSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboAppDistribution"; + + public NativeRNFBTurboAppDistributionSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void isTesterSignedIn(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signInTester(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signOutTester(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void checkForUpdate(Promise promise); +} diff --git a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/CMakeLists.txt b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..b14bf3abf3 --- /dev/null +++ b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBAppDistributionTurboModules/*.cpp) + +add_library( + react_codegen_RNFBAppDistributionTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBAppDistributionTurboModules PUBLIC . react/renderer/components/RNFBAppDistributionTurboModules) + +target_link_libraries( + react_codegen_RNFBAppDistributionTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBAppDistributionTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/RNFBAppDistributionTurboModules-generated.cpp b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/RNFBAppDistributionTurboModules-generated.cpp new file mode 100644 index 0000000000..3b0f6733b5 --- /dev/null +++ b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/RNFBAppDistributionTurboModules-generated.cpp @@ -0,0 +1,50 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBAppDistributionTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_isTesterSignedIn(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "isTesterSignedIn", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_signInTester(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signInTester", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_signOutTester(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signOutTester", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_checkForUpdate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "checkForUpdate", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboAppDistributionSpecJSI::NativeRNFBTurboAppDistributionSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["isTesterSignedIn"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_isTesterSignedIn}; + methodMap_["signInTester"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_signInTester}; + methodMap_["signOutTester"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_signOutTester}; + methodMap_["checkForUpdate"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_checkForUpdate}; +} + +std::shared_ptr RNFBAppDistributionTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboAppDistribution") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/RNFBAppDistributionTurboModules.h b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/RNFBAppDistributionTurboModules.h new file mode 100644 index 0000000000..88466f6d6a --- /dev/null +++ b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/RNFBAppDistributionTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboAppDistribution' + */ +class JSI_EXPORT NativeRNFBTurboAppDistributionSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboAppDistributionSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBAppDistributionTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/react/renderer/components/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModulesJSI-generated.cpp b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/react/renderer/components/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..d4383bb504 --- /dev/null +++ b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/react/renderer/components/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModulesJSI-generated.cpp @@ -0,0 +1,44 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAppDistributionTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_isTesterSignedIn(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->isTesterSignedIn( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_signInTester(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInTester( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_signOutTester(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signOutTester( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_checkForUpdate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->checkForUpdate( + rt + ); +} + +NativeRNFBTurboAppDistributionCxxSpecJSI::NativeRNFBTurboAppDistributionCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboAppDistribution", jsInvoker) { + methodMap_["isTesterSignedIn"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_isTesterSignedIn}; + methodMap_["signInTester"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_signInTester}; + methodMap_["signOutTester"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_signOutTester}; + methodMap_["checkForUpdate"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_checkForUpdate}; +} + + +} // namespace facebook::react diff --git a/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/react/renderer/components/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModulesJSI.h b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/react/renderer/components/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModulesJSI.h new file mode 100644 index 0000000000..66aeecd6d9 --- /dev/null +++ b/packages/app-distribution/android/src/main/java/io/invertase/firebase/appdistribution/generated/jni/react/renderer/components/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModulesJSI.h @@ -0,0 +1,166 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboAppDistributionAppDistributionRelease + +template +struct NativeRNFBTurboAppDistributionAppDistributionRelease { + P0 displayVersion; + P1 buildVersion; + P2 releaseNotes; + P3 isExpired; + P4 downloadURL; + bool operator==(const NativeRNFBTurboAppDistributionAppDistributionRelease &other) const { + return displayVersion == other.displayVersion && buildVersion == other.buildVersion && releaseNotes == other.releaseNotes && isExpired == other.isExpired && downloadURL == other.downloadURL; + } +}; + +template +struct NativeRNFBTurboAppDistributionAppDistributionReleaseBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "displayVersion"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "buildVersion"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "releaseNotes"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "isExpired"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "downloadURL"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String displayVersionToJs(jsi::Runtime &rt, decltype(types.displayVersion) value) { + return bridging::toJs(rt, value); + } + + static jsi::String buildVersionToJs(jsi::Runtime &rt, decltype(types.buildVersion) value) { + return bridging::toJs(rt, value); + } + + static std::optional releaseNotesToJs(jsi::Runtime &rt, decltype(types.releaseNotes) value) { + return bridging::toJs(rt, value); + } + + static bool isExpiredToJs(jsi::Runtime &rt, decltype(types.isExpired) value) { + return bridging::toJs(rt, value); + } + + static jsi::String downloadURLToJs(jsi::Runtime &rt, decltype(types.downloadURL) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "displayVersion", bridging::toJs(rt, value.displayVersion, jsInvoker)); + result.setProperty(rt, "buildVersion", bridging::toJs(rt, value.buildVersion, jsInvoker)); + result.setProperty(rt, "releaseNotes", bridging::toJs(rt, value.releaseNotes, jsInvoker)); + result.setProperty(rt, "isExpired", bridging::toJs(rt, value.isExpired, jsInvoker)); + result.setProperty(rt, "downloadURL", bridging::toJs(rt, value.downloadURL, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboAppDistributionCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAppDistributionCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value isTesterSignedIn(jsi::Runtime &rt) = 0; + virtual jsi::Value signInTester(jsi::Runtime &rt) = 0; + virtual jsi::Value signOutTester(jsi::Runtime &rt) = 0; + virtual jsi::Value checkForUpdate(jsi::Runtime &rt) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAppDistributionCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboAppDistribution"; + +protected: + NativeRNFBTurboAppDistributionCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAppDistributionCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAppDistributionCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAppDistributionCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value isTesterSignedIn(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::isTesterSignedIn) == 1, + "Expected isTesterSignedIn(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::isTesterSignedIn, jsInvoker_, instance_); + } + jsi::Value signInTester(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::signInTester) == 1, + "Expected signInTester(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::signInTester, jsInvoker_, instance_); + } + jsi::Value signOutTester(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::signOutTester) == 1, + "Expected signOutTester(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::signOutTester, jsInvoker_, instance_); + } + jsi::Value checkForUpdate(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::checkForUpdate) == 1, + "Expected checkForUpdate(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::checkForUpdate, jsInvoker_, instance_); + } + + private: + friend class NativeRNFBTurboAppDistributionCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/app-distribution/ios/RNFBAppDistribution.xcodeproj/project.pbxproj b/packages/app-distribution/ios/RNFBAppDistribution.xcodeproj/project.pbxproj index 36828a7107..ece34e437a 100644 --- a/packages/app-distribution/ios/RNFBAppDistribution.xcodeproj/project.pbxproj +++ b/packages/app-distribution/ios/RNFBAppDistribution.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBAppDistributionModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAppDistributionModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBAppDistributionModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAppDistributionModule.mm */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -25,7 +25,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBAppDistribution.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBAppDistribution.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBAppDistributionModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBAppDistributionModule.h; path = RNFBAppDistribution/RNFBAppDistributionModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBAppDistributionModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBAppDistributionModule.m; path = RNFBAppDistribution/RNFBAppDistributionModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBAppDistributionModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBAppDistributionModule.mm; path = RNFBAppDistribution/RNFBAppDistributionModule.mm; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,7 +53,7 @@ 2744B9A121F48736004F8E3F /* converters */, 2744B98C21F45C64004F8E3F /* common */, 2744B98421F45429004F8E3F /* RNFBAppDistributionModule.h */, - 2744B98521F45429004F8E3F /* RNFBAppDistributionModule.m */, + 2744B98521F45429004F8E3F /* RNFBAppDistributionModule.mm */, ); path = RNFBAppDistribution; sourceTree = ""; @@ -124,7 +124,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBAppDistributionModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBAppDistributionModule.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.h b/packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.h index b21dbecb14..a550e5c459 100644 --- a/packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.h +++ b/packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.h @@ -16,9 +16,8 @@ */ #import +#import "RNFBAppDistributionTurboModules.h" -#import - -@interface RNFBAppDistributionModule : NSObject +@interface RNFBAppDistributionModule : NSObject @end diff --git a/packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.m b/packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.mm similarity index 77% rename from packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.m rename to packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.mm index a13b881f2b..7e82fb21f6 100644 --- a/packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.m +++ b/packages/app-distribution/ios/RNFBAppDistribution/RNFBAppDistributionModule.mm @@ -22,31 +22,28 @@ #import "RNFBAppDistributionModule.h" @implementation RNFBAppDistributionModule -#pragma mark - -#pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboAppDistribution) -- (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); ++ (BOOL)requiresMainQueueSetup { + return NO; } -#pragma mark - -#pragma mark Firebase AppDistribution Methods +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} -RCT_EXPORT_METHOD(isTesterSignedIn - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)isTesterSignedIn:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { FIRAppDistribution *appDistribution = [FIRAppDistribution appDistribution]; BOOL isTesterSignedIn = appDistribution.isTesterSignedIn; resolve([NSNumber numberWithBool:isTesterSignedIn]); } -RCT_EXPORT_METHOD(signInTester : (RCTPromiseResolveBlock)resolve : (RCTPromiseRejectBlock)reject) { +- (void)signInTester:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { FIRAppDistribution *appDistribution = [FIRAppDistribution appDistribution]; [appDistribution signInTesterWithCompletion:^(NSError *_Nullable error) { if (error != nil) { - // Handle any errors if the signIn failed DLog(@"Unable to signInTester: %@", error); [RNFBSharedUtils rejectPromiseWithUserInfo:reject userInfo:(NSMutableDictionary *)@{ @@ -60,21 +57,16 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(signOutTester - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)signOutTester:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { [[FIRAppDistribution appDistribution] signOutTester]; resolve([NSNull null]); } -RCT_EXPORT_METHOD(checkForUpdate - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)checkForUpdate:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { FIRAppDistribution *appDistribution = [FIRAppDistribution appDistribution]; [appDistribution checkForUpdateWithCompletion:^(FIRAppDistributionRelease *_Nullable release, NSError *_Nullable error) { if (error != nil) { - // Handle any errors if the release was not retrieved. DLog(@"Unable to check App Distribution release: %@", error); [RNFBSharedUtils rejectPromiseWithUserInfo:reject userInfo:(NSMutableDictionary *)@{ @@ -84,7 +76,7 @@ - (dispatch_queue_t)methodQueue { return; } if (release == nil) { - DLog(@"Unable to check App Distribution release: %@", error); + DLog(@"Unable to check App Distribution release."); [RNFBSharedUtils rejectPromiseWithUserInfo:reject userInfo:(NSMutableDictionary *)@{ @"code" : @"checkupdate-null", diff --git a/packages/app-distribution/ios/generated/RCTAppDependencyProvider.h b/packages/app-distribution/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/app-distribution/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/app-distribution/ios/generated/RCTAppDependencyProvider.mm b/packages/app-distribution/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/app-distribution/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/app-distribution/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/app-distribution/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/app-distribution/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/app-distribution/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/app-distribution/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/app-distribution/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/app-distribution/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/app-distribution/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/app-distribution/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/app-distribution/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/app-distribution/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/app-distribution/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModules-generated.mm b/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModules-generated.mm new file mode 100644 index 0000000000..9455f8f6ad --- /dev/null +++ b/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModules-generated.mm @@ -0,0 +1,60 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBAppDistributionTurboModules.h" + + +@implementation NativeRNFBTurboAppDistributionSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_isTesterSignedIn(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "isTesterSignedIn", @selector(isTesterSignedIn:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_signInTester(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signInTester", @selector(signInTester:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_signOutTester(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signOutTester", @selector(signOutTester:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_checkForUpdate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "checkForUpdate", @selector(checkForUpdate:reject:), args, count); + } + + NativeRNFBTurboAppDistributionSpecJSI::NativeRNFBTurboAppDistributionSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["isTesterSignedIn"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_isTesterSignedIn}; + + + methodMap_["signInTester"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_signInTester}; + + + methodMap_["signOutTester"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_signOutTester}; + + + methodMap_["checkForUpdate"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionSpecJSI_checkForUpdate}; + + } +} // namespace facebook::react diff --git a/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModules.h b/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModules.h new file mode 100644 index 0000000000..c5b39e5c3d --- /dev/null +++ b/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModules/RNFBAppDistributionTurboModules.h @@ -0,0 +1,69 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBAppDistributionTurboModules symbols +#ifndef RNFBAppDistributionTurboModules_H +#define RNFBAppDistributionTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@protocol NativeRNFBTurboAppDistributionSpec + +- (void)isTesterSignedIn:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signInTester:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signOutTester:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)checkForUpdate:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end + +@interface NativeRNFBTurboAppDistributionSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboAppDistribution' + */ + class JSI_EXPORT NativeRNFBTurboAppDistributionSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboAppDistributionSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +NS_ASSUME_NONNULL_END +#endif // RNFBAppDistributionTurboModules_H diff --git a/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModulesJSI-generated.cpp b/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..d4383bb504 --- /dev/null +++ b/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModulesJSI-generated.cpp @@ -0,0 +1,44 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAppDistributionTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_isTesterSignedIn(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->isTesterSignedIn( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_signInTester(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInTester( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_signOutTester(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signOutTester( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_checkForUpdate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->checkForUpdate( + rt + ); +} + +NativeRNFBTurboAppDistributionCxxSpecJSI::NativeRNFBTurboAppDistributionCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboAppDistribution", jsInvoker) { + methodMap_["isTesterSignedIn"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_isTesterSignedIn}; + methodMap_["signInTester"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_signInTester}; + methodMap_["signOutTester"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_signOutTester}; + methodMap_["checkForUpdate"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppDistributionCxxSpecJSI_checkForUpdate}; +} + + +} // namespace facebook::react diff --git a/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModulesJSI.h b/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModulesJSI.h new file mode 100644 index 0000000000..66aeecd6d9 --- /dev/null +++ b/packages/app-distribution/ios/generated/RNFBAppDistributionTurboModulesJSI.h @@ -0,0 +1,166 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboAppDistributionAppDistributionRelease + +template +struct NativeRNFBTurboAppDistributionAppDistributionRelease { + P0 displayVersion; + P1 buildVersion; + P2 releaseNotes; + P3 isExpired; + P4 downloadURL; + bool operator==(const NativeRNFBTurboAppDistributionAppDistributionRelease &other) const { + return displayVersion == other.displayVersion && buildVersion == other.buildVersion && releaseNotes == other.releaseNotes && isExpired == other.isExpired && downloadURL == other.downloadURL; + } +}; + +template +struct NativeRNFBTurboAppDistributionAppDistributionReleaseBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "displayVersion"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "buildVersion"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "releaseNotes"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "isExpired"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "downloadURL"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String displayVersionToJs(jsi::Runtime &rt, decltype(types.displayVersion) value) { + return bridging::toJs(rt, value); + } + + static jsi::String buildVersionToJs(jsi::Runtime &rt, decltype(types.buildVersion) value) { + return bridging::toJs(rt, value); + } + + static std::optional releaseNotesToJs(jsi::Runtime &rt, decltype(types.releaseNotes) value) { + return bridging::toJs(rt, value); + } + + static bool isExpiredToJs(jsi::Runtime &rt, decltype(types.isExpired) value) { + return bridging::toJs(rt, value); + } + + static jsi::String downloadURLToJs(jsi::Runtime &rt, decltype(types.downloadURL) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "displayVersion", bridging::toJs(rt, value.displayVersion, jsInvoker)); + result.setProperty(rt, "buildVersion", bridging::toJs(rt, value.buildVersion, jsInvoker)); + result.setProperty(rt, "releaseNotes", bridging::toJs(rt, value.releaseNotes, jsInvoker)); + result.setProperty(rt, "isExpired", bridging::toJs(rt, value.isExpired, jsInvoker)); + result.setProperty(rt, "downloadURL", bridging::toJs(rt, value.downloadURL, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboAppDistributionCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAppDistributionCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value isTesterSignedIn(jsi::Runtime &rt) = 0; + virtual jsi::Value signInTester(jsi::Runtime &rt) = 0; + virtual jsi::Value signOutTester(jsi::Runtime &rt) = 0; + virtual jsi::Value checkForUpdate(jsi::Runtime &rt) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAppDistributionCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboAppDistribution"; + +protected: + NativeRNFBTurboAppDistributionCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAppDistributionCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAppDistributionCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAppDistributionCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value isTesterSignedIn(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::isTesterSignedIn) == 1, + "Expected isTesterSignedIn(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::isTesterSignedIn, jsInvoker_, instance_); + } + jsi::Value signInTester(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::signInTester) == 1, + "Expected signInTester(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::signInTester, jsInvoker_, instance_); + } + jsi::Value signOutTester(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::signOutTester) == 1, + "Expected signOutTester(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::signOutTester, jsInvoker_, instance_); + } + jsi::Value checkForUpdate(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::checkForUpdate) == 1, + "Expected checkForUpdate(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::checkForUpdate, jsInvoker_, instance_); + } + + private: + friend class NativeRNFBTurboAppDistributionCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/app-distribution/ios/generated/ReactAppDependencyProvider.podspec b/packages/app-distribution/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/app-distribution/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/app-distribution/lib/index.ts b/packages/app-distribution/lib/index.ts index b29b399dc3..5895bebb3f 100644 --- a/packages/app-distribution/lib/index.ts +++ b/packages/app-distribution/lib/index.ts @@ -28,7 +28,7 @@ import type { AppDistribution, AppDistributionRelease } from './types/app-distri import type { AppDistributionInternal } from './types/internal'; import { version } from './version'; -const nativeModuleName = 'RNFBAppDistributionModule'; +const nativeModuleName = 'NativeRNFBTurboAppDistribution'; function rejectUnsupportedPlatform(): Promise { return Promise.reject( @@ -76,6 +76,7 @@ const config: ModuleConfig = { nativeEvents: false, hasMultiAppSupport: false, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; export const SDK_VERSION = version; diff --git a/packages/app-distribution/lib/types/internal.ts b/packages/app-distribution/lib/types/internal.ts index 35b37ff093..57b85a53bf 100644 --- a/packages/app-distribution/lib/types/internal.ts +++ b/packages/app-distribution/lib/types/internal.ts @@ -9,7 +9,7 @@ export interface RNFBAppDistributionModule { declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBAppDistributionModule: RNFBAppDistributionModule; + NativeRNFBTurboAppDistribution: RNFBAppDistributionModule; } } diff --git a/packages/app-distribution/package.json b/packages/app-distribution/package.json index 6efa1e05c6..995ed56c7b 100644 --- a/packages/app-distribution/package.json +++ b/packages/app-distribution/package.json @@ -5,13 +5,30 @@ "description": "React Native Firebase - App Distribution", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBAppDistributionTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.appdistribution" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboAppDistribution": "RNFBAppDistributionModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "build:plugin": "rimraf plugin/build && tsc --build plugin", "compile": "bob build", "lint:plugin": "eslint plugin/src/*", - "prepare": "yarn run build && yarn compile && yarn run build:plugin" + "prepare": "yarn run build && yarn compile && yarn run build:plugin", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/main/java/io/invertase/firebase/appdistribution/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/app-distribution/react-native.config.js b/packages/app-distribution/react-native.config.js new file mode 100644 index 0000000000..f76c67c9e9 --- /dev/null +++ b/packages/app-distribution/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/main/java/io/invertase/firebase/appdistribution/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/app-distribution/specs/NativeRNFBTurboAppDistribution.ts b/packages/app-distribution/specs/NativeRNFBTurboAppDistribution.ts new file mode 100644 index 0000000000..f5d03b4b6e --- /dev/null +++ b/packages/app-distribution/specs/NativeRNFBTurboAppDistribution.ts @@ -0,0 +1,19 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface AppDistributionRelease { + displayVersion: string; + buildVersion: string; + releaseNotes: string | null; + isExpired: boolean; + downloadURL: string; +} + +export interface Spec extends TurboModule { + isTesterSignedIn(): Promise; + signInTester(): Promise; + signOutTester(): Promise; + checkForUpdate(): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboAppDistribution'); diff --git a/packages/app/RNFBApp.podspec b/packages/app/RNFBApp.podspec index 0f8ca1d42c..7794b7eee4 100644 --- a/packages/app/RNFBApp.podspec +++ b/packages/app/RNFBApp.podspec @@ -22,20 +22,14 @@ Pod::Spec.new do |s| s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target s.cocoapods_version = '>= 1.12.0' - s.source_files = "ios/**/*.{h,m}" + s.source_files = "ios/**/*.{h,m,mm,cpp}" + s.private_header_files = "ios/**/*.h" + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' - # Deprecation message for old architecture users - # - safely in case the variable goes away completely in future react-native versions - # - suppressable in case people need to - if ( - defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && - ENV["RCT_NEW_ARCH_ENABLED"] == '0' && - ENV["RNFB_SUPPRESS_NEW_ARCHITECTURE_WARNING"] != '1' - ) - Pod::UI.puts '[react-native-firebase] '.yellow + "Legacy Architecture support is deprecated for all modules" - Pod::UI.puts '[react-native-firebase] '.yellow + "New Architecture support is already required for some modules" - Pod::UI.puts '[react-native-firebase] '.yellow + "all modules will require it in the future." - Pod::UI.puts '[react-native-firebase] '.yellow + "Suppress this with environment variable RNFB_SUPPRESS_NEW_ARCHITECTURE_WARNING=1" + # Fail fast for old architecture users, but safely in case the variable goes away + # completely in future react-native versions + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end # App must define modules for static framework integration of other packages to work diff --git a/packages/app/__tests__/app.test.ts b/packages/app/__tests__/app.test.ts index a21a03584b..399f21beaa 100644 --- a/packages/app/__tests__/app.test.ts +++ b/packages/app/__tests__/app.test.ts @@ -21,6 +21,12 @@ describe('App', function () { expect(registerVersion).toBeDefined(); }); + it('`registerVersion` throws synchronously on react-native', function () { + expect(() => registerVersion('test-library', '1.0.0')).toThrow( + 'registerVersion is only supported on Web', + ); + }); + it('`onLog` function is properly exposed to end user', function () { expect(onLog).toBeDefined(); }); diff --git a/packages/app/__tests__/harnessCommittedDefaults.test.ts b/packages/app/__tests__/harnessCommittedDefaults.test.ts new file mode 100644 index 0000000000..72b34a2743 --- /dev/null +++ b/packages/app/__tests__/harnessCommittedDefaults.test.ts @@ -0,0 +1,168 @@ +import { readdirSync, readFileSync, statSync } from 'fs'; +import { join } from 'path'; + +import { describe, expect, it } from '@jest/globals'; + +const REPO_ROOT = join(__dirname, '..', '..', '..'); +const GLOBALS_PATH = join(REPO_ROOT, 'tests', 'globals.js'); +const APP_PATH = join(REPO_ROOT, 'tests', 'app.js'); + +/** + * Full platformSupportedModules sets committed in tests/app.js before + * harness.overrides.js filtering. Update deliberately when adding e2e coverage. + */ +const COMMITTED_OTHER_PLATFORM_MODULES = [ + 'app', + 'functions', + 'firestore', + 'database', + 'auth', + 'storage', + 'remoteConfig', + 'analytics', + 'appCheck', + 'ai', +] as const; + +const COMMITTED_NATIVE_PLATFORM_MODULES = [ + 'app', + 'functions', + 'auth', + 'database', + 'firestore', + 'storage', + 'messaging', + 'perf', + 'analytics', + 'remoteConfig', + 'crashlytics', + 'inAppMessaging', + 'installations', + 'appCheck', + 'appDistribution', + 'ml', + 'phoneNumberVerification', + 'ai', +] as const; + +const EXCLUSIVE_TEST_PATTERN = /\b(describe|it|context|specify)\.only\s*\(/; + +function readHarnessSource(path: string): string { + return readFileSync(path, 'utf8'); +} + +function extractPlatformBlock(source: string, condition: string): string { + const start = source.indexOf(condition); + expect(start).toBeGreaterThanOrEqual(0); + + const braceStart = source.indexOf('{', start); + expect(braceStart).toBeGreaterThanOrEqual(0); + + let depth = 0; + for (let index = braceStart; index < source.length; index += 1) { + const char = source[index]; + if (char === '{') { + depth += 1; + } else if (char === '}') { + depth -= 1; + if (depth === 0) { + return source.slice(braceStart + 1, index); + } + } + } + + throw new Error(`Unbalanced braces while parsing platform block for ${condition}`); +} + +function extractPushedModules(blockSource: string): string[] { + const modules: string[] = []; + const pushPattern = /platformSupportedModules\.push\(\s*['"]([^'"]+)['"]\s*\)/g; + + for (const match of blockSource.matchAll(pushPattern)) { + modules.push(match[1]); + } + + return modules; +} + +const TRACKED_TEST_EXTENSIONS = new Set(['.js', '.jsx', '.ts', '.tsx']); + +function collectSourceFiles(rootDir: string, results: string[] = []): string[] { + for (const entry of readdirSync(rootDir, { withFileTypes: true })) { + if (entry.name === 'node_modules') { + continue; + } + + const absolutePath = join(rootDir, entry.name); + if (entry.isDirectory()) { + collectSourceFiles(absolutePath, results); + continue; + } + + const extension = absolutePath.slice(absolutePath.lastIndexOf('.')); + if (TRACKED_TEST_EXTENSIONS.has(extension)) { + results.push(absolutePath); + } + } + + return results; +} + +function listTrackedHarnessTestSources(): string[] { + const testsDir = join(REPO_ROOT, 'tests'); + const packageDirs = readdirSync(join(REPO_ROOT, 'packages'), { withFileTypes: true }) + .filter(entry => entry.isDirectory()) + .map(entry => join(REPO_ROOT, 'packages', entry.name, 'e2e')) + .filter(e2eDir => { + try { + return statSync(e2eDir).isDirectory(); + } catch { + return false; + } + }); + + return [ + ...collectSourceFiles(testsDir).filter(path => !path.endsWith('harness.overrides.js')), + ...packageDirs.flatMap(e2eDir => collectSourceFiles(e2eDir)), + ]; +} + +describe('committed e2e harness defaults (NewArch-AD-13)', function () { + it('keeps RNFBDebug committed default false in tests/globals.js', function () { + const source = readHarnessSource(GLOBALS_PATH); + + expect(source).toMatch( + /globalThis\.RNFBDebug\s*=\s*harnessOverrides\.RNFBDebug\s*\?\?\s*false/, + ); + expect(source).not.toMatch(/globalThis\.RNFBDebug\s*=\s*true/); + }); + + it('keeps full platformSupportedModules for Platform.other before overrides filtering', function () { + const source = readHarnessSource(APP_PATH); + + expect(source).toMatch(/if\s*\(\s*Platform\.other\s*\)/); + expect(source).not.toMatch(/if\s*\(\s*false\s*&&\s*Platform\.other\s*\)/); + + const otherBlock = extractPlatformBlock(source, 'if (Platform.other)'); + expect(extractPushedModules(otherBlock)).toEqual([...COMMITTED_OTHER_PLATFORM_MODULES]); + }); + + it('keeps full platformSupportedModules for native platforms before overrides filtering', function () { + const source = readHarnessSource(APP_PATH); + + expect(source).toMatch(/if\s*\(\s*!Platform\.other\s*\)/); + expect(source).not.toMatch(/if\s*\(\s*false\s*&&\s*!Platform\.other\s*\)/); + + const nativeBlock = extractPlatformBlock(source, 'if (!Platform.other)'); + expect(extractPushedModules(nativeBlock)).toEqual([...COMMITTED_NATIVE_PLATFORM_MODULES]); + }); + + it('does not commit exclusive mocha tests (.only) in tracked harness or e2e sources', function () { + const offenders = listTrackedHarnessTestSources().filter(sourcePath => { + const source = readFileSync(sourcePath, 'utf8'); + return EXCLUSIVE_TEST_PATTERN.test(source); + }); + + expect(offenders).toEqual([]); + }); +}); diff --git a/packages/app/__tests__/nativeModuleContract.test.ts b/packages/app/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..7ae78af58d --- /dev/null +++ b/packages/app/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,91 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { TurboModuleRegistry } from 'react-native'; +import FirebaseModule from '../lib/internal/FirebaseModule'; +import type { ModuleConfig } from '../lib/internal'; +import { getNativeModule } from '../lib/internal/registry/nativeModule'; +import type { WrappedNativeModule } from '../lib/internal/NativeModules'; +import { createTurboModuleFixture } from './turboModuleContractHelper'; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('models TurboModule host: methods non-own on prototype, Object.keys(raw) === []', function () { + const methodA = jest.fn(() => 'a'); + const raw = createTurboModuleFixture({ methodA }, { CONSTANT: 'x' }); + + expect(Object.keys(raw)).toEqual([]); + expect(typeof raw.methodA).toBe('function'); + expect(Object.prototype.hasOwnProperty.call(raw, 'methodA')).toBe(false); + expect((raw.getConstants as () => Record)().CONSTANT).toBe('x'); + }); + + it('exposes every spec method callable through the real wrapper', function () { + const methodA = jest.fn(() => 'ok-a'); + const methodB = jest.fn(() => 'ok-b'); + const raw = createTurboModuleFixture({ methodA, methodB }); + + jest.mocked(TurboModuleRegistry.get).mockReturnValueOnce(raw); + + const config: ModuleConfig = { + namespace: 'contractSingle', + nativeModuleName: 'NativeRNFBTurboContractSingle', + nativeEvents: false, + hasMultiAppSupport: false, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + }; + + class ContractModule extends FirebaseModule { + constructor() { + super({ name: '[DEFAULT]' } as any, config); + } + } + + const wrapped = getNativeModule(new ContractModule()) as WrappedNativeModule & { + methodA: () => string; + methodB: () => string; + }; + + expect(wrapped.methodA()).toBe('ok-a'); + expect(wrapped.methodB()).toBe('ok-b'); + expect(methodA).toHaveBeenCalledTimes(1); + expect(methodB).toHaveBeenCalledTimes(1); + expect(Object.keys(wrapped)).toContain('methodA'); + expect(Object.keys(wrapped)).toContain('methodB'); + }); + + it('routes methods through a 2-host merge composite Proxy (NewArch-AD-14a)', function () { + const hostAMethod = jest.fn(() => 'from-a'); + const hostBMethod = jest.fn(() => 'from-b'); + const hostA = createTurboModuleFixture({ methodFromA: hostAMethod }); + const hostB = createTurboModuleFixture({ methodFromB: hostBMethod }); + + jest.mocked(TurboModuleRegistry.get).mockReturnValueOnce(hostA).mockReturnValueOnce(hostB); + + const config: ModuleConfig = { + namespace: 'contractMerge', + nativeModuleName: ['NativeRNFBTurboContractA', 'NativeRNFBTurboContractB'], + nativeEvents: false, + hasMultiAppSupport: false, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + }; + + class MergeModule extends FirebaseModule { + constructor() { + super({ name: '[DEFAULT]' } as any, config); + } + } + + const wrapped = getNativeModule(new MergeModule()) as WrappedNativeModule & { + methodFromA: () => string; + methodFromB: () => string; + }; + + expect(wrapped.methodFromA()).toBe('from-a'); + expect(wrapped.methodFromB()).toBe('from-b'); + expect(hostAMethod).toHaveBeenCalledTimes(1); + expect(hostBMethod).toHaveBeenCalledTimes(1); + expect('methodFromA' in wrapped).toBe(true); + expect('methodFromB' in wrapped).toBe(true); + expect(Object.keys(wrapped).sort()).toEqual(['methodFromA', 'methodFromB']); + }); +}); diff --git a/packages/app/__tests__/nativeModuleResolver.test.ts b/packages/app/__tests__/nativeModuleResolver.test.ts new file mode 100644 index 0000000000..31f4dc3bd1 --- /dev/null +++ b/packages/app/__tests__/nativeModuleResolver.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { TurboModuleRegistry } from 'react-native'; +import { getReactNativeModule } from '../lib/internal/nativeModuleAndroidIos'; + +describe('getReactNativeModule (NewArch-AD-6 Phase R)', function () { + it('throws when TurboModuleRegistry has no module for the name', function () { + const unknownModule = 'NativeRNFBTurboNonExistentModule'; + jest.mocked(TurboModuleRegistry.get).mockReturnValueOnce(null); + + expect(() => getReactNativeModule(unknownModule)).toThrow( + `Native module ${unknownModule} is not registered.`, + ); + }); +}); diff --git a/packages/app/__tests__/specNativeParityHelper.ts b/packages/app/__tests__/specNativeParityHelper.ts new file mode 100644 index 0000000000..b57c7aee9f --- /dev/null +++ b/packages/app/__tests__/specNativeParityHelper.ts @@ -0,0 +1,292 @@ +import fs from 'fs'; +import path from 'path'; +import ts from 'typescript'; + +const REPO_ROOT = path.resolve(__dirname, '../../..'); + +/** TurboModule infrastructure methods excluded from parity comparison. */ +const EXCLUDED_METHODS = new Set(['getConstants', 'constantsToExport']); + +export const MIGRATED_TURBO_PACKAGES = [ + 'app', + 'firestore', + 'installations', + 'perf', + 'in-app-messaging', + 'app-distribution', + 'ml', + 'app-check', + 'remote-config', + 'analytics', + 'crashlytics', + 'storage', + 'functions', + 'messaging', + 'database', + 'auth', + 'phone-number-verification', +] as const; + +export type MigratedTurboPackage = (typeof MIGRATED_TURBO_PACKAGES)[number]; + +export type SpecParityContext = { + packageName: MigratedTurboPackage; + moduleName: string; + specPath: string; + androidSpecPath: string; + iosHeaderPath: string; +}; + +export type SpecParityContextEntry = { + moduleName: string; + specPath: string; + androidSpecPath: string; + iosHeaderPath: string; +}; + +/** + * Explicit spec/native paths for packages with non-default codegen layout (see + * database/messaging guardrail commits). + */ +export const PACKAGE_SPEC_PARITY_CONTEXTS: Partial< + Record +> = { + auth: [ + { + moduleName: 'NativeRNFBTurboAuth', + specPath: 'packages/auth/specs/NativeRNFBTurboAuth.ts', + androidSpecPath: + 'packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAuthSpec.java', + iosHeaderPath: 'packages/auth/ios/generated/RNFBAuthTurboModules/RNFBAuthTurboModules.h', + }, + ], + 'phone-number-verification': [ + { + moduleName: 'NativeRNFBTurboPnv', + specPath: 'packages/phone-number-verification/specs/NativeRNFBTurboPnv.ts', + androidSpecPath: + 'packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboPnvSpec.java', + iosHeaderPath: + 'packages/phone-number-verification/ios/generated/RNFBPnvTurboModules/RNFBPnvTurboModules.h', + }, + ], +}; +export function extractSpecMethods(specContent: string, fileName = 'spec.ts'): string[] { + const sourceFile = ts.createSourceFile( + fileName, + specContent, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS, + ); + + let specInterface: ts.InterfaceDeclaration | undefined; + + const visit = (node: ts.Node): void => { + if (ts.isInterfaceDeclaration(node) && node.name.text === 'Spec') { + specInterface = node; + return; + } + ts.forEachChild(node, visit); + }; + + visit(sourceFile); + + if (!specInterface) { + throw new Error('Could not find Spec interface'); + } + + const methods: string[] = []; + + for (const member of specInterface.members) { + if (!ts.isMethodSignature(member)) { + continue; + } + + const name = member.name; + if (!ts.isIdentifier(name)) { + continue; + } + + const methodName = name.text; + if (!EXCLUDED_METHODS.has(methodName)) { + methods.push(methodName); + } + } + + return sortUnique(methods); +} + +export function extractAndroidReactMethods(javaContent: string): string[] { + const methods: string[] = []; + const methodRegex = + /@ReactMethod(?:\([^)]*\))?\s+(?:@DoNotStrip\s+)?public abstract [\w.]+ (\w+)\s*\(/g; + let match = methodRegex.exec(javaContent); + while (match) { + const name = match[1]; + if (!EXCLUDED_METHODS.has(name)) { + methods.push(name); + } + match = methodRegex.exec(javaContent); + } + + return sortUnique(methods); +} + +/** ObjC TurboModule protocol methods from generated RNFB*TurboModules.h headers. */ +export function extractIosTurboMethods(headerContent: string, moduleName: string): string[] { + const protocolName = `${moduleName}Spec`; + const start = headerContent.indexOf(`@protocol ${protocolName}`); + if (start === -1) { + throw new Error(`Could not find @protocol ${protocolName}`); + } + + const end = headerContent.indexOf('\n@end', start); + if (end === -1) { + throw new Error(`Could not find @end for @protocol ${protocolName}`); + } + + const block = headerContent.slice(start, end); + const methods: string[] = []; + const methodRegex = /- \([^)]+\)(\w+)(?::|;)/g; + let match = methodRegex.exec(block); + while (match) { + const name = match[1]; + if (!EXCLUDED_METHODS.has(name)) { + methods.push(name); + } + match = methodRegex.exec(block); + } + + return sortUnique(methods); +} + +function sortUnique(values: string[]): string[] { + return [...new Set(values)].sort(); +} + +function readFileOrThrow(filePath: string): string { + if (!fs.existsSync(filePath)) { + throw new Error(`Missing file: ${filePath}`); + } + return fs.readFileSync(filePath, 'utf8'); +} + +function findSingleMatch(rootDir: string, pattern: RegExp, label: string): string { + const matches: string[] = []; + + function walk(dir: string): void { + if (!fs.existsSync(dir)) { + return; + } + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + walk(fullPath); + } else if (pattern.test(entry.name)) { + matches.push(fullPath); + } + } + } + + walk(rootDir); + + if (matches.length !== 1) { + throw new Error( + `${label}: expected exactly one match under ${rootDir}, found ${matches.length}${ + matches.length ? `: ${matches.join(', ')}` : '' + }`, + ); + } + + return matches[0]; +} + +function resolveParityContext( + packageName: MigratedTurboPackage, + entry: SpecParityContextEntry, +): SpecParityContext { + return { + packageName, + moduleName: entry.moduleName, + specPath: path.join(REPO_ROOT, entry.specPath), + androidSpecPath: path.join(REPO_ROOT, entry.androidSpecPath), + iosHeaderPath: path.join(REPO_ROOT, entry.iosHeaderPath), + }; +} + +export function discoverPackageSpecContexts( + packageName: MigratedTurboPackage, +): SpecParityContext[] { + const explicitContexts = PACKAGE_SPEC_PARITY_CONTEXTS[packageName]; + if (explicitContexts?.length) { + return explicitContexts.map(entry => resolveParityContext(packageName, entry)); + } + + const packageDir = path.join(REPO_ROOT, 'packages', packageName); + const specsDir = path.join(packageDir, 'specs'); + const specFiles = fs + .readdirSync(specsDir) + .filter(file => file.startsWith('NativeRNFBTurbo') && file.endsWith('.ts')) + .sort(); + + const iosHeaderPath = findSingleMatch( + path.join(packageDir, 'ios'), + /^RNFB.*TurboModules\.h$/, + `${packageName} iOS TurboModules header`, + ); + + return specFiles.map(specFile => { + const moduleName = specFile.replace(/\.ts$/, ''); + const androidSpecPath = findSingleMatch( + path.join(packageDir, 'android'), + new RegExp(`^${moduleName}Spec\\.java$`), + `${packageName} Android spec for ${moduleName}`, + ); + + return { + packageName, + moduleName, + specPath: path.join(specsDir, specFile), + androidSpecPath, + iosHeaderPath, + }; + }); +} + +export function collectSpecNativeParity(context: SpecParityContext): { + spec: string[]; + android: string[]; + ios: string[]; + nativeUnion: string[]; +} { + const spec = extractSpecMethods( + readFileOrThrow(context.specPath), + path.basename(context.specPath), + ); + const android = extractAndroidReactMethods(readFileOrThrow(context.androidSpecPath)); + const ios = extractIosTurboMethods(readFileOrThrow(context.iosHeaderPath), context.moduleName); + const nativeUnion = sortUnique([...android, ...ios]); + + return { spec, android, ios, nativeUnion }; +} + +export function diffSets(left: string[], right: string[]): { missing: string[]; extra: string[] } { + const leftSet = new Set(left); + const rightSet = new Set(right); + return { + missing: left.filter(name => !rightSet.has(name)), + extra: right.filter(name => !leftSet.has(name)), + }; +} + +export function formatSetDiff(label: string, diff: { missing: string[]; extra: string[] }): string { + const parts: string[] = []; + if (diff.missing.length) { + parts.push(`${label} missing: ${diff.missing.join(', ')}`); + } + if (diff.extra.length) { + parts.push(`${label} extra: ${diff.extra.join(', ')}`); + } + return parts.join('; '); +} diff --git a/packages/app/__tests__/turboModuleContractHelper.ts b/packages/app/__tests__/turboModuleContractHelper.ts new file mode 100644 index 0000000000..faf2b70b19 --- /dev/null +++ b/packages/app/__tests__/turboModuleContractHelper.ts @@ -0,0 +1,97 @@ +import { expect, jest } from '@jest/globals'; +import { TurboModuleRegistry } from 'react-native'; +import type { ModuleConfig } from '@react-native-firebase/app/dist/module/internal'; +import FirebaseModule from '@react-native-firebase/app/dist/module/internal/FirebaseModule'; +import { getNativeModule } from '@react-native-firebase/app/dist/module/internal/registry/nativeModule'; +import type { WrappedNativeModule } from '@react-native-firebase/app/dist/module/internal/NativeModules'; + +export function createTurboModuleFixture( + methods: Record = {}, + constants: Record = {}, +): Record { + const proto = Object.create(Object.prototype, { + getConstants: { + value: () => constants, + enumerable: true, + }, + }); + + for (const [name, fn] of Object.entries(methods)) { + Object.defineProperty(proto, name, { + value: fn, + enumerable: true, + configurable: true, + }); + } + + return Object.create(proto); +} + +export type TurboContractConfig = ModuleConfig & { + specMethods: readonly string[]; + createMock?: (method: string) => jest.Mock; + constants?: Record; + customizeRaw?: (raw: Record, mocks: Record) => void; + customUrlOrRegion?: string | null; + assertExtra?: ( + wrapped: WrappedNativeModule & Record, + mocks: Record, + ) => void; +}; + +export type TurboMethodFixtures = Partial< + Record< + string, + (wrapped: WrappedNativeModule & Record unknown>) => void + > +>; + +export function assertTurboContract( + config: TurboContractConfig, + methodFixtures: TurboMethodFixtures = {}, +): { + wrapped: WrappedNativeModule & Record; + mocks: Record; +} { + const { + specMethods, + createMock, + constants, + customizeRaw, + customUrlOrRegion, + assertExtra, + ...moduleConfig + } = config; + + const mocks = Object.fromEntries( + specMethods.map(method => [method, createMock ? createMock(method) : jest.fn()]), + ) as Record; + + const raw = createTurboModuleFixture(mocks, constants ?? {}); + customizeRaw?.(raw, mocks); + jest.mocked(TurboModuleRegistry.get).mockReturnValueOnce(raw); + + class ContractModule extends FirebaseModule { + constructor() { + super({ name: '[DEFAULT]' } as any, moduleConfig, customUrlOrRegion); + } + } + + const wrapped = getNativeModule(new ContractModule()) as WrappedNativeModule & + Record unknown>; + + for (const method of specMethods) { + const invoke = methodFixtures[method]; + if (invoke) { + invoke(wrapped); + } else { + void wrapped[method](); + } + expect(mocks[method]).toHaveBeenCalledTimes(1); + expect(Object.keys(wrapped)).toContain(method); + } + + assertExtra?.(wrapped, mocks); + + return { wrapped, mocks }; +} diff --git a/packages/app/__tests__/turboModuleSpecNativeParity.test.ts b/packages/app/__tests__/turboModuleSpecNativeParity.test.ts new file mode 100644 index 0000000000..db87c70f52 --- /dev/null +++ b/packages/app/__tests__/turboModuleSpecNativeParity.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from '@jest/globals'; +import { + MIGRATED_TURBO_PACKAGES, + collectSpecNativeParity, + diffSets, + discoverPackageSpecContexts, + formatSetDiff, +} from './specNativeParityHelper'; + +describe('Spec↔native parity (NewArch-AD-17.2)', function () { + for (const packageName of MIGRATED_TURBO_PACKAGES) { + describe(packageName, function () { + const contexts = discoverPackageSpecContexts(packageName); + + it('has no duplicate method names across package specs (NewArch-AD-11)', function () { + const allMethods = contexts.flatMap(context => collectSpecNativeParity(context).spec); + expect(new Set(allMethods).size).toBe(allMethods.length); + }); + + for (const context of contexts) { + it(`${context.moduleName} spec matches Android @ReactMethod + iOS TurboModule protocol`, function () { + const { spec, android, ios, nativeUnion } = collectSpecNativeParity(context); + + const specVsUnion = diffSets(spec, nativeUnion); + expect(specVsUnion).toEqual({ missing: [], extra: [] }); + + const specVsAndroid = diffSets(spec, android); + const specVsIos = diffSets(spec, ios); + + if (specVsUnion.missing.length || specVsUnion.extra.length) { + throw new Error( + [ + `${context.packageName}/${context.moduleName} parity mismatch`, + formatSetDiff('spec vs native union', specVsUnion), + formatSetDiff('spec vs android', specVsAndroid), + formatSetDiff('spec vs ios', specVsIos), + ] + .filter(Boolean) + .join('\n'), + ); + } + + expect(android).toEqual(spec); + expect(ios).toEqual(spec); + expect(nativeUnion).toEqual(spec); + }); + } + }); + } +}); diff --git a/packages/app/android/build.gradle b/packages/app/android/build.gradle index 1f1e8a06fb..5b8e2eefa5 100644 --- a/packages/app/android/build.gradle +++ b/packages/app/android/build.gradle @@ -92,6 +92,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -132,12 +133,16 @@ def isNewArchitectureDisabled() { return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" } -if (isNewArchitectureDisabled() && System.getenv('RNFB_SUPPRESS_NEW_ARCHITECTURE_WARNING') != 1) { - def ANSI_YELLOW = "\u001B[33m"; +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; def ANSI_RESET = "\u001B[0m"; - println(ANSI_YELLOW + " [react-native-firebase] Legacy Architecture support is deprecated for all modules") - println(ANSI_YELLOW + " [react-native-firebase] New Architecture support is already required for some modules") - println(ANSI_YELLOW + " [react-native-firebase] all modules will require it in the future.") - println(ANSI_YELLOW + " [react-native-firebase] Suppress this with environment variable RNFB_SUPPRESS_NEW_ARCHITECTURE_WARNING=1" + ANSI_RESET) + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/app") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) } diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java new file mode 100644 index 0000000000..af52527362 --- /dev/null +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java @@ -0,0 +1,188 @@ +package io.invertase.firebase.app; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import android.util.Log; +import com.facebook.fbreact.specs.NativeRNFBTurboAppSpec; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableMap; +import com.google.firebase.FirebaseApp; +import io.invertase.firebase.common.RCTConvertFirebase; +import io.invertase.firebase.common.ReactNativeFirebaseEvent; +import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter; +import io.invertase.firebase.common.ReactNativeFirebaseJSON; +import io.invertase.firebase.common.ReactNativeFirebaseMeta; +import io.invertase.firebase.common.ReactNativeFirebasePreferences; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class NativeRNFBTurboApp extends NativeRNFBTurboAppSpec { + private static final String TAG = "App"; + + public static Map authDomains = new HashMap<>(); + + NativeRNFBTurboApp(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public void initialize() { + super.initialize(); + ReactNativeFirebaseEventEmitter.getSharedInstance() + .attachReactContext(getReactApplicationContext()); + } + + @Override + protected Map getTypedExportedConstants() { + Map constants = new HashMap<>(); + List> appsList = new ArrayList<>(); + List firebaseApps = FirebaseApp.getApps(getReactApplicationContext()); + + for (FirebaseApp app : firebaseApps) { + appsList.add(RCTConvertFirebase.firebaseAppToMap(app)); + } + + constants.put("NATIVE_FIREBASE_APPS", appsList); + constants.put("FIREBASE_RAW_JSON", ReactNativeFirebaseJSON.getSharedInstance().getRawJSON()); + + return constants; + } + + @Override + public void initializeApp(ReadableMap options, ReadableMap appConfig, Promise promise) { + FirebaseApp firebaseApp = + RCTConvertFirebase.readableMapToFirebaseApp( + options, appConfig, getReactApplicationContext()); + NativeRNFBTurboApp.configureAuthDomain( + appConfig.getString("name"), options.getString("authDomain")); + + WritableMap firebaseAppMap = RCTConvertFirebase.firebaseAppToWritableMap(firebaseApp); + promise.resolve(firebaseAppMap); + } + + public static void configureAuthDomain(String name, String authDomain) { + if (authDomain != null) { + Log.d(TAG, name + " custom authDomain " + authDomain); + authDomains.put(name, authDomain); + } else { + authDomains.remove(name); + } + } + + @Override + public void setAutomaticDataCollectionEnabled(String appName, boolean enabled) { + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); + firebaseApp.setDataCollectionDefaultEnabled(enabled); + } + + @Override + public void deleteApp(String appName, Promise promise) { + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); + + if (firebaseApp != null) { + firebaseApp.delete(); + } + + promise.resolve(null); + } + + @Override + public void eventsNotifyReady(boolean ready) { + ReactNativeFirebaseEventEmitter emitter = ReactNativeFirebaseEventEmitter.getSharedInstance(); + emitter.notifyJsReady(ready); + } + + @Override + public void eventsGetListeners(Promise promise) { + ReactNativeFirebaseEventEmitter emitter = ReactNativeFirebaseEventEmitter.getSharedInstance(); + promise.resolve(emitter.getListenersMap()); + } + + @Override + public void eventsPing(String eventName, ReadableMap eventBody, Promise promise) { + ReactNativeFirebaseEventEmitter emitter = ReactNativeFirebaseEventEmitter.getSharedInstance(); + emitter.sendEvent( + new ReactNativeFirebaseEvent( + eventName, RCTConvertFirebase.readableMapToWritableMap(eventBody))); + promise.resolve(RCTConvertFirebase.readableMapToWritableMap(eventBody)); + } + + @Override + public void eventsAddListener(String eventName) { + ReactNativeFirebaseEventEmitter emitter = ReactNativeFirebaseEventEmitter.getSharedInstance(); + emitter.addListener(eventName); + } + + @Override + public void eventsRemoveListener(String eventName, boolean all) { + ReactNativeFirebaseEventEmitter emitter = ReactNativeFirebaseEventEmitter.getSharedInstance(); + emitter.removeListener(eventName, all); + } + + @Override + public void addListener(String eventName) { + // Keep: Required for RN built in Event Emitter Calls. + } + + @Override + public void removeListeners(double count) { + // Keep: Required for RN built in Event Emitter Calls. + } + + @Override + public void metaGetAll(Promise promise) { + promise.resolve(ReactNativeFirebaseMeta.getSharedInstance().getAll()); + } + + @Override + public void jsonGetAll(Promise promise) { + promise.resolve(ReactNativeFirebaseJSON.getSharedInstance().getAll()); + } + + @Override + public void preferencesSetBool(String key, boolean value, Promise promise) { + ReactNativeFirebasePreferences.getSharedInstance().setBooleanValue(key, value); + promise.resolve(null); + } + + @Override + public void preferencesSetString(String key, String value, Promise promise) { + ReactNativeFirebasePreferences.getSharedInstance().setStringValue(key, value); + promise.resolve(null); + } + + @Override + public void preferencesGetAll(Promise promise) { + promise.resolve(ReactNativeFirebasePreferences.getSharedInstance().getAll()); + } + + @Override + public void preferencesClearAll(Promise promise) { + ReactNativeFirebasePreferences.getSharedInstance().clearAll(); + promise.resolve(null); + } + + @Override + public void setLogLevel(String logLevel) { + // Android uses Firebase SDK log level via manifest; no-op at runtime. + } +} diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppModule.java b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppModule.java index bc9918f8dc..7efc7cfef7 100644 --- a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppModule.java +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppModule.java @@ -17,7 +17,6 @@ * */ -import android.util.Log; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactMethod; @@ -39,8 +38,6 @@ public class ReactNativeFirebaseAppModule extends ReactNativeFirebaseModule { private static final String TAG = "App"; - public static Map authDomains = new HashMap<>(); - ReactNativeFirebaseAppModule(ReactApplicationContext reactContext) { super(reactContext, TAG); } @@ -63,12 +60,7 @@ public void initializeApp(ReadableMap options, ReadableMap appConfig, Promise pr } public static void configureAuthDomain(String name, String authDomain) { - if (authDomain != null) { - Log.d(TAG, name + " custom authDomain " + authDomain); - authDomains.put(name, authDomain); - } else { - authDomains.remove(name); - } + NativeRNFBTurboApp.configureAuthDomain(name, authDomain); } @ReactMethod diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java index fe7245f39a..03b0b822ba 100644 --- a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java @@ -21,7 +21,7 @@ import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; -import io.invertase.firebase.utils.ReactNativeFirebaseUtilsModule; +import io.invertase.firebase.utils.NativeRNFBTurboUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -36,8 +36,8 @@ public List createNativeModules(@Nonnull ReactApplicationContext r ReactNativeFirebaseApp.setApplicationContext(reactContext.getApplicationContext()); } List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseAppModule(reactContext)); - modules.add(new ReactNativeFirebaseUtilsModule(reactContext)); + modules.add(new NativeRNFBTurboApp(reactContext)); + modules.add(new NativeRNFBTurboUtils(reactContext)); return modules; } diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAppSpec.java b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAppSpec.java new file mode 100644 index 0000000000..a13ee58e77 --- /dev/null +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAppSpec.java @@ -0,0 +1,136 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboAppSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboApp"; + + public NativeRNFBTurboAppSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + protected abstract Map getTypedExportedConstants(); + + @Override + @DoNotStrip + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "FIREBASE_RAW_JSON", + "NATIVE_FIREBASE_APPS" + )); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } + + @ReactMethod + @DoNotStrip + public abstract void initializeApp(ReadableMap options, ReadableMap appConfig, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setAutomaticDataCollectionEnabled(String appName, boolean enabled); + + @ReactMethod + @DoNotStrip + public abstract void deleteApp(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void eventsNotifyReady(boolean ready); + + @ReactMethod + @DoNotStrip + public abstract void eventsGetListeners(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void eventsPing(String eventName, ReadableMap eventBody, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void eventsAddListener(String eventName); + + @ReactMethod + @DoNotStrip + public abstract void eventsRemoveListener(String eventName, boolean all); + + @ReactMethod + @DoNotStrip + public abstract void addListener(String eventName); + + @ReactMethod + @DoNotStrip + public abstract void removeListeners(double count); + + @ReactMethod + @DoNotStrip + public abstract void metaGetAll(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void jsonGetAll(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void preferencesSetBool(String key, boolean value, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void preferencesSetString(String key, String value, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void preferencesGetAll(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void preferencesClearAll(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setLogLevel(String logLevel); +} diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboUtilsSpec.java b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboUtilsSpec.java new file mode 100644 index 0000000000..1f6cb833bf --- /dev/null +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboUtilsSpec.java @@ -0,0 +1,94 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboUtilsSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboUtils"; + + public NativeRNFBTurboUtilsSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + protected abstract Map getTypedExportedConstants(); + + @Override + @DoNotStrip + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "CACHES_DIRECTORY", + "DOCUMENT_DIRECTORY", + "LIBRARY_DIRECTORY", + "MAIN_BUNDLE", + "MOVIES_DIRECTORY", + "PICTURES_DIRECTORY", + "TEMP_DIRECTORY", + "isRunningInTestLab" + )); + Set optionalFlowConstants = new HashSet<>(Arrays.asList( + "EXTERNAL_DIRECTORY", + "EXTERNAL_STORAGE_DIRECTORY", + "FILE_TYPE_DIRECTORY", + "FILE_TYPE_REGULAR" + )); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } + + @ReactMethod + @DoNotStrip + public abstract void androidGetPlayServicesStatus(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void androidPromptForPlayServices(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void androidResolutionForPlayServices(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void androidMakePlayServicesAvailable(Promise promise); +} diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/CMakeLists.txt b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..f9c2aa3646 --- /dev/null +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBAppTurboModules/*.cpp) + +add_library( + react_codegen_RNFBAppTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBAppTurboModules PUBLIC . react/renderer/components/RNFBAppTurboModules) + +target_link_libraries( + react_codegen_RNFBAppTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBAppTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/RNFBAppTurboModules-generated.cpp b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/RNFBAppTurboModules-generated.cpp new file mode 100644 index 0000000000..763f2c8625 --- /dev/null +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/RNFBAppTurboModules-generated.cpp @@ -0,0 +1,170 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBAppTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "getConstants", "()Ljava/util/Map;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_initializeApp(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "initializeApp", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_setAutomaticDataCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "setAutomaticDataCollectionEnabled", "(Ljava/lang/String;Z)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_deleteApp(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "deleteApp", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsNotifyReady(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "eventsNotifyReady", "(Z)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsGetListeners(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "eventsGetListeners", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsPing(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "eventsPing", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsAddListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "eventsAddListener", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsRemoveListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "eventsRemoveListener", "(Ljava/lang/String;Z)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_addListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "addListener", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_removeListeners(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeListeners", "(D)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_metaGetAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "metaGetAll", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_jsonGetAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "jsonGetAll", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesSetBool(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "preferencesSetBool", "(Ljava/lang/String;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesSetString(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "preferencesSetString", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesGetAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "preferencesGetAll", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesClearAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "preferencesClearAll", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_setLogLevel(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "setLogLevel", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboAppSpecJSI::NativeRNFBTurboAppSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_getConstants}; + methodMap_["initializeApp"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_initializeApp}; + methodMap_["setAutomaticDataCollectionEnabled"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_setAutomaticDataCollectionEnabled}; + methodMap_["deleteApp"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_deleteApp}; + methodMap_["eventsNotifyReady"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsNotifyReady}; + methodMap_["eventsGetListeners"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsGetListeners}; + methodMap_["eventsPing"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsPing}; + methodMap_["eventsAddListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsAddListener}; + methodMap_["eventsRemoveListener"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsRemoveListener}; + methodMap_["addListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_addListener}; + methodMap_["removeListeners"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_removeListeners}; + methodMap_["metaGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_metaGetAll}; + methodMap_["jsonGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_jsonGetAll}; + methodMap_["preferencesSetBool"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesSetBool}; + methodMap_["preferencesSetString"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesSetString}; + methodMap_["preferencesGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesGetAll}; + methodMap_["preferencesClearAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesClearAll}; + methodMap_["setLogLevel"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_setLogLevel}; +} +static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "getConstants", "()Ljava/util/Map;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidGetPlayServicesStatus(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "androidGetPlayServicesStatus", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidPromptForPlayServices(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "androidPromptForPlayServices", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidResolutionForPlayServices(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "androidResolutionForPlayServices", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidMakePlayServicesAvailable(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "androidMakePlayServicesAvailable", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboUtilsSpecJSI::NativeRNFBTurboUtilsSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_getConstants}; + methodMap_["androidGetPlayServicesStatus"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidGetPlayServicesStatus}; + methodMap_["androidPromptForPlayServices"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidPromptForPlayServices}; + methodMap_["androidResolutionForPlayServices"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidResolutionForPlayServices}; + methodMap_["androidMakePlayServicesAvailable"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidMakePlayServicesAvailable}; +} + +std::shared_ptr RNFBAppTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboApp") { + return std::make_shared(params); + } + if (moduleName == "NativeRNFBTurboUtils") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/RNFBAppTurboModules.h b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/RNFBAppTurboModules.h new file mode 100644 index 0000000000..8f4b523751 --- /dev/null +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/RNFBAppTurboModules.h @@ -0,0 +1,39 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboApp' + */ +class JSI_EXPORT NativeRNFBTurboAppSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboAppSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + +/** + * JNI C++ class for module 'NativeRNFBTurboUtils' + */ +class JSI_EXPORT NativeRNFBTurboUtilsSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboUtilsSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBAppTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/react/renderer/components/RNFBAppTurboModules/RNFBAppTurboModulesJSI-generated.cpp b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/react/renderer/components/RNFBAppTurboModules/RNFBAppTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..1fab136ed3 --- /dev/null +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/react/renderer/components/RNFBAppTurboModules/RNFBAppTurboModulesJSI-generated.cpp @@ -0,0 +1,187 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAppTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_initializeApp(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initializeApp( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_setAutomaticDataCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setAutomaticDataCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_deleteApp(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteApp( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsNotifyReady(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->eventsNotifyReady( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsGetListeners(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->eventsGetListeners( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsPing(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->eventsPing( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsAddListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->eventsAddListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsRemoveListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->eventsRemoveListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_addListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_removeListeners(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeListeners( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_metaGetAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->metaGetAll( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_jsonGetAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->jsonGetAll( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesSetBool(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->preferencesSetBool( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesSetString(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->preferencesSetString( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesGetAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->preferencesGetAll( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesClearAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->preferencesClearAll( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_setLogLevel(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setLogLevel( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboAppCxxSpecJSI::NativeRNFBTurboAppCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboApp", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_getConstants}; + methodMap_["initializeApp"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_initializeApp}; + methodMap_["setAutomaticDataCollectionEnabled"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_setAutomaticDataCollectionEnabled}; + methodMap_["deleteApp"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_deleteApp}; + methodMap_["eventsNotifyReady"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsNotifyReady}; + methodMap_["eventsGetListeners"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsGetListeners}; + methodMap_["eventsPing"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsPing}; + methodMap_["eventsAddListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsAddListener}; + methodMap_["eventsRemoveListener"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsRemoveListener}; + methodMap_["addListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_addListener}; + methodMap_["removeListeners"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_removeListeners}; + methodMap_["metaGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_metaGetAll}; + methodMap_["jsonGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_jsonGetAll}; + methodMap_["preferencesSetBool"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesSetBool}; + methodMap_["preferencesSetString"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesSetString}; + methodMap_["preferencesGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesGetAll}; + methodMap_["preferencesClearAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesClearAll}; + methodMap_["setLogLevel"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_setLogLevel}; +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidGetPlayServicesStatus(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->androidGetPlayServicesStatus( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidPromptForPlayServices(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->androidPromptForPlayServices( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidResolutionForPlayServices(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->androidResolutionForPlayServices( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidMakePlayServicesAvailable(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->androidMakePlayServicesAvailable( + rt + ); +} + +NativeRNFBTurboUtilsCxxSpecJSI::NativeRNFBTurboUtilsCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboUtils", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_getConstants}; + methodMap_["androidGetPlayServicesStatus"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidGetPlayServicesStatus}; + methodMap_["androidPromptForPlayServices"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidPromptForPlayServices}; + methodMap_["androidResolutionForPlayServices"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidResolutionForPlayServices}; + methodMap_["androidMakePlayServicesAvailable"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidMakePlayServicesAvailable}; +} + + +} // namespace facebook::react diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/react/renderer/components/RNFBAppTurboModules/RNFBAppTurboModulesJSI.h b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/react/renderer/components/RNFBAppTurboModules/RNFBAppTurboModulesJSI.h new file mode 100644 index 0000000000..2a25d7e6e9 --- /dev/null +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/app/generated/jni/react/renderer/components/RNFBAppTurboModules/RNFBAppTurboModulesJSI.h @@ -0,0 +1,606 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboAppFirebaseAppConfig + +template +struct NativeRNFBTurboAppFirebaseAppConfig { + P0 name; + P1 automaticResourceManagement; + P2 automaticDataCollectionEnabled; + bool operator==(const NativeRNFBTurboAppFirebaseAppConfig &other) const { + return name == other.name && automaticResourceManagement == other.automaticResourceManagement && automaticDataCollectionEnabled == other.automaticDataCollectionEnabled; + } +}; + +template +struct NativeRNFBTurboAppFirebaseAppConfigBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "name"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "automaticResourceManagement"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "automaticDataCollectionEnabled"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } + + static bool automaticResourceManagementToJs(jsi::Runtime &rt, decltype(types.automaticResourceManagement) value) { + return bridging::toJs(rt, value); + } + + static bool automaticDataCollectionEnabledToJs(jsi::Runtime &rt, decltype(types.automaticDataCollectionEnabled) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "name", bridging::toJs(rt, value.name, jsInvoker)); + if (value.automaticResourceManagement) { + result.setProperty(rt, "automaticResourceManagement", bridging::toJs(rt, value.automaticResourceManagement.value(), jsInvoker)); + } + if (value.automaticDataCollectionEnabled) { + result.setProperty(rt, "automaticDataCollectionEnabled", bridging::toJs(rt, value.automaticDataCollectionEnabled.value(), jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboAppFirebaseAppOptions + +template +struct NativeRNFBTurboAppFirebaseAppOptions { + P0 apiKey; + P1 appId; + P2 databaseURL; + P3 messagingSenderId; + P4 projectId; + P5 storageBucket; + P6 authDomain; + P7 iosBundleId; + P8 iosClientId; + P9 appGroupId; + bool operator==(const NativeRNFBTurboAppFirebaseAppOptions &other) const { + return apiKey == other.apiKey && appId == other.appId && databaseURL == other.databaseURL && messagingSenderId == other.messagingSenderId && projectId == other.projectId && storageBucket == other.storageBucket && authDomain == other.authDomain && iosBundleId == other.iosBundleId && iosClientId == other.iosClientId && appGroupId == other.appGroupId; + } +}; + +template +struct NativeRNFBTurboAppFirebaseAppOptionsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "apiKey"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "appId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "databaseURL"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "messagingSenderId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "projectId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "storageBucket"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "authDomain"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "iosBundleId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "iosClientId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "appGroupId"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String apiKeyToJs(jsi::Runtime &rt, decltype(types.apiKey) value) { + return bridging::toJs(rt, value); + } + + static jsi::String appIdToJs(jsi::Runtime &rt, decltype(types.appId) value) { + return bridging::toJs(rt, value); + } + + static std::optional databaseURLToJs(jsi::Runtime &rt, decltype(types.databaseURL) value) { + return bridging::toJs(rt, value); + } + + static jsi::String messagingSenderIdToJs(jsi::Runtime &rt, decltype(types.messagingSenderId) value) { + return bridging::toJs(rt, value); + } + + static jsi::String projectIdToJs(jsi::Runtime &rt, decltype(types.projectId) value) { + return bridging::toJs(rt, value); + } + + static std::optional storageBucketToJs(jsi::Runtime &rt, decltype(types.storageBucket) value) { + return bridging::toJs(rt, value); + } + + static std::optional authDomainToJs(jsi::Runtime &rt, decltype(types.authDomain) value) { + return bridging::toJs(rt, value); + } + + static std::optional iosBundleIdToJs(jsi::Runtime &rt, decltype(types.iosBundleId) value) { + return bridging::toJs(rt, value); + } + + static std::optional iosClientIdToJs(jsi::Runtime &rt, decltype(types.iosClientId) value) { + return bridging::toJs(rt, value); + } + + static std::optional appGroupIdToJs(jsi::Runtime &rt, decltype(types.appGroupId) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "apiKey", bridging::toJs(rt, value.apiKey, jsInvoker)); + result.setProperty(rt, "appId", bridging::toJs(rt, value.appId, jsInvoker)); + if (value.databaseURL) { + result.setProperty(rt, "databaseURL", bridging::toJs(rt, value.databaseURL.value(), jsInvoker)); + } + result.setProperty(rt, "messagingSenderId", bridging::toJs(rt, value.messagingSenderId, jsInvoker)); + result.setProperty(rt, "projectId", bridging::toJs(rt, value.projectId, jsInvoker)); + if (value.storageBucket) { + result.setProperty(rt, "storageBucket", bridging::toJs(rt, value.storageBucket.value(), jsInvoker)); + } + if (value.authDomain) { + result.setProperty(rt, "authDomain", bridging::toJs(rt, value.authDomain.value(), jsInvoker)); + } + if (value.iosBundleId) { + result.setProperty(rt, "iosBundleId", bridging::toJs(rt, value.iosBundleId.value(), jsInvoker)); + } + if (value.iosClientId) { + result.setProperty(rt, "iosClientId", bridging::toJs(rt, value.iosClientId.value(), jsInvoker)); + } + if (value.appGroupId) { + result.setProperty(rt, "appGroupId", bridging::toJs(rt, value.appGroupId.value(), jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboAppNativeFirebaseApp + +template +struct NativeRNFBTurboAppNativeFirebaseApp { + P0 appConfig; + P1 options; + bool operator==(const NativeRNFBTurboAppNativeFirebaseApp &other) const { + return appConfig == other.appConfig && options == other.options; + } +}; + +template +struct NativeRNFBTurboAppNativeFirebaseAppBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "appConfig"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "options"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object appConfigToJs(jsi::Runtime &rt, decltype(types.appConfig) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object optionsToJs(jsi::Runtime &rt, decltype(types.options) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "appConfig", bridging::toJs(rt, value.appConfig, jsInvoker)); + result.setProperty(rt, "options", bridging::toJs(rt, value.options, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboAppCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAppCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value initializeApp(jsi::Runtime &rt, jsi::Object options, jsi::Object appConfig) = 0; + virtual void setAutomaticDataCollectionEnabled(jsi::Runtime &rt, jsi::String appName, bool enabled) = 0; + virtual jsi::Value deleteApp(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void eventsNotifyReady(jsi::Runtime &rt, bool ready) = 0; + virtual jsi::Value eventsGetListeners(jsi::Runtime &rt) = 0; + virtual jsi::Value eventsPing(jsi::Runtime &rt, jsi::String eventName, jsi::Object eventBody) = 0; + virtual void eventsAddListener(jsi::Runtime &rt, jsi::String eventName) = 0; + virtual void eventsRemoveListener(jsi::Runtime &rt, jsi::String eventName, bool all) = 0; + virtual void addListener(jsi::Runtime &rt, jsi::String eventName) = 0; + virtual void removeListeners(jsi::Runtime &rt, double count) = 0; + virtual jsi::Value metaGetAll(jsi::Runtime &rt) = 0; + virtual jsi::Value jsonGetAll(jsi::Runtime &rt) = 0; + virtual jsi::Value preferencesSetBool(jsi::Runtime &rt, jsi::String key, bool value) = 0; + virtual jsi::Value preferencesSetString(jsi::Runtime &rt, jsi::String key, jsi::String value) = 0; + virtual jsi::Value preferencesGetAll(jsi::Runtime &rt) = 0; + virtual jsi::Value preferencesClearAll(jsi::Runtime &rt) = 0; + virtual void setLogLevel(jsi::Runtime &rt, jsi::String logLevel) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAppCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboApp"; + +protected: + NativeRNFBTurboAppCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAppCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAppCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAppCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value initializeApp(jsi::Runtime &rt, jsi::Object options, jsi::Object appConfig) override { + static_assert( + bridging::getParameterCount(&T::initializeApp) == 3, + "Expected initializeApp(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::initializeApp, jsInvoker_, instance_, std::move(options), std::move(appConfig)); + } + void setAutomaticDataCollectionEnabled(jsi::Runtime &rt, jsi::String appName, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setAutomaticDataCollectionEnabled) == 3, + "Expected setAutomaticDataCollectionEnabled(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setAutomaticDataCollectionEnabled, jsInvoker_, instance_, std::move(appName), std::move(enabled)); + } + jsi::Value deleteApp(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::deleteApp) == 2, + "Expected deleteApp(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::deleteApp, jsInvoker_, instance_, std::move(appName)); + } + void eventsNotifyReady(jsi::Runtime &rt, bool ready) override { + static_assert( + bridging::getParameterCount(&T::eventsNotifyReady) == 2, + "Expected eventsNotifyReady(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::eventsNotifyReady, jsInvoker_, instance_, std::move(ready)); + } + jsi::Value eventsGetListeners(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::eventsGetListeners) == 1, + "Expected eventsGetListeners(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::eventsGetListeners, jsInvoker_, instance_); + } + jsi::Value eventsPing(jsi::Runtime &rt, jsi::String eventName, jsi::Object eventBody) override { + static_assert( + bridging::getParameterCount(&T::eventsPing) == 3, + "Expected eventsPing(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::eventsPing, jsInvoker_, instance_, std::move(eventName), std::move(eventBody)); + } + void eventsAddListener(jsi::Runtime &rt, jsi::String eventName) override { + static_assert( + bridging::getParameterCount(&T::eventsAddListener) == 2, + "Expected eventsAddListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::eventsAddListener, jsInvoker_, instance_, std::move(eventName)); + } + void eventsRemoveListener(jsi::Runtime &rt, jsi::String eventName, bool all) override { + static_assert( + bridging::getParameterCount(&T::eventsRemoveListener) == 3, + "Expected eventsRemoveListener(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::eventsRemoveListener, jsInvoker_, instance_, std::move(eventName), std::move(all)); + } + void addListener(jsi::Runtime &rt, jsi::String eventName) override { + static_assert( + bridging::getParameterCount(&T::addListener) == 2, + "Expected addListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::addListener, jsInvoker_, instance_, std::move(eventName)); + } + void removeListeners(jsi::Runtime &rt, double count) override { + static_assert( + bridging::getParameterCount(&T::removeListeners) == 2, + "Expected removeListeners(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeListeners, jsInvoker_, instance_, std::move(count)); + } + jsi::Value metaGetAll(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::metaGetAll) == 1, + "Expected metaGetAll(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::metaGetAll, jsInvoker_, instance_); + } + jsi::Value jsonGetAll(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::jsonGetAll) == 1, + "Expected jsonGetAll(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::jsonGetAll, jsInvoker_, instance_); + } + jsi::Value preferencesSetBool(jsi::Runtime &rt, jsi::String key, bool value) override { + static_assert( + bridging::getParameterCount(&T::preferencesSetBool) == 3, + "Expected preferencesSetBool(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::preferencesSetBool, jsInvoker_, instance_, std::move(key), std::move(value)); + } + jsi::Value preferencesSetString(jsi::Runtime &rt, jsi::String key, jsi::String value) override { + static_assert( + bridging::getParameterCount(&T::preferencesSetString) == 3, + "Expected preferencesSetString(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::preferencesSetString, jsInvoker_, instance_, std::move(key), std::move(value)); + } + jsi::Value preferencesGetAll(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::preferencesGetAll) == 1, + "Expected preferencesGetAll(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::preferencesGetAll, jsInvoker_, instance_); + } + jsi::Value preferencesClearAll(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::preferencesClearAll) == 1, + "Expected preferencesClearAll(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::preferencesClearAll, jsInvoker_, instance_); + } + void setLogLevel(jsi::Runtime &rt, jsi::String logLevel) override { + static_assert( + bridging::getParameterCount(&T::setLogLevel) == 2, + "Expected setLogLevel(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setLogLevel, jsInvoker_, instance_, std::move(logLevel)); + } + + private: + friend class NativeRNFBTurboAppCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + +#pragma mark - NativeRNFBTurboUtilsPlayServicesAvailability + +template +struct NativeRNFBTurboUtilsPlayServicesAvailability { + P0 isAvailable; + P1 status; + P2 hasResolution; + P3 isUserResolvableError; + P4 error; + bool operator==(const NativeRNFBTurboUtilsPlayServicesAvailability &other) const { + return isAvailable == other.isAvailable && status == other.status && hasResolution == other.hasResolution && isUserResolvableError == other.isUserResolvableError && error == other.error; + } +}; + +template +struct NativeRNFBTurboUtilsPlayServicesAvailabilityBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "isAvailable"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "status"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "hasResolution"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "isUserResolvableError"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "error"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool isAvailableToJs(jsi::Runtime &rt, decltype(types.isAvailable) value) { + return bridging::toJs(rt, value); + } + + static double statusToJs(jsi::Runtime &rt, decltype(types.status) value) { + return bridging::toJs(rt, value); + } + + static bool hasResolutionToJs(jsi::Runtime &rt, decltype(types.hasResolution) value) { + return bridging::toJs(rt, value); + } + + static bool isUserResolvableErrorToJs(jsi::Runtime &rt, decltype(types.isUserResolvableError) value) { + return bridging::toJs(rt, value); + } + + static jsi::String errorToJs(jsi::Runtime &rt, decltype(types.error) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "isAvailable", bridging::toJs(rt, value.isAvailable, jsInvoker)); + result.setProperty(rt, "status", bridging::toJs(rt, value.status, jsInvoker)); + result.setProperty(rt, "hasResolution", bridging::toJs(rt, value.hasResolution, jsInvoker)); + result.setProperty(rt, "isUserResolvableError", bridging::toJs(rt, value.isUserResolvableError, jsInvoker)); + if (value.error) { + result.setProperty(rt, "error", bridging::toJs(rt, value.error.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboUtilsCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboUtilsCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value androidGetPlayServicesStatus(jsi::Runtime &rt) = 0; + virtual jsi::Value androidPromptForPlayServices(jsi::Runtime &rt) = 0; + virtual jsi::Value androidResolutionForPlayServices(jsi::Runtime &rt) = 0; + virtual jsi::Value androidMakePlayServicesAvailable(jsi::Runtime &rt) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboUtilsCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboUtils"; + +protected: + NativeRNFBTurboUtilsCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboUtilsCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboUtilsCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboUtilsCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value androidGetPlayServicesStatus(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::androidGetPlayServicesStatus) == 1, + "Expected androidGetPlayServicesStatus(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::androidGetPlayServicesStatus, jsInvoker_, instance_); + } + jsi::Value androidPromptForPlayServices(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::androidPromptForPlayServices) == 1, + "Expected androidPromptForPlayServices(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::androidPromptForPlayServices, jsInvoker_, instance_); + } + jsi::Value androidResolutionForPlayServices(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::androidResolutionForPlayServices) == 1, + "Expected androidResolutionForPlayServices(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::androidResolutionForPlayServices, jsInvoker_, instance_); + } + jsi::Value androidMakePlayServicesAvailable(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::androidMakePlayServicesAvailable) == 1, + "Expected androidMakePlayServicesAvailable(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::androidMakePlayServicesAvailable, jsInvoker_, instance_); + } + + private: + friend class NativeRNFBTurboUtilsCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java b/packages/app/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java index 0a1d56235c..b8feb8236f 100644 --- a/packages/app/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java @@ -25,7 +25,7 @@ import com.facebook.react.bridge.WritableMap; import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; -import io.invertase.firebase.app.ReactNativeFirebaseAppModule; +import io.invertase.firebase.app.NativeRNFBTurboApp; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -57,8 +57,8 @@ public static Map firebaseAppToMap(FirebaseApp firebaseApp) { options.put("messagingSenderId", appOptions.getGcmSenderId()); options.put("storageBucket", appOptions.getStorageBucket()); - if (ReactNativeFirebaseAppModule.authDomains.get(name) != null) { - options.put("authDomain", ReactNativeFirebaseAppModule.authDomains.get(name)); + if (NativeRNFBTurboApp.authDomains.get(name) != null) { + options.put("authDomain", NativeRNFBTurboApp.authDomains.get(name)); } root.put("options", options); diff --git a/packages/app/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.java b/packages/app/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.java new file mode 100644 index 0000000000..884d9ddbde --- /dev/null +++ b/packages/app/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.java @@ -0,0 +1,184 @@ +package io.invertase.firebase.utils; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import android.app.Activity; +import android.content.Context; +import android.content.IntentSender; +import android.os.Build; +import android.os.Environment; +import android.provider.Settings; +import android.util.Log; +import com.facebook.fbreact.specs.NativeRNFBTurboUtilsSpec; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.WritableMap; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; +import io.invertase.firebase.app.ReactNativeFirebaseApp; +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +public class NativeRNFBTurboUtils extends NativeRNFBTurboUtilsSpec { + private static final String TAG = "Utils"; + private static final String KEY_MAIN_BUNDLE = "MAIN_BUNDLE"; + private static final String KEY_DOCUMENT_DIRECTORY = "DOCUMENT_DIRECTORY"; + private static final String KEY_LIBRARY_DIRECTORY = "LIBRARY_DIRECTORY"; + private static final String KEY_EXTERNAL_DIRECTORY = "EXTERNAL_DIRECTORY"; + private static final String KEY_EXT_STORAGE_DIRECTORY = "EXTERNAL_STORAGE_DIRECTORY"; + private static final String KEY_PICS_DIRECTORY = "PICTURES_DIRECTORY"; + private static final String KEY_MOVIES_DIRECTORY = "MOVIES_DIRECTORY"; + private static final String KEY_TEMP_DIRECTORY = "TEMP_DIRECTORY"; + private static final String KEY_CACHE_DIRECTORY = "CACHES_DIRECTORY"; + private static final String FIREBASE_TEST_LAB = "firebase.test.lab"; + + public NativeRNFBTurboUtils(ReactApplicationContext reactContext) { + super(reactContext); + } + + private static Boolean isRunningInTestLab() { + String testLabSetting = + Settings.System.getString( + ReactNativeFirebaseApp.getApplicationContext().getContentResolver(), FIREBASE_TEST_LAB); + + return "true".equals(testLabSetting); + } + + @Override + public void androidGetPlayServicesStatus(Promise promise) { + promise.resolve(getPlayServicesStatusMap()); + } + + @Override + public void androidPromptForPlayServices(Promise promise) { + int status = isGooglePlayServicesAvailable(); + GoogleApiAvailability gapi = GoogleApiAvailability.getInstance(); + + if (status != ConnectionResult.SUCCESS && gapi.isUserResolvableError(status)) { + Activity activity = getCurrentActivity(); + if (activity != null) { + gapi.getErrorDialog(activity, status, status).show(); + } + } + promise.resolve(null); + } + + @Override + public void androidResolutionForPlayServices(Promise promise) { + int status = isGooglePlayServicesAvailable(); + ConnectionResult connectionResult = new ConnectionResult(status); + + if (!connectionResult.isSuccess() && connectionResult.hasResolution()) { + Activity activity = getCurrentActivity(); + if (activity != null) { + try { + connectionResult.startResolutionForResult(activity, status); + } catch (IntentSender.SendIntentException error) { + Log.d(TAG, "resolutionForPlayServices", error); + } + } + } + promise.resolve(null); + } + + @Override + public void androidMakePlayServicesAvailable(Promise promise) { + int status = isGooglePlayServicesAvailable(); + + if (status != ConnectionResult.SUCCESS) { + Activity activity = getCurrentActivity(); + if (activity != null) { + GoogleApiAvailability.getInstance().makeGooglePlayServicesAvailable(activity); + } + } + promise.resolve(null); + } + + private int isGooglePlayServicesAvailable() { + GoogleApiAvailability gapi = GoogleApiAvailability.getInstance(); + return gapi.isGooglePlayServicesAvailable(getReactApplicationContext()); + } + + private WritableMap getPlayServicesStatusMap() { + WritableMap result = Arguments.createMap(); + GoogleApiAvailability gapi = GoogleApiAvailability.getInstance(); + + int status = gapi.isGooglePlayServicesAvailable(getReactApplicationContext()); + result.putInt("status", status); + + if (status == ConnectionResult.SUCCESS) { + result.putBoolean("isAvailable", true); + } else { + result.putBoolean("isAvailable", false); + result.putString("error", gapi.getErrorString(status)); + result.putBoolean("isUserResolvableError", gapi.isUserResolvableError(status)); + result.putBoolean("hasResolution", new ConnectionResult(status).hasResolution()); + } + + return result; + } + + @Override + protected Map getTypedExportedConstants() { + Map constants = new HashMap<>(); + + constants.put("isRunningInTestLab", isRunningInTestLab()); + + Context context = getReactApplicationContext(); + constants.put(KEY_MAIN_BUNDLE, ""); + constants.put(KEY_LIBRARY_DIRECTORY, context.getFilesDir().getAbsolutePath()); + constants.put(KEY_TEMP_DIRECTORY, context.getCacheDir().getAbsolutePath()); + constants.put(KEY_CACHE_DIRECTORY, context.getCacheDir().getAbsolutePath()); + + File externalDirectory = context.getExternalFilesDir(null); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (externalDirectory != null) { + constants.put(KEY_DOCUMENT_DIRECTORY, externalDirectory.getAbsolutePath()); + } else { + constants.put(KEY_DOCUMENT_DIRECTORY, context.getFilesDir().getAbsolutePath()); + } + } + + if (!constants.containsKey(KEY_DOCUMENT_DIRECTORY)) { + constants.put(KEY_DOCUMENT_DIRECTORY, context.getFilesDir().getAbsolutePath()); + } + + File picturesDirectory = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); + constants.put( + KEY_PICS_DIRECTORY, picturesDirectory != null ? picturesDirectory.getAbsolutePath() : ""); + + File moviesDirectory = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); + constants.put( + KEY_MOVIES_DIRECTORY, moviesDirectory != null ? moviesDirectory.getAbsolutePath() : ""); + + File externalStorageDirectory = Environment.getExternalStorageDirectory(); + if (externalStorageDirectory != null) { + constants.put(KEY_EXT_STORAGE_DIRECTORY, externalStorageDirectory.getAbsolutePath()); + } + + if (externalDirectory != null) { + constants.put(KEY_EXTERNAL_DIRECTORY, externalDirectory.getAbsolutePath()); + } + + return constants; + } +} diff --git a/packages/app/e2e/events.e2e.js b/packages/app/e2e/events.e2e.js index 22d8dfad81..4085b2c194 100644 --- a/packages/app/e2e/events.e2e.js +++ b/packages/app/e2e/events.e2e.js @@ -21,10 +21,12 @@ const eventBody = { foo: 'bar', }; +const APP_MODULE = NativeModules.NativeRNFBTurboApp; + describe('Core -> EventEmitter', function () { describe('ReactNativeFirebaseEventEmitter', function () { it('queues events before app is ready', async function () { - const { eventsPing, eventsNotifyReady, eventsGetListeners } = NativeModules.RNFBAppModule; + const { eventsPing, eventsNotifyReady, eventsGetListeners } = APP_MODULE; await eventsNotifyReady(false); let readyToResolve = false; @@ -67,7 +69,7 @@ describe('Core -> EventEmitter', function () { }); it('can send and receive lots of events', async function () { - const { eventsPing, eventsNotifyReady } = NativeModules.RNFBAppModule; + const { eventsPing, eventsNotifyReady } = APP_MODULE; await eventsNotifyReady(true); const { resolve, reject, promise } = Promise.defer(); const emitter = NativeEventEmitter; @@ -96,7 +98,7 @@ describe('Core -> EventEmitter', function () { it('queues events before a js listener is registered', async function () { const { eventsPing, eventsNotifyReady, eventsGetListeners, eventsRemoveListener } = - NativeModules.RNFBAppModule; + APP_MODULE; await eventsNotifyReady(true); const { resolve, reject, promise } = Promise.defer(); const emitter = NativeEventEmitter; diff --git a/packages/app/e2e/nativeModuleResolver.e2e.js b/packages/app/e2e/nativeModuleResolver.e2e.js new file mode 100644 index 0000000000..f476408902 --- /dev/null +++ b/packages/app/e2e/nativeModuleResolver.e2e.js @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +import { getReactNativeModule } from '@react-native-firebase/app/dist/module/internal/nativeModule'; + +describe('getReactNativeModule resolver', function () { + it('throws for an unknown module name', function () { + const unknownModule = 'NativeRNFBTurboNonExistentModule'; + + try { + getReactNativeModule(unknownModule); + throw new Error('did not throw for unknown module'); + } catch (e) { + e.message.should.containEql(unknownModule); + e.message.should.containEql('not registered'); + } + }); +}); diff --git a/packages/app/ios/RNFBApp.xcodeproj/project.pbxproj b/packages/app/ios/RNFBApp.xcodeproj/project.pbxproj index cf22fc572d..1127bb625c 100644 --- a/packages/app/ios/RNFBApp.xcodeproj/project.pbxproj +++ b/packages/app/ios/RNFBApp.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBAppModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAppModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBAppModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAppModule.mm */; }; 2744B99121F46140004F8E3F /* RNFBRCTEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B99021F46140004F8E3F /* RNFBRCTEventEmitter.m */; }; 2744B9A421F48A4F004F8E3F /* RCTConvert+FIROptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B9A321F48A4F004F8E3F /* RCTConvert+FIROptions.m */; }; 2744B9A721F57C2F004F8E3F /* RCTConvert+FIRApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B9A621F57C2F004F8E3F /* RCTConvert+FIRApp.m */; }; @@ -15,7 +15,7 @@ 2748D8172236429D00FC8DC8 /* RNFBSharedUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 2748D8102236417700FC8DC8 /* RNFBSharedUtils.m */; }; 2748D81C223674CD00FC8DC8 /* RNFBPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 2748D81B223674CD00FC8DC8 /* RNFBPreferences.m */; }; 2748D8202237018600FC8DC8 /* RNFBMeta.m in Sources */ = {isa = PBXBuildFile; fileRef = 2748D81F2237018600FC8DC8 /* RNFBMeta.m */; }; - 4D97BAD423042F2700077358 /* RNFBUtilsModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D97BAD323042F2700077358 /* RNFBUtilsModule.m */; }; + 4D97BAD423042F2700077358 /* RNFBUtilsModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4D97BAD323042F2700077358 /* RNFBUtilsModule.mm */; }; DAA1F28522FCF6AD00F4DEC1 /* RNFBVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA1F28422FCF6AD00F4DEC1 /* RNFBVersion.m */; }; RNFB00001A2025011100000001 /* RNFBNullSentinelInterceptor.m in Sources */ = {isa = PBXBuildFile; fileRef = RNFB00001A2025011100000002 /* RNFBNullSentinelInterceptor.m */; }; /* End PBXBuildFile section */ @@ -35,7 +35,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBApp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBApp.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBAppModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBAppModule.h; path = RNFBApp/RNFBAppModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBAppModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBAppModule.m; path = RNFBApp/RNFBAppModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBAppModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = RNFBAppModule.mm; path = RNFBApp/RNFBAppModule.mm; sourceTree = SOURCE_ROOT; }; 2744B98D21F45E8B004F8E3F /* RNFBRCTEventEmitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBRCTEventEmitter.h; sourceTree = ""; }; 2744B99021F46140004F8E3F /* RNFBRCTEventEmitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBRCTEventEmitter.m; sourceTree = ""; }; 2744B9A221F48826004F8E3F /* RCTConvert+FIROptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTConvert+FIROptions.h"; sourceTree = ""; }; @@ -51,7 +51,7 @@ 2748D81E2237012B00FC8DC8 /* RNFBMeta.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBMeta.h; sourceTree = ""; }; 2748D81F2237018600FC8DC8 /* RNFBMeta.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBMeta.m; sourceTree = ""; }; 4D97BAD223042F0800077358 /* RNFBUtilsModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBUtilsModule.h; sourceTree = ""; }; - 4D97BAD323042F2700077358 /* RNFBUtilsModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBUtilsModule.m; sourceTree = ""; }; + 4D97BAD323042F2700077358 /* RNFBUtilsModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RNFBUtilsModule.mm; sourceTree = ""; }; DAA1F28422FCF6AD00F4DEC1 /* RNFBVersion.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBVersion.m; sourceTree = ""; }; DAA1F28622FCF6C200F4DEC1 /* RNFBVersion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBVersion.h; sourceTree = ""; }; RNFB00001A2025011100000002 /* RNFBNullSentinelInterceptor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBNullSentinelInterceptor.m; sourceTree = ""; }; @@ -91,7 +91,7 @@ 2744B9A521F57BD9004F8E3F /* RCTConvert+FIRApp.h */, 2744B9A621F57C2F004F8E3F /* RCTConvert+FIRApp.m */, 2744B98421F45429004F8E3F /* RNFBAppModule.h */, - 2744B98521F45429004F8E3F /* RNFBAppModule.m */, + 2744B98521F45429004F8E3F /* RNFBAppModule.mm */, 2748D8162236428100FC8DC8 /* RNFBJSON.h */, 2748D8142236426300FC8DC8 /* RNFBJSON.m */, 2748D81A223674B600FC8DC8 /* RNFBPreferences.h */, @@ -99,7 +99,7 @@ DAA1F28422FCF6AD00F4DEC1 /* RNFBVersion.m */, DAA1F28622FCF6C200F4DEC1 /* RNFBVersion.h */, 4D97BAD223042F0800077358 /* RNFBUtilsModule.h */, - 4D97BAD323042F2700077358 /* RNFBUtilsModule.m */, + 4D97BAD323042F2700077358 /* RNFBUtilsModule.mm */, RNFB00001A2025011100000003 /* RNFBNullSentinelInterceptor.h */, RNFB00001A2025011100000002 /* RNFBNullSentinelInterceptor.m */, ); @@ -173,12 +173,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBAppModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBAppModule.mm in Sources */, 2744B9A721F57C2F004F8E3F /* RCTConvert+FIRApp.m in Sources */, 2748D8172236429D00FC8DC8 /* RNFBSharedUtils.m in Sources */, 2748D81C223674CD00FC8DC8 /* RNFBPreferences.m in Sources */, DAA1F28522FCF6AD00F4DEC1 /* RNFBVersion.m in Sources */, - 4D97BAD423042F2700077358 /* RNFBUtilsModule.m in Sources */, + 4D97BAD423042F2700077358 /* RNFBUtilsModule.mm in Sources */, 2748D8202237018600FC8DC8 /* RNFBMeta.m in Sources */, 2744B99121F46140004F8E3F /* RNFBRCTEventEmitter.m in Sources */, 2744B9A421F48A4F004F8E3F /* RCTConvert+FIROptions.m in Sources */, diff --git a/packages/app/ios/RNFBApp/RNFBAppModule.h b/packages/app/ios/RNFBApp/RNFBAppModule.h index 894c019d73..70389cc55b 100644 --- a/packages/app/ios/RNFBApp/RNFBAppModule.h +++ b/packages/app/ios/RNFBApp/RNFBAppModule.h @@ -17,9 +17,7 @@ #import -#import - -@interface RNFBAppModule : NSObject +@interface RNFBAppModule : NSObject + (NSString *)getCustomDomain:(NSString *)appName; diff --git a/packages/app/ios/RNFBApp/RNFBAppModule.m b/packages/app/ios/RNFBApp/RNFBAppModule.mm similarity index 68% rename from packages/app/ios/RNFBApp/RNFBAppModule.m rename to packages/app/ios/RNFBApp/RNFBAppModule.mm index f679daad1b..3a96742813 100644 --- a/packages/app/ios/RNFBApp/RNFBAppModule.m +++ b/packages/app/ios/RNFBApp/RNFBAppModule.mm @@ -16,9 +16,12 @@ */ #import +#import #import +#import "RCTConvert+FIRApp.h" #import "RNFBAppModule.h" +#import "RNFBAppTurboModules.h" #import "RNFBJSON.h" #import "RNFBMeta.h" #import "RNFBPreferences.h" @@ -31,15 +34,19 @@ #define REGISTER_LIB #endif +@interface RNFBAppModule () +@end + @implementation RNFBAppModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboApp) -- (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); } - (void)setBridge:(RCTBridge *)bridge { @@ -71,54 +78,70 @@ - (void)invalidate { [[RNFBRCTEventEmitter shared] invalidate]; } +#pragma mark - +#pragma mark Constants + +- (NSDictionary *)appConstantsDictionary { + NSDictionary *firApps = [FIRApp allApps]; + NSMutableArray *appsArray = [NSMutableArray new]; + NSMutableDictionary *constants = [NSMutableDictionary new]; + + for (id key in firApps) { + [appsArray addObject:[RNFBSharedUtils firAppToDictionary:firApps[key]]]; + } + + constants[@"NATIVE_FIREBASE_APPS"] = appsArray; + constants[@"FIREBASE_RAW_JSON"] = [[RNFBJSON shared] getRawJSON]; + + return constants; +} + +- (facebook::react::ModuleConstants)constantsToExport { + return [_RCTTypedModuleConstants newWithUnsafeDictionary:[self appConstantsDictionary]]; +} + +- (facebook::react::ModuleConstants)getConstants { + return [self constantsToExport]; +} + #pragma mark - #pragma mark META Methods -RCT_EXPORT_METHOD(metaGetAll - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)metaGetAll:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { resolve([RNFBMeta getAll]); } #pragma mark - #pragma mark JSON Methods -RCT_EXPORT_METHOD(jsonGetAll - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)jsonGetAll:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { resolve([[RNFBJSON shared] getAll]); } #pragma mark - #pragma mark Preference Methods -RCT_EXPORT_METHOD(preferencesSetBool - : (NSString *)key boolValue - : (BOOL)boolValue resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { - [[RNFBPreferences shared] setBooleanValue:key boolValue:boolValue]; +- (void)preferencesSetBool:(NSString *)key + value:(BOOL)value + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [[RNFBPreferences shared] setBooleanValue:key boolValue:value]; resolve([NSNull null]); } -RCT_EXPORT_METHOD(preferencesSetString - : (NSString *)key stringValue - : (NSString *)stringValue resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { - [[RNFBPreferences shared] setStringValue:key stringValue:stringValue]; +- (void)preferencesSetString:(NSString *)key + value:(NSString *)value + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [[RNFBPreferences shared] setStringValue:key stringValue:value]; resolve([NSNull null]); } -RCT_EXPORT_METHOD(preferencesGetAll - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)preferencesGetAll:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { resolve([[RNFBPreferences shared] getAll]); } -RCT_EXPORT_METHOD(preferencesClearAll - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)preferencesClearAll:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { [[RNFBPreferences shared] clearAll]; resolve([NSNull null]); } @@ -126,52 +149,48 @@ - (void)invalidate { #pragma mark - #pragma mark Event Methods -RCT_EXPORT_METHOD(eventsNotifyReady : (BOOL)ready) { +- (void)eventsNotifyReady:(BOOL)ready { [[RNFBRCTEventEmitter shared] notifyJsReady:ready]; } -RCT_EXPORT_METHOD(eventsGetListeners - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)eventsGetListeners:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { resolve([[RNFBRCTEventEmitter shared] getListenersDictionary]); } -RCT_EXPORT_METHOD(eventsPing - : (NSString *)eventName eventBody - : (NSDictionary *)eventBody resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)eventsPing:(NSString *)eventName + eventBody:(NSDictionary *)eventBody + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [[RNFBRCTEventEmitter shared] sendEventWithName:eventName body:eventBody]; resolve(eventBody); } -RCT_EXPORT_METHOD(eventsAddListener : (NSString *)eventName) { +- (void)eventsAddListener:(NSString *)eventName { [[RNFBRCTEventEmitter shared] addListener:eventName]; } -RCT_EXPORT_METHOD(eventsRemoveListener : (NSString *)eventName all : (BOOL)all) { +- (void)eventsRemoveListener:(NSString *)eventName all:(BOOL)all { [[RNFBRCTEventEmitter shared] removeListeners:eventName all:all]; } #pragma mark - #pragma mark Events Unused -RCT_EXPORT_METHOD(addListener : (NSString *)eventName) { +- (void)addListener:(NSString *)eventName { // Keep: Required for RN built in Event Emitter Calls. } -RCT_EXPORT_METHOD(removeListeners : (NSInteger)count) { +- (void)removeListeners:(double)count { // Keep: Required for RN built in Event Emitter Calls. } #pragma mark - #pragma mark Firebase App Methods -RCT_EXPORT_METHOD(initializeApp - : (NSDictionary *)options appConfig - : (NSDictionary *)appConfig resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)initializeApp:(NSDictionary *)options + appConfig:(NSDictionary *)appConfig + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { RCTUnsafeExecuteOnMainQueueSync(^{ FIRApp *firApp; NSString *appName = [appConfig valueForKey:@"name"]; @@ -182,24 +201,18 @@ - (void)invalidate { GCMSenderID:messagingSenderId]; firOptions.APIKey = [options valueForKey:@"apiKey"]; firOptions.projectID = [options valueForKey:@"projectId"]; - // kFirebaseOptionsDatabaseUrl if (![[options valueForKey:@"databaseURL"] isEqual:[NSNull null]]) { firOptions.databaseURL = [options valueForKey:@"databaseURL"]; } - // kFirebaseOptionsStorageBucket if (![[options valueForKey:@"storageBucket"] isEqual:[NSNull null]]) { firOptions.storageBucket = [options valueForKey:@"storageBucket"]; } - - // kFirebaseOptionsIosBundleId if (![[options valueForKey:@"iosBundleId"] isEqual:[NSNull null]]) { firOptions.bundleID = [options valueForKey:@"iosBundleId"]; } - // kFirebaseOptionsIosClientId if (![[options valueForKey:@"iosClientId"] isEqual:[NSNull null]]) { firOptions.clientID = [options valueForKey:@"iosClientId"]; } - // kFirebaseOptionsAppGroupId if (![[options valueForKey:@"appGroupId"] isEqual:[NSNull null]]) { firOptions.appGroupID = [options valueForKey:@"appGroupId"]; } @@ -237,7 +250,7 @@ + (NSString *)getCustomDomain:(NSString *)appName { return customAuthDomains[appName]; } -RCT_EXPORT_METHOD(setLogLevel : (NSString *)logLevel) { +- (void)setLogLevel:(NSString *)logLevel { int level = FIRLoggerLevelError; if ([logLevel isEqualToString:@"verbose"]) { level = FIRLoggerLevelDebug; @@ -249,19 +262,20 @@ + (NSString *)getCustomDomain:(NSString *)appName { level = FIRLoggerLevelWarning; } DLog(@"RNFBSetLogLevel: setting level to %d from %@.", level, logLevel); - [[FIRConfiguration sharedInstance] setLoggerLevel:level]; + [[FIRConfiguration sharedInstance] setLoggerLevel:(FIRLoggerLevel)level]; } -RCT_EXPORT_METHOD(setAutomaticDataCollectionEnabled : (FIRApp *)firApp enabled : (BOOL)enabled) { +- (void)setAutomaticDataCollectionEnabled:(NSString *)appName enabled:(BOOL)enabled { + FIRApp *firApp = [RCTConvert firAppFromString:appName]; if (firApp) { firApp.dataCollectionDefaultEnabled = enabled; } } -RCT_EXPORT_METHOD(deleteApp - : (FIRApp *)firApp resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)deleteApp:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firApp = [RCTConvert firAppFromString:appName]; if (!firApp) { return resolve([NSNull null]); } @@ -270,12 +284,10 @@ + (NSString *)getCustomDomain:(NSString *)appName { if (success) { resolve([NSNull null]); } else { - // try again once more [firApp deleteApp:^(BOOL success2) { if (success2) { resolve([NSNull null]); } else { - // TODO js error builder reject(@"app/delete-app-failed", @"Failed to delete the specified app.", nil); } }]; @@ -283,23 +295,8 @@ + (NSString *)getCustomDomain:(NSString *)appName { }]; } -- (NSDictionary *)constantsToExport { - NSDictionary *firApps = [FIRApp allApps]; - NSMutableArray *appsArray = [NSMutableArray new]; - NSMutableDictionary *constants = [NSMutableDictionary new]; - - for (id key in firApps) { - [appsArray addObject:[RNFBSharedUtils firAppToDictionary:firApps[key]]]; - } - - constants[@"NATIVE_FIREBASE_APPS"] = appsArray; - - constants[@"FIREBASE_RAW_JSON"] = [[RNFBJSON shared] getRawJSON]; - - return constants; -} - + (BOOL)requiresMainQueueSetup { - return YES; + return NO; } + @end diff --git a/packages/app/ios/RNFBApp/RNFBUtilsModule.h b/packages/app/ios/RNFBApp/RNFBUtilsModule.h index 43ec807b78..9e50cd8c3a 100644 --- a/packages/app/ios/RNFBApp/RNFBUtilsModule.h +++ b/packages/app/ios/RNFBApp/RNFBUtilsModule.h @@ -18,9 +18,7 @@ #import #import -#import - -@interface RNFBUtilsModule : NSObject +@interface RNFBUtilsModule : NSObject + (BOOL)isRemoteAsset:(NSString *)localFilePath; + (BOOL)unused_isHeic:(NSString *)localFilePath; diff --git a/packages/app/ios/RNFBApp/RNFBUtilsModule.m b/packages/app/ios/RNFBApp/RNFBUtilsModule.mm similarity index 66% rename from packages/app/ios/RNFBApp/RNFBUtilsModule.m rename to packages/app/ios/RNFBApp/RNFBUtilsModule.mm index 7d28331109..e8231a0f3e 100644 --- a/packages/app/ios/RNFBApp/RNFBUtilsModule.m +++ b/packages/app/ios/RNFBApp/RNFBUtilsModule.mm @@ -18,20 +18,84 @@ #import #import "RNFBApp/RNFBSharedUtils.h" +#import "RNFBAppTurboModules.h" #import "RNFBUtilsModule.h" +@interface RNFBUtilsModule () +@end + @implementation RNFBUtilsModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboUtils) -- (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); } + (BOOL)requiresMainQueueSetup { - return YES; + return NO; +} + +#pragma mark - +#pragma mark Constants + +- (NSString *)getPathForDirectory:(int)directory { + NSArray *paths = + NSSearchPathForDirectoriesInDomains((NSSearchPathDirectory)directory, NSUserDomainMask, YES); + return [paths firstObject]; +} + +- (NSDictionary *)utilsConstantsDictionary { + return @{ + @"isRunningInTestLab" : @NO, + @"MAIN_BUNDLE" : [[NSBundle mainBundle] bundlePath], + @"CACHES_DIRECTORY" : [self getPathForDirectory:NSCachesDirectory], + @"DOCUMENT_DIRECTORY" : [self getPathForDirectory:NSDocumentDirectory], + @"PICTURES_DIRECTORY" : [self getPathForDirectory:NSPicturesDirectory], + @"MOVIES_DIRECTORY" : [self getPathForDirectory:NSMoviesDirectory], + @"TEMP_DIRECTORY" : NSTemporaryDirectory(), + @"LIBRARY_DIRECTORY" : [self getPathForDirectory:NSLibraryDirectory], + }; +} + +- (facebook::react::ModuleConstants) + constantsToExport { + return [_RCTTypedModuleConstants newWithUnsafeDictionary:[self utilsConstantsDictionary]]; +} + +- (facebook::react::ModuleConstants)getConstants { + return [self constantsToExport]; +} + +#pragma mark - +#pragma mark Android-only stubs + +- (void)androidGetPlayServicesStatus:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + resolve(@{ + @"isAvailable" : @YES, + @"status" : @0, + @"hasResolution" : @NO, + @"isUserResolvableError" : @NO, + }); +} + +- (void)androidPromptForPlayServices:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + resolve(nil); +} + +- (void)androidResolutionForPlayServices:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + resolve(nil); +} + +- (void)androidMakePlayServicesAvailable:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + resolve(nil); } #pragma mark - @@ -56,7 +120,6 @@ + (PHAsset *)fetchAssetForPath:(NSString *)localFilePath { if ([localFilePath hasPrefix:@"assets-library://"] || [localFilePath hasPrefix:@"ph://"]) { if ([localFilePath hasPrefix:@"assets-library://"]) { - NSURL *localFile = [[NSURL alloc] initWithString:localFilePath]; static BOOL hasWarned = NO; if (!hasWarned) { NSLog(@"'assets-library://' & 'ph://' URLs are not supported in Catalyst-based targets " @@ -77,24 +140,4 @@ + (PHAsset *)fetchAssetForPath:(NSString *)localFilePath { return asset; } -- (NSString *)getPathForDirectory:(int)directory { - NSArray *paths = - NSSearchPathForDirectoriesInDomains((NSSearchPathDirectory)directory, NSUserDomainMask, YES); - return [paths firstObject]; -} - -- (NSDictionary *)constantsToExport { - NSMutableDictionary *constants = [@{ - @"MAIN_BUNDLE" : [[NSBundle mainBundle] bundlePath], - @"CACHES_DIRECTORY" : [self getPathForDirectory:NSCachesDirectory], - @"DOCUMENT_DIRECTORY" : [self getPathForDirectory:NSDocumentDirectory], - @"PICTURES_DIRECTORY" : [self getPathForDirectory:NSPicturesDirectory], - @"MOVIES_DIRECTORY" : [self getPathForDirectory:NSMoviesDirectory], - @"TEMP_DIRECTORY" : NSTemporaryDirectory(), - @"LIBRARY_DIRECTORY" : [self getPathForDirectory:NSLibraryDirectory], - } mutableCopy]; - - return constants; -} - @end diff --git a/packages/app/ios/generated/RCTAppDependencyProvider.h b/packages/app/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/app/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/app/ios/generated/RCTAppDependencyProvider.mm b/packages/app/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/app/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/app/ios/generated/RCTModuleProviders.h b/packages/app/ios/generated/RCTModuleProviders.h new file mode 100644 index 0000000000..aff637c692 --- /dev/null +++ b/packages/app/ios/generated/RCTModuleProviders.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTModuleProvider; + +@interface RCTModuleProviders: NSObject + ++ (NSDictionary> *)moduleProviders; + +@end diff --git a/packages/app/ios/generated/RCTModuleProviders.mm b/packages/app/ios/generated/RCTModuleProviders.mm new file mode 100644 index 0000000000..5f34abf2d4 --- /dev/null +++ b/packages/app/ios/generated/RCTModuleProviders.mm @@ -0,0 +1,52 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +#import "RCTModuleProviders.h" +#import +#import + +@implementation RCTModuleProviders + ++ (NSDictionary> *)moduleProviders +{ + static NSDictionary> *providers = nil; + static dispatch_once_t onceToken; + + dispatch_once(&onceToken, ^{ + NSDictionary * moduleMapping = @{ + @"NativeRNFBTurboApp": @"RNFBAppModule", // @react-native-firebase/app + @"NativeRNFBTurboUtils": @"RNFBUtilsModule", // @react-native-firebase/app + }; + + NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:moduleMapping.count]; + + for (NSString *key in moduleMapping) { + NSString * moduleProviderName = moduleMapping[key]; + Class klass = NSClassFromString(moduleProviderName); + if (!klass) { + RCTLogError(@"Module provider %@ cannot be found in the runtime", moduleProviderName); + continue; + } + + id instance = [klass new]; + if (![instance respondsToSelector:@selector(getTurboModule:)]) { + RCTLogError(@"Module provider %@ does not conform to RCTModuleProvider", moduleProviderName); + continue; + } + + [dict setObject:instance forKey:key]; + } + + providers = dict; + }); + + return providers; +} + +@end diff --git a/packages/app/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/app/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/app/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/app/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/app/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/app/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/app/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/app/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/app/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/app/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/app/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/app/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/app/ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.h b/packages/app/ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.h new file mode 100644 index 0000000000..114d32253a --- /dev/null +++ b/packages/app/ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.h @@ -0,0 +1,14 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTUnstableModulesRequiringMainQueueSetupProvider: NSObject + ++(NSArray *)modules; + +@end diff --git a/packages/app/ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.mm b/packages/app/ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.mm new file mode 100644 index 0000000000..9cc59ed7e3 --- /dev/null +++ b/packages/app/ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.mm @@ -0,0 +1,19 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTUnstableModulesRequiringMainQueueSetupProvider.h" + +@implementation RCTUnstableModulesRequiringMainQueueSetupProvider + ++(NSArray *)modules +{ + return @[ + + ]; +} + +@end diff --git a/packages/app/ios/generated/RNFBAppTurboModules/RNFBAppTurboModules-generated.mm b/packages/app/ios/generated/RNFBAppTurboModules/RNFBAppTurboModules-generated.mm new file mode 100644 index 0000000000..cb0ba08784 --- /dev/null +++ b/packages/app/ios/generated/RNFBAppTurboModules/RNFBAppTurboModules-generated.mm @@ -0,0 +1,210 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBAppTurboModules.h" + + +@implementation NativeRNFBTurboAppSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_initializeApp(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "initializeApp", @selector(initializeApp:appConfig:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_setAutomaticDataCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setAutomaticDataCollectionEnabled", @selector(setAutomaticDataCollectionEnabled:enabled:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_deleteApp(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "deleteApp", @selector(deleteApp:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsNotifyReady(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "eventsNotifyReady", @selector(eventsNotifyReady:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsGetListeners(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "eventsGetListeners", @selector(eventsGetListeners:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsPing(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "eventsPing", @selector(eventsPing:eventBody:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsAddListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "eventsAddListener", @selector(eventsAddListener:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_eventsRemoveListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "eventsRemoveListener", @selector(eventsRemoveListener:all:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_addListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "addListener", @selector(addListener:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_removeListeners(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "removeListeners", @selector(removeListeners:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_metaGetAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "metaGetAll", @selector(metaGetAll:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_jsonGetAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "jsonGetAll", @selector(jsonGetAll:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesSetBool(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "preferencesSetBool", @selector(preferencesSetBool:value:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesSetString(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "preferencesSetString", @selector(preferencesSetString:value:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesGetAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "preferencesGetAll", @selector(preferencesGetAll:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesClearAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "preferencesClearAll", @selector(preferencesClearAll:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_setLogLevel(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setLogLevel", @selector(setLogLevel:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAppSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + NativeRNFBTurboAppSpecJSI::NativeRNFBTurboAppSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["initializeApp"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_initializeApp}; + + + methodMap_["setAutomaticDataCollectionEnabled"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_setAutomaticDataCollectionEnabled}; + + + methodMap_["deleteApp"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_deleteApp}; + + + methodMap_["eventsNotifyReady"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsNotifyReady}; + + + methodMap_["eventsGetListeners"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsGetListeners}; + + + methodMap_["eventsPing"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsPing}; + + + methodMap_["eventsAddListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsAddListener}; + + + methodMap_["eventsRemoveListener"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_eventsRemoveListener}; + + + methodMap_["addListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_addListener}; + + + methodMap_["removeListeners"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_removeListeners}; + + + methodMap_["metaGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_metaGetAll}; + + + methodMap_["jsonGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_jsonGetAll}; + + + methodMap_["preferencesSetBool"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesSetBool}; + + + methodMap_["preferencesSetString"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesSetString}; + + + methodMap_["preferencesGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesGetAll}; + + + methodMap_["preferencesClearAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_preferencesClearAll}; + + + methodMap_["setLogLevel"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppSpecJSI_setLogLevel}; + + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppSpecJSI_getConstants}; + + } +} // namespace facebook::react + +@implementation NativeRNFBTurboUtilsSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidGetPlayServicesStatus(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "androidGetPlayServicesStatus", @selector(androidGetPlayServicesStatus:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidPromptForPlayServices(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "androidPromptForPlayServices", @selector(androidPromptForPlayServices:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidResolutionForPlayServices(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "androidResolutionForPlayServices", @selector(androidResolutionForPlayServices:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidMakePlayServicesAvailable(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "androidMakePlayServicesAvailable", @selector(androidMakePlayServicesAvailable:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboUtilsSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + NativeRNFBTurboUtilsSpecJSI::NativeRNFBTurboUtilsSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["androidGetPlayServicesStatus"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidGetPlayServicesStatus}; + + + methodMap_["androidPromptForPlayServices"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidPromptForPlayServices}; + + + methodMap_["androidResolutionForPlayServices"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidResolutionForPlayServices}; + + + methodMap_["androidMakePlayServicesAvailable"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_androidMakePlayServicesAvailable}; + + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsSpecJSI_getConstants}; + + } +} // namespace facebook::react diff --git a/packages/app/ios/generated/RNFBAppTurboModules/RNFBAppTurboModules.h b/packages/app/ios/generated/RNFBAppTurboModules/RNFBAppTurboModules.h new file mode 100644 index 0000000000..77ed272284 --- /dev/null +++ b/packages/app/ios/generated/RNFBAppTurboModules/RNFBAppTurboModules.h @@ -0,0 +1,384 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBAppTurboModules symbols +#ifndef RNFBAppTurboModules_H +#define RNFBAppTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN +namespace JS { + namespace NativeRNFBTurboApp { + struct FirebaseAppConfig { + + struct Builder { + struct Input { + RCTRequired name; + std::optional automaticResourceManagement; + std::optional automaticDataCollectionEnabled; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing FirebaseAppConfig */ + Builder(FirebaseAppConfig i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static FirebaseAppConfig fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + FirebaseAppConfig(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +namespace JS { + namespace NativeRNFBTurboApp { + struct FirebaseAppOptions { + + struct Builder { + struct Input { + RCTRequired apiKey; + RCTRequired appId; + NSString *databaseURL; + RCTRequired messagingSenderId; + RCTRequired projectId; + NSString *storageBucket; + NSString *authDomain; + NSString *iosBundleId; + NSString *iosClientId; + NSString *appGroupId; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing FirebaseAppOptions */ + Builder(FirebaseAppOptions i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static FirebaseAppOptions fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + FirebaseAppOptions(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +namespace JS { + namespace NativeRNFBTurboApp { + struct NativeFirebaseApp { + + struct Builder { + struct Input { + RCTRequired appConfig; + RCTRequired options; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing NativeFirebaseApp */ + Builder(NativeFirebaseApp i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static NativeFirebaseApp fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + NativeFirebaseApp(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +namespace JS { + namespace NativeRNFBTurboApp { + struct Constants { + + struct Builder { + struct Input { + RCTRequired> NATIVE_FIREBASE_APPS; + RCTRequired FIREBASE_RAW_JSON; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeRNFBTurboAppSpec + +- (void)initializeApp:(NSDictionary *)options + appConfig:(NSDictionary *)appConfig + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setAutomaticDataCollectionEnabled:(NSString *)appName + enabled:(BOOL)enabled; +- (void)deleteApp:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)eventsNotifyReady:(BOOL)ready; +- (void)eventsGetListeners:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)eventsPing:(NSString *)eventName + eventBody:(NSDictionary *)eventBody + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)eventsAddListener:(NSString *)eventName; +- (void)eventsRemoveListener:(NSString *)eventName + all:(BOOL)all; +- (void)addListener:(NSString *)eventName; +- (void)removeListeners:(double)count; +- (void)metaGetAll:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)jsonGetAll:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)preferencesSetBool:(NSString *)key + value:(BOOL)value + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)preferencesSetString:(NSString *)key + value:(NSString *)value + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)preferencesGetAll:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)preferencesClearAll:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setLogLevel:(NSString *)logLevel; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end + +@interface NativeRNFBTurboAppSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboApp' + */ + class JSI_EXPORT NativeRNFBTurboAppSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboAppSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +namespace JS { + namespace NativeRNFBTurboUtils { + struct Constants { + + struct Builder { + struct Input { + RCTRequired isRunningInTestLab; + RCTRequired MAIN_BUNDLE; + RCTRequired CACHES_DIRECTORY; + RCTRequired DOCUMENT_DIRECTORY; + NSString *EXTERNAL_DIRECTORY; + NSString *EXTERNAL_STORAGE_DIRECTORY; + RCTRequired TEMP_DIRECTORY; + RCTRequired LIBRARY_DIRECTORY; + RCTRequired PICTURES_DIRECTORY; + RCTRequired MOVIES_DIRECTORY; + NSString *FILE_TYPE_REGULAR; + NSString *FILE_TYPE_DIRECTORY; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeRNFBTurboUtilsSpec + +- (void)androidGetPlayServicesStatus:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)androidPromptForPlayServices:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)androidResolutionForPlayServices:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)androidMakePlayServicesAvailable:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end + +@interface NativeRNFBTurboUtilsSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboUtils' + */ + class JSI_EXPORT NativeRNFBTurboUtilsSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboUtilsSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +inline JS::NativeRNFBTurboApp::FirebaseAppConfig::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto name = i.name.get(); + d[@"name"] = name; + auto automaticResourceManagement = i.automaticResourceManagement; + d[@"automaticResourceManagement"] = automaticResourceManagement.has_value() ? @((BOOL)automaticResourceManagement.value()) : nil; + auto automaticDataCollectionEnabled = i.automaticDataCollectionEnabled; + d[@"automaticDataCollectionEnabled"] = automaticDataCollectionEnabled.has_value() ? @((BOOL)automaticDataCollectionEnabled.value()) : nil; + return d; +}) {} +inline JS::NativeRNFBTurboApp::FirebaseAppConfig::Builder::Builder(FirebaseAppConfig i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +inline JS::NativeRNFBTurboApp::FirebaseAppOptions::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto apiKey = i.apiKey.get(); + d[@"apiKey"] = apiKey; + auto appId = i.appId.get(); + d[@"appId"] = appId; + auto databaseURL = i.databaseURL; + d[@"databaseURL"] = databaseURL; + auto messagingSenderId = i.messagingSenderId.get(); + d[@"messagingSenderId"] = messagingSenderId; + auto projectId = i.projectId.get(); + d[@"projectId"] = projectId; + auto storageBucket = i.storageBucket; + d[@"storageBucket"] = storageBucket; + auto authDomain = i.authDomain; + d[@"authDomain"] = authDomain; + auto iosBundleId = i.iosBundleId; + d[@"iosBundleId"] = iosBundleId; + auto iosClientId = i.iosClientId; + d[@"iosClientId"] = iosClientId; + auto appGroupId = i.appGroupId; + d[@"appGroupId"] = appGroupId; + return d; +}) {} +inline JS::NativeRNFBTurboApp::FirebaseAppOptions::Builder::Builder(FirebaseAppOptions i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +inline JS::NativeRNFBTurboApp::NativeFirebaseApp::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto appConfig = i.appConfig.get(); + d[@"appConfig"] = appConfig.buildUnsafeRawValue(); + auto options = i.options.get(); + d[@"options"] = options.buildUnsafeRawValue(); + return d; +}) {} +inline JS::NativeRNFBTurboApp::NativeFirebaseApp::Builder::Builder(NativeFirebaseApp i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +inline JS::NativeRNFBTurboApp::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto NATIVE_FIREBASE_APPS = i.NATIVE_FIREBASE_APPS.get(); + d[@"NATIVE_FIREBASE_APPS"] = RCTConvertVecToArray(NATIVE_FIREBASE_APPS, ^id(JS::NativeRNFBTurboApp::NativeFirebaseApp::Builder el_) { return el_.buildUnsafeRawValue(); }); + auto FIREBASE_RAW_JSON = i.FIREBASE_RAW_JSON.get(); + d[@"FIREBASE_RAW_JSON"] = FIREBASE_RAW_JSON; + return d; +}) {} +inline JS::NativeRNFBTurboApp::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +inline JS::NativeRNFBTurboUtils::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto isRunningInTestLab = i.isRunningInTestLab.get(); + d[@"isRunningInTestLab"] = @(isRunningInTestLab); + auto MAIN_BUNDLE = i.MAIN_BUNDLE.get(); + d[@"MAIN_BUNDLE"] = MAIN_BUNDLE; + auto CACHES_DIRECTORY = i.CACHES_DIRECTORY.get(); + d[@"CACHES_DIRECTORY"] = CACHES_DIRECTORY; + auto DOCUMENT_DIRECTORY = i.DOCUMENT_DIRECTORY.get(); + d[@"DOCUMENT_DIRECTORY"] = DOCUMENT_DIRECTORY; + auto EXTERNAL_DIRECTORY = i.EXTERNAL_DIRECTORY; + d[@"EXTERNAL_DIRECTORY"] = EXTERNAL_DIRECTORY; + auto EXTERNAL_STORAGE_DIRECTORY = i.EXTERNAL_STORAGE_DIRECTORY; + d[@"EXTERNAL_STORAGE_DIRECTORY"] = EXTERNAL_STORAGE_DIRECTORY; + auto TEMP_DIRECTORY = i.TEMP_DIRECTORY.get(); + d[@"TEMP_DIRECTORY"] = TEMP_DIRECTORY; + auto LIBRARY_DIRECTORY = i.LIBRARY_DIRECTORY.get(); + d[@"LIBRARY_DIRECTORY"] = LIBRARY_DIRECTORY; + auto PICTURES_DIRECTORY = i.PICTURES_DIRECTORY.get(); + d[@"PICTURES_DIRECTORY"] = PICTURES_DIRECTORY; + auto MOVIES_DIRECTORY = i.MOVIES_DIRECTORY.get(); + d[@"MOVIES_DIRECTORY"] = MOVIES_DIRECTORY; + auto FILE_TYPE_REGULAR = i.FILE_TYPE_REGULAR; + d[@"FILE_TYPE_REGULAR"] = FILE_TYPE_REGULAR; + auto FILE_TYPE_DIRECTORY = i.FILE_TYPE_DIRECTORY; + d[@"FILE_TYPE_DIRECTORY"] = FILE_TYPE_DIRECTORY; + return d; +}) {} +inline JS::NativeRNFBTurboUtils::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +NS_ASSUME_NONNULL_END +#endif // RNFBAppTurboModules_H diff --git a/packages/app/ios/generated/RNFBAppTurboModulesJSI-generated.cpp b/packages/app/ios/generated/RNFBAppTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..1fab136ed3 --- /dev/null +++ b/packages/app/ios/generated/RNFBAppTurboModulesJSI-generated.cpp @@ -0,0 +1,187 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAppTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_initializeApp(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->initializeApp( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_setAutomaticDataCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setAutomaticDataCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_deleteApp(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteApp( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsNotifyReady(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->eventsNotifyReady( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsGetListeners(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->eventsGetListeners( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsPing(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->eventsPing( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsAddListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->eventsAddListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsRemoveListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->eventsRemoveListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_addListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_removeListeners(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeListeners( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_metaGetAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->metaGetAll( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_jsonGetAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->jsonGetAll( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesSetBool(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->preferencesSetBool( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesSetString(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->preferencesSetString( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesGetAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->preferencesGetAll( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesClearAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->preferencesClearAll( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAppCxxSpecJSI_setLogLevel(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setLogLevel( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboAppCxxSpecJSI::NativeRNFBTurboAppCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboApp", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_getConstants}; + methodMap_["initializeApp"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_initializeApp}; + methodMap_["setAutomaticDataCollectionEnabled"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_setAutomaticDataCollectionEnabled}; + methodMap_["deleteApp"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_deleteApp}; + methodMap_["eventsNotifyReady"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsNotifyReady}; + methodMap_["eventsGetListeners"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsGetListeners}; + methodMap_["eventsPing"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsPing}; + methodMap_["eventsAddListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsAddListener}; + methodMap_["eventsRemoveListener"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_eventsRemoveListener}; + methodMap_["addListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_addListener}; + methodMap_["removeListeners"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_removeListeners}; + methodMap_["metaGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_metaGetAll}; + methodMap_["jsonGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_jsonGetAll}; + methodMap_["preferencesSetBool"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesSetBool}; + methodMap_["preferencesSetString"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesSetString}; + methodMap_["preferencesGetAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesGetAll}; + methodMap_["preferencesClearAll"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_preferencesClearAll}; + methodMap_["setLogLevel"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAppCxxSpecJSI_setLogLevel}; +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidGetPlayServicesStatus(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->androidGetPlayServicesStatus( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidPromptForPlayServices(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->androidPromptForPlayServices( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidResolutionForPlayServices(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->androidResolutionForPlayServices( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidMakePlayServicesAvailable(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->androidMakePlayServicesAvailable( + rt + ); +} + +NativeRNFBTurboUtilsCxxSpecJSI::NativeRNFBTurboUtilsCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboUtils", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_getConstants}; + methodMap_["androidGetPlayServicesStatus"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidGetPlayServicesStatus}; + methodMap_["androidPromptForPlayServices"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidPromptForPlayServices}; + methodMap_["androidResolutionForPlayServices"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidResolutionForPlayServices}; + methodMap_["androidMakePlayServicesAvailable"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboUtilsCxxSpecJSI_androidMakePlayServicesAvailable}; +} + + +} // namespace facebook::react diff --git a/packages/app/ios/generated/RNFBAppTurboModulesJSI.h b/packages/app/ios/generated/RNFBAppTurboModulesJSI.h new file mode 100644 index 0000000000..2a25d7e6e9 --- /dev/null +++ b/packages/app/ios/generated/RNFBAppTurboModulesJSI.h @@ -0,0 +1,606 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboAppFirebaseAppConfig + +template +struct NativeRNFBTurboAppFirebaseAppConfig { + P0 name; + P1 automaticResourceManagement; + P2 automaticDataCollectionEnabled; + bool operator==(const NativeRNFBTurboAppFirebaseAppConfig &other) const { + return name == other.name && automaticResourceManagement == other.automaticResourceManagement && automaticDataCollectionEnabled == other.automaticDataCollectionEnabled; + } +}; + +template +struct NativeRNFBTurboAppFirebaseAppConfigBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "name"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "automaticResourceManagement"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "automaticDataCollectionEnabled"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String nameToJs(jsi::Runtime &rt, decltype(types.name) value) { + return bridging::toJs(rt, value); + } + + static bool automaticResourceManagementToJs(jsi::Runtime &rt, decltype(types.automaticResourceManagement) value) { + return bridging::toJs(rt, value); + } + + static bool automaticDataCollectionEnabledToJs(jsi::Runtime &rt, decltype(types.automaticDataCollectionEnabled) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "name", bridging::toJs(rt, value.name, jsInvoker)); + if (value.automaticResourceManagement) { + result.setProperty(rt, "automaticResourceManagement", bridging::toJs(rt, value.automaticResourceManagement.value(), jsInvoker)); + } + if (value.automaticDataCollectionEnabled) { + result.setProperty(rt, "automaticDataCollectionEnabled", bridging::toJs(rt, value.automaticDataCollectionEnabled.value(), jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboAppFirebaseAppOptions + +template +struct NativeRNFBTurboAppFirebaseAppOptions { + P0 apiKey; + P1 appId; + P2 databaseURL; + P3 messagingSenderId; + P4 projectId; + P5 storageBucket; + P6 authDomain; + P7 iosBundleId; + P8 iosClientId; + P9 appGroupId; + bool operator==(const NativeRNFBTurboAppFirebaseAppOptions &other) const { + return apiKey == other.apiKey && appId == other.appId && databaseURL == other.databaseURL && messagingSenderId == other.messagingSenderId && projectId == other.projectId && storageBucket == other.storageBucket && authDomain == other.authDomain && iosBundleId == other.iosBundleId && iosClientId == other.iosClientId && appGroupId == other.appGroupId; + } +}; + +template +struct NativeRNFBTurboAppFirebaseAppOptionsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "apiKey"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "appId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "databaseURL"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "messagingSenderId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "projectId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "storageBucket"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "authDomain"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "iosBundleId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "iosClientId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "appGroupId"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String apiKeyToJs(jsi::Runtime &rt, decltype(types.apiKey) value) { + return bridging::toJs(rt, value); + } + + static jsi::String appIdToJs(jsi::Runtime &rt, decltype(types.appId) value) { + return bridging::toJs(rt, value); + } + + static std::optional databaseURLToJs(jsi::Runtime &rt, decltype(types.databaseURL) value) { + return bridging::toJs(rt, value); + } + + static jsi::String messagingSenderIdToJs(jsi::Runtime &rt, decltype(types.messagingSenderId) value) { + return bridging::toJs(rt, value); + } + + static jsi::String projectIdToJs(jsi::Runtime &rt, decltype(types.projectId) value) { + return bridging::toJs(rt, value); + } + + static std::optional storageBucketToJs(jsi::Runtime &rt, decltype(types.storageBucket) value) { + return bridging::toJs(rt, value); + } + + static std::optional authDomainToJs(jsi::Runtime &rt, decltype(types.authDomain) value) { + return bridging::toJs(rt, value); + } + + static std::optional iosBundleIdToJs(jsi::Runtime &rt, decltype(types.iosBundleId) value) { + return bridging::toJs(rt, value); + } + + static std::optional iosClientIdToJs(jsi::Runtime &rt, decltype(types.iosClientId) value) { + return bridging::toJs(rt, value); + } + + static std::optional appGroupIdToJs(jsi::Runtime &rt, decltype(types.appGroupId) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "apiKey", bridging::toJs(rt, value.apiKey, jsInvoker)); + result.setProperty(rt, "appId", bridging::toJs(rt, value.appId, jsInvoker)); + if (value.databaseURL) { + result.setProperty(rt, "databaseURL", bridging::toJs(rt, value.databaseURL.value(), jsInvoker)); + } + result.setProperty(rt, "messagingSenderId", bridging::toJs(rt, value.messagingSenderId, jsInvoker)); + result.setProperty(rt, "projectId", bridging::toJs(rt, value.projectId, jsInvoker)); + if (value.storageBucket) { + result.setProperty(rt, "storageBucket", bridging::toJs(rt, value.storageBucket.value(), jsInvoker)); + } + if (value.authDomain) { + result.setProperty(rt, "authDomain", bridging::toJs(rt, value.authDomain.value(), jsInvoker)); + } + if (value.iosBundleId) { + result.setProperty(rt, "iosBundleId", bridging::toJs(rt, value.iosBundleId.value(), jsInvoker)); + } + if (value.iosClientId) { + result.setProperty(rt, "iosClientId", bridging::toJs(rt, value.iosClientId.value(), jsInvoker)); + } + if (value.appGroupId) { + result.setProperty(rt, "appGroupId", bridging::toJs(rt, value.appGroupId.value(), jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboAppNativeFirebaseApp + +template +struct NativeRNFBTurboAppNativeFirebaseApp { + P0 appConfig; + P1 options; + bool operator==(const NativeRNFBTurboAppNativeFirebaseApp &other) const { + return appConfig == other.appConfig && options == other.options; + } +}; + +template +struct NativeRNFBTurboAppNativeFirebaseAppBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "appConfig"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "options"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object appConfigToJs(jsi::Runtime &rt, decltype(types.appConfig) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object optionsToJs(jsi::Runtime &rt, decltype(types.options) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "appConfig", bridging::toJs(rt, value.appConfig, jsInvoker)); + result.setProperty(rt, "options", bridging::toJs(rt, value.options, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboAppCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAppCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value initializeApp(jsi::Runtime &rt, jsi::Object options, jsi::Object appConfig) = 0; + virtual void setAutomaticDataCollectionEnabled(jsi::Runtime &rt, jsi::String appName, bool enabled) = 0; + virtual jsi::Value deleteApp(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void eventsNotifyReady(jsi::Runtime &rt, bool ready) = 0; + virtual jsi::Value eventsGetListeners(jsi::Runtime &rt) = 0; + virtual jsi::Value eventsPing(jsi::Runtime &rt, jsi::String eventName, jsi::Object eventBody) = 0; + virtual void eventsAddListener(jsi::Runtime &rt, jsi::String eventName) = 0; + virtual void eventsRemoveListener(jsi::Runtime &rt, jsi::String eventName, bool all) = 0; + virtual void addListener(jsi::Runtime &rt, jsi::String eventName) = 0; + virtual void removeListeners(jsi::Runtime &rt, double count) = 0; + virtual jsi::Value metaGetAll(jsi::Runtime &rt) = 0; + virtual jsi::Value jsonGetAll(jsi::Runtime &rt) = 0; + virtual jsi::Value preferencesSetBool(jsi::Runtime &rt, jsi::String key, bool value) = 0; + virtual jsi::Value preferencesSetString(jsi::Runtime &rt, jsi::String key, jsi::String value) = 0; + virtual jsi::Value preferencesGetAll(jsi::Runtime &rt) = 0; + virtual jsi::Value preferencesClearAll(jsi::Runtime &rt) = 0; + virtual void setLogLevel(jsi::Runtime &rt, jsi::String logLevel) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAppCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboApp"; + +protected: + NativeRNFBTurboAppCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAppCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAppCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAppCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value initializeApp(jsi::Runtime &rt, jsi::Object options, jsi::Object appConfig) override { + static_assert( + bridging::getParameterCount(&T::initializeApp) == 3, + "Expected initializeApp(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::initializeApp, jsInvoker_, instance_, std::move(options), std::move(appConfig)); + } + void setAutomaticDataCollectionEnabled(jsi::Runtime &rt, jsi::String appName, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setAutomaticDataCollectionEnabled) == 3, + "Expected setAutomaticDataCollectionEnabled(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setAutomaticDataCollectionEnabled, jsInvoker_, instance_, std::move(appName), std::move(enabled)); + } + jsi::Value deleteApp(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::deleteApp) == 2, + "Expected deleteApp(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::deleteApp, jsInvoker_, instance_, std::move(appName)); + } + void eventsNotifyReady(jsi::Runtime &rt, bool ready) override { + static_assert( + bridging::getParameterCount(&T::eventsNotifyReady) == 2, + "Expected eventsNotifyReady(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::eventsNotifyReady, jsInvoker_, instance_, std::move(ready)); + } + jsi::Value eventsGetListeners(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::eventsGetListeners) == 1, + "Expected eventsGetListeners(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::eventsGetListeners, jsInvoker_, instance_); + } + jsi::Value eventsPing(jsi::Runtime &rt, jsi::String eventName, jsi::Object eventBody) override { + static_assert( + bridging::getParameterCount(&T::eventsPing) == 3, + "Expected eventsPing(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::eventsPing, jsInvoker_, instance_, std::move(eventName), std::move(eventBody)); + } + void eventsAddListener(jsi::Runtime &rt, jsi::String eventName) override { + static_assert( + bridging::getParameterCount(&T::eventsAddListener) == 2, + "Expected eventsAddListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::eventsAddListener, jsInvoker_, instance_, std::move(eventName)); + } + void eventsRemoveListener(jsi::Runtime &rt, jsi::String eventName, bool all) override { + static_assert( + bridging::getParameterCount(&T::eventsRemoveListener) == 3, + "Expected eventsRemoveListener(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::eventsRemoveListener, jsInvoker_, instance_, std::move(eventName), std::move(all)); + } + void addListener(jsi::Runtime &rt, jsi::String eventName) override { + static_assert( + bridging::getParameterCount(&T::addListener) == 2, + "Expected addListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::addListener, jsInvoker_, instance_, std::move(eventName)); + } + void removeListeners(jsi::Runtime &rt, double count) override { + static_assert( + bridging::getParameterCount(&T::removeListeners) == 2, + "Expected removeListeners(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeListeners, jsInvoker_, instance_, std::move(count)); + } + jsi::Value metaGetAll(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::metaGetAll) == 1, + "Expected metaGetAll(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::metaGetAll, jsInvoker_, instance_); + } + jsi::Value jsonGetAll(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::jsonGetAll) == 1, + "Expected jsonGetAll(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::jsonGetAll, jsInvoker_, instance_); + } + jsi::Value preferencesSetBool(jsi::Runtime &rt, jsi::String key, bool value) override { + static_assert( + bridging::getParameterCount(&T::preferencesSetBool) == 3, + "Expected preferencesSetBool(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::preferencesSetBool, jsInvoker_, instance_, std::move(key), std::move(value)); + } + jsi::Value preferencesSetString(jsi::Runtime &rt, jsi::String key, jsi::String value) override { + static_assert( + bridging::getParameterCount(&T::preferencesSetString) == 3, + "Expected preferencesSetString(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::preferencesSetString, jsInvoker_, instance_, std::move(key), std::move(value)); + } + jsi::Value preferencesGetAll(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::preferencesGetAll) == 1, + "Expected preferencesGetAll(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::preferencesGetAll, jsInvoker_, instance_); + } + jsi::Value preferencesClearAll(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::preferencesClearAll) == 1, + "Expected preferencesClearAll(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::preferencesClearAll, jsInvoker_, instance_); + } + void setLogLevel(jsi::Runtime &rt, jsi::String logLevel) override { + static_assert( + bridging::getParameterCount(&T::setLogLevel) == 2, + "Expected setLogLevel(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setLogLevel, jsInvoker_, instance_, std::move(logLevel)); + } + + private: + friend class NativeRNFBTurboAppCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + +#pragma mark - NativeRNFBTurboUtilsPlayServicesAvailability + +template +struct NativeRNFBTurboUtilsPlayServicesAvailability { + P0 isAvailable; + P1 status; + P2 hasResolution; + P3 isUserResolvableError; + P4 error; + bool operator==(const NativeRNFBTurboUtilsPlayServicesAvailability &other) const { + return isAvailable == other.isAvailable && status == other.status && hasResolution == other.hasResolution && isUserResolvableError == other.isUserResolvableError && error == other.error; + } +}; + +template +struct NativeRNFBTurboUtilsPlayServicesAvailabilityBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "isAvailable"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "status"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "hasResolution"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "isUserResolvableError"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "error"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool isAvailableToJs(jsi::Runtime &rt, decltype(types.isAvailable) value) { + return bridging::toJs(rt, value); + } + + static double statusToJs(jsi::Runtime &rt, decltype(types.status) value) { + return bridging::toJs(rt, value); + } + + static bool hasResolutionToJs(jsi::Runtime &rt, decltype(types.hasResolution) value) { + return bridging::toJs(rt, value); + } + + static bool isUserResolvableErrorToJs(jsi::Runtime &rt, decltype(types.isUserResolvableError) value) { + return bridging::toJs(rt, value); + } + + static jsi::String errorToJs(jsi::Runtime &rt, decltype(types.error) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "isAvailable", bridging::toJs(rt, value.isAvailable, jsInvoker)); + result.setProperty(rt, "status", bridging::toJs(rt, value.status, jsInvoker)); + result.setProperty(rt, "hasResolution", bridging::toJs(rt, value.hasResolution, jsInvoker)); + result.setProperty(rt, "isUserResolvableError", bridging::toJs(rt, value.isUserResolvableError, jsInvoker)); + if (value.error) { + result.setProperty(rt, "error", bridging::toJs(rt, value.error.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboUtilsCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboUtilsCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value androidGetPlayServicesStatus(jsi::Runtime &rt) = 0; + virtual jsi::Value androidPromptForPlayServices(jsi::Runtime &rt) = 0; + virtual jsi::Value androidResolutionForPlayServices(jsi::Runtime &rt) = 0; + virtual jsi::Value androidMakePlayServicesAvailable(jsi::Runtime &rt) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboUtilsCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboUtils"; + +protected: + NativeRNFBTurboUtilsCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboUtilsCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboUtilsCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboUtilsCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value androidGetPlayServicesStatus(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::androidGetPlayServicesStatus) == 1, + "Expected androidGetPlayServicesStatus(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::androidGetPlayServicesStatus, jsInvoker_, instance_); + } + jsi::Value androidPromptForPlayServices(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::androidPromptForPlayServices) == 1, + "Expected androidPromptForPlayServices(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::androidPromptForPlayServices, jsInvoker_, instance_); + } + jsi::Value androidResolutionForPlayServices(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::androidResolutionForPlayServices) == 1, + "Expected androidResolutionForPlayServices(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::androidResolutionForPlayServices, jsInvoker_, instance_); + } + jsi::Value androidMakePlayServicesAvailable(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::androidMakePlayServicesAvailable) == 1, + "Expected androidMakePlayServicesAvailable(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::androidMakePlayServicesAvailable, jsInvoker_, instance_); + } + + private: + friend class NativeRNFBTurboUtilsCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/app/ios/generated/ReactAppDependencyProvider.podspec b/packages/app/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/app/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/app/ios/generated/ReactCodegen.podspec b/packages/app/ios/generated/ReactCodegen.podspec new file mode 100644 index 0000000000..2e6a73db65 --- /dev/null +++ b/packages/app/ios/generated/ReactCodegen.podspec @@ -0,0 +1,111 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.82.1" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +use_frameworks = ENV['USE_FRAMEWORKS'] != nil +folly_compiler_flags = Helpers::Constants.folly_config[:compiler_flags] +boost_compiler_flags = Helpers::Constants.boost_config[:compiler_flags] + +header_search_paths = [] +framework_search_paths = [] + +header_search_paths = [ + "\"$(PODS_ROOT)/ReactNativeDependencies\"", + "\"${PODS_ROOT}/Headers/Public/ReactCodegen/react/renderer/components\"", + "\"$(PODS_ROOT)/Headers/Private/React-Fabric\"", + "\"$(PODS_ROOT)/Headers/Private/React-RCTFabric\"", + "\"$(PODS_ROOT)/Headers/Private/Yoga\"", + "\"$(PODS_TARGET_SRCROOT)\"", +] + +if use_frameworks + ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-Fabric", "React_Fabric", ["react/renderer/components/view/platform/cxx"]) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-FabricImage", "React_FabricImage", [])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-graphics", "React_graphics", ["react/renderer/graphics/platform/ios"])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "ReactCommon", "ReactCommon", ["react/nativemodule/core"])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-runtimeexecutor", "React_runtimeexecutor", ["platform/ios"])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-NativeModulesApple", "React_NativeModulesApple", [])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-RCTFabric", "RCTFabric", [])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-debug", "React_debug", [])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-rendererdebug", "React_rendererdebug", [])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-utils", "React_utils", [])) + .concat(ReactNativePodsUtils.create_header_search_path_for_frameworks("PODS_CONFIGURATION_BUILD_DIR", "React-featureflags", "React_featureflags", [])) + .each { |search_path| + header_search_paths << "\"#{search_path}\"" + } + end + +Pod::Spec.new do |s| + s.name = "ReactCodegen" + s.version = version + s.summary = 'Temp pod for generated files for React Native' + s.homepage = 'https://facebook.com/' + s.license = 'Unlicense' + s.authors = 'Facebook' + s.compiler_flags = "#{folly_compiler_flags} #{boost_compiler_flags} -Wno-nullability-completeness -std=c++20" + s.source = { :git => '' } + s.header_mappings_dir = './' + s.platforms = min_supported_versions + s.source_files = "**/*.{h,mm,cpp}" + s.exclude_files = "RCTAppDependencyProvider.{h,mm}" # these files are generated in the same codegen path but needs to belong to a different pod + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => header_search_paths.join(' '), + "FRAMEWORK_SEARCH_PATHS" => framework_search_paths, + "OTHER_CPLUSPLUSFLAGS" => "$(inherited) #{folly_compiler_flags} #{boost_compiler_flags}" + } + + s.dependency "React-jsiexecutor" + s.dependency "RCTRequired" + s.dependency "RCTTypeSafety" + s.dependency "React-Core" + s.dependency "React-jsi" + s.dependency "ReactCommon/turbomodule/bridging" + s.dependency "ReactCommon/turbomodule/core" + s.dependency "React-NativeModulesApple" + s.dependency 'React-graphics' + s.dependency 'React-rendererdebug' + s.dependency 'React-Fabric' + s.dependency 'React-FabricImage' + s.dependency 'React-debug' + s.dependency 'React-utils' + s.dependency 'React-featureflags' + s.dependency 'React-RCTAppDelegate' + + depend_on_js_engine(s) + add_rn_third_party_dependencies(s) + add_rncore_dependency(s) + + s.script_phases = { + 'name' => 'Generate Specs', + 'execution_position' => :before_compile, + 'input_files' => ["${PODS_ROOT}/../../specs/NativeRNFBTurboApp.ts", +"${PODS_ROOT}/../../specs/NativeRNFBTurboUtils.ts"], + 'show_env_vars_in_log' => true, + 'output_files' => ["${DERIVED_FILE_DIR}/react-codegen.log"], + 'script': <<-SCRIPT +pushd "$PODS_ROOT/../" > /dev/null +RCT_SCRIPT_POD_INSTALLATION_ROOT=$(pwd) +popd >/dev/null + +export RCT_SCRIPT_RN_DIR="$RCT_SCRIPT_POD_INSTALLATION_ROOT/../../../../node_modules/react-native" +export RCT_SCRIPT_APP_PATH="$RCT_SCRIPT_POD_INSTALLATION_ROOT/../.." +export RCT_SCRIPT_OUTPUT_DIR="$RCT_SCRIPT_POD_INSTALLATION_ROOT" +export RCT_SCRIPT_TYPE="withCodegenDiscovery" + +export SCRIPT_PHASES_SCRIPT="$RCT_SCRIPT_RN_DIR/scripts/react_native_pods_utils/script_phases.sh" +export WITH_ENVIRONMENT="$RCT_SCRIPT_RN_DIR/scripts/xcode/with-environment.sh" +/bin/sh -c '"$WITH_ENVIRONMENT" "$SCRIPT_PHASES_SCRIPT"' +SCRIPT + } + +end diff --git a/packages/app/lib/internal/RNFBNativeEventEmitter.ts b/packages/app/lib/internal/RNFBNativeEventEmitter.ts index 2abb338595..a0bc036982 100644 --- a/packages/app/lib/internal/RNFBNativeEventEmitter.ts +++ b/packages/app/lib/internal/RNFBNativeEventEmitter.ts @@ -16,6 +16,7 @@ */ import { type EmitterSubscription, NativeEventEmitter } from 'react-native'; +import { APP_NATIVE_MODULE } from './constants'; import { getReactNativeModule } from './nativeModule'; import type { RNFBAppModuleInterface } from './NativeModules'; @@ -38,10 +39,11 @@ class RNFBNativeEventEmitter extends NativeEventEmitter { ready: boolean; constructor() { - const RNFBAppModule = getReactNativeModule('RNFBAppModule'); + // NewArch-AD-18 E1: NativeEventEmitter must receive the same raw host that implements addListener/removeListeners. + const RNFBAppModule = getReactNativeModule(APP_NATIVE_MODULE); if (!RNFBAppModule) { throw new Error( - 'Native module RNFBAppModule not found. Re-check module install, linking, configuration, build and install steps.', + `Native module ${APP_NATIVE_MODULE} not found. Re-check module install, linking, configuration, build and install steps.`, ); } // Cast to any for NativeEventEmitter constructor which expects React Native's NativeModule type @@ -54,8 +56,9 @@ class RNFBNativeEventEmitter extends NativeEventEmitter { listener: (...args: unknown[]) => unknown, context?: object, ): EmitterSubscription { + // NewArch-AD-18 E1: event bridge identity requires raw app-module host for listener registration. const RNFBAppModule = getReactNativeModule( - 'RNFBAppModule', + APP_NATIVE_MODULE, ) as unknown as RNFBAppModuleInterface; if (!this.ready) { (RNFBAppModule.eventsNotifyReady as EventsNotifyReadyMethod)(true); @@ -99,7 +102,8 @@ class RNFBNativeEventEmitter extends NativeEventEmitter { // we will modify it to do our native unsubscription then call the original const originalRemove = subscription.remove; const newRemove = () => { - const module = getReactNativeModule('RNFBAppModule') as unknown as RNFBAppModuleInterface; + // NewArch-AD-18 E1: raw host for eventsRemoveListener on unsubscribe. + const module = getReactNativeModule(APP_NATIVE_MODULE) as unknown as RNFBAppModuleInterface; (module.eventsRemoveListener as EventsRemoveListenerMethod)(eventType, false); const superClass = Object.getPrototypeOf(Object.getPrototypeOf(this)); if (superClass.removeSubscription != null) { @@ -115,8 +119,9 @@ class RNFBNativeEventEmitter extends NativeEventEmitter { } removeAllListeners(eventType: string): void { + // NewArch-AD-18 E1: raw host for eventsRemoveListener. const RNFBAppModule = getReactNativeModule( - 'RNFBAppModule', + APP_NATIVE_MODULE, ) as unknown as RNFBAppModuleInterface; (RNFBAppModule.eventsRemoveListener as EventsRemoveListenerMethod)(eventType, true); super.removeAllListeners(`rnfb_${eventType}`); @@ -124,8 +129,9 @@ class RNFBNativeEventEmitter extends NativeEventEmitter { // This is likely no longer ever called, but it is here for backwards compatibility with RN <= 0.64 removeSubscription(subscription: EmitterSubscription & { eventType?: string }): void { + // NewArch-AD-18 E1: raw host for legacy removeSubscription path. const RNFBAppModule = getReactNativeModule( - 'RNFBAppModule', + APP_NATIVE_MODULE, ) as unknown as RNFBAppModuleInterface; const eventType = subscription.eventType?.replace('rnfb_', '') || ''; (RNFBAppModule.eventsRemoveListener as EventsRemoveListenerMethod)(eventType, false); diff --git a/packages/app/lib/internal/constants.ts b/packages/app/lib/internal/constants.ts index 9e8d687e8d..0675aceadf 100644 --- a/packages/app/lib/internal/constants.ts +++ b/packages/app/lib/internal/constants.ts @@ -15,6 +15,8 @@ * */ -export const APP_NATIVE_MODULE = 'RNFBAppModule'; +export const APP_NATIVE_MODULE = 'NativeRNFBTurboApp'; + +export const UTILS_NATIVE_MODULE = 'NativeRNFBTurboUtils'; export const DEFAULT_APP_NAME = '[DEFAULT]'; diff --git a/packages/app/lib/internal/nativeModuleAndroidIos.ts b/packages/app/lib/internal/nativeModuleAndroidIos.ts index ad6c02fb82..96434b0b29 100644 --- a/packages/app/lib/internal/nativeModuleAndroidIos.ts +++ b/packages/app/lib/internal/nativeModuleAndroidIos.ts @@ -1,30 +1,85 @@ /* eslint-disable no-console */ -import { NativeModules } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +const DYNAMIC_CONSTANT_KEYS = new Set(['androidPlayServices']); + +const memoizedModuleConstants = new Map>(); +const memoizedDebugProxies = new Map>(); + +function withTurboConstants( + moduleName: string, + module: Record | undefined, +): Record | undefined { + if (!module) { + return module; + } + + const getConstants = module.getConstants; + if (typeof getConstants !== 'function') { + return module; + } + + let constants = memoizedModuleConstants.get(moduleName); + if (!constants) { + constants = (getConstants as () => Record).call(module) || {}; + memoizedModuleConstants.set(moduleName, constants); + } + + const descriptors: PropertyDescriptorMap = {}; + for (const key of Object.keys(constants)) { + if (DYNAMIC_CONSTANT_KEYS.has(key)) { + continue; + } + descriptors[key] = { + value: constants[key], + enumerable: true, + writable: true, + configurable: true, + }; + } + + return Object.create(module, descriptors); +} /** - * This is used by Android and iOS to get a native module. - * We additionally add a Proxy to the module to intercept calls - * and log them to the console for debugging purposes, if enabled. - * @param moduleName - * @returns Raw native module from React Native (object with methods/properties or undefined) + * Unified native module resolver — TurboModule only (NewArch-AD-6 Phase R). */ -export function getReactNativeModule(moduleName: string): Record | undefined { - const nativeModule = NativeModules[moduleName]; +export function getReactNativeModule(moduleName: string): Record { + const turboModule = TurboModuleRegistry.get(moduleName); + if (!turboModule) { + throw new Error(`Native module ${moduleName} is not registered.`); + } + + const nativeModule = withTurboConstants( + moduleName, + turboModule as Record, + ) as Record; + if (!globalThis.RNFBDebug) { return nativeModule; } - return new Proxy(nativeModule, { + + let debugProxy = memoizedDebugProxies.get(moduleName); + if (debugProxy) { + return debugProxy; + } + + debugProxy = new Proxy(nativeModule as Record, { ownKeys(target) { - return Object.keys(target); + const keys: string[] = []; + for (const key in target) { + keys.push(key); + } + return keys; }, get: (_, name) => { - const prop = nativeModule[name as string]; + const prop = (nativeModule as Record)[name as string]; if (typeof prop !== 'function') return prop; return (...args: unknown[]) => { console.debug( `[RNFB->Native][🔵] ${moduleName}.${String(name)} -> ${JSON.stringify(args)}`, ); - const result: unknown = (prop as (...args: unknown[]) => unknown)(...args); + const result: unknown = (prop as (...args: unknown[]) => unknown).apply(nativeModule, args); if (result && typeof result === 'object' && 'then' in result) { return (result as Promise).then( (res: unknown) => { @@ -48,6 +103,8 @@ export function getReactNativeModule(moduleName: string): Record> = {}; +// Register before exporting getters — RNFBNativeEventEmitter instantiates during circular imports. +const nativeModuleRegistry: Record> = { + RNFBAppModule: RNFBAppModule as unknown as Record, + [APP_NATIVE_MODULE]: RNFBAppModule as unknown as Record, +}; export function getReactNativeModule(moduleName: string): Record | undefined { const nativeModule = nativeModuleRegistry[moduleName]; @@ -14,8 +19,11 @@ export function getReactNativeModule(moduleName: string): Record { const prop = nativeModule[name as string]; @@ -56,5 +64,3 @@ export function setReactNativeModule( ): void { nativeModuleRegistry[moduleName] = nativeModule; } - -setReactNativeModule('RNFBAppModule', RNFBAppModule); diff --git a/packages/app/lib/internal/registry/app.ts b/packages/app/lib/internal/registry/app.ts index a4b028090a..553c177c68 100644 --- a/packages/app/lib/internal/registry/app.ts +++ b/packages/app/lib/internal/registry/app.ts @@ -257,9 +257,24 @@ export function deleteApp(name: string, nativeInitialized: boolean): Promise { (app as any)._deleted = true; - for (let i = 0; i < onAppDestroyCallbacks.length; i++) { - onAppDestroyCallbacks[i]?.(app); + try { + for (let i = 0; i < onAppDestroyCallbacks.length; i++) { + try { + onAppDestroyCallbacks[i]?.(app); + } catch (e) { + // A failing destroy listener must not prevent the remaining listeners (or the + // registry cleanup below) from running. Surface it for diagnosis — partial cleanup + // here can leave a module's native/JS state stale for the deleted app. + // eslint-disable-next-line no-console + console.warn( + `Firebase: an onAppDestroy callback (index ${i}) for app '${name}' threw and was ` + + 'skipped; remaining callbacks will still run. Inspect the offending listener:', + e, + ); + } + } + } finally { + delete APP_REGISTRY[name]; } - delete APP_REGISTRY[name]; }); } diff --git a/packages/app/lib/internal/registry/nativeModule.ts b/packages/app/lib/internal/registry/nativeModule.ts index 559997b248..2646ba8665 100644 --- a/packages/app/lib/internal/registry/nativeModule.ts +++ b/packages/app/lib/internal/registry/nativeModule.ts @@ -14,7 +14,7 @@ * limitations under the License. * */ -import { APP_NATIVE_MODULE } from '../constants'; +import { APP_NATIVE_MODULE, UTILS_NATIVE_MODULE } from '../constants'; import NativeFirebaseError from '../NativeFirebaseError'; import type { NativeError } from '../../types/internal'; import RNFBNativeEventEmitter from '../RNFBNativeEventEmitter'; @@ -31,8 +31,15 @@ interface NativeEvent { [key: string]: unknown; } +interface RouteEntry { + host: Record; + key: string; + argToPrepend: unknown[]; +} + const NATIVE_MODULE_REGISTRY: Record = {}; const NATIVE_MODULE_EVENT_SUBSCRIPTIONS: Record = {}; +let staticUtilsModule: WrappedNativeModule | null = null; function nativeModuleKey(module: FirebaseModule): string { return `${module._customUrlOrRegion || ''}:${module.app.name}:${module._config.namespace}`; @@ -41,11 +48,6 @@ function nativeModuleKey(module: FirebaseModule): string { /** * Wraps a native module method to provide * auto prepended args and custom Error classes. - * - * @param namespace - * @param method - * @param argToPrepend - * @returns {Function} */ function nativeModuleMethodWrapped( namespace: string, @@ -54,9 +56,7 @@ function nativeModuleMethodWrapped( isTurboModule: boolean, ): (...args: unknown[]) => unknown { return (...args: unknown[]) => { - // For iOS TurboModules, encode null values in arguments to work around - // the limitation where null values in object properties get stripped during serialization - // See: https://github.com/facebook/react-native/issues/52802 + // Per-call encodeNullValues walk is intentional: args may differ on every invocation. const processedArgs = isIOS && isTurboModule ? args.map(arg => encodeNullValues(arg)) : args; const allArgs = [...argToPrepend, ...processedArgs]; const possiblePromise = method(...allArgs); @@ -73,50 +73,107 @@ function nativeModuleMethodWrapped( } /** - * Prepends all arguments in prependArgs to all native method calls - * - * @param namespace - * @param NativeModule - Raw native module from React Native - * @param argToPrepend + * NewArch-AD-14 / NewArch-AD-14a: routing composite Proxy — lazy wrap+bind on first access per method. */ -function nativeModuleWrapped( +function createRoutingCompositeProxy( namespace: string, - NativeModule: Record | undefined, - argToPrepend: unknown[], + hosts: Array<{ module: Record | undefined; argToPrepend: unknown[] }>, isTurboModule: boolean, ): WrappedNativeModule { - const native: Record = {}; - if (!NativeModule) { - return NativeModule as unknown as WrappedNativeModule; - } + const routingMap: Record = {}; + const memoizedMethods: Record unknown> = {}; + const memoizedConstants: Record = {}; - const nativeModuleObj = NativeModule; - let properties = Object.keys(Object.getPrototypeOf(nativeModuleObj)); - if (!properties.length) properties = Object.keys(nativeModuleObj); - - for (let i = 0, len = properties.length; i < len; i++) { - const property = properties[i]; - if (!property) continue; - if (typeof nativeModuleObj[property] === 'function') { - native[property] = nativeModuleMethodWrapped( - namespace, - nativeModuleObj[property] as (...args: unknown[]) => unknown, - argToPrepend, - isTurboModule, - ); - } else { - native[property] = nativeModuleObj[property]; + for (const { module, argToPrepend } of hosts) { + if (!module) { + continue; + } + for (const key in module) { + if (key === 'constructor' || key === 'getConstants') { + continue; + } + routingMap[key] = { host: module, key, argToPrepend }; } } - return native; + const target = Object.create(null) as WrappedNativeModule; + + return new Proxy(target, { + get(_target, name: string | symbol) { + if (typeof name !== 'string' || !(name in routingMap)) { + return undefined; + } + + const route = routingMap[name]; + if (!route) { + return undefined; + } + + const value = route.host[route.key]; + + if (typeof value !== 'function') { + if (!(name in memoizedConstants)) { + memoizedConstants[name] = value; + } + return memoizedConstants[name]; + } + + if (!memoizedMethods[name]) { + memoizedMethods[name] = nativeModuleMethodWrapped( + namespace, + (value as (...args: unknown[]) => unknown).bind(route.host), + route.argToPrepend, + isTurboModule, + ) as (...args: unknown[]) => unknown; + } + + return memoizedMethods[name]; + }, + has(_target, name) { + return typeof name === 'string' && name in routingMap; + }, + ownKeys() { + return Object.keys(routingMap); + }, + getOwnPropertyDescriptor(_target, name) { + if (typeof name !== 'string' || !(name in routingMap)) { + return undefined; + } + return { + enumerable: true, + configurable: true, + }; + }, + set() { + return false; + }, + }); +} + +/** + * NewArch-AD-14a N=1: single-host routing composite (TurboModule by default). + */ +function createSingleHostComposite( + namespace: string, + moduleName: string, + argToPrepend: unknown[] = [], + isTurboModule = true, +): WrappedNativeModule { + const nativeModule = getReactNativeModule(moduleName); + + if (!nativeModule) { + throw new Error(getMissingModuleHelpText(namespace)); + } + + return createRoutingCompositeProxy( + namespace, + [{ module: nativeModule, argToPrepend }], + isTurboModule, + ); } /** * Initialises and wraps all the native module methods. - * - * @param module - * @returns {*} */ function initialiseNativeModule(module: FirebaseModule): WrappedNativeModule { const config = module._config; @@ -130,41 +187,45 @@ function initialiseNativeModule(module: FirebaseModule): WrappedNativeModule { disablePrependCustomUrlOrRegion, turboModule, } = config; - const multiModuleRoot: WrappedNativeModule = {}; const isTurboModule = !!turboModule; const multiModule = Array.isArray(nativeModuleName); const nativeModuleNames = multiModule ? nativeModuleName : [nativeModuleName]; - for (let i = 0; i < nativeModuleNames.length; i++) { - const moduleName = nativeModuleNames[i]; - if (!moduleName) continue; + const argToPrepend: Array = []; + + if (hasMultiAppSupport) { + argToPrepend.push(module.app.name); + } + + if (hasCustomUrlOrRegionSupport && !disablePrependCustomUrlOrRegion) { + argToPrepend.push(module._customUrlOrRegion as string); + } - const nativeModule = getReactNativeModule(moduleName); + let composite: WrappedNativeModule; - // only error if there's a single native module - // as multi modules can mean some are optional - if (!multiModule && !nativeModule) { + if (!multiModule) { + const moduleName = nativeModuleNames[0]; + if (!moduleName) { throw new Error(getMissingModuleHelpText(namespace)); } - if (multiModule) { - multiModuleRoot[moduleName] = !!nativeModule; - } + composite = createSingleHostComposite(namespace, moduleName, argToPrepend, isTurboModule); + } else { + const hosts: Array<{ module: Record | undefined; argToPrepend: unknown[] }> = + []; - const argToPrepend: Array = []; + for (let i = 0; i < nativeModuleNames.length; i++) { + const moduleName = nativeModuleNames[i]; + if (!moduleName) continue; - if (hasMultiAppSupport) { - argToPrepend.push(module.app.name); - } + const nativeModule = getReactNativeModule(moduleName); - if (hasCustomUrlOrRegionSupport && !disablePrependCustomUrlOrRegion) { - argToPrepend.push(module._customUrlOrRegion as string); + if (nativeModule) { + hosts.push({ module: nativeModule, argToPrepend }); + } } - Object.assign( - multiModuleRoot, - nativeModuleWrapped(namespace, nativeModule, argToPrepend, isTurboModule), - ); + composite = createRoutingCompositeProxy(namespace, hosts, isTurboModule); } if (nativeEvents && Array.isArray(nativeEvents) && nativeEvents.length) { @@ -176,34 +237,20 @@ function initialiseNativeModule(module: FirebaseModule): WrappedNativeModule { } } - Object.freeze(multiModuleRoot); - - NATIVE_MODULE_REGISTRY[key] = multiModuleRoot; + NATIVE_MODULE_REGISTRY[key] = composite; return NATIVE_MODULE_REGISTRY[key]; } -/** - * Subscribe to a native event for js side distribution by appName - * React Native events are hard set at compile - cant do dynamic event names - * so we use a single event send it to js and js then internally can prefix it - * and distribute dynamically. - * - * @param eventName - * @private - */ function subscribeToNativeModuleEvent(eventName: string): void { if (!NATIVE_MODULE_EVENT_SUBSCRIPTIONS[eventName]) { RNFBNativeEventEmitter.addListener(eventName, (...args: unknown[]) => { const event = args[0] as NativeEvent; if (event.appName && event.databaseId) { - // Firestore requires both appName and databaseId to prefix SharedEventEmitter.emit(`${event.appName}-${event.databaseId}-${eventName}`, event); } else if (event.appName) { - // native event has an appName property - auto prefix and internally emit SharedEventEmitter.emit(`${event.appName}-${eventName}`, event); } else { - // standard event - no need to prefix SharedEventEmitter.emit(eventName, event); } }); @@ -212,12 +259,6 @@ function subscribeToNativeModuleEvent(eventName: string): void { } } -/** - * Help text for integrating the native counter parts for each firebase module. - * - * @param namespace - * @returns {string} - */ function getMissingModuleHelpText(namespace: string): string { const snippet = `firebase.${namespace}()`; @@ -236,13 +277,6 @@ function getMissingModuleHelpText(namespace: string): string { ); } -/** - * Gets a wrapped native module instance for the provided firebase module. - * Will attempt to create a new instance if non previously created. - * - * @param module - * @returns {*} - */ export function getNativeModule(module: FirebaseModule): WrappedNativeModule { const key = nativeModuleKey(module); @@ -253,30 +287,25 @@ export function getNativeModule(module: FirebaseModule): WrappedNativeModule { return initialiseNativeModule(module); } -/** - * Custom wrapped app module as it does not have it's own FirebaseModule based class. - * - * @returns {*} - */ export function getAppModule(): RNFBAppModuleInterface { if (NATIVE_MODULE_REGISTRY[APP_NATIVE_MODULE]) { return NATIVE_MODULE_REGISTRY[APP_NATIVE_MODULE] as unknown as RNFBAppModuleInterface; } - const namespace = 'app'; - const nativeModule = getReactNativeModule(APP_NATIVE_MODULE); + NATIVE_MODULE_REGISTRY[APP_NATIVE_MODULE] = createSingleHostComposite('app', APP_NATIVE_MODULE); - if (!nativeModule) { - throw new Error(getMissingModuleHelpText(namespace)); + return NATIVE_MODULE_REGISTRY[APP_NATIVE_MODULE] as unknown as RNFBAppModuleInterface; +} + +/** + * Memoized wrapped utils surface for static path-constant reads (NewArch-AD-18 E5). + */ +export function getStaticUtilsModule(): WrappedNativeModule { + if (staticUtilsModule) { + return staticUtilsModule; } - NATIVE_MODULE_REGISTRY[APP_NATIVE_MODULE] = nativeModuleWrapped( - namespace, - nativeModule, - [], - // TODO: change to true when we use TurboModules for app package - false, - ); + staticUtilsModule = createSingleHostComposite('utils', UTILS_NATIVE_MODULE); - return NATIVE_MODULE_REGISTRY[APP_NATIVE_MODULE] as unknown as RNFBAppModuleInterface; + return staticUtilsModule; } diff --git a/packages/app/lib/modular.ts b/packages/app/lib/modular.ts index 52068ef85e..03464bc283 100644 --- a/packages/app/lib/modular.ts +++ b/packages/app/lib/modular.ts @@ -28,9 +28,7 @@ import { } from './internal/registry/app'; import { setUserLogHandler } from './internal/logger'; import { version as sdkVersion } from './version'; -import { getReactNativeModule } from './internal/nativeModule'; -import { APP_NATIVE_MODULE } from './internal/constants'; -import type { RNFBAppModuleInterface } from './internal/NativeModules'; +import { getAppModule } from './internal/registry/nativeModule'; /** * Renders this app unusable and frees the resources of all associated services. * @param app - The app to delete. @@ -42,16 +40,15 @@ export function deleteApp(app: ReactNativeFirebase.FirebaseApp): Promise { /** * Registers a library's name and version for platform logging purposes. - * @param _libraryKeyOrName - library name or key. - * @param _version - library version. - * @param _variant - library variant. Optional. - * @returns Promise + * + * @remarks **Web only.** Always throws on React Native Firebase — native SDK version registration + * is handled by the Firebase iOS/Android SDKs. */ export function registerVersion( _libraryKeyOrName: string, _version: string, _variant?: string, -): Promise { +): void { throw new Error('registerVersion is only supported on Web'); } @@ -75,6 +72,11 @@ export function getApps(): ReactNativeFirebase.FirebaseApp[] { /** * Initializes a Firebase app with the provided options and name. + * + * @remarks On React Native Firebase this is **async** (`Promise`) because secondary + * app creation crosses the native bridge. The default app is still configured from native + * `GoogleService-Info.plist` / `google-services.json` at launch. + * * @param options - Options to configure the services used in the app. * @param configOrName - The optional name of the app, or config for the app to initialize (a name of '[DEFAULT]' will be used if omitted). * @returns The initialized Firebase app. @@ -121,10 +123,7 @@ export function setReactNativeAsyncStorage( * @returns map of key / value pairs containing native meta data */ export function metaGetAll(): Promise<{ [key: string]: string | boolean }> { - const RNFBAppModule = getReactNativeModule( - APP_NATIVE_MODULE, - ) as unknown as RNFBAppModuleInterface; - return RNFBAppModule.metaGetAll(); + return getAppModule().metaGetAll(); } /** @@ -132,10 +131,7 @@ export function metaGetAll(): Promise<{ [key: string]: string | boolean }> { * @returns map of key / value pairs containing native firebase.json constants */ export function jsonGetAll(): Promise<{ [key: string]: string | boolean }> { - const RNFBAppModule = getReactNativeModule( - APP_NATIVE_MODULE, - ) as unknown as RNFBAppModuleInterface; - return RNFBAppModule.jsonGetAll(); + return getAppModule().jsonGetAll(); } /** @@ -143,10 +139,7 @@ export function jsonGetAll(): Promise<{ [key: string]: string | boolean }> { * @returns Promise */ export function preferencesClearAll(): Promise { - const RNFBAppModule = getReactNativeModule( - APP_NATIVE_MODULE, - ) as unknown as RNFBAppModuleInterface; - return RNFBAppModule.preferencesClearAll(); + return getAppModule().preferencesClearAll(); } /** @@ -154,10 +147,7 @@ export function preferencesClearAll(): Promise { * @returns map of key / value pairs containing native preferences data */ export function preferencesGetAll(): Promise<{ [key: string]: string | boolean }> { - const RNFBAppModule = getReactNativeModule( - APP_NATIVE_MODULE, - ) as unknown as RNFBAppModuleInterface; - return RNFBAppModule.preferencesGetAll(); + return getAppModule().preferencesGetAll(); } /** @@ -167,10 +157,7 @@ export function preferencesGetAll(): Promise<{ [key: string]: string | boolean } * @returns Promise */ export function preferencesSetBool(key: string, value: boolean): Promise { - const RNFBAppModule = getReactNativeModule( - APP_NATIVE_MODULE, - ) as unknown as RNFBAppModuleInterface; - return RNFBAppModule.preferencesSetBool(key, value); + return getAppModule().preferencesSetBool(key, value); } /** @@ -180,13 +167,10 @@ export function preferencesSetBool(key: string, value: boolean): Promise { * @returns Promise */ export function preferencesSetString(key: string, value: string): Promise { - const RNFBAppModule = getReactNativeModule( - APP_NATIVE_MODULE, - ) as unknown as RNFBAppModuleInterface; - return RNFBAppModule.preferencesSetString(key, value); + return getAppModule().preferencesSetString(key, value); } -export const SDK_VERSION = sdkVersion; +export const SDK_VERSION: string = sdkVersion; /** * Returns the {@link Utils.Module} instance for the default or given {@link ReactNativeFirebase.FirebaseApp}. diff --git a/packages/app/lib/utils/UtilsStatics.ts b/packages/app/lib/utils/UtilsStatics.ts index 69c9860aa6..2e82a5ebd5 100644 --- a/packages/app/lib/utils/UtilsStatics.ts +++ b/packages/app/lib/utils/UtilsStatics.ts @@ -15,7 +15,7 @@ * */ -import { NativeModules } from 'react-native'; +import { getStaticUtilsModule } from '../internal/registry/nativeModule'; import { stripTrailingSlash, isOther } from '../common'; import { Utils } from '../types/app'; import { version } from '../version'; @@ -66,7 +66,7 @@ const statics: Utils.Statics = { SDK_VERSION: version, get FilePath(): Utils.FilePath { // We don't support path constants on non-native platforms. - return processPathConstants(isOther ? {} : NativeModules.RNFBUtilsModule); + return processPathConstants(isOther ? {} : getStaticUtilsModule()); }, }; diff --git a/packages/app/lib/utils/index.ts b/packages/app/lib/utils/index.ts index 31b5f52c81..a09d0fe2c4 100644 --- a/packages/app/lib/utils/index.ts +++ b/packages/app/lib/utils/index.ts @@ -19,9 +19,10 @@ import { isIOS } from '../common'; import { FirebaseModule, getOrCreateModularInstance } from '../internal'; import type { ModuleConfig } from '../internal'; import type { ReactNativeFirebase, Utils } from '../types/app'; +import { UTILS_NATIVE_MODULE } from '../internal/constants'; const namespace = 'utils'; -const nativeModuleName = 'RNFBUtilsModule'; +const nativeModuleName = UTILS_NATIVE_MODULE; const config: ModuleConfig = { namespace, @@ -29,6 +30,7 @@ const config: ModuleConfig = { nativeEvents: false, hasMultiAppSupport: false, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; class FirebaseUtilsModule extends FirebaseModule<'RNFBUtilsModule'> { @@ -49,7 +51,8 @@ class FirebaseUtilsModule extends FirebaseModule<'RNFBUtilsModule'> { error: undefined, }; } - return this.native.androidPlayServices; + // NewArch-AD-15: dynamic Play Services status — use getPlayServicesStatus() (async) on Android. + return this.getPlayServicesStatus() as unknown as Utils.PlayServicesAvailability; } getPlayServicesStatus(): Promise { diff --git a/packages/app/package.json b/packages/app/package.json index 064ea7a739..f01a9dffbe 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -5,7 +5,25 @@ "description": "A well tested, feature rich Firebase implementation for React Native, supporting iOS & Android. Individual module support for Admob, Analytics, Auth, Crash Reporting, Cloud Firestore, Database, Dynamic Links, Functions, Messaging (FCM), Remote Config, Storage and more.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBAppTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.app" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboApp": "RNFBAppModule", + "NativeRNFBTurboUtils": "RNFBUtilsModule" + } + } + }, "scripts": { + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/reactnative/java/io/invertase/firebase/app/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated", "build": "genversion --esm --semi lib/version.ts && npm run build:version", "build:version": "node ./scripts/genversion-ios && node ./scripts/genversion-android", "build:clean": "rimraf android/build && rimraf ios/build", diff --git a/packages/app/react-native.config.js b/packages/app/react-native.config.js index 8502984955..377589a57b 100644 --- a/packages/app/react-native.config.js +++ b/packages/app/react-native.config.js @@ -3,6 +3,8 @@ module.exports = { platforms: { android: { packageImportPath: 'import io.invertase.firebase.app.ReactNativeFirebaseAppPackage;', + cmakeListsPath: + './src/reactnative/java/io/invertase/firebase/app/generated/jni/CMakeLists.txt', }, ios: { scriptPhases: [ diff --git a/packages/app/specs/NativeRNFBTurboApp.ts b/packages/app/specs/NativeRNFBTurboApp.ts new file mode 100644 index 0000000000..1d74f3e293 --- /dev/null +++ b/packages/app/specs/NativeRNFBTurboApp.ts @@ -0,0 +1,57 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export type FirebaseAppConfig = { + name: string; + automaticResourceManagement?: boolean; + automaticDataCollectionEnabled?: boolean; +}; + +export type FirebaseAppOptions = { + apiKey: string; + appId: string; + databaseURL?: string | null; + messagingSenderId: string; + projectId: string; + storageBucket?: string | null; + authDomain?: string | null; + iosBundleId?: string | null; + iosClientId?: string | null; + appGroupId?: string | null; +}; + +export type NativeFirebaseApp = { + appConfig: FirebaseAppConfig; + options: FirebaseAppOptions; +}; + +export interface Spec extends TurboModule { + getConstants(): { + NATIVE_FIREBASE_APPS: Array; + FIREBASE_RAW_JSON: string; + }; + + initializeApp(options: Object, appConfig: Object): Promise; + setAutomaticDataCollectionEnabled(appName: string, enabled: boolean): void; + deleteApp(appName: string): Promise; + + eventsNotifyReady(ready: boolean): void; + eventsGetListeners(): Promise; + eventsPing(eventName: string, eventBody: Object): Promise; + eventsAddListener(eventName: string): void; + eventsRemoveListener(eventName: string, all: boolean): void; + addListener(eventName: string): void; + removeListeners(count: number): void; + + metaGetAll(): Promise; + jsonGetAll(): Promise; + preferencesSetBool(key: string, value: boolean): Promise; + preferencesSetString(key: string, value: string): Promise; + preferencesGetAll(): Promise; + preferencesClearAll(): Promise; + + setLogLevel(logLevel: string): void; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboApp'); diff --git a/packages/app/specs/NativeRNFBTurboUtils.ts b/packages/app/specs/NativeRNFBTurboUtils.ts new file mode 100644 index 0000000000..57ad14e631 --- /dev/null +++ b/packages/app/specs/NativeRNFBTurboUtils.ts @@ -0,0 +1,34 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export type PlayServicesAvailability = { + isAvailable: boolean; + status: number; + hasResolution: boolean; + isUserResolvableError: boolean; + error?: string; +}; + +export interface Spec extends TurboModule { + getConstants(): { + isRunningInTestLab: boolean; + MAIN_BUNDLE: string; + CACHES_DIRECTORY: string; + DOCUMENT_DIRECTORY: string; + EXTERNAL_DIRECTORY?: string; + EXTERNAL_STORAGE_DIRECTORY?: string; + TEMP_DIRECTORY: string; + LIBRARY_DIRECTORY: string; + PICTURES_DIRECTORY: string; + MOVIES_DIRECTORY: string; + FILE_TYPE_REGULAR?: string; + FILE_TYPE_DIRECTORY?: string; + }; + + androidGetPlayServicesStatus(): Promise; + androidPromptForPlayServices(): Promise; + androidResolutionForPlayServices(): Promise; + androidMakePlayServicesAvailable(): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboUtils'); diff --git a/packages/app/type-test.ts b/packages/app/type-test.ts index 0fb0d3b07d..40c495bb73 100644 --- a/packages/app/type-test.ts +++ b/packages/app/type-test.ts @@ -14,14 +14,7 @@ * limitations under the License. */ -import { - getApp, - getApps, - getUtils, - initializeApp, - SDK_VERSION, - FilePath, -} from '.'; +import { getApp, getApps, getUtils, initializeApp, SDK_VERSION, FilePath } from '.'; // modular app accessors console.log(getUtils().app.name); diff --git a/packages/auth/RNFBAuth.podspec b/packages/auth/RNFBAuth.podspec index 8e9b9d5065..69a8d2e8d9 100644 --- a/packages/auth/RNFBAuth.podspec +++ b/packages/auth/RNFBAuth.podspec @@ -27,15 +27,23 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp}' + s.private_header_files = [ + 'ios/RNFBAuth/RNFBAuthModule.h', + 'ios/generated/**/*.h', + ] + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' + + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ios/generated/RNFBAuthTurboModules\" \"$(PODS_TARGET_SRCROOT)/ios/generated\"", + } s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/auth/__tests__/auth.test.ts b/packages/auth/__tests__/auth.test.ts index 31253d04f8..53527185c0 100644 --- a/packages/auth/__tests__/auth.test.ts +++ b/packages/auth/__tests__/auth.test.ts @@ -141,6 +141,13 @@ describe('Auth', function () { expect(isSignInWithEmailLink).toBeDefined(); }); + it('`isSignInWithEmailLink` returns synchronously', function () { + const result = isSignInWithEmailLink(getAuth(), 'https://example.com/link'); + + expect(result).toBe(false); + expect(result).not.toBeInstanceOf(Promise); + }); + it('`onAuthStateChanged` function is properly exposed to end user', function () { expect(onAuthStateChanged).toBeDefined(); }); @@ -242,6 +249,67 @@ describe('Auth', function () { expect(ActionCodeURL.parseLink('https://example.com/not-an-action-link')).toBeNull(); }); + it('`TotpSecret.generateQrCodeUrl` returns synchronously with default account and issuer', function () { + const generateQrCodeUrl = jest.fn( + (_secretKey: string, _account: string, _issuer: string) => 'otpauth://totp/example', + ); + const secret = new TotpSecret('secret-key', { + app: { name: '[DEFAULT]' }, + currentUser: { email: 'user@example.com' }, + native: { generateQrCodeUrl }, + } as never); + + const result = secret.generateQrCodeUrl(); + + expect(result).toBe('otpauth://totp/example'); + expect(result).not.toBeInstanceOf(Promise); + expect(generateQrCodeUrl).toHaveBeenCalledWith('secret-key', 'user@example.com', '[DEFAULT]'); + }); + + it('`TotpSecret.generateQrCodeUrl` throws auth/invalid-multi-factor-secret for a missing secret', function () { + const generateQrCodeUrl = jest.fn((_secretKey: string, _account: string, _issuer: string) => { + const error = new Error("can't find secret for provided key"); + error.name = 'invalid-multi-factor-secret'; + throw error; + }); + const secret = new TotpSecret('missing-secret-key', { + app: { name: '[DEFAULT]' }, + currentUser: { email: 'user@example.com' }, + native: { generateQrCodeUrl }, + } as never); + + expect(() => secret.generateQrCodeUrl()).toThrow( + "[auth/invalid-multi-factor-secret] can't find secret for provided key", + ); + expect(generateQrCodeUrl).toHaveBeenCalledWith( + 'missing-secret-key', + 'user@example.com', + '[DEFAULT]', + ); + }); + + it('`TotpSecret.generateQrCodeUrl` forwards explicit account and issuer synchronously', function () { + const generateQrCodeUrl = jest.fn( + (_secretKey: string, _account: string, _issuer: string) => + 'otpauth://totp/Example%20App:account%40example.com', + ); + const secret = new TotpSecret('secret-key', { + app: { name: '[DEFAULT]' }, + currentUser: { email: 'user@example.com' }, + native: { generateQrCodeUrl }, + } as never); + + const result = secret.generateQrCodeUrl('account@example.com', 'Example App'); + + expect(result).toBe('otpauth://totp/Example%20App:account%40example.com'); + expect(result).not.toBeInstanceOf(Promise); + expect(generateQrCodeUrl).toHaveBeenCalledWith( + 'secret-key', + 'account@example.com', + 'Example App', + ); + }); + it('`deleteUser` function is properly exposed to end user', function () { expect(deleteUser).toBeDefined(); }); diff --git a/packages/auth/__tests__/nativeModuleContract.test.ts b/packages/auth/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..806e19b0f7 --- /dev/null +++ b/packages/auth/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,232 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'configureAuthDomain', + 'getCustomAuthDomain', + 'addAuthStateListener', + 'removeAuthStateListener', + 'addIdTokenListener', + 'removeIdTokenListener', + 'forceRecaptchaFlowForTesting', + 'setAutoRetrievedSmsCodeForPhoneNumber', + 'setAppVerificationDisabledForTesting', + 'useUserAccessGroup', + 'signOut', + 'signInAnonymously', + 'createUserWithEmailAndPassword', + 'isSignInWithEmailLink', + 'signInWithEmailAndPassword', + 'signInWithEmailLink', + 'signInWithCustomToken', + 'revokeToken', + 'sendPasswordResetEmail', + 'sendSignInLinkToEmail', + 'deleteUser', + 'reload', + 'sendEmailVerification', + 'verifyBeforeUpdateEmail', + 'updateEmail', + 'updatePassword', + 'updatePhoneNumber', + 'updateProfile', + 'getIdToken', + 'getIdTokenResult', + 'signInWithCredential', + 'signInWithProvider', + 'signInWithPhoneNumber', + 'verifyPhoneNumberWithMultiFactorInfo', + 'verifyPhoneNumberForMultiFactor', + 'resolveMultiFactorSignIn', + 'resolveTotpSignIn', + 'generateTotpSecret', + 'generateQrCodeUrl', + 'openInOtpApp', + 'getSession', + 'unenrollMultiFactor', + 'finalizeMultiFactorEnrollment', + 'finalizeTotpEnrollment', + 'confirmationResultConfirm', + 'verifyPhoneNumber', + 'confirmPasswordReset', + 'applyActionCode', + 'checkActionCode', + 'linkWithCredential', + 'linkWithProvider', + 'unlink', + 'reauthenticateWithCredential', + 'reauthenticateWithProvider', + 'fetchSignInMethodsForEmail', + 'setLanguageCode', + 'setTenantId', + 'useDeviceLanguage', + 'verifyPasswordResetCode', + 'useEmulator', +] as const; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper', function () { + assertTurboContract( + { + namespace: 'auth', + nativeModuleName: 'NativeRNFBTurboAuth', + nativeEvents: ['auth_state_changed', 'auth_id_token_changed', 'phone_auth_state_changed'], + hasMultiAppSupport: true, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + specMethods: SPEC_METHODS, + constants: { + APP_LANGUAGE: { '[DEFAULT]': 'en-US' }, + APP_USER: { '[DEFAULT]': null }, + }, + createMock: method => + jest.fn(() => { + if (method === 'isSignInWithEmailLink') { + return false; + } + + if (method === 'generateQrCodeUrl') { + return 'otpauth://totp/example'; + } + + if ( + method === 'configureAuthDomain' || + method === 'addAuthStateListener' || + method === 'removeAuthStateListener' || + method === 'addIdTokenListener' || + method === 'removeIdTokenListener' || + method === 'setLanguageCode' || + method === 'useDeviceLanguage' || + method === 'openInOtpApp' || + method === 'verifyPhoneNumber' || + method === 'useEmulator' + ) { + return undefined; + } + + return Promise.resolve(); + }), + }, + { + createUserWithEmailAndPassword: wrapped => { + void wrapped.createUserWithEmailAndPassword('a@b.com', 'password'); + }, + signInWithEmailAndPassword: wrapped => { + void wrapped.signInWithEmailAndPassword('a@b.com', 'password'); + }, + signInWithEmailLink: wrapped => { + void wrapped.signInWithEmailLink('a@b.com', 'https://example.com/link'); + }, + signInWithCustomToken: wrapped => { + void wrapped.signInWithCustomToken('token'); + }, + signInWithCredential: wrapped => { + void wrapped.signInWithCredential('google.com', 'token', 'secret'); + }, + signInWithProvider: wrapped => { + void wrapped.signInWithProvider({ providerId: 'google.com' }); + }, + signInWithPhoneNumber: wrapped => { + void wrapped.signInWithPhoneNumber('+15555550100', true); + }, + sendPasswordResetEmail: wrapped => { + void wrapped.sendPasswordResetEmail('a@b.com', null); + }, + sendSignInLinkToEmail: wrapped => { + void wrapped.sendSignInLinkToEmail('a@b.com', { url: 'https://example.com' }); + }, + sendEmailVerification: wrapped => { + void wrapped.sendEmailVerification(null); + }, + verifyBeforeUpdateEmail: wrapped => { + void wrapped.verifyBeforeUpdateEmail('new@b.com', null); + }, + updatePhoneNumber: wrapped => { + void wrapped.updatePhoneNumber('phone', 'token', 'secret'); + }, + updateProfile: wrapped => { + void wrapped.updateProfile({ displayName: 'Test' }); + }, + getIdToken: wrapped => { + void wrapped.getIdToken(true); + }, + getIdTokenResult: wrapped => { + void wrapped.getIdTokenResult(true); + }, + verifyPhoneNumberWithMultiFactorInfo: wrapped => { + void wrapped.verifyPhoneNumberWithMultiFactorInfo('uid', 'session'); + }, + verifyPhoneNumberForMultiFactor: wrapped => { + void wrapped.verifyPhoneNumberForMultiFactor('+15555550100', 'session'); + }, + resolveMultiFactorSignIn: wrapped => { + void wrapped.resolveMultiFactorSignIn('session', 'verification-id', '123456'); + }, + resolveTotpSignIn: wrapped => { + void wrapped.resolveTotpSignIn('session', 'uid', '123456'); + }, + generateTotpSecret: wrapped => { + void wrapped.generateTotpSecret('session'); + }, + generateQrCodeUrl: wrapped => { + const result = wrapped.generateQrCodeUrl('secret', 'account', 'issuer'); + expect(result).toBe('otpauth://totp/example'); + expect(result).not.toBeInstanceOf(Promise); + }, + openInOtpApp: wrapped => { + wrapped.openInOtpApp('secret', 'otpauth://totp/example'); + }, + finalizeMultiFactorEnrollment: wrapped => { + void wrapped.finalizeMultiFactorEnrollment('verification-id', '123456', 'Device'); + }, + finalizeTotpEnrollment: wrapped => { + void wrapped.finalizeTotpEnrollment('secret', '123456', 'Device'); + }, + confirmationResultConfirm: wrapped => { + void wrapped.confirmationResultConfirm('123456'); + }, + verifyPhoneNumber: wrapped => { + wrapped.verifyPhoneNumber('+15555550100', 'request-key', 60, true); + }, + confirmPasswordReset: wrapped => { + void wrapped.confirmPasswordReset('code', 'new-password'); + }, + linkWithCredential: wrapped => { + void wrapped.linkWithCredential('google.com', 'token', 'secret'); + }, + linkWithProvider: wrapped => { + void wrapped.linkWithProvider({ providerId: 'google.com' }); + }, + reauthenticateWithCredential: wrapped => { + void wrapped.reauthenticateWithCredential('google.com', 'token', 'secret'); + }, + reauthenticateWithProvider: wrapped => { + void wrapped.reauthenticateWithProvider({ providerId: 'google.com' }); + }, + setTenantId: wrapped => { + void wrapped.setTenantId('tenant-id'); + }, + useEmulator: wrapped => { + wrapped.useEmulator('localhost', 9099); + }, + isSignInWithEmailLink: wrapped => { + const result = wrapped.isSignInWithEmailLink('https://example.com/link'); + expect(result).toBe(false); + expect(result).not.toBeInstanceOf(Promise); + }, + forceRecaptchaFlowForTesting: wrapped => { + void wrapped.forceRecaptchaFlowForTesting(true); + }, + setAutoRetrievedSmsCodeForPhoneNumber: wrapped => { + void wrapped.setAutoRetrievedSmsCodeForPhoneNumber('+15555550100', '123456'); + }, + setAppVerificationDisabledForTesting: wrapped => { + void wrapped.setAppVerificationDisabledForTesting(true); + }, + useUserAccessGroup: wrapped => { + void wrapped.useUserAccessGroup('group.example'); + }, + }, + ); + }); +}); diff --git a/packages/auth/android/build.gradle b/packages/auth/android/build.gradle index a1a0fcab7f..316f3e003f 100644 --- a/packages/auth/android/build.gradle +++ b/packages/auth/android/build.gradle @@ -75,6 +75,11 @@ android { targetCompatibility = JavaVersion.VERSION_11 } } + sourceSets { + main { + java.excludes = ['**/generated/jni/**'] + } + } } repositories { @@ -92,3 +97,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/auth") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthModule.java b/packages/auth/android/src/main/java/io/invertase/firebase/auth/NativeRNFBTurboAuth.java similarity index 96% rename from packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthModule.java rename to packages/auth/android/src/main/java/io/invertase/firebase/auth/NativeRNFBTurboAuth.java index 3981765a78..4db668ccd6 100644 --- a/packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthModule.java +++ b/packages/auth/android/src/main/java/io/invertase/firebase/auth/NativeRNFBTurboAuth.java @@ -17,15 +17,18 @@ * */ +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage; +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithExceptionMap; + import android.app.Activity; import android.net.Uri; import android.os.Parcel; import android.util.Log; import androidx.annotation.NonNull; +import com.facebook.fbreact.specs.NativeRNFBTurboAuthSpec; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableMapKeySetIterator; @@ -72,11 +75,11 @@ import com.google.firebase.auth.TwitterAuthProvider; import com.google.firebase.auth.UserInfo; import com.google.firebase.auth.UserProfileChangeRequest; -import io.invertase.firebase.app.ReactNativeFirebaseAppModule; +import io.invertase.firebase.app.NativeRNFBTurboApp; import io.invertase.firebase.common.ReactNativeFirebaseEvent; import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import io.invertase.firebase.common.SharedUtils; +import io.invertase.firebase.common.TaskExecutorService; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -86,13 +89,14 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.Nullable; @SuppressWarnings({"ThrowableResultOfMethodCallIgnored", "JavaDoc"}) -class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboAuth extends NativeRNFBTurboAuthSpec { // Easier to use would be Instant and DateTimeFormatter, but these are only available in API 26+ // According to https://stackoverflow.com/a/2202300 this is not the optimal solution, but we only // get a unix timestamp so we can hardcode the timezone. @@ -116,8 +120,15 @@ class ReactNativeFirebaseAuthModule extends ReactNativeFirebaseModule { // https://github.com/invertase/react-native-firebase/issues/4911 private HashMap credentials = new HashMap<>(); - ReactNativeFirebaseAuthModule(ReactApplicationContext reactContext) { - super(reactContext, TAG); + private final TaskExecutorService executorService; + + public NativeRNFBTurboAuth(ReactApplicationContext reactContext) { + super(reactContext); + executorService = new TaskExecutorService("NativeRNFBTurboAuth"); + } + + private ExecutorService getExecutor() { + return executorService.getExecutor(); } @Override @@ -161,19 +172,19 @@ public void invalidate() { mTotpSecrets.clear(); } - @ReactMethod + @Override public void configureAuthDomain(final String appName) { Log.d(TAG, "configureAuthDomain"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); - String authDomain = ReactNativeFirebaseAppModule.authDomains.get(appName); + String authDomain = NativeRNFBTurboApp.authDomains.get(appName); Log.d(TAG, "configureAuthDomain - app " + appName + " domain? " + authDomain); if (authDomain != null) { firebaseAuth.setCustomAuthDomain(authDomain); } } - @ReactMethod + @Override public void getCustomAuthDomain(final String appName, final Promise promise) { Log.d(TAG, "configureAuthDomain"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -182,7 +193,7 @@ public void getCustomAuthDomain(final String appName, final Promise promise) { } /** Add a new auth state listener - if one doesn't exist already */ - @ReactMethod + @Override public void addAuthStateListener(final String appName) { Log.d(TAG, "addAuthStateListener"); @@ -215,7 +226,7 @@ public void addAuthStateListener(final String appName) { } /** Removes the current auth state listener */ - @ReactMethod + @Override public void removeAuthStateListener(String appName) { Log.d(TAG, "removeAuthStateListener"); @@ -231,7 +242,7 @@ public void removeAuthStateListener(String appName) { } /** Add a new id token listener - if one doesn't exist already */ - @ReactMethod + @Override public void addIdTokenListener(final String appName) { Log.d(TAG, "addIdTokenListener"); @@ -265,7 +276,7 @@ public void addIdTokenListener(final String appName) { } /** Removes the current id token listener */ - @ReactMethod + @Override public void removeIdTokenListener(String appName) { Log.d(TAG, "removeIdTokenListener"); @@ -292,7 +303,7 @@ public void removeIdTokenListener(String appName) { * @param forceRecaptchaFlow * @param promise */ - @ReactMethod + @Override public void forceRecaptchaFlowForTesting( String appName, boolean forceRecaptchaFlow, Promise promise) { Log.d(TAG, "forceRecaptchaFlowForTesting"); @@ -315,7 +326,7 @@ public void forceRecaptchaFlowForTesting( * @param smsCode * @param promise */ - @ReactMethod + @Override public void setAutoRetrievedSmsCodeForPhoneNumber( String appName, String phoneNumber, String smsCode, Promise promise) { Log.d(TAG, "setAutoRetrievedSmsCodeForPhoneNumber"); @@ -333,7 +344,7 @@ public void setAutoRetrievedSmsCodeForPhoneNumber( * @param disabled * @param promise */ - @ReactMethod + @Override public void setAppVerificationDisabledForTesting( String appName, boolean disabled, Promise promise) { Log.d(TAG, "setAppVerificationDisabledForTesting"); @@ -344,7 +355,12 @@ public void setAppVerificationDisabledForTesting( promise.resolve(null); } - @ReactMethod + @Override + public void useUserAccessGroup(String appName, String userAccessGroup, Promise promise) { + promise.resolve(null); + } + + @Override public void signOut(String appName, Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -358,8 +374,8 @@ public void signOut(String appName, Promise promise) { } } - @ReactMethod - private void signInAnonymously(String appName, final Promise promise) { + @Override + public void signInAnonymously(String appName, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -385,8 +401,8 @@ private void signInAnonymously(String appName, final Promise promise) { * @param password * @param promise */ - @ReactMethod - private void createUserWithEmailAndPassword( + @Override + public void createUserWithEmailAndPassword( String appName, final String email, final String password, final Promise promise) { Log.d(TAG, "createUserWithEmailAndPassword"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -411,14 +427,13 @@ private void createUserWithEmailAndPassword( * isSignInWithEmailLink * * @param email - * @param promise */ - @ReactMethod - public void isSignInWithEmailLink(String appName, String emailLink, final Promise promise) { + @Override + public boolean isSignInWithEmailLink(String appName, String emailLink) { Log.d(TAG, "isSignInWithEmailLink"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); - promise.resolve(firebaseAuth.isSignInWithEmailLink(emailLink)); + return firebaseAuth.isSignInWithEmailLink(emailLink); } /** @@ -428,8 +443,8 @@ public void isSignInWithEmailLink(String appName, String emailLink, final Promis * @param password * @param promise */ - @ReactMethod - private void signInWithEmailAndPassword( + @Override + public void signInWithEmailAndPassword( String appName, final String email, final String password, final Promise promise) { Log.d(TAG, "signInWithEmailAndPassword"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -457,8 +472,8 @@ private void signInWithEmailAndPassword( * @param emailLink * @param promise */ - @ReactMethod - private void signInWithEmailLink( + @Override + public void signInWithEmailLink( String appName, final String email, final String emailLink, final Promise promise) { Log.d(TAG, "signInWithEmailLink"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -483,8 +498,8 @@ private void signInWithEmailLink( } } - @ReactMethod - private void signInWithCustomToken(String appName, final String token, final Promise promise) { + @Override + public void signInWithCustomToken(String appName, final String token, final Promise promise) { Log.d(TAG, "signInWithCustomToken"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -509,7 +524,7 @@ private void signInWithCustomToken(String appName, final String token, final Pro * @param authorizationCode * @param promise */ - @ReactMethod + @Override public void revokeToken(String appName, final String authorizationCode, final Promise promise) { Log.d(TAG, "revokeToken"); @@ -524,7 +539,7 @@ public void revokeToken(String appName, final String authorizationCode, final Pr * @param email * @param promise */ - @ReactMethod + @Override public void sendPasswordResetEmail( String appName, final String email, ReadableMap actionCodeSettings, final Promise promise) { Log.d(TAG, "sendPasswordResetEmail"); @@ -559,7 +574,7 @@ public void sendPasswordResetEmail( * @param email * @param promise */ - @ReactMethod + @Override public void sendSignInLinkToEmail( String appName, String email, ReadableMap actionCodeSettings, final Promise promise) { Log.d(TAG, "sendSignInLinkToEmail"); @@ -589,12 +604,12 @@ public void sendSignInLinkToEmail( * ---------------------- */ /** - * delete + * deleteUser * * @param promise Promise */ - @ReactMethod - public void delete(String appName, final Promise promise) { + @Override + public void deleteUser(String appName, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -625,7 +640,7 @@ public void delete(String appName, final Promise promise) { * * @param promise */ - @ReactMethod + @Override public void reload(String appName, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -658,7 +673,7 @@ public void reload(String appName, final Promise promise) { * * @param promise */ - @ReactMethod + @Override public void sendEmailVerification( String appName, ReadableMap actionCodeSettings, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -697,7 +712,7 @@ public void sendEmailVerification( * * @param promise */ - @ReactMethod + @Override public void verifyBeforeUpdateEmail( String appName, String email, ReadableMap actionCodeSettings, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -738,7 +753,7 @@ public void verifyBeforeUpdateEmail( * @param email * @param promise */ - @ReactMethod + @Override public void updateEmail(String appName, final String email, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -772,7 +787,7 @@ public void updateEmail(String appName, final String email, final Promise promis * @param password * @param promise */ - @ReactMethod + @Override public void updatePassword(String appName, final String password, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -808,8 +823,8 @@ public void updatePassword(String appName, final String password, final Promise * @param authSecret * @param promise */ - @ReactMethod - private void updatePhoneNumber( + @Override + public void updatePhoneNumber( String appName, String provider, String authToken, String authSecret, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -856,7 +871,7 @@ private void updatePhoneNumber( * @param props * @param promise */ - @ReactMethod + @Override public void updateProfile(String appName, ReadableMap props, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -898,8 +913,8 @@ public void updateProfile(String appName, ReadableMap props, final Promise promi } } - @ReactMethod - private void signInWithCredential( + @Override + public void signInWithCredential( String appName, String provider, String authToken, String authSecret, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -930,8 +945,8 @@ private void signInWithCredential( } } - @ReactMethod - private void signInWithProvider(String appName, ReadableMap provider, final Promise promise) { + @Override + public void signInWithProvider(String appName, ReadableMap provider, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -1003,7 +1018,7 @@ private void signInWithProvider(String appName, ReadableMap provider, final Prom * @param appName * @param phoneNumber */ - @ReactMethod + @Override public void signInWithPhoneNumber( String appName, final String phoneNumber, final boolean forceResend, final Promise promise) { Log.d(TAG, "signInWithPhoneNumber"); @@ -1112,7 +1127,7 @@ public void onCodeAutoRetrievalTimeOut(String verificationId) { } } - @ReactMethod + @Override public void getSession(final String appName, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -1135,7 +1150,7 @@ public void getSession(final String appName, final Promise promise) { }); } - @ReactMethod + @Override public void unenrollMultiFactor( final String appName, final String factorUID, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -1155,7 +1170,7 @@ public void unenrollMultiFactor( }); } - @ReactMethod + @Override public void verifyPhoneNumberWithMultiFactorInfo( final String appName, final String hintUid, final String sessionKey, final Promise promise) { final MultiFactorResolver resolver = mCachedResolvers.get(sessionKey); @@ -1224,7 +1239,7 @@ public void onVerificationFailed(@NonNull FirebaseException e) { PhoneAuthProvider.verifyPhoneNumber(phoneAuthOptions); } - @ReactMethod + @Override public void verifyPhoneNumberForMultiFactor( final String appName, final String phoneNumber, @@ -1274,7 +1289,7 @@ public void onCodeSent( PhoneAuthProvider.verifyPhoneNumber(phoneAuthOptions); } - @ReactMethod + @Override public void finalizeMultiFactorEnrollment( final String appName, final String verificationId, @@ -1305,24 +1320,19 @@ public void finalizeMultiFactorEnrollment( }); } - @ReactMethod - public void generateQrCodeUrl( - final String appName, - final String secretKey, - final String account, - final String issuer, - final Promise promise) { + @Override + public String generateQrCodeUrl( + final String appName, final String secretKey, final String account, final String issuer) { TotpSecret secret = mTotpSecrets.get(secretKey); if (secret == null) { - rejectPromiseWithCodeAndMessage( - promise, "invalid-multi-factor-secret", "can't find secret for provided key"); - return; + throw new ReactNativeFirebaseAuthSyncException( + "invalid-multi-factor-secret", "can't find secret for provided key"); } - promise.resolve(secret.generateQrCodeUrl(account, issuer)); + return secret.generateQrCodeUrl(account, issuer); } - @ReactMethod + @Override public void openInOtpApp(final String appName, final String secretKey, final String qrCodeUri) { TotpSecret secret = mTotpSecrets.get(secretKey); if (secret != null) { @@ -1330,7 +1340,7 @@ public void openInOtpApp(final String appName, final String secretKey, final Str } } - @ReactMethod + @Override public void finalizeTotpEnrollment( final String appName, final String totpSecret, @@ -1408,7 +1418,7 @@ private void resolveMultiFactorCredential( }); } - @ReactMethod + @Override public void resolveMultiFactorSignIn( final String appName, final String session, @@ -1421,7 +1431,7 @@ public void resolveMultiFactorSignIn( resolveMultiFactorCredential(credential, session, promise); } - @ReactMethod + @Override public void resolveTotpSignIn( final String appName, final String sessionKey, @@ -1456,7 +1466,7 @@ public void resolveTotpSignIn( }); } - @ReactMethod + @Override public void generateTotpSecret( final String appName, final String sessionKey, final Promise promise) { @@ -1485,7 +1495,7 @@ public void generateTotpSecret( }); } - @ReactMethod + @Override public void confirmationResultConfirm( String appName, final String verificationCode, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -1526,12 +1536,12 @@ public void confirmationResultConfirm( * @param phoneNumber * @param timeout */ - @ReactMethod + @Override public void verifyPhoneNumber( final String appName, final String phoneNumber, final String requestKey, - final int timeout, + final double timeout, final boolean forceResend) { Log.d(TAG, "verifyPhoneNumber:" + phoneNumber); @@ -1625,10 +1635,15 @@ public void onCodeAutoRetrievalTimeOut(String verificationId) { if (forceResend && mForceResendingToken != null) { PhoneAuthProvider.getInstance(firebaseAuth) .verifyPhoneNumber( - phoneNumber, timeout, TimeUnit.SECONDS, activity, callbacks, mForceResendingToken); + phoneNumber, + (long) timeout, + TimeUnit.SECONDS, + activity, + callbacks, + mForceResendingToken); } else { PhoneAuthProvider.getInstance(firebaseAuth) - .verifyPhoneNumber(phoneNumber, timeout, TimeUnit.SECONDS, activity, callbacks); + .verifyPhoneNumber(phoneNumber, (long) timeout, TimeUnit.SECONDS, activity, callbacks); } } } @@ -1640,7 +1655,7 @@ public void onCodeAutoRetrievalTimeOut(String verificationId) { * @param newPassword * @param promise */ - @ReactMethod + @Override public void confirmPasswordReset( String appName, String code, String newPassword, final Promise promise) { Log.d(TAG, "confirmPasswordReset"); @@ -1670,7 +1685,7 @@ public void confirmPasswordReset( * @param code * @param promise */ - @ReactMethod + @Override public void applyActionCode(String appName, String code, final Promise promise) { Log.d(TAG, "applyActionCode"); @@ -1697,7 +1712,7 @@ public void applyActionCode(String appName, String code, final Promise promise) * @param code * @param promise */ - @ReactMethod + @Override public void checkActionCode(String appName, String code, final Promise promise) { Log.d(TAG, "checkActionCode"); @@ -1760,8 +1775,8 @@ public void checkActionCode(String appName, String code, final Promise promise) * @param authSecret * @param promise */ - @ReactMethod - private void linkWithCredential( + @Override + public void linkWithCredential( String appName, String provider, String authToken, String authSecret, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -1814,8 +1829,8 @@ private void linkWithCredential( * @param provider * @param promise */ - @ReactMethod - private void linkWithProvider(String appName, ReadableMap provider, final Promise promise) { + @Override + public void linkWithProvider(String appName, ReadableMap provider, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -1888,7 +1903,7 @@ private void linkWithProvider(String appName, ReadableMap provider, final Promis } } - @ReactMethod + @Override public void unlink(final String appName, final String providerId, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -1914,8 +1929,8 @@ public void unlink(final String appName, final String providerId, final Promise } } - @ReactMethod - private void reauthenticateWithCredential( + @Override + public void reauthenticateWithCredential( String appName, String provider, String authToken, String authSecret, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -1957,8 +1972,8 @@ private void reauthenticateWithCredential( * @param provider * @param promise */ - @ReactMethod - private void reauthenticateWithProvider( + @Override + public void reauthenticateWithProvider( String appName, ReadableMap provider, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -2109,8 +2124,8 @@ private PhoneAuthCredential getPhoneAuthCredential(String authToken, String auth * @param forceRefresh * @param promise */ - @ReactMethod - public void getIdToken(String appName, Boolean forceRefresh, final Promise promise) { + @Override + public void getIdToken(String appName, boolean forceRefresh, final Promise promise) { Log.d(TAG, "getIdToken"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -2145,8 +2160,8 @@ public void getIdToken(String appName, Boolean forceRefresh, final Promise promi * @param forceRefresh * @param promise */ - @ReactMethod - public void getIdTokenResult(String appName, Boolean forceRefresh, final Promise promise) { + @Override + public void getIdTokenResult(String appName, boolean forceRefresh, final Promise promise) { Log.d(TAG, "getIdTokenResult"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -2206,7 +2221,7 @@ public void getIdTokenResult(String appName, Boolean forceRefresh, final Promise * @param email * @param promise */ - @ReactMethod + @Override public void fetchSignInMethodsForEmail(String appName, String email, final Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -2245,7 +2260,7 @@ public void fetchSignInMethodsForEmail(String appName, String email, final Promi * @param appName * @param code */ - @ReactMethod + @Override public void setLanguageCode(String appName, String code) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -2264,7 +2279,7 @@ public void setLanguageCode(String appName, String code) { * @param tenantId * @param promise */ - @ReactMethod + @Override public void setTenantId(String appName, String tenantId, final Promise promise) { try { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); @@ -2281,7 +2296,7 @@ public void setTenantId(String appName, String tenantId, final Promise promise) * * @param appName */ - @ReactMethod + @Override public void useDeviceLanguage(String appName) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); @@ -2289,7 +2304,7 @@ public void useDeviceLanguage(String appName) { firebaseAuth.useAppLanguage(); } - @ReactMethod + @Override public void verifyPasswordResetCode(String appName, String code, final Promise promise) { Log.d(TAG, "verifyPasswordResetCode"); @@ -2312,14 +2327,14 @@ public void verifyPasswordResetCode(String appName, String code, final Promise p }); } - @ReactMethod - public void useEmulator(String appName, String host, int port) { + @Override + public void useEmulator(String appName, String host, double port) { if (emulatorConfigs.get(appName) == null) { emulatorConfigs.put(appName, "true"); FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp); - firebaseAuth.useEmulator(host, port); + firebaseAuth.useEmulator(host, (int) port); } } @@ -2809,7 +2824,7 @@ private void sendPhoneStateEvent( * @return */ @Override - public Map getConstants() { + protected Map getTypedExportedConstants() { Map constants = new HashMap<>(); List firebaseAppList = FirebaseApp.getApps(getReactApplicationContext()); diff --git a/packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthPackage.java b/packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthPackage.java index 22851f2836..d67d72c552 100644 --- a/packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthPackage.java +++ b/packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthPackage.java @@ -32,7 +32,7 @@ public class ReactNativeFirebaseAuthPackage implements ReactPackage { @Override public List createNativeModules(@Nonnull ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseAuthModule(reactContext)); + modules.add(new NativeRNFBTurboAuth(reactContext)); return modules; } diff --git a/packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthSyncException.java b/packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthSyncException.java new file mode 100644 index 0000000000..876ae98c96 --- /dev/null +++ b/packages/auth/android/src/main/java/io/invertase/firebase/auth/ReactNativeFirebaseAuthSyncException.java @@ -0,0 +1,35 @@ +package io.invertase.firebase.auth; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/** + * Structured sync TurboModule error carrying the same RNFB {@code code}/{@code message} pair used + * by {@code rejectPromiseWithCodeAndMessage}. + */ +public class ReactNativeFirebaseAuthSyncException extends RuntimeException { + private final String code; + + public ReactNativeFirebaseAuthSyncException(String code, String message) { + super(message); + this.code = code; + } + + public String getCode() { + return code; + } +} diff --git a/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAuthSpec.java b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAuthSpec.java new file mode 100644 index 0000000000..dbe4d7f4fd --- /dev/null +++ b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboAuthSpec.java @@ -0,0 +1,308 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboAuthSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboAuth"; + + public NativeRNFBTurboAuthSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + protected abstract Map getTypedExportedConstants(); + + @Override + @DoNotStrip + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "APP_LANGUAGE", + "APP_USER" + )); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } + + @ReactMethod + @DoNotStrip + public abstract void configureAuthDomain(String appName); + + @ReactMethod + @DoNotStrip + public abstract void getCustomAuthDomain(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void addAuthStateListener(String appName); + + @ReactMethod + @DoNotStrip + public abstract void removeAuthStateListener(String appName); + + @ReactMethod + @DoNotStrip + public abstract void addIdTokenListener(String appName); + + @ReactMethod + @DoNotStrip + public abstract void removeIdTokenListener(String appName); + + @ReactMethod + @DoNotStrip + public abstract void forceRecaptchaFlowForTesting(String appName, boolean forceRecaptchaFlow, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setAutoRetrievedSmsCodeForPhoneNumber(String appName, String phoneNumber, String smsCode, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setAppVerificationDisabledForTesting(String appName, boolean disabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void useUserAccessGroup(String appName, String userAccessGroup, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signOut(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signInAnonymously(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void createUserWithEmailAndPassword(String appName, String email, String password, Promise promise); + + @ReactMethod(isBlockingSynchronousMethod = true) + @DoNotStrip + public abstract boolean isSignInWithEmailLink(String appName, String emailLink); + + @ReactMethod + @DoNotStrip + public abstract void signInWithEmailAndPassword(String appName, String email, String password, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signInWithEmailLink(String appName, String email, String emailLink, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signInWithCustomToken(String appName, String token, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void revokeToken(String appName, String authorizationCode, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void sendPasswordResetEmail(String appName, String email, @Nullable ReadableMap actionCodeSettings, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void sendSignInLinkToEmail(String appName, String email, ReadableMap actionCodeSettings, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void deleteUser(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void reload(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void sendEmailVerification(String appName, @Nullable ReadableMap actionCodeSettings, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void verifyBeforeUpdateEmail(String appName, String email, @Nullable ReadableMap actionCodeSettings, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void updateEmail(String appName, String email, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void updatePassword(String appName, String password, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void updatePhoneNumber(String appName, String provider, String authToken, String authSecret, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void updateProfile(String appName, ReadableMap props, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getIdToken(String appName, boolean forceRefresh, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getIdTokenResult(String appName, boolean forceRefresh, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signInWithCredential(String appName, String provider, String authToken, String authSecret, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signInWithProvider(String appName, ReadableMap provider, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signInWithPhoneNumber(String appName, String phoneNumber, boolean forceResend, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void verifyPhoneNumberWithMultiFactorInfo(String appName, String hintUid, String sessionKey, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void verifyPhoneNumberForMultiFactor(String appName, String phoneNumber, String sessionKey, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void resolveMultiFactorSignIn(String appName, String session, String verificationId, String verificationCode, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void resolveTotpSignIn(String appName, String sessionKey, String uid, String oneTimePassword, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void generateTotpSecret(String appName, String sessionKey, Promise promise); + + @ReactMethod(isBlockingSynchronousMethod = true) + @DoNotStrip + public abstract String generateQrCodeUrl(String appName, String secretKey, String account, String issuer); + + @ReactMethod + @DoNotStrip + public abstract void openInOtpApp(String appName, String secretKey, String qrCodeUri); + + @ReactMethod + @DoNotStrip + public abstract void getSession(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void unenrollMultiFactor(String appName, String factorUID, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void finalizeMultiFactorEnrollment(String appName, String verificationId, String verificationCode, @Nullable String displayName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void finalizeTotpEnrollment(String appName, String totpSecret, String verificationCode, @Nullable String displayName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void confirmationResultConfirm(String appName, String verificationCode, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void verifyPhoneNumber(String appName, String phoneNumber, String requestKey, double timeout, boolean forceResend); + + @ReactMethod + @DoNotStrip + public abstract void confirmPasswordReset(String appName, String code, String newPassword, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void applyActionCode(String appName, String code, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void checkActionCode(String appName, String code, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void linkWithCredential(String appName, String provider, String authToken, String authSecret, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void linkWithProvider(String appName, ReadableMap provider, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void unlink(String appName, String providerId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void reauthenticateWithCredential(String appName, String provider, String authToken, String authSecret, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void reauthenticateWithProvider(String appName, ReadableMap provider, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void fetchSignInMethodsForEmail(String appName, String email, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setLanguageCode(String appName, @Nullable String code); + + @ReactMethod + @DoNotStrip + public abstract void setTenantId(String appName, @Nullable String tenantId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void useDeviceLanguage(String appName); + + @ReactMethod + @DoNotStrip + public abstract void verifyPasswordResetCode(String appName, String code, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void useEmulator(String appName, String host, double port); +} diff --git a/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/CMakeLists.txt b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..c963c0d7a5 --- /dev/null +++ b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBAuthTurboModules/*.cpp) + +add_library( + react_codegen_RNFBAuthTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBAuthTurboModules PUBLIC . react/renderer/components/RNFBAuthTurboModules) + +target_link_libraries( + react_codegen_RNFBAuthTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBAuthTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/RNFBAuthTurboModules-generated.cpp b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/RNFBAuthTurboModules-generated.cpp new file mode 100644 index 0000000000..6c381a13c3 --- /dev/null +++ b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/RNFBAuthTurboModules-generated.cpp @@ -0,0 +1,392 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBAuthTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "getConstants", "()Ljava/util/Map;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_configureAuthDomain(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "configureAuthDomain", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getCustomAuthDomain(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getCustomAuthDomain", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_addAuthStateListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "addAuthStateListener", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_removeAuthStateListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeAuthStateListener", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_addIdTokenListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "addIdTokenListener", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_removeIdTokenListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeIdTokenListener", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_forceRecaptchaFlowForTesting(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "forceRecaptchaFlowForTesting", "(Ljava/lang/String;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_setAutoRetrievedSmsCodeForPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setAutoRetrievedSmsCodeForPhoneNumber", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_setAppVerificationDisabledForTesting(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setAppVerificationDisabledForTesting", "(Ljava/lang/String;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_useUserAccessGroup(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "useUserAccessGroup", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signOut(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signOut", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInAnonymously(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signInAnonymously", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_createUserWithEmailAndPassword(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "createUserWithEmailAndPassword", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_isSignInWithEmailLink(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, BooleanKind, "isSignInWithEmailLink", "(Ljava/lang/String;Ljava/lang/String;)Z", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithEmailAndPassword(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signInWithEmailAndPassword", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithEmailLink(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signInWithEmailLink", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithCustomToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signInWithCustomToken", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_revokeToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "revokeToken", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_sendPasswordResetEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "sendPasswordResetEmail", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_sendSignInLinkToEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "sendSignInLinkToEmail", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_deleteUser(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "deleteUser", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_reload(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "reload", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_sendEmailVerification(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "sendEmailVerification", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyBeforeUpdateEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "verifyBeforeUpdateEmail", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_updateEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "updateEmail", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_updatePassword(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "updatePassword", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_updatePhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "updatePhoneNumber", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_updateProfile(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "updateProfile", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getIdToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getIdToken", "(Ljava/lang/String;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getIdTokenResult(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getIdTokenResult", "(Ljava/lang/String;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithCredential(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signInWithCredential", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithProvider(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signInWithProvider", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "signInWithPhoneNumber", "(Ljava/lang/String;Ljava/lang/String;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumberWithMultiFactorInfo(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "verifyPhoneNumberWithMultiFactorInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumberForMultiFactor(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "verifyPhoneNumberForMultiFactor", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_resolveMultiFactorSignIn(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "resolveMultiFactorSignIn", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_resolveTotpSignIn(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "resolveTotpSignIn", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_generateTotpSecret(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "generateTotpSecret", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_generateQrCodeUrl(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, StringKind, "generateQrCodeUrl", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_openInOtpApp(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "openInOtpApp", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getSession(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getSession", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_unenrollMultiFactor(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "unenrollMultiFactor", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_finalizeMultiFactorEnrollment(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "finalizeMultiFactorEnrollment", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_finalizeTotpEnrollment(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "finalizeTotpEnrollment", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_confirmationResultConfirm(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "confirmationResultConfirm", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "verifyPhoneNumber", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DZ)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_confirmPasswordReset(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "confirmPasswordReset", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_applyActionCode(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "applyActionCode", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_checkActionCode(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "checkActionCode", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_linkWithCredential(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "linkWithCredential", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_linkWithProvider(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "linkWithProvider", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_unlink(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "unlink", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_reauthenticateWithCredential(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "reauthenticateWithCredential", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_reauthenticateWithProvider(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "reauthenticateWithProvider", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_fetchSignInMethodsForEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "fetchSignInMethodsForEmail", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_setLanguageCode(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "setLanguageCode", "(Ljava/lang/String;Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_setTenantId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setTenantId", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_useDeviceLanguage(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "useDeviceLanguage", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPasswordResetCode(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "verifyPasswordResetCode", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_useEmulator(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "useEmulator", "(Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +NativeRNFBTurboAuthSpecJSI::NativeRNFBTurboAuthSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAuthSpecJSI_getConstants}; + methodMap_["configureAuthDomain"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_configureAuthDomain}; + methodMap_["getCustomAuthDomain"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_getCustomAuthDomain}; + methodMap_["addAuthStateListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_addAuthStateListener}; + methodMap_["removeAuthStateListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_removeAuthStateListener}; + methodMap_["addIdTokenListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_addIdTokenListener}; + methodMap_["removeIdTokenListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_removeIdTokenListener}; + methodMap_["forceRecaptchaFlowForTesting"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_forceRecaptchaFlowForTesting}; + methodMap_["setAutoRetrievedSmsCodeForPhoneNumber"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_setAutoRetrievedSmsCodeForPhoneNumber}; + methodMap_["setAppVerificationDisabledForTesting"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_setAppVerificationDisabledForTesting}; + methodMap_["useUserAccessGroup"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_useUserAccessGroup}; + methodMap_["signOut"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_signOut}; + methodMap_["signInAnonymously"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInAnonymously}; + methodMap_["createUserWithEmailAndPassword"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_createUserWithEmailAndPassword}; + methodMap_["isSignInWithEmailLink"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_isSignInWithEmailLink}; + methodMap_["signInWithEmailAndPassword"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithEmailAndPassword}; + methodMap_["signInWithEmailLink"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithEmailLink}; + methodMap_["signInWithCustomToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithCustomToken}; + methodMap_["revokeToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_revokeToken}; + methodMap_["sendPasswordResetEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_sendPasswordResetEmail}; + methodMap_["sendSignInLinkToEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_sendSignInLinkToEmail}; + methodMap_["deleteUser"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_deleteUser}; + methodMap_["reload"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_reload}; + methodMap_["sendEmailVerification"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_sendEmailVerification}; + methodMap_["verifyBeforeUpdateEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyBeforeUpdateEmail}; + methodMap_["updateEmail"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_updateEmail}; + methodMap_["updatePassword"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_updatePassword}; + methodMap_["updatePhoneNumber"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_updatePhoneNumber}; + methodMap_["updateProfile"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_updateProfile}; + methodMap_["getIdToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_getIdToken}; + methodMap_["getIdTokenResult"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_getIdTokenResult}; + methodMap_["signInWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithCredential}; + methodMap_["signInWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithProvider}; + methodMap_["signInWithPhoneNumber"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithPhoneNumber}; + methodMap_["verifyPhoneNumberWithMultiFactorInfo"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumberWithMultiFactorInfo}; + methodMap_["verifyPhoneNumberForMultiFactor"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumberForMultiFactor}; + methodMap_["resolveMultiFactorSignIn"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_resolveMultiFactorSignIn}; + methodMap_["resolveTotpSignIn"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_resolveTotpSignIn}; + methodMap_["generateTotpSecret"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_generateTotpSecret}; + methodMap_["generateQrCodeUrl"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_generateQrCodeUrl}; + methodMap_["openInOtpApp"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_openInOtpApp}; + methodMap_["getSession"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_getSession}; + methodMap_["unenrollMultiFactor"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_unenrollMultiFactor}; + methodMap_["finalizeMultiFactorEnrollment"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_finalizeMultiFactorEnrollment}; + methodMap_["finalizeTotpEnrollment"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_finalizeTotpEnrollment}; + methodMap_["confirmationResultConfirm"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_confirmationResultConfirm}; + methodMap_["verifyPhoneNumber"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumber}; + methodMap_["confirmPasswordReset"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_confirmPasswordReset}; + methodMap_["applyActionCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_applyActionCode}; + methodMap_["checkActionCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_checkActionCode}; + methodMap_["linkWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_linkWithCredential}; + methodMap_["linkWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_linkWithProvider}; + methodMap_["unlink"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_unlink}; + methodMap_["reauthenticateWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_reauthenticateWithCredential}; + methodMap_["reauthenticateWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_reauthenticateWithProvider}; + methodMap_["fetchSignInMethodsForEmail"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_fetchSignInMethodsForEmail}; + methodMap_["setLanguageCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_setLanguageCode}; + methodMap_["setTenantId"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_setTenantId}; + methodMap_["useDeviceLanguage"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_useDeviceLanguage}; + methodMap_["verifyPasswordResetCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPasswordResetCode}; + methodMap_["useEmulator"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_useEmulator}; +} + +std::shared_ptr RNFBAuthTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboAuth") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/RNFBAuthTurboModules.h b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/RNFBAuthTurboModules.h new file mode 100644 index 0000000000..31a845064e --- /dev/null +++ b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/RNFBAuthTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboAuth' + */ +class JSI_EXPORT NativeRNFBTurboAuthSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboAuthSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBAuthTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/react/renderer/components/RNFBAuthTurboModules/RNFBAuthTurboModulesJSI-generated.cpp b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/react/renderer/components/RNFBAuthTurboModules/RNFBAuthTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..806538eb38 --- /dev/null +++ b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/react/renderer/components/RNFBAuthTurboModules/RNFBAuthTurboModulesJSI-generated.cpp @@ -0,0 +1,538 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAuthTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_configureAuthDomain(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->configureAuthDomain( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getCustomAuthDomain(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getCustomAuthDomain( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_addAuthStateListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addAuthStateListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_removeAuthStateListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeAuthStateListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_addIdTokenListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addIdTokenListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_removeIdTokenListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeIdTokenListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_forceRecaptchaFlowForTesting(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->forceRecaptchaFlowForTesting( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setAutoRetrievedSmsCodeForPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAutoRetrievedSmsCodeForPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setAppVerificationDisabledForTesting(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAppVerificationDisabledForTesting( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useUserAccessGroup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->useUserAccessGroup( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signOut(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signOut( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInAnonymously(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInAnonymously( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_createUserWithEmailAndPassword(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->createUserWithEmailAndPassword( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_isSignInWithEmailLink(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->isSignInWithEmailLink( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithEmailAndPassword(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithEmailAndPassword( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithEmailLink(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithEmailLink( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithCustomToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithCustomToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_revokeToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->revokeToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendPasswordResetEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->sendPasswordResetEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 || args[2].isNull() || args[2].isUndefined() ? std::nullopt : std::make_optional(args[2].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendSignInLinkToEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->sendSignInLinkToEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_deleteUser(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteUser( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reload(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->reload( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendEmailVerification(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->sendEmailVerification( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyBeforeUpdateEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->verifyBeforeUpdateEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 || args[2].isNull() || args[2].isUndefined() ? std::nullopt : std::make_optional(args[2].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updateEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updateEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updatePassword(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updatePassword( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updatePhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updatePhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updateProfile(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updateProfile( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getIdToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getIdToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getIdTokenResult(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getIdTokenResult( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithCredential(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithCredential( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithProvider(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithProvider( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumberWithMultiFactorInfo(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->verifyPhoneNumberWithMultiFactorInfo( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumberForMultiFactor(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->verifyPhoneNumberForMultiFactor( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_resolveMultiFactorSignIn(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->resolveMultiFactorSignIn( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_resolveTotpSignIn(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->resolveTotpSignIn( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_generateTotpSecret(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->generateTotpSecret( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_generateQrCodeUrl(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->generateQrCodeUrl( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_openInOtpApp(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->openInOtpApp( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getSession(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getSession( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_unenrollMultiFactor(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->unenrollMultiFactor( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_finalizeMultiFactorEnrollment(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->finalizeMultiFactorEnrollment( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 || args[3].isNull() || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_finalizeTotpEnrollment(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->finalizeTotpEnrollment( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 || args[3].isNull() || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_confirmationResultConfirm(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->confirmationResultConfirm( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->verifyPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_confirmPasswordReset(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->confirmPasswordReset( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_applyActionCode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->applyActionCode( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_checkActionCode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->checkActionCode( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_linkWithCredential(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->linkWithCredential( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_linkWithProvider(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->linkWithProvider( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_unlink(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->unlink( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reauthenticateWithCredential(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->reauthenticateWithCredential( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reauthenticateWithProvider(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->reauthenticateWithProvider( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_fetchSignInMethodsForEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->fetchSignInMethodsForEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setLanguageCode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setLanguageCode( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asString(rt)) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setTenantId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setTenantId( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useDeviceLanguage(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useDeviceLanguage( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPasswordResetCode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->verifyPasswordResetCode( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useEmulator(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useEmulator( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboAuthCxxSpecJSI::NativeRNFBTurboAuthCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboAuth", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getConstants}; + methodMap_["configureAuthDomain"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_configureAuthDomain}; + methodMap_["getCustomAuthDomain"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getCustomAuthDomain}; + methodMap_["addAuthStateListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_addAuthStateListener}; + methodMap_["removeAuthStateListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_removeAuthStateListener}; + methodMap_["addIdTokenListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_addIdTokenListener}; + methodMap_["removeIdTokenListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_removeIdTokenListener}; + methodMap_["forceRecaptchaFlowForTesting"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_forceRecaptchaFlowForTesting}; + methodMap_["setAutoRetrievedSmsCodeForPhoneNumber"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setAutoRetrievedSmsCodeForPhoneNumber}; + methodMap_["setAppVerificationDisabledForTesting"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setAppVerificationDisabledForTesting}; + methodMap_["useUserAccessGroup"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useUserAccessGroup}; + methodMap_["signOut"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signOut}; + methodMap_["signInAnonymously"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInAnonymously}; + methodMap_["createUserWithEmailAndPassword"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_createUserWithEmailAndPassword}; + methodMap_["isSignInWithEmailLink"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_isSignInWithEmailLink}; + methodMap_["signInWithEmailAndPassword"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithEmailAndPassword}; + methodMap_["signInWithEmailLink"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithEmailLink}; + methodMap_["signInWithCustomToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithCustomToken}; + methodMap_["revokeToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_revokeToken}; + methodMap_["sendPasswordResetEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendPasswordResetEmail}; + methodMap_["sendSignInLinkToEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendSignInLinkToEmail}; + methodMap_["deleteUser"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_deleteUser}; + methodMap_["reload"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reload}; + methodMap_["sendEmailVerification"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendEmailVerification}; + methodMap_["verifyBeforeUpdateEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyBeforeUpdateEmail}; + methodMap_["updateEmail"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updateEmail}; + methodMap_["updatePassword"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updatePassword}; + methodMap_["updatePhoneNumber"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updatePhoneNumber}; + methodMap_["updateProfile"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updateProfile}; + methodMap_["getIdToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getIdToken}; + methodMap_["getIdTokenResult"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getIdTokenResult}; + methodMap_["signInWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithCredential}; + methodMap_["signInWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithProvider}; + methodMap_["signInWithPhoneNumber"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithPhoneNumber}; + methodMap_["verifyPhoneNumberWithMultiFactorInfo"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumberWithMultiFactorInfo}; + methodMap_["verifyPhoneNumberForMultiFactor"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumberForMultiFactor}; + methodMap_["resolveMultiFactorSignIn"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_resolveMultiFactorSignIn}; + methodMap_["resolveTotpSignIn"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_resolveTotpSignIn}; + methodMap_["generateTotpSecret"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_generateTotpSecret}; + methodMap_["generateQrCodeUrl"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_generateQrCodeUrl}; + methodMap_["openInOtpApp"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_openInOtpApp}; + methodMap_["getSession"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getSession}; + methodMap_["unenrollMultiFactor"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_unenrollMultiFactor}; + methodMap_["finalizeMultiFactorEnrollment"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_finalizeMultiFactorEnrollment}; + methodMap_["finalizeTotpEnrollment"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_finalizeTotpEnrollment}; + methodMap_["confirmationResultConfirm"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_confirmationResultConfirm}; + methodMap_["verifyPhoneNumber"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumber}; + methodMap_["confirmPasswordReset"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_confirmPasswordReset}; + methodMap_["applyActionCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_applyActionCode}; + methodMap_["checkActionCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_checkActionCode}; + methodMap_["linkWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_linkWithCredential}; + methodMap_["linkWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_linkWithProvider}; + methodMap_["unlink"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_unlink}; + methodMap_["reauthenticateWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reauthenticateWithCredential}; + methodMap_["reauthenticateWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reauthenticateWithProvider}; + methodMap_["fetchSignInMethodsForEmail"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_fetchSignInMethodsForEmail}; + methodMap_["setLanguageCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setLanguageCode}; + methodMap_["setTenantId"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setTenantId}; + methodMap_["useDeviceLanguage"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useDeviceLanguage}; + methodMap_["verifyPasswordResetCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPasswordResetCode}; + methodMap_["useEmulator"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useEmulator}; +} + + +} // namespace facebook::react diff --git a/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/react/renderer/components/RNFBAuthTurboModules/RNFBAuthTurboModulesJSI.h b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/react/renderer/components/RNFBAuthTurboModules/RNFBAuthTurboModulesJSI.h new file mode 100644 index 0000000000..9cfa98662d --- /dev/null +++ b/packages/auth/android/src/main/java/io/invertase/firebase/auth/generated/jni/react/renderer/components/RNFBAuthTurboModules/RNFBAuthTurboModulesJSI.h @@ -0,0 +1,611 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboAuthCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAuthCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual void configureAuthDomain(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value getCustomAuthDomain(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void addAuthStateListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void removeAuthStateListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void addIdTokenListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void removeIdTokenListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value forceRecaptchaFlowForTesting(jsi::Runtime &rt, jsi::String appName, bool forceRecaptchaFlow) = 0; + virtual jsi::Value setAutoRetrievedSmsCodeForPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String smsCode) = 0; + virtual jsi::Value setAppVerificationDisabledForTesting(jsi::Runtime &rt, jsi::String appName, bool disabled) = 0; + virtual jsi::Value useUserAccessGroup(jsi::Runtime &rt, jsi::String appName, jsi::String userAccessGroup) = 0; + virtual jsi::Value signOut(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value signInAnonymously(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value createUserWithEmailAndPassword(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String password) = 0; + virtual bool isSignInWithEmailLink(jsi::Runtime &rt, jsi::String appName, jsi::String emailLink) = 0; + virtual jsi::Value signInWithEmailAndPassword(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String password) = 0; + virtual jsi::Value signInWithEmailLink(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String emailLink) = 0; + virtual jsi::Value signInWithCustomToken(jsi::Runtime &rt, jsi::String appName, jsi::String token) = 0; + virtual jsi::Value revokeToken(jsi::Runtime &rt, jsi::String appName, jsi::String authorizationCode) = 0; + virtual jsi::Value sendPasswordResetEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, std::optional actionCodeSettings) = 0; + virtual jsi::Value sendSignInLinkToEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::Object actionCodeSettings) = 0; + virtual jsi::Value deleteUser(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value reload(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value sendEmailVerification(jsi::Runtime &rt, jsi::String appName, std::optional actionCodeSettings) = 0; + virtual jsi::Value verifyBeforeUpdateEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, std::optional actionCodeSettings) = 0; + virtual jsi::Value updateEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email) = 0; + virtual jsi::Value updatePassword(jsi::Runtime &rt, jsi::String appName, jsi::String password) = 0; + virtual jsi::Value updatePhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) = 0; + virtual jsi::Value updateProfile(jsi::Runtime &rt, jsi::String appName, jsi::Object props) = 0; + virtual jsi::Value getIdToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) = 0; + virtual jsi::Value getIdTokenResult(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) = 0; + virtual jsi::Value signInWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) = 0; + virtual jsi::Value signInWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) = 0; + virtual jsi::Value signInWithPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, bool forceResend) = 0; + virtual jsi::Value verifyPhoneNumberWithMultiFactorInfo(jsi::Runtime &rt, jsi::String appName, jsi::String hintUid, jsi::String sessionKey) = 0; + virtual jsi::Value verifyPhoneNumberForMultiFactor(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String sessionKey) = 0; + virtual jsi::Value resolveMultiFactorSignIn(jsi::Runtime &rt, jsi::String appName, jsi::String session, jsi::String verificationId, jsi::String verificationCode) = 0; + virtual jsi::Value resolveTotpSignIn(jsi::Runtime &rt, jsi::String appName, jsi::String sessionKey, jsi::String uid, jsi::String oneTimePassword) = 0; + virtual jsi::Value generateTotpSecret(jsi::Runtime &rt, jsi::String appName, jsi::String sessionKey) = 0; + virtual jsi::String generateQrCodeUrl(jsi::Runtime &rt, jsi::String appName, jsi::String secretKey, jsi::String account, jsi::String issuer) = 0; + virtual void openInOtpApp(jsi::Runtime &rt, jsi::String appName, jsi::String secretKey, jsi::String qrCodeUri) = 0; + virtual jsi::Value getSession(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value unenrollMultiFactor(jsi::Runtime &rt, jsi::String appName, jsi::String factorUID) = 0; + virtual jsi::Value finalizeMultiFactorEnrollment(jsi::Runtime &rt, jsi::String appName, jsi::String verificationId, jsi::String verificationCode, std::optional displayName) = 0; + virtual jsi::Value finalizeTotpEnrollment(jsi::Runtime &rt, jsi::String appName, jsi::String totpSecret, jsi::String verificationCode, std::optional displayName) = 0; + virtual jsi::Value confirmationResultConfirm(jsi::Runtime &rt, jsi::String appName, jsi::String verificationCode) = 0; + virtual void verifyPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String requestKey, double timeout, bool forceResend) = 0; + virtual jsi::Value confirmPasswordReset(jsi::Runtime &rt, jsi::String appName, jsi::String code, jsi::String newPassword) = 0; + virtual jsi::Value applyActionCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) = 0; + virtual jsi::Value checkActionCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) = 0; + virtual jsi::Value linkWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) = 0; + virtual jsi::Value linkWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) = 0; + virtual jsi::Value unlink(jsi::Runtime &rt, jsi::String appName, jsi::String providerId) = 0; + virtual jsi::Value reauthenticateWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) = 0; + virtual jsi::Value reauthenticateWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) = 0; + virtual jsi::Value fetchSignInMethodsForEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email) = 0; + virtual void setLanguageCode(jsi::Runtime &rt, jsi::String appName, std::optional code) = 0; + virtual jsi::Value setTenantId(jsi::Runtime &rt, jsi::String appName, std::optional tenantId) = 0; + virtual void useDeviceLanguage(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value verifyPasswordResetCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) = 0; + virtual void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String host, double port) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAuthCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboAuth"; + +protected: + NativeRNFBTurboAuthCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAuthCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAuthCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAuthCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + void configureAuthDomain(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::configureAuthDomain) == 2, + "Expected configureAuthDomain(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::configureAuthDomain, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value getCustomAuthDomain(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::getCustomAuthDomain) == 2, + "Expected getCustomAuthDomain(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getCustomAuthDomain, jsInvoker_, instance_, std::move(appName)); + } + void addAuthStateListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::addAuthStateListener) == 2, + "Expected addAuthStateListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::addAuthStateListener, jsInvoker_, instance_, std::move(appName)); + } + void removeAuthStateListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::removeAuthStateListener) == 2, + "Expected removeAuthStateListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeAuthStateListener, jsInvoker_, instance_, std::move(appName)); + } + void addIdTokenListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::addIdTokenListener) == 2, + "Expected addIdTokenListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::addIdTokenListener, jsInvoker_, instance_, std::move(appName)); + } + void removeIdTokenListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::removeIdTokenListener) == 2, + "Expected removeIdTokenListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeIdTokenListener, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value forceRecaptchaFlowForTesting(jsi::Runtime &rt, jsi::String appName, bool forceRecaptchaFlow) override { + static_assert( + bridging::getParameterCount(&T::forceRecaptchaFlowForTesting) == 3, + "Expected forceRecaptchaFlowForTesting(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::forceRecaptchaFlowForTesting, jsInvoker_, instance_, std::move(appName), std::move(forceRecaptchaFlow)); + } + jsi::Value setAutoRetrievedSmsCodeForPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String smsCode) override { + static_assert( + bridging::getParameterCount(&T::setAutoRetrievedSmsCodeForPhoneNumber) == 4, + "Expected setAutoRetrievedSmsCodeForPhoneNumber(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setAutoRetrievedSmsCodeForPhoneNumber, jsInvoker_, instance_, std::move(appName), std::move(phoneNumber), std::move(smsCode)); + } + jsi::Value setAppVerificationDisabledForTesting(jsi::Runtime &rt, jsi::String appName, bool disabled) override { + static_assert( + bridging::getParameterCount(&T::setAppVerificationDisabledForTesting) == 3, + "Expected setAppVerificationDisabledForTesting(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setAppVerificationDisabledForTesting, jsInvoker_, instance_, std::move(appName), std::move(disabled)); + } + jsi::Value useUserAccessGroup(jsi::Runtime &rt, jsi::String appName, jsi::String userAccessGroup) override { + static_assert( + bridging::getParameterCount(&T::useUserAccessGroup) == 3, + "Expected useUserAccessGroup(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::useUserAccessGroup, jsInvoker_, instance_, std::move(appName), std::move(userAccessGroup)); + } + jsi::Value signOut(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::signOut) == 2, + "Expected signOut(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::signOut, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value signInAnonymously(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::signInAnonymously) == 2, + "Expected signInAnonymously(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::signInAnonymously, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value createUserWithEmailAndPassword(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String password) override { + static_assert( + bridging::getParameterCount(&T::createUserWithEmailAndPassword) == 4, + "Expected createUserWithEmailAndPassword(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::createUserWithEmailAndPassword, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(password)); + } + bool isSignInWithEmailLink(jsi::Runtime &rt, jsi::String appName, jsi::String emailLink) override { + static_assert( + bridging::getParameterCount(&T::isSignInWithEmailLink) == 3, + "Expected isSignInWithEmailLink(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::isSignInWithEmailLink, jsInvoker_, instance_, std::move(appName), std::move(emailLink)); + } + jsi::Value signInWithEmailAndPassword(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String password) override { + static_assert( + bridging::getParameterCount(&T::signInWithEmailAndPassword) == 4, + "Expected signInWithEmailAndPassword(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithEmailAndPassword, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(password)); + } + jsi::Value signInWithEmailLink(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String emailLink) override { + static_assert( + bridging::getParameterCount(&T::signInWithEmailLink) == 4, + "Expected signInWithEmailLink(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithEmailLink, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(emailLink)); + } + jsi::Value signInWithCustomToken(jsi::Runtime &rt, jsi::String appName, jsi::String token) override { + static_assert( + bridging::getParameterCount(&T::signInWithCustomToken) == 3, + "Expected signInWithCustomToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithCustomToken, jsInvoker_, instance_, std::move(appName), std::move(token)); + } + jsi::Value revokeToken(jsi::Runtime &rt, jsi::String appName, jsi::String authorizationCode) override { + static_assert( + bridging::getParameterCount(&T::revokeToken) == 3, + "Expected revokeToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::revokeToken, jsInvoker_, instance_, std::move(appName), std::move(authorizationCode)); + } + jsi::Value sendPasswordResetEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, std::optional actionCodeSettings) override { + static_assert( + bridging::getParameterCount(&T::sendPasswordResetEmail) == 4, + "Expected sendPasswordResetEmail(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::sendPasswordResetEmail, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(actionCodeSettings)); + } + jsi::Value sendSignInLinkToEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::Object actionCodeSettings) override { + static_assert( + bridging::getParameterCount(&T::sendSignInLinkToEmail) == 4, + "Expected sendSignInLinkToEmail(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::sendSignInLinkToEmail, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(actionCodeSettings)); + } + jsi::Value deleteUser(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::deleteUser) == 2, + "Expected deleteUser(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::deleteUser, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value reload(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::reload) == 2, + "Expected reload(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::reload, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value sendEmailVerification(jsi::Runtime &rt, jsi::String appName, std::optional actionCodeSettings) override { + static_assert( + bridging::getParameterCount(&T::sendEmailVerification) == 3, + "Expected sendEmailVerification(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::sendEmailVerification, jsInvoker_, instance_, std::move(appName), std::move(actionCodeSettings)); + } + jsi::Value verifyBeforeUpdateEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, std::optional actionCodeSettings) override { + static_assert( + bridging::getParameterCount(&T::verifyBeforeUpdateEmail) == 4, + "Expected verifyBeforeUpdateEmail(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::verifyBeforeUpdateEmail, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(actionCodeSettings)); + } + jsi::Value updateEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email) override { + static_assert( + bridging::getParameterCount(&T::updateEmail) == 3, + "Expected updateEmail(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::updateEmail, jsInvoker_, instance_, std::move(appName), std::move(email)); + } + jsi::Value updatePassword(jsi::Runtime &rt, jsi::String appName, jsi::String password) override { + static_assert( + bridging::getParameterCount(&T::updatePassword) == 3, + "Expected updatePassword(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::updatePassword, jsInvoker_, instance_, std::move(appName), std::move(password)); + } + jsi::Value updatePhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) override { + static_assert( + bridging::getParameterCount(&T::updatePhoneNumber) == 5, + "Expected updatePhoneNumber(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::updatePhoneNumber, jsInvoker_, instance_, std::move(appName), std::move(provider), std::move(authToken), std::move(authSecret)); + } + jsi::Value updateProfile(jsi::Runtime &rt, jsi::String appName, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::updateProfile) == 3, + "Expected updateProfile(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::updateProfile, jsInvoker_, instance_, std::move(appName), std::move(props)); + } + jsi::Value getIdToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) override { + static_assert( + bridging::getParameterCount(&T::getIdToken) == 3, + "Expected getIdToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getIdToken, jsInvoker_, instance_, std::move(appName), std::move(forceRefresh)); + } + jsi::Value getIdTokenResult(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) override { + static_assert( + bridging::getParameterCount(&T::getIdTokenResult) == 3, + "Expected getIdTokenResult(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getIdTokenResult, jsInvoker_, instance_, std::move(appName), std::move(forceRefresh)); + } + jsi::Value signInWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) override { + static_assert( + bridging::getParameterCount(&T::signInWithCredential) == 5, + "Expected signInWithCredential(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithCredential, jsInvoker_, instance_, std::move(appName), std::move(provider), std::move(authToken), std::move(authSecret)); + } + jsi::Value signInWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) override { + static_assert( + bridging::getParameterCount(&T::signInWithProvider) == 3, + "Expected signInWithProvider(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithProvider, jsInvoker_, instance_, std::move(appName), std::move(provider)); + } + jsi::Value signInWithPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, bool forceResend) override { + static_assert( + bridging::getParameterCount(&T::signInWithPhoneNumber) == 4, + "Expected signInWithPhoneNumber(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithPhoneNumber, jsInvoker_, instance_, std::move(appName), std::move(phoneNumber), std::move(forceResend)); + } + jsi::Value verifyPhoneNumberWithMultiFactorInfo(jsi::Runtime &rt, jsi::String appName, jsi::String hintUid, jsi::String sessionKey) override { + static_assert( + bridging::getParameterCount(&T::verifyPhoneNumberWithMultiFactorInfo) == 4, + "Expected verifyPhoneNumberWithMultiFactorInfo(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::verifyPhoneNumberWithMultiFactorInfo, jsInvoker_, instance_, std::move(appName), std::move(hintUid), std::move(sessionKey)); + } + jsi::Value verifyPhoneNumberForMultiFactor(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String sessionKey) override { + static_assert( + bridging::getParameterCount(&T::verifyPhoneNumberForMultiFactor) == 4, + "Expected verifyPhoneNumberForMultiFactor(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::verifyPhoneNumberForMultiFactor, jsInvoker_, instance_, std::move(appName), std::move(phoneNumber), std::move(sessionKey)); + } + jsi::Value resolveMultiFactorSignIn(jsi::Runtime &rt, jsi::String appName, jsi::String session, jsi::String verificationId, jsi::String verificationCode) override { + static_assert( + bridging::getParameterCount(&T::resolveMultiFactorSignIn) == 5, + "Expected resolveMultiFactorSignIn(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::resolveMultiFactorSignIn, jsInvoker_, instance_, std::move(appName), std::move(session), std::move(verificationId), std::move(verificationCode)); + } + jsi::Value resolveTotpSignIn(jsi::Runtime &rt, jsi::String appName, jsi::String sessionKey, jsi::String uid, jsi::String oneTimePassword) override { + static_assert( + bridging::getParameterCount(&T::resolveTotpSignIn) == 5, + "Expected resolveTotpSignIn(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::resolveTotpSignIn, jsInvoker_, instance_, std::move(appName), std::move(sessionKey), std::move(uid), std::move(oneTimePassword)); + } + jsi::Value generateTotpSecret(jsi::Runtime &rt, jsi::String appName, jsi::String sessionKey) override { + static_assert( + bridging::getParameterCount(&T::generateTotpSecret) == 3, + "Expected generateTotpSecret(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::generateTotpSecret, jsInvoker_, instance_, std::move(appName), std::move(sessionKey)); + } + jsi::String generateQrCodeUrl(jsi::Runtime &rt, jsi::String appName, jsi::String secretKey, jsi::String account, jsi::String issuer) override { + static_assert( + bridging::getParameterCount(&T::generateQrCodeUrl) == 5, + "Expected generateQrCodeUrl(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::generateQrCodeUrl, jsInvoker_, instance_, std::move(appName), std::move(secretKey), std::move(account), std::move(issuer)); + } + void openInOtpApp(jsi::Runtime &rt, jsi::String appName, jsi::String secretKey, jsi::String qrCodeUri) override { + static_assert( + bridging::getParameterCount(&T::openInOtpApp) == 4, + "Expected openInOtpApp(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::openInOtpApp, jsInvoker_, instance_, std::move(appName), std::move(secretKey), std::move(qrCodeUri)); + } + jsi::Value getSession(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::getSession) == 2, + "Expected getSession(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getSession, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value unenrollMultiFactor(jsi::Runtime &rt, jsi::String appName, jsi::String factorUID) override { + static_assert( + bridging::getParameterCount(&T::unenrollMultiFactor) == 3, + "Expected unenrollMultiFactor(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::unenrollMultiFactor, jsInvoker_, instance_, std::move(appName), std::move(factorUID)); + } + jsi::Value finalizeMultiFactorEnrollment(jsi::Runtime &rt, jsi::String appName, jsi::String verificationId, jsi::String verificationCode, std::optional displayName) override { + static_assert( + bridging::getParameterCount(&T::finalizeMultiFactorEnrollment) == 5, + "Expected finalizeMultiFactorEnrollment(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::finalizeMultiFactorEnrollment, jsInvoker_, instance_, std::move(appName), std::move(verificationId), std::move(verificationCode), std::move(displayName)); + } + jsi::Value finalizeTotpEnrollment(jsi::Runtime &rt, jsi::String appName, jsi::String totpSecret, jsi::String verificationCode, std::optional displayName) override { + static_assert( + bridging::getParameterCount(&T::finalizeTotpEnrollment) == 5, + "Expected finalizeTotpEnrollment(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::finalizeTotpEnrollment, jsInvoker_, instance_, std::move(appName), std::move(totpSecret), std::move(verificationCode), std::move(displayName)); + } + jsi::Value confirmationResultConfirm(jsi::Runtime &rt, jsi::String appName, jsi::String verificationCode) override { + static_assert( + bridging::getParameterCount(&T::confirmationResultConfirm) == 3, + "Expected confirmationResultConfirm(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::confirmationResultConfirm, jsInvoker_, instance_, std::move(appName), std::move(verificationCode)); + } + void verifyPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String requestKey, double timeout, bool forceResend) override { + static_assert( + bridging::getParameterCount(&T::verifyPhoneNumber) == 6, + "Expected verifyPhoneNumber(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::verifyPhoneNumber, jsInvoker_, instance_, std::move(appName), std::move(phoneNumber), std::move(requestKey), std::move(timeout), std::move(forceResend)); + } + jsi::Value confirmPasswordReset(jsi::Runtime &rt, jsi::String appName, jsi::String code, jsi::String newPassword) override { + static_assert( + bridging::getParameterCount(&T::confirmPasswordReset) == 4, + "Expected confirmPasswordReset(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::confirmPasswordReset, jsInvoker_, instance_, std::move(appName), std::move(code), std::move(newPassword)); + } + jsi::Value applyActionCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) override { + static_assert( + bridging::getParameterCount(&T::applyActionCode) == 3, + "Expected applyActionCode(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::applyActionCode, jsInvoker_, instance_, std::move(appName), std::move(code)); + } + jsi::Value checkActionCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) override { + static_assert( + bridging::getParameterCount(&T::checkActionCode) == 3, + "Expected checkActionCode(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::checkActionCode, jsInvoker_, instance_, std::move(appName), std::move(code)); + } + jsi::Value linkWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) override { + static_assert( + bridging::getParameterCount(&T::linkWithCredential) == 5, + "Expected linkWithCredential(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::linkWithCredential, jsInvoker_, instance_, std::move(appName), std::move(provider), std::move(authToken), std::move(authSecret)); + } + jsi::Value linkWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) override { + static_assert( + bridging::getParameterCount(&T::linkWithProvider) == 3, + "Expected linkWithProvider(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::linkWithProvider, jsInvoker_, instance_, std::move(appName), std::move(provider)); + } + jsi::Value unlink(jsi::Runtime &rt, jsi::String appName, jsi::String providerId) override { + static_assert( + bridging::getParameterCount(&T::unlink) == 3, + "Expected unlink(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::unlink, jsInvoker_, instance_, std::move(appName), std::move(providerId)); + } + jsi::Value reauthenticateWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) override { + static_assert( + bridging::getParameterCount(&T::reauthenticateWithCredential) == 5, + "Expected reauthenticateWithCredential(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::reauthenticateWithCredential, jsInvoker_, instance_, std::move(appName), std::move(provider), std::move(authToken), std::move(authSecret)); + } + jsi::Value reauthenticateWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) override { + static_assert( + bridging::getParameterCount(&T::reauthenticateWithProvider) == 3, + "Expected reauthenticateWithProvider(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::reauthenticateWithProvider, jsInvoker_, instance_, std::move(appName), std::move(provider)); + } + jsi::Value fetchSignInMethodsForEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email) override { + static_assert( + bridging::getParameterCount(&T::fetchSignInMethodsForEmail) == 3, + "Expected fetchSignInMethodsForEmail(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::fetchSignInMethodsForEmail, jsInvoker_, instance_, std::move(appName), std::move(email)); + } + void setLanguageCode(jsi::Runtime &rt, jsi::String appName, std::optional code) override { + static_assert( + bridging::getParameterCount(&T::setLanguageCode) == 3, + "Expected setLanguageCode(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setLanguageCode, jsInvoker_, instance_, std::move(appName), std::move(code)); + } + jsi::Value setTenantId(jsi::Runtime &rt, jsi::String appName, std::optional tenantId) override { + static_assert( + bridging::getParameterCount(&T::setTenantId) == 3, + "Expected setTenantId(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setTenantId, jsInvoker_, instance_, std::move(appName), std::move(tenantId)); + } + void useDeviceLanguage(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::useDeviceLanguage) == 2, + "Expected useDeviceLanguage(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::useDeviceLanguage, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value verifyPasswordResetCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) override { + static_assert( + bridging::getParameterCount(&T::verifyPasswordResetCode) == 3, + "Expected verifyPasswordResetCode(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::verifyPasswordResetCode, jsInvoker_, instance_, std::move(appName), std::move(code)); + } + void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String host, double port) override { + static_assert( + bridging::getParameterCount(&T::useEmulator) == 4, + "Expected useEmulator(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::useEmulator, jsInvoker_, instance_, std::move(appName), std::move(host), std::move(port)); + } + + private: + friend class NativeRNFBTurboAuthCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/auth/e2e/emailLink.e2e.js b/packages/auth/e2e/emailLink.e2e.js index a5df456285..b1cc54d725 100644 --- a/packages/auth/e2e/emailLink.e2e.js +++ b/packages/auth/e2e/emailLink.e2e.js @@ -66,7 +66,7 @@ describe('auth() -> emailLink Provider', function () { }); }); describe('isSignInWithEmailLink', function () { - it('should return true/false', async function () { + it('should return true/false', function () { const { getAuth, isSignInWithEmailLink } = authModular; const auth = getAuth(); @@ -79,14 +79,14 @@ describe('auth() -> emailLink Provider', function () { // ios does not require apiKey, but android and web/other do if (!Platform.ios) { - should.equal(false, await isSignInWithEmailLink(auth, emailLink1)); + should.equal(false, isSignInWithEmailLink(auth, emailLink1)); } else { - should.equal(true, await isSignInWithEmailLink(auth, emailLink1)); + should.equal(true, isSignInWithEmailLink(auth, emailLink1)); } - should.equal(false, await isSignInWithEmailLink(auth, emailLink2)); - should.equal(false, await isSignInWithEmailLink(auth, emailLink3)); - should.equal(true, await isSignInWithEmailLink(auth, emailLink4)); - should.equal(true, await isSignInWithEmailLink(auth, emailLink5)); + should.equal(false, isSignInWithEmailLink(auth, emailLink2)); + should.equal(false, isSignInWithEmailLink(auth, emailLink3)); + should.equal(true, isSignInWithEmailLink(auth, emailLink4)); + should.equal(true, isSignInWithEmailLink(auth, emailLink5)); }); }); diff --git a/packages/auth/ios/RNFBAuth.xcodeproj/project.pbxproj b/packages/auth/ios/RNFBAuth.xcodeproj/project.pbxproj index 0eecf5f117..1609bfd97d 100644 --- a/packages/auth/ios/RNFBAuth.xcodeproj/project.pbxproj +++ b/packages/auth/ios/RNFBAuth.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBAuthModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAuthModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBAuthModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBAuthModule.mm */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -25,7 +25,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBAuth.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBAuth.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBAuthModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBAuthModule.h; path = RNFBAuth/RNFBAuthModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBAuthModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBAuthModule.m; path = RNFBAuth/RNFBAuthModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBAuthModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = RNFBAuthModule.mm; path = RNFBAuth/RNFBAuthModule.mm; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,7 +53,7 @@ 2744B9A121F48736004F8E3F /* converters */, 2744B98C21F45C64004F8E3F /* common */, 2744B98421F45429004F8E3F /* RNFBAuthModule.h */, - 2744B98521F45429004F8E3F /* RNFBAuthModule.m */, + 2744B98521F45429004F8E3F /* RNFBAuthModule.mm */, ); path = RNFBAuth; sourceTree = ""; @@ -124,7 +124,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBAuthModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBAuthModule.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/packages/auth/ios/RNFBAuth/RNFBAuthModule.h b/packages/auth/ios/RNFBAuth/RNFBAuthModule.h index dd7b0774c1..b10cd3d6dc 100644 --- a/packages/auth/ios/RNFBAuth/RNFBAuthModule.h +++ b/packages/auth/ios/RNFBAuth/RNFBAuthModule.h @@ -17,9 +17,9 @@ #import #import -#import +#import "RNFBAuthTurboModules.h" -@interface RNFBAuthModule : NSObject +@interface RNFBAuthModule : NSObject @end extern NSString* const AuthErrorCode_toJSErrorCode[]; diff --git a/packages/auth/ios/RNFBAuth/RNFBAuthModule.m b/packages/auth/ios/RNFBAuth/RNFBAuthModule.mm similarity index 78% rename from packages/auth/ios/RNFBAuth/RNFBAuthModule.m rename to packages/auth/ios/RNFBAuth/RNFBAuthModule.mm index 73b91b9a4b..82fbeee8b7 100644 --- a/packages/auth/ios/RNFBAuth/RNFBAuthModule.m +++ b/packages/auth/ios/RNFBAuth/RNFBAuthModule.mm @@ -22,6 +22,13 @@ #import "RNFBApp/RNFBAppModule.h" #import "RNFBApp/RNFBSharedUtils.h" #import "RNFBAuthModule.h" +#import "RNFBAuthTurboModules.h" + +static void RNFBAuthThrowSyncErrorWithCode(NSString *code, NSString *message) { + @throw [NSException exceptionWithName:code + reason:message + userInfo:@{@"code" : code, @"message" : message}]; +} static NSString *const keyIOS = @"iOS"; static NSString *const keyUrl = @"url"; @@ -65,10 +72,15 @@ @implementation RNFBAuthModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboAuth); + (BOOL)requiresMainQueueSetup { - return YES; + return NO; +} + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); } - (id)init { @@ -119,7 +131,9 @@ - (void)invalidate { #pragma mark - #pragma mark Firebase Auth Methods -RCT_EXPORT_METHOD(addAuthStateListener : (FIRApp *)firebaseApp) { +- (void)addAuthStateListener:(NSString *)appName { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + if (![authStateHandlers valueForKey:firebaseApp.name]) { FIRAuthStateDidChangeListenerHandle newListenerHandle = [[FIRAuth authWithApp:firebaseApp] addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) { @@ -135,7 +149,9 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(removeAuthStateListener : (FIRApp *)firebaseApp) { +- (void)removeAuthStateListener:(NSString *)appName { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + if ([authStateHandlers valueForKey:firebaseApp.name]) { [[FIRAuth authWithApp:firebaseApp] removeAuthStateDidChangeListener:[authStateHandlers valueForKey:firebaseApp.name]]; @@ -143,7 +159,9 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(addIdTokenListener : (FIRApp *)firebaseApp) { +- (void)addIdTokenListener:(NSString *)appName { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + if (![idTokenHandlers valueForKey:firebaseApp.name]) { FIRIDTokenDidChangeListenerHandle newListenerHandle = [[FIRAuth authWithApp:firebaseApp] addIDTokenDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) { @@ -161,7 +179,9 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(removeIdTokenListener : (FIRApp *)firebaseApp) { +- (void)removeIdTokenListener:(NSString *)appName { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + if ([idTokenHandlers valueForKey:firebaseApp.name]) { [[FIRAuth authWithApp:firebaseApp] removeIDTokenDidChangeListener:[idTokenHandlers valueForKey:firebaseApp.name]]; @@ -169,7 +189,9 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(configureAuthDomain : (FIRApp *)firebaseApp) { +- (void)configureAuthDomain:(NSString *)appName { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSString *authDomain = [RNFBAppModule getCustomDomain:firebaseApp.name]; DLog(@"RNFBAuth app: %@ customAuthDomain: %@", firebaseApp.name, authDomain); if (authDomain != nil) { @@ -177,22 +199,45 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(getCustomAuthDomain - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getCustomAuthDomain:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + resolve([FIRAuth authWithApp:firebaseApp].customAuthDomain); } -RCT_EXPORT_METHOD(setAppVerificationDisabledForTesting : (FIRApp *)firebaseApp : (BOOL)disabled) { +- (void)setAppVerificationDisabledForTesting:(NSString *)appName + disabled:(BOOL)disabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [FIRAuth authWithApp:firebaseApp].settings.appVerificationDisabledForTesting = disabled; + resolve([NSNull null]); } -RCT_EXPORT_METHOD(useUserAccessGroup - : (FIRApp *)firebaseApp - : (NSString *)userAccessGroup - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)forceRecaptchaFlowForTesting:(NSString *)appName + forceRecaptchaFlow:(BOOL)forceRecaptchaFlow + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + resolve([NSNull null]); +} + +- (void)setAutoRetrievedSmsCodeForPhoneNumber:(NSString *)appName + phoneNumber:(NSString *)phoneNumber + smsCode:(NSString *)smsCode + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + resolve([NSNull null]); +} + +- (void)useUserAccessGroup:(NSString *)appName + userAccessGroup:(NSString *)userAccessGroup + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSError *error; [[FIRAuth authWithApp:firebaseApp] useUserAccessGroup:userAccessGroup error:&error]; @@ -204,10 +249,11 @@ - (void)invalidate { return; } -RCT_EXPORT_METHOD(signOut - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)signOut:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { @@ -224,10 +270,11 @@ - (void)invalidate { [self promiseNoUser:resolve rejecter:reject isError:YES]; } -RCT_EXPORT_METHOD(signInAnonymously - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)signInAnonymously:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] signInAnonymouslyWithCompletion:^(FIRAuthDataResult *authResult, NSError *error) { if (error) { @@ -238,12 +285,13 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(signInWithEmailAndPassword - : (FIRApp *)firebaseApp - : (NSString *)email - : (NSString *)password - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)signInWithEmailAndPassword:(NSString *)appName + email:(NSString *)email + password:(NSString *)password + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] signInWithEmail:email password:password @@ -256,21 +304,20 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(isSignInWithEmailLink - : (FIRApp *)firebaseApp - : (NSString *)emailLink - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - resolve( - @([RCTConvert BOOL:@([[FIRAuth authWithApp:firebaseApp] isSignInWithEmailLink:emailLink])])); +- (NSNumber *)isSignInWithEmailLink:(NSString *)appName emailLink:(NSString *)emailLink { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + + return + @([RCTConvert BOOL:@([[FIRAuth authWithApp:firebaseApp] isSignInWithEmailLink:emailLink])]); } -RCT_EXPORT_METHOD(signInWithEmailLink - : (FIRApp *)firebaseApp - : (NSString *)email - : (NSString *)emailLink - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)signInWithEmailLink:(NSString *)appName + email:(NSString *)email + emailLink:(NSString *)emailLink + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] signInWithEmail:email link:emailLink @@ -283,12 +330,13 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(createUserWithEmailAndPassword - : (FIRApp *)firebaseApp - : (NSString *)email - : (NSString *)password - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)createUserWithEmailAndPassword:(NSString *)appName + email:(NSString *)email + password:(NSString *)password + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] createUserWithEmail:email password:password @@ -301,10 +349,11 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(delete - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)deleteUser:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { @@ -320,10 +369,11 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(reload - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)reload:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { [self reloadAndReturnUser:user resolver:resolve rejecter:reject firebaseApp:firebaseApp]; @@ -332,11 +382,12 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(sendEmailVerification - : (FIRApp *)firebaseApp - : (NSDictionary *)actionCodeSettings - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)sendEmailVerification:(NSString *)appName + actionCodeSettings:(NSDictionary *)actionCodeSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { id handler = ^(NSError *_Nullable error) { @@ -358,12 +409,13 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(verifyBeforeUpdateEmail - : (FIRApp *)firebaseApp - : (NSString *)email - : (NSDictionary *)actionCodeSettings - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)verifyBeforeUpdateEmail:(NSString *)appName + email:(NSString *)email + actionCodeSettings:(NSDictionary *)actionCodeSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { id handler = ^(NSError *_Nullable error) { @@ -387,11 +439,12 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(updateEmail - : (FIRApp *)firebaseApp - : (NSString *)email - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)updateEmail:(NSString *)appName + email:(NSString *)email + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { @@ -411,11 +464,12 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(updatePassword - : (FIRApp *)firebaseApp - : (NSString *)password - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)updatePassword:(NSString *)appName + password:(NSString *)password + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { @@ -434,13 +488,14 @@ - (void)invalidate { } #if TARGET_OS_IOS -RCT_EXPORT_METHOD(updatePhoneNumber - : (FIRApp *)firebaseApp - : (NSString *)provider - : (NSString *)authToken - : (NSString *)authSecret - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)updatePhoneNumber:(NSString *)appName + provider:(NSString *)provider + authToken:(NSString *)authToken + authSecret:(NSString *)authSecret + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { @@ -476,11 +531,12 @@ - (void)invalidate { } #endif -RCT_EXPORT_METHOD(updateProfile - : (FIRApp *)firebaseApp - : (NSDictionary *)props - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)updateProfile:(NSString *)appName + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { @@ -512,11 +568,12 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(getIdToken - : (FIRApp *)firebaseApp - : (BOOL)forceRefresh - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getIdToken:(NSString *)appName + forceRefresh:(BOOL)forceRefresh + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { @@ -533,11 +590,12 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(getIdTokenResult - : (FIRApp *)firebaseApp - : (BOOL)forceRefresh - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getIdTokenResult:(NSString *)appName + forceRefresh:(BOOL)forceRefresh + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { @@ -579,13 +637,14 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(signInWithCredential - : (FIRApp *)firebaseApp - : (NSString *)provider - : (NSString *)authToken - : (NSString *)authSecret - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)signInWithCredential:(NSString *)appName + provider:(NSString *)provider + authToken:(NSString *)authToken + authSecret:(NSString *)authSecret + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRAuthCredential *credential = [self getCredentialForProvider:provider token:authToken secret:authSecret @@ -611,11 +670,12 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(signInWithProvider - : (FIRApp *)firebaseApp - : (NSDictionary *)provider - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)signInWithProvider:(NSString *)appName + provider:(NSDictionary *)provider + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSString *providerId = provider[@"providerId"]; if (providerId == nil) { [RNFBSharedUtils rejectPromiseWithUserInfo:reject @@ -671,12 +731,13 @@ - (void)invalidate { #endif } -RCT_EXPORT_METHOD(confirmPasswordReset - : (FIRApp *)firebaseApp - : (NSString *)code - : (NSString *)newPassword - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)confirmPasswordReset:(NSString *)appName + code:(NSString *)code + newPassword:(NSString *)newPassword + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] confirmPasswordResetWithCode:code newPassword:newPassword @@ -689,11 +750,12 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(applyActionCode - : (FIRApp *)firebaseApp - : (NSString *)code - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)applyActionCode:(NSString *)appName + code:(NSString *)code + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] applyActionCode:code completion:^(NSError *_Nullable error) { @@ -707,11 +769,12 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(checkActionCode - : (FIRApp *)firebaseApp - : (NSString *)code - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)checkActionCode:(NSString *)appName + code:(NSString *)code + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] checkActionCode:code completion:^(FIRActionCodeInfo *_Nullable info, NSError *_Nullable error) { @@ -763,11 +826,12 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(revokeToken - : (FIRApp *)firebaseApp - : (NSString *)authorizationCode - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)revokeToken:(NSString *)appName + authorizationCode:(NSString *)authorizationCode + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] revokeTokenWithAuthorizationCode:authorizationCode completion:^(NSError *_Nullable error) { @@ -779,12 +843,13 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(sendPasswordResetEmail - : (FIRApp *)firebaseApp - : (NSString *)email - : (NSDictionary *)actionCodeSettings - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)sendPasswordResetEmail:(NSString *)appName + email:(NSString *)email + actionCodeSettings:(NSDictionary *)actionCodeSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + id handler = ^(NSError *_Nullable error) { if (error) { [self promiseRejectAuthException:reject error:error]; @@ -803,12 +868,13 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(sendSignInLinkToEmail - : (FIRApp *)firebaseApp - : (NSString *)email - : (NSDictionary *)actionCodeSettings - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)sendSignInLinkToEmail:(NSString *)appName + email:(NSString *)email + actionCodeSettings:(NSDictionary *)actionCodeSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + id handler = ^(NSError *_Nullable error) { if (error) { [self promiseRejectAuthException:reject error:error]; @@ -823,11 +889,12 @@ - (void)invalidate { completion:handler]; } -RCT_EXPORT_METHOD(signInWithCustomToken - : (FIRApp *)firebaseApp - : (NSString *)customToken - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)signInWithCustomToken:(NSString *)appName + customToken:(NSString *)customToken + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] signInWithCustomToken:customToken completion:^(FIRAuthDataResult *authResult, NSError *error) { @@ -840,13 +907,17 @@ - (void)invalidate { } #if TARGET_OS_IOS -RCT_EXPORT_METHOD(signInWithPhoneNumber - : (FIRApp *)firebaseApp - : (NSString *)phoneNumber - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)signInWithPhoneNumber:(NSString *)appName + phoneNumber:(NSString *)phoneNumber + forceResend:(BOOL)forceResend + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"SignInWthPhoneNumber instance: %@", firebaseApp.name); + (void)forceResend; + [[FIRPhoneAuthProvider providerWithAuth:[FIRAuth authWithApp:firebaseApp]] verifyPhoneNumber:phoneNumber UIDelegate:nil @@ -860,12 +931,13 @@ - (void)invalidate { } }]; } -RCT_EXPORT_METHOD(verifyPhoneNumberWithMultiFactorInfo - : (FIRApp *)firebaseApp - : (NSString *)hintUid - : (NSString *)sessionKey - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)verifyPhoneNumberWithMultiFactorInfo:(NSString *)appName + hintUid:(NSString *)hintUid + sessionKey:(NSString *)sessionKey + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + if ([cachedResolver valueForKey:sessionKey] == nil) { [RNFBSharedUtils rejectPromiseWithUserInfo:reject @@ -905,16 +977,17 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(verifyPhoneNumberForMultiFactor - : (FIRApp *)firebaseApp - : (NSString *)phoneNumber - : (NSString *)sessionId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)verifyPhoneNumberForMultiFactor:(NSString *)appName + phoneNumber:(NSString *)phoneNumber + sessionKey:(NSString *)sessionKey + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"verifyPhoneNumberForMultifactor using app: %@", firebaseApp.name); DLog(@"verifyPhoneNumberForMultifactor phoneNumber: %@", phoneNumber); - DLog(@"verifyPhoneNumberForMultifactor sessionId: %@", sessionId); - FIRMultiFactorSession *session = cachedSessions[sessionId]; + DLog(@"verifyPhoneNumberForMultifactor sessionKey: %@", sessionKey); + FIRMultiFactorSession *session = cachedSessions[sessionKey]; if (session == nil) { [RNFBSharedUtils rejectPromiseWithUserInfo:reject userInfo:(NSMutableDictionary *)@{ @@ -937,13 +1010,14 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(resolveMultiFactorSignIn - : (FIRApp *)firebaseApp - : (NSString *)sessionKey - : (NSString *)verificationId - : (NSString *)verificationCode - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)resolveMultiFactorSignIn:(NSString *)appName + session:(NSString *)session + verificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"using instance resolve MultiFactorSignIn: %@", firebaseApp.name); FIRPhoneAuthCredential *credential = @@ -955,28 +1029,28 @@ - (void)invalidate { FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; - [cachedResolver[sessionKey] resolveSignInWithAssertion:assertion - completion:^(FIRAuthDataResult *_Nullable authResult, - NSError *_Nullable error) { - DLog(@"authError: %@", error) if (error) { - [self promiseRejectAuthException:reject - error:error]; - } - else { - [self promiseWithAuthResult:resolve - rejecter:reject - authResult:authResult]; - } - }]; -} + [cachedResolver[session] resolveSignInWithAssertion:assertion + completion:^(FIRAuthDataResult *_Nullable authResult, + NSError *_Nullable error) { + DLog(@"authError: %@", error) if (error) { + [self promiseRejectAuthException:reject error:error]; + } + else { + [self promiseWithAuthResult:resolve + rejecter:reject + authResult:authResult]; + } + }]; +} + +- (void)resolveTotpSignIn:(NSString *)appName + sessionKey:(NSString *)sessionKey + uid:(NSString *)uid + oneTimePassword:(NSString *)oneTimePassword + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; -RCT_EXPORT_METHOD(resolveTotpSignIn - : (FIRApp *)firebaseApp - : (NSString *)sessionKey - : (NSString *)uid - : (NSString *)oneTimePassword - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { DLog(@"using instance resolve TotpSignIn: %@", firebaseApp.name); FIRMultiFactorAssertion *assertion = @@ -997,11 +1071,12 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(generateTotpSecret - : (FIRApp *)firebaseApp - : (NSString *)sessionKey - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)generateTotpSecret:(NSString *)appName + sessionKey:(NSString *)sessionKey + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"using instance resolve generateTotpSecret: %@", firebaseApp.name); FIRMultiFactorSession *session = cachedSessions[sessionKey]; @@ -1026,35 +1101,40 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(generateQrCodeUrl - : (FIRApp *)firebaseApp - : (NSString *)secretKey - : (NSString *)accountName - : (NSString *)issuer - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (NSString *)generateQrCodeUrl:(NSString *)appName + secretKey:(NSString *)secretKey + account:(NSString *)account + issuer:(NSString *)issuer { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"generateQrCodeUrl using instance resolve generateQrCodeUrl: %@", firebaseApp.name); DLog(@"generateQrCodeUrl using secretKey: %@", secretKey); FIRTOTPSecret *totpSecret = cachedTotpSecrets[secretKey]; - NSString *url = [totpSecret generateQRCodeURLWithAccountName:accountName issuer:issuer]; + if (!totpSecret) { + RNFBAuthThrowSyncErrorWithCode(@"invalid-multi-factor-secret", + @"can't find secret for provided key"); + } + NSString *url = [totpSecret generateQRCodeURLWithAccountName:account issuer:issuer]; DLog(@"generateQrCodeUrl got QR Code URL %@", url); - resolve(url); + return url; } -RCT_EXPORT_METHOD(openInOtpApp - : (FIRApp *)firebaseApp - : (NSString *)secretKey - : (NSString *)qrCodeUri) { +- (void)openInOtpApp:(NSString *)appName + secretKey:(NSString *)secretKey + qrCodeUri:(NSString *)qrCodeUri { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"generateQrCodeUrl using secretKey: %@", secretKey); FIRTOTPSecret *totpSecret = cachedTotpSecrets[secretKey]; DLog(@"openInOtpApp using qrCodeUri: %@", qrCodeUri); [totpSecret openInOTPAppWithQRCodeURL:qrCodeUri]; } -RCT_EXPORT_METHOD(getSession - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getSession:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; [[user multiFactor] getSessionWithCompletion:^(FIRMultiFactorSession *_Nullable session, NSError *_Nullable error) { @@ -1069,11 +1149,12 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(unenrollMultiFactor - : (FIRApp *)firebaseApp - : (NSString *)factorUID - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)unenrollMultiFactor:(NSString *)appName + factorUID:(NSString *)factorUID + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"using instance unenrollMultiFactor: %@", firebaseApp.name); FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; @@ -1089,13 +1170,14 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(finalizeMultiFactorEnrollment - : (FIRApp *)firebaseApp - : (NSString *)verificationId - : (NSString *)verificationCode - : (NSString *_Nullable)displayName - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)finalizeMultiFactorEnrollment:(NSString *)appName + verificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode + displayName:(NSString *_Nullable)displayName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"using instance finalizeMultifactorEnrollment: %@", firebaseApp.name); FIRPhoneAuthCredential *credential = @@ -1118,13 +1200,14 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(finalizeTotpEnrollment - : (FIRApp *)firebaseApp - : (NSString *)totpSecret - : (NSString *)verificationCode - : (NSString *_Nullable)displayName - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)finalizeTotpEnrollment:(NSString *)appName + totpSecret:(NSString *)totpSecret + verificationCode:(NSString *)verificationCode + displayName:(NSString *_Nullable)displayName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"using instance finalizeTotpEnrollment: %@", firebaseApp.name); FIRTOTPSecret *cachedTotpSecret = cachedTotpSecrets[totpSecret]; @@ -1149,10 +1232,13 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(verifyPhoneNumber - : (FIRApp *)firebaseApp - : (NSString *)phoneNumber - : (NSString *)requestKey) { +- (void)verifyPhoneNumber:(NSString *)appName + phoneNumber:(NSString *)phoneNumber + requestKey:(NSString *)requestKey + timeout:(double)timeout + forceResend:(BOOL)forceResend { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + DLog(@"using instance verifyPhoneNumber: %@", firebaseApp.name); [[FIRPhoneAuthProvider providerWithAuth:[FIRAuth authWithApp:firebaseApp]] @@ -1184,11 +1270,12 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(confirmationResultConfirm - : (FIRApp *)firebaseApp - : (NSString *)verificationCode - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)confirmationResultConfirm:(NSString *)appName + verificationCode:(NSString *)verificationCode + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *verificationId = [defaults stringForKey:@"authVerificationID"]; @@ -1210,13 +1297,14 @@ - (void)invalidate { } #endif -RCT_EXPORT_METHOD(linkWithCredential - : (FIRApp *)firebaseApp - : (NSString *)provider - : (NSString *)authToken - : (NSString *)authSecret - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)linkWithCredential:(NSString *)appName + provider:(NSString *)provider + authToken:(NSString *)authToken + authSecret:(NSString *)authSecret + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRAuthCredential *credential = [self getCredentialForProvider:provider token:authToken secret:authSecret @@ -1246,11 +1334,12 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(linkWithProvider - : (FIRApp *)firebaseApp - : (NSDictionary *)provider - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)linkWithProvider:(NSString *)appName + provider:(NSDictionary *)provider + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSString *providerId = provider[@"providerId"]; if (providerId == nil) { [RNFBSharedUtils rejectPromiseWithUserInfo:reject @@ -1311,11 +1400,12 @@ - (void)invalidate { #endif } -RCT_EXPORT_METHOD(unlink - : (FIRApp *)firebaseApp - : (NSString *)providerId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)unlink:(NSString *)appName + providerId:(NSString *)providerId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRUser *user = [FIRAuth authWithApp:firebaseApp].currentUser; if (user) { @@ -1335,13 +1425,14 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(reauthenticateWithCredential - : (FIRApp *)firebaseApp - : (NSString *)provider - : (NSString *)authToken - : (NSString *)authSecret - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)reauthenticateWithCredential:(NSString *)appName + provider:(NSString *)provider + authToken:(NSString *)authToken + authSecret:(NSString *)authSecret + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRAuthCredential *credential = [self getCredentialForProvider:provider token:authToken secret:authSecret @@ -1375,11 +1466,12 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(reauthenticateWithProvider - : (FIRApp *)firebaseApp - : (NSDictionary *)provider - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)reauthenticateWithProvider:(NSString *)appName + provider:(NSDictionary *)provider + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSString *providerId = provider[@"providerId"]; if (providerId == nil) { [RNFBSharedUtils rejectPromiseWithUserInfo:reject @@ -1440,11 +1532,12 @@ - (void)invalidate { #endif } -RCT_EXPORT_METHOD(fetchSignInMethodsForEmail - : (FIRApp *)firebaseApp - : (NSString *)email - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)fetchSignInMethodsForEmail:(NSString *)appName + email:(NSString *)email + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] fetchSignInMethodsForEmail:email completion:^(NSArray *_Nullable providers, @@ -1460,7 +1553,9 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(setLanguageCode : (FIRApp *)firebaseApp : (NSString *)code) { +- (void)setLanguageCode:(NSString *)appName code:(NSString *)code { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + if (code) { [FIRAuth authWithApp:firebaseApp].languageCode = code; } else { @@ -1468,19 +1563,28 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(setTenantId : (FIRApp *)firebaseApp : (NSString *)tenantID) { - [FIRAuth authWithApp:firebaseApp].tenantID = tenantID; +- (void)setTenantId:(NSString *)appName + tenantId:(NSString *)tenantId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + + [FIRAuth authWithApp:firebaseApp].tenantID = tenantId; + resolve([NSNull null]); } -RCT_EXPORT_METHOD(useDeviceLanguage : (FIRApp *)firebaseApp) { +- (void)useDeviceLanguage:(NSString *)appName { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] useAppLanguage]; } -RCT_EXPORT_METHOD(verifyPasswordResetCode - : (FIRApp *)firebaseApp - : (NSString *)code - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)verifyPasswordResetCode:(NSString *)appName + code:(NSString *)code + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + [[FIRAuth authWithApp:firebaseApp] verifyPasswordResetCode:code completion:^(NSString *_Nullable email, NSError *_Nullable error) { @@ -1492,12 +1596,11 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(useEmulator - : (FIRApp *)firebaseApp - : (nonnull NSString *)host - : (NSInteger)port) { +- (void)useEmulator:(NSString *)appName host:(nonnull NSString *)host port:(double)port { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + if (!emulatorConfigs[firebaseApp.name]) { - [[FIRAuth authWithApp:firebaseApp] useEmulatorWithHost:host port:port]; + [[FIRAuth authWithApp:firebaseApp] useEmulatorWithHost:host port:(NSInteger)port]; emulatorConfigs[firebaseApp.name] = @YES; } } @@ -1806,7 +1909,15 @@ - (void)promiseWithAuthResult:(RCTPromiseResolveBlock)resolve return output; } -- (NSDictionary *)constantsToExport { +- (facebook::react::ModuleConstants)constantsToExport { + return [_RCTTypedModuleConstants newWithUnsafeDictionary:[self authConstantsDictionary]]; +} + +- (facebook::react::ModuleConstants)getConstants { + return [self constantsToExport]; +} + +- (NSDictionary *)authConstantsDictionary { NSDictionary *firebaseApps = [FIRApp allApps]; NSMutableDictionary *constants = [NSMutableDictionary new]; NSMutableDictionary *appLanguage = [NSMutableDictionary new]; diff --git a/packages/auth/ios/generated/RCTAppDependencyProvider.h b/packages/auth/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/auth/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/auth/ios/generated/RCTAppDependencyProvider.mm b/packages/auth/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/auth/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/auth/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/auth/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/auth/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/auth/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/auth/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/auth/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/auth/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/auth/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/auth/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/auth/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/auth/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/auth/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/auth/ios/generated/RNFBAuthTurboModules/RNFBAuthTurboModules-generated.mm b/packages/auth/ios/generated/RNFBAuthTurboModules/RNFBAuthTurboModules-generated.mm new file mode 100644 index 0000000000..3669361cc9 --- /dev/null +++ b/packages/auth/ios/generated/RNFBAuthTurboModules/RNFBAuthTurboModules-generated.mm @@ -0,0 +1,459 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBAuthTurboModules.h" + + +@implementation NativeRNFBTurboAuthSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_configureAuthDomain(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "configureAuthDomain", @selector(configureAuthDomain:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getCustomAuthDomain(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getCustomAuthDomain", @selector(getCustomAuthDomain:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_addAuthStateListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "addAuthStateListener", @selector(addAuthStateListener:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_removeAuthStateListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "removeAuthStateListener", @selector(removeAuthStateListener:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_addIdTokenListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "addIdTokenListener", @selector(addIdTokenListener:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_removeIdTokenListener(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "removeIdTokenListener", @selector(removeIdTokenListener:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_forceRecaptchaFlowForTesting(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "forceRecaptchaFlowForTesting", @selector(forceRecaptchaFlowForTesting:forceRecaptchaFlow:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_setAutoRetrievedSmsCodeForPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setAutoRetrievedSmsCodeForPhoneNumber", @selector(setAutoRetrievedSmsCodeForPhoneNumber:phoneNumber:smsCode:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_setAppVerificationDisabledForTesting(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setAppVerificationDisabledForTesting", @selector(setAppVerificationDisabledForTesting:disabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_useUserAccessGroup(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "useUserAccessGroup", @selector(useUserAccessGroup:userAccessGroup:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signOut(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signOut", @selector(signOut:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInAnonymously(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signInAnonymously", @selector(signInAnonymously:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_createUserWithEmailAndPassword(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "createUserWithEmailAndPassword", @selector(createUserWithEmailAndPassword:email:password:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_isSignInWithEmailLink(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, BooleanKind, "isSignInWithEmailLink", @selector(isSignInWithEmailLink:emailLink:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithEmailAndPassword(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signInWithEmailAndPassword", @selector(signInWithEmailAndPassword:email:password:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithEmailLink(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signInWithEmailLink", @selector(signInWithEmailLink:email:emailLink:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithCustomToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signInWithCustomToken", @selector(signInWithCustomToken:token:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_revokeToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "revokeToken", @selector(revokeToken:authorizationCode:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_sendPasswordResetEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "sendPasswordResetEmail", @selector(sendPasswordResetEmail:email:actionCodeSettings:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_sendSignInLinkToEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "sendSignInLinkToEmail", @selector(sendSignInLinkToEmail:email:actionCodeSettings:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_deleteUser(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "deleteUser", @selector(deleteUser:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_reload(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "reload", @selector(reload:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_sendEmailVerification(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "sendEmailVerification", @selector(sendEmailVerification:actionCodeSettings:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyBeforeUpdateEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "verifyBeforeUpdateEmail", @selector(verifyBeforeUpdateEmail:email:actionCodeSettings:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_updateEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "updateEmail", @selector(updateEmail:email:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_updatePassword(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "updatePassword", @selector(updatePassword:password:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_updatePhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "updatePhoneNumber", @selector(updatePhoneNumber:provider:authToken:authSecret:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_updateProfile(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "updateProfile", @selector(updateProfile:props:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getIdToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getIdToken", @selector(getIdToken:forceRefresh:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getIdTokenResult(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getIdTokenResult", @selector(getIdTokenResult:forceRefresh:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithCredential(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signInWithCredential", @selector(signInWithCredential:provider:authToken:authSecret:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithProvider(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signInWithProvider", @selector(signInWithProvider:provider:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "signInWithPhoneNumber", @selector(signInWithPhoneNumber:phoneNumber:forceResend:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumberWithMultiFactorInfo(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "verifyPhoneNumberWithMultiFactorInfo", @selector(verifyPhoneNumberWithMultiFactorInfo:hintUid:sessionKey:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumberForMultiFactor(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "verifyPhoneNumberForMultiFactor", @selector(verifyPhoneNumberForMultiFactor:phoneNumber:sessionKey:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_resolveMultiFactorSignIn(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "resolveMultiFactorSignIn", @selector(resolveMultiFactorSignIn:session:verificationId:verificationCode:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_resolveTotpSignIn(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "resolveTotpSignIn", @selector(resolveTotpSignIn:sessionKey:uid:oneTimePassword:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_generateTotpSecret(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "generateTotpSecret", @selector(generateTotpSecret:sessionKey:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_generateQrCodeUrl(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, StringKind, "generateQrCodeUrl", @selector(generateQrCodeUrl:secretKey:account:issuer:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_openInOtpApp(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "openInOtpApp", @selector(openInOtpApp:secretKey:qrCodeUri:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getSession(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getSession", @selector(getSession:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_unenrollMultiFactor(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "unenrollMultiFactor", @selector(unenrollMultiFactor:factorUID:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_finalizeMultiFactorEnrollment(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "finalizeMultiFactorEnrollment", @selector(finalizeMultiFactorEnrollment:verificationId:verificationCode:displayName:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_finalizeTotpEnrollment(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "finalizeTotpEnrollment", @selector(finalizeTotpEnrollment:totpSecret:verificationCode:displayName:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_confirmationResultConfirm(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "confirmationResultConfirm", @selector(confirmationResultConfirm:verificationCode:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "verifyPhoneNumber", @selector(verifyPhoneNumber:phoneNumber:requestKey:timeout:forceResend:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_confirmPasswordReset(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "confirmPasswordReset", @selector(confirmPasswordReset:code:newPassword:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_applyActionCode(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "applyActionCode", @selector(applyActionCode:code:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_checkActionCode(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "checkActionCode", @selector(checkActionCode:code:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_linkWithCredential(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "linkWithCredential", @selector(linkWithCredential:provider:authToken:authSecret:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_linkWithProvider(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "linkWithProvider", @selector(linkWithProvider:provider:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_unlink(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "unlink", @selector(unlink:providerId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_reauthenticateWithCredential(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "reauthenticateWithCredential", @selector(reauthenticateWithCredential:provider:authToken:authSecret:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_reauthenticateWithProvider(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "reauthenticateWithProvider", @selector(reauthenticateWithProvider:provider:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_fetchSignInMethodsForEmail(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "fetchSignInMethodsForEmail", @selector(fetchSignInMethodsForEmail:email:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_setLanguageCode(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setLanguageCode", @selector(setLanguageCode:code:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_setTenantId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setTenantId", @selector(setTenantId:tenantId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_useDeviceLanguage(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "useDeviceLanguage", @selector(useDeviceLanguage:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPasswordResetCode(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "verifyPasswordResetCode", @selector(verifyPasswordResetCode:code:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_useEmulator(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "useEmulator", @selector(useEmulator:host:port:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboAuthSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + NativeRNFBTurboAuthSpecJSI::NativeRNFBTurboAuthSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["configureAuthDomain"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_configureAuthDomain}; + + + methodMap_["getCustomAuthDomain"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_getCustomAuthDomain}; + + + methodMap_["addAuthStateListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_addAuthStateListener}; + + + methodMap_["removeAuthStateListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_removeAuthStateListener}; + + + methodMap_["addIdTokenListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_addIdTokenListener}; + + + methodMap_["removeIdTokenListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_removeIdTokenListener}; + + + methodMap_["forceRecaptchaFlowForTesting"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_forceRecaptchaFlowForTesting}; + + + methodMap_["setAutoRetrievedSmsCodeForPhoneNumber"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_setAutoRetrievedSmsCodeForPhoneNumber}; + + + methodMap_["setAppVerificationDisabledForTesting"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_setAppVerificationDisabledForTesting}; + + + methodMap_["useUserAccessGroup"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_useUserAccessGroup}; + + + methodMap_["signOut"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_signOut}; + + + methodMap_["signInAnonymously"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInAnonymously}; + + + methodMap_["createUserWithEmailAndPassword"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_createUserWithEmailAndPassword}; + + + methodMap_["isSignInWithEmailLink"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_isSignInWithEmailLink}; + + + methodMap_["signInWithEmailAndPassword"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithEmailAndPassword}; + + + methodMap_["signInWithEmailLink"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithEmailLink}; + + + methodMap_["signInWithCustomToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithCustomToken}; + + + methodMap_["revokeToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_revokeToken}; + + + methodMap_["sendPasswordResetEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_sendPasswordResetEmail}; + + + methodMap_["sendSignInLinkToEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_sendSignInLinkToEmail}; + + + methodMap_["deleteUser"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_deleteUser}; + + + methodMap_["reload"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_reload}; + + + methodMap_["sendEmailVerification"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_sendEmailVerification}; + + + methodMap_["verifyBeforeUpdateEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyBeforeUpdateEmail}; + + + methodMap_["updateEmail"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_updateEmail}; + + + methodMap_["updatePassword"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_updatePassword}; + + + methodMap_["updatePhoneNumber"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_updatePhoneNumber}; + + + methodMap_["updateProfile"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_updateProfile}; + + + methodMap_["getIdToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_getIdToken}; + + + methodMap_["getIdTokenResult"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_getIdTokenResult}; + + + methodMap_["signInWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithCredential}; + + + methodMap_["signInWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithProvider}; + + + methodMap_["signInWithPhoneNumber"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_signInWithPhoneNumber}; + + + methodMap_["verifyPhoneNumberWithMultiFactorInfo"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumberWithMultiFactorInfo}; + + + methodMap_["verifyPhoneNumberForMultiFactor"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumberForMultiFactor}; + + + methodMap_["resolveMultiFactorSignIn"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_resolveMultiFactorSignIn}; + + + methodMap_["resolveTotpSignIn"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_resolveTotpSignIn}; + + + methodMap_["generateTotpSecret"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_generateTotpSecret}; + + + methodMap_["generateQrCodeUrl"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_generateQrCodeUrl}; + + + methodMap_["openInOtpApp"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_openInOtpApp}; + + + methodMap_["getSession"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_getSession}; + + + methodMap_["unenrollMultiFactor"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_unenrollMultiFactor}; + + + methodMap_["finalizeMultiFactorEnrollment"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_finalizeMultiFactorEnrollment}; + + + methodMap_["finalizeTotpEnrollment"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_finalizeTotpEnrollment}; + + + methodMap_["confirmationResultConfirm"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_confirmationResultConfirm}; + + + methodMap_["verifyPhoneNumber"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPhoneNumber}; + + + methodMap_["confirmPasswordReset"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_confirmPasswordReset}; + + + methodMap_["applyActionCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_applyActionCode}; + + + methodMap_["checkActionCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_checkActionCode}; + + + methodMap_["linkWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_linkWithCredential}; + + + methodMap_["linkWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_linkWithProvider}; + + + methodMap_["unlink"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_unlink}; + + + methodMap_["reauthenticateWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthSpecJSI_reauthenticateWithCredential}; + + + methodMap_["reauthenticateWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_reauthenticateWithProvider}; + + + methodMap_["fetchSignInMethodsForEmail"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_fetchSignInMethodsForEmail}; + + + methodMap_["setLanguageCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_setLanguageCode}; + + + methodMap_["setTenantId"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_setTenantId}; + + + methodMap_["useDeviceLanguage"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthSpecJSI_useDeviceLanguage}; + + + methodMap_["verifyPasswordResetCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthSpecJSI_verifyPasswordResetCode}; + + + methodMap_["useEmulator"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthSpecJSI_useEmulator}; + + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAuthSpecJSI_getConstants}; + + } +} // namespace facebook::react diff --git a/packages/auth/ios/generated/RNFBAuthTurboModules/RNFBAuthTurboModules.h b/packages/auth/ios/generated/RNFBAuthTurboModules/RNFBAuthTurboModules.h new file mode 100644 index 0000000000..19047bf239 --- /dev/null +++ b/packages/auth/ios/generated/RNFBAuthTurboModules/RNFBAuthTurboModules.h @@ -0,0 +1,338 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBAuthTurboModules symbols +#ifndef RNFBAuthTurboModules_H +#define RNFBAuthTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN +namespace JS { + namespace NativeRNFBTurboAuth { + struct Constants { + + struct Builder { + struct Input { + RCTRequired> APP_LANGUAGE; + RCTRequired> APP_USER; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeRNFBTurboAuthSpec + +- (void)configureAuthDomain:(NSString *)appName; +- (void)getCustomAuthDomain:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)addAuthStateListener:(NSString *)appName; +- (void)removeAuthStateListener:(NSString *)appName; +- (void)addIdTokenListener:(NSString *)appName; +- (void)removeIdTokenListener:(NSString *)appName; +- (void)forceRecaptchaFlowForTesting:(NSString *)appName + forceRecaptchaFlow:(BOOL)forceRecaptchaFlow + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setAutoRetrievedSmsCodeForPhoneNumber:(NSString *)appName + phoneNumber:(NSString *)phoneNumber + smsCode:(NSString *)smsCode + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setAppVerificationDisabledForTesting:(NSString *)appName + disabled:(BOOL)disabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)useUserAccessGroup:(NSString *)appName + userAccessGroup:(NSString *)userAccessGroup + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signOut:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signInAnonymously:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)createUserWithEmailAndPassword:(NSString *)appName + email:(NSString *)email + password:(NSString *)password + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (NSNumber *)isSignInWithEmailLink:(NSString *)appName + emailLink:(NSString *)emailLink; +- (void)signInWithEmailAndPassword:(NSString *)appName + email:(NSString *)email + password:(NSString *)password + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signInWithEmailLink:(NSString *)appName + email:(NSString *)email + emailLink:(NSString *)emailLink + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signInWithCustomToken:(NSString *)appName + token:(NSString *)token + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)revokeToken:(NSString *)appName + authorizationCode:(NSString *)authorizationCode + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)sendPasswordResetEmail:(NSString *)appName + email:(NSString *)email + actionCodeSettings:(NSDictionary * _Nullable)actionCodeSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)sendSignInLinkToEmail:(NSString *)appName + email:(NSString *)email + actionCodeSettings:(NSDictionary *)actionCodeSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)deleteUser:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)reload:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)sendEmailVerification:(NSString *)appName + actionCodeSettings:(NSDictionary * _Nullable)actionCodeSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)verifyBeforeUpdateEmail:(NSString *)appName + email:(NSString *)email + actionCodeSettings:(NSDictionary * _Nullable)actionCodeSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)updateEmail:(NSString *)appName + email:(NSString *)email + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)updatePassword:(NSString *)appName + password:(NSString *)password + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)updatePhoneNumber:(NSString *)appName + provider:(NSString *)provider + authToken:(NSString *)authToken + authSecret:(NSString *)authSecret + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)updateProfile:(NSString *)appName + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getIdToken:(NSString *)appName + forceRefresh:(BOOL)forceRefresh + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getIdTokenResult:(NSString *)appName + forceRefresh:(BOOL)forceRefresh + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signInWithCredential:(NSString *)appName + provider:(NSString *)provider + authToken:(NSString *)authToken + authSecret:(NSString *)authSecret + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signInWithProvider:(NSString *)appName + provider:(NSDictionary *)provider + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signInWithPhoneNumber:(NSString *)appName + phoneNumber:(NSString *)phoneNumber + forceResend:(BOOL)forceResend + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)verifyPhoneNumberWithMultiFactorInfo:(NSString *)appName + hintUid:(NSString *)hintUid + sessionKey:(NSString *)sessionKey + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)verifyPhoneNumberForMultiFactor:(NSString *)appName + phoneNumber:(NSString *)phoneNumber + sessionKey:(NSString *)sessionKey + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)resolveMultiFactorSignIn:(NSString *)appName + session:(NSString *)session + verificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)resolveTotpSignIn:(NSString *)appName + sessionKey:(NSString *)sessionKey + uid:(NSString *)uid + oneTimePassword:(NSString *)oneTimePassword + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)generateTotpSecret:(NSString *)appName + sessionKey:(NSString *)sessionKey + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (NSString *)generateQrCodeUrl:(NSString *)appName + secretKey:(NSString *)secretKey + account:(NSString *)account + issuer:(NSString *)issuer; +- (void)openInOtpApp:(NSString *)appName + secretKey:(NSString *)secretKey + qrCodeUri:(NSString *)qrCodeUri; +- (void)getSession:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)unenrollMultiFactor:(NSString *)appName + factorUID:(NSString *)factorUID + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)finalizeMultiFactorEnrollment:(NSString *)appName + verificationId:(NSString *)verificationId + verificationCode:(NSString *)verificationCode + displayName:(NSString * _Nullable)displayName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)finalizeTotpEnrollment:(NSString *)appName + totpSecret:(NSString *)totpSecret + verificationCode:(NSString *)verificationCode + displayName:(NSString * _Nullable)displayName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)confirmationResultConfirm:(NSString *)appName + verificationCode:(NSString *)verificationCode + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)verifyPhoneNumber:(NSString *)appName + phoneNumber:(NSString *)phoneNumber + requestKey:(NSString *)requestKey + timeout:(double)timeout + forceResend:(BOOL)forceResend; +- (void)confirmPasswordReset:(NSString *)appName + code:(NSString *)code + newPassword:(NSString *)newPassword + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)applyActionCode:(NSString *)appName + code:(NSString *)code + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)checkActionCode:(NSString *)appName + code:(NSString *)code + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)linkWithCredential:(NSString *)appName + provider:(NSString *)provider + authToken:(NSString *)authToken + authSecret:(NSString *)authSecret + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)linkWithProvider:(NSString *)appName + provider:(NSDictionary *)provider + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)unlink:(NSString *)appName + providerId:(NSString *)providerId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)reauthenticateWithCredential:(NSString *)appName + provider:(NSString *)provider + authToken:(NSString *)authToken + authSecret:(NSString *)authSecret + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)reauthenticateWithProvider:(NSString *)appName + provider:(NSDictionary *)provider + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)fetchSignInMethodsForEmail:(NSString *)appName + email:(NSString *)email + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setLanguageCode:(NSString *)appName + code:(NSString * _Nullable)code; +- (void)setTenantId:(NSString *)appName + tenantId:(NSString * _Nullable)tenantId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)useDeviceLanguage:(NSString *)appName; +- (void)verifyPasswordResetCode:(NSString *)appName + code:(NSString *)code + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)useEmulator:(NSString *)appName + host:(NSString *)host + port:(double)port; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end + +@interface NativeRNFBTurboAuthSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboAuth' + */ + class JSI_EXPORT NativeRNFBTurboAuthSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboAuthSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +inline JS::NativeRNFBTurboAuth::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto APP_LANGUAGE = i.APP_LANGUAGE.get(); + d[@"APP_LANGUAGE"] = APP_LANGUAGE; + auto APP_USER = i.APP_USER.get(); + d[@"APP_USER"] = APP_USER; + return d; +}) {} +inline JS::NativeRNFBTurboAuth::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +NS_ASSUME_NONNULL_END +#endif // RNFBAuthTurboModules_H diff --git a/packages/auth/ios/generated/RNFBAuthTurboModulesJSI-generated.cpp b/packages/auth/ios/generated/RNFBAuthTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..806538eb38 --- /dev/null +++ b/packages/auth/ios/generated/RNFBAuthTurboModulesJSI-generated.cpp @@ -0,0 +1,538 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBAuthTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_configureAuthDomain(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->configureAuthDomain( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getCustomAuthDomain(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getCustomAuthDomain( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_addAuthStateListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addAuthStateListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_removeAuthStateListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeAuthStateListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_addIdTokenListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addIdTokenListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_removeIdTokenListener(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeIdTokenListener( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_forceRecaptchaFlowForTesting(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->forceRecaptchaFlowForTesting( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setAutoRetrievedSmsCodeForPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAutoRetrievedSmsCodeForPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setAppVerificationDisabledForTesting(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAppVerificationDisabledForTesting( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useUserAccessGroup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->useUserAccessGroup( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signOut(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signOut( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInAnonymously(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInAnonymously( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_createUserWithEmailAndPassword(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->createUserWithEmailAndPassword( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_isSignInWithEmailLink(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->isSignInWithEmailLink( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithEmailAndPassword(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithEmailAndPassword( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithEmailLink(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithEmailLink( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithCustomToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithCustomToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_revokeToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->revokeToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendPasswordResetEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->sendPasswordResetEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 || args[2].isNull() || args[2].isUndefined() ? std::nullopt : std::make_optional(args[2].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendSignInLinkToEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->sendSignInLinkToEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_deleteUser(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteUser( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reload(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->reload( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendEmailVerification(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->sendEmailVerification( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyBeforeUpdateEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->verifyBeforeUpdateEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 || args[2].isNull() || args[2].isUndefined() ? std::nullopt : std::make_optional(args[2].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updateEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updateEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updatePassword(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updatePassword( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updatePhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updatePhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updateProfile(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updateProfile( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getIdToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getIdToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getIdTokenResult(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getIdTokenResult( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithCredential(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithCredential( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithProvider(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithProvider( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->signInWithPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumberWithMultiFactorInfo(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->verifyPhoneNumberWithMultiFactorInfo( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumberForMultiFactor(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->verifyPhoneNumberForMultiFactor( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_resolveMultiFactorSignIn(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->resolveMultiFactorSignIn( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_resolveTotpSignIn(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->resolveTotpSignIn( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_generateTotpSecret(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->generateTotpSecret( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_generateQrCodeUrl(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->generateQrCodeUrl( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_openInOtpApp(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->openInOtpApp( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getSession(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getSession( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_unenrollMultiFactor(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->unenrollMultiFactor( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_finalizeMultiFactorEnrollment(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->finalizeMultiFactorEnrollment( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 || args[3].isNull() || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_finalizeTotpEnrollment(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->finalizeTotpEnrollment( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 || args[3].isNull() || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_confirmationResultConfirm(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->confirmationResultConfirm( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->verifyPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_confirmPasswordReset(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->confirmPasswordReset( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_applyActionCode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->applyActionCode( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_checkActionCode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->checkActionCode( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_linkWithCredential(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->linkWithCredential( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_linkWithProvider(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->linkWithProvider( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_unlink(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->unlink( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reauthenticateWithCredential(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->reauthenticateWithCredential( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reauthenticateWithProvider(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->reauthenticateWithProvider( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_fetchSignInMethodsForEmail(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->fetchSignInMethodsForEmail( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setLanguageCode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setLanguageCode( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asString(rt)) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setTenantId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setTenantId( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isNull() || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useDeviceLanguage(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useDeviceLanguage( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPasswordResetCode(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->verifyPasswordResetCode( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useEmulator(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useEmulator( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboAuthCxxSpecJSI::NativeRNFBTurboAuthCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboAuth", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getConstants}; + methodMap_["configureAuthDomain"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_configureAuthDomain}; + methodMap_["getCustomAuthDomain"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getCustomAuthDomain}; + methodMap_["addAuthStateListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_addAuthStateListener}; + methodMap_["removeAuthStateListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_removeAuthStateListener}; + methodMap_["addIdTokenListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_addIdTokenListener}; + methodMap_["removeIdTokenListener"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_removeIdTokenListener}; + methodMap_["forceRecaptchaFlowForTesting"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_forceRecaptchaFlowForTesting}; + methodMap_["setAutoRetrievedSmsCodeForPhoneNumber"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setAutoRetrievedSmsCodeForPhoneNumber}; + methodMap_["setAppVerificationDisabledForTesting"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setAppVerificationDisabledForTesting}; + methodMap_["useUserAccessGroup"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useUserAccessGroup}; + methodMap_["signOut"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signOut}; + methodMap_["signInAnonymously"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInAnonymously}; + methodMap_["createUserWithEmailAndPassword"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_createUserWithEmailAndPassword}; + methodMap_["isSignInWithEmailLink"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_isSignInWithEmailLink}; + methodMap_["signInWithEmailAndPassword"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithEmailAndPassword}; + methodMap_["signInWithEmailLink"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithEmailLink}; + methodMap_["signInWithCustomToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithCustomToken}; + methodMap_["revokeToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_revokeToken}; + methodMap_["sendPasswordResetEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendPasswordResetEmail}; + methodMap_["sendSignInLinkToEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendSignInLinkToEmail}; + methodMap_["deleteUser"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_deleteUser}; + methodMap_["reload"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reload}; + methodMap_["sendEmailVerification"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_sendEmailVerification}; + methodMap_["verifyBeforeUpdateEmail"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyBeforeUpdateEmail}; + methodMap_["updateEmail"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updateEmail}; + methodMap_["updatePassword"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updatePassword}; + methodMap_["updatePhoneNumber"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updatePhoneNumber}; + methodMap_["updateProfile"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_updateProfile}; + methodMap_["getIdToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getIdToken}; + methodMap_["getIdTokenResult"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getIdTokenResult}; + methodMap_["signInWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithCredential}; + methodMap_["signInWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithProvider}; + methodMap_["signInWithPhoneNumber"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_signInWithPhoneNumber}; + methodMap_["verifyPhoneNumberWithMultiFactorInfo"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumberWithMultiFactorInfo}; + methodMap_["verifyPhoneNumberForMultiFactor"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumberForMultiFactor}; + methodMap_["resolveMultiFactorSignIn"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_resolveMultiFactorSignIn}; + methodMap_["resolveTotpSignIn"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_resolveTotpSignIn}; + methodMap_["generateTotpSecret"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_generateTotpSecret}; + methodMap_["generateQrCodeUrl"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_generateQrCodeUrl}; + methodMap_["openInOtpApp"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_openInOtpApp}; + methodMap_["getSession"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_getSession}; + methodMap_["unenrollMultiFactor"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_unenrollMultiFactor}; + methodMap_["finalizeMultiFactorEnrollment"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_finalizeMultiFactorEnrollment}; + methodMap_["finalizeTotpEnrollment"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_finalizeTotpEnrollment}; + methodMap_["confirmationResultConfirm"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_confirmationResultConfirm}; + methodMap_["verifyPhoneNumber"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPhoneNumber}; + methodMap_["confirmPasswordReset"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_confirmPasswordReset}; + methodMap_["applyActionCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_applyActionCode}; + methodMap_["checkActionCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_checkActionCode}; + methodMap_["linkWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_linkWithCredential}; + methodMap_["linkWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_linkWithProvider}; + methodMap_["unlink"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_unlink}; + methodMap_["reauthenticateWithCredential"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reauthenticateWithCredential}; + methodMap_["reauthenticateWithProvider"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_reauthenticateWithProvider}; + methodMap_["fetchSignInMethodsForEmail"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_fetchSignInMethodsForEmail}; + methodMap_["setLanguageCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setLanguageCode}; + methodMap_["setTenantId"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_setTenantId}; + methodMap_["useDeviceLanguage"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useDeviceLanguage}; + methodMap_["verifyPasswordResetCode"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_verifyPasswordResetCode}; + methodMap_["useEmulator"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboAuthCxxSpecJSI_useEmulator}; +} + + +} // namespace facebook::react diff --git a/packages/auth/ios/generated/RNFBAuthTurboModulesJSI.h b/packages/auth/ios/generated/RNFBAuthTurboModulesJSI.h new file mode 100644 index 0000000000..9cfa98662d --- /dev/null +++ b/packages/auth/ios/generated/RNFBAuthTurboModulesJSI.h @@ -0,0 +1,611 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboAuthCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboAuthCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual void configureAuthDomain(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value getCustomAuthDomain(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void addAuthStateListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void removeAuthStateListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void addIdTokenListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void removeIdTokenListener(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value forceRecaptchaFlowForTesting(jsi::Runtime &rt, jsi::String appName, bool forceRecaptchaFlow) = 0; + virtual jsi::Value setAutoRetrievedSmsCodeForPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String smsCode) = 0; + virtual jsi::Value setAppVerificationDisabledForTesting(jsi::Runtime &rt, jsi::String appName, bool disabled) = 0; + virtual jsi::Value useUserAccessGroup(jsi::Runtime &rt, jsi::String appName, jsi::String userAccessGroup) = 0; + virtual jsi::Value signOut(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value signInAnonymously(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value createUserWithEmailAndPassword(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String password) = 0; + virtual bool isSignInWithEmailLink(jsi::Runtime &rt, jsi::String appName, jsi::String emailLink) = 0; + virtual jsi::Value signInWithEmailAndPassword(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String password) = 0; + virtual jsi::Value signInWithEmailLink(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String emailLink) = 0; + virtual jsi::Value signInWithCustomToken(jsi::Runtime &rt, jsi::String appName, jsi::String token) = 0; + virtual jsi::Value revokeToken(jsi::Runtime &rt, jsi::String appName, jsi::String authorizationCode) = 0; + virtual jsi::Value sendPasswordResetEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, std::optional actionCodeSettings) = 0; + virtual jsi::Value sendSignInLinkToEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::Object actionCodeSettings) = 0; + virtual jsi::Value deleteUser(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value reload(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value sendEmailVerification(jsi::Runtime &rt, jsi::String appName, std::optional actionCodeSettings) = 0; + virtual jsi::Value verifyBeforeUpdateEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, std::optional actionCodeSettings) = 0; + virtual jsi::Value updateEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email) = 0; + virtual jsi::Value updatePassword(jsi::Runtime &rt, jsi::String appName, jsi::String password) = 0; + virtual jsi::Value updatePhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) = 0; + virtual jsi::Value updateProfile(jsi::Runtime &rt, jsi::String appName, jsi::Object props) = 0; + virtual jsi::Value getIdToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) = 0; + virtual jsi::Value getIdTokenResult(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) = 0; + virtual jsi::Value signInWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) = 0; + virtual jsi::Value signInWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) = 0; + virtual jsi::Value signInWithPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, bool forceResend) = 0; + virtual jsi::Value verifyPhoneNumberWithMultiFactorInfo(jsi::Runtime &rt, jsi::String appName, jsi::String hintUid, jsi::String sessionKey) = 0; + virtual jsi::Value verifyPhoneNumberForMultiFactor(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String sessionKey) = 0; + virtual jsi::Value resolveMultiFactorSignIn(jsi::Runtime &rt, jsi::String appName, jsi::String session, jsi::String verificationId, jsi::String verificationCode) = 0; + virtual jsi::Value resolveTotpSignIn(jsi::Runtime &rt, jsi::String appName, jsi::String sessionKey, jsi::String uid, jsi::String oneTimePassword) = 0; + virtual jsi::Value generateTotpSecret(jsi::Runtime &rt, jsi::String appName, jsi::String sessionKey) = 0; + virtual jsi::String generateQrCodeUrl(jsi::Runtime &rt, jsi::String appName, jsi::String secretKey, jsi::String account, jsi::String issuer) = 0; + virtual void openInOtpApp(jsi::Runtime &rt, jsi::String appName, jsi::String secretKey, jsi::String qrCodeUri) = 0; + virtual jsi::Value getSession(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value unenrollMultiFactor(jsi::Runtime &rt, jsi::String appName, jsi::String factorUID) = 0; + virtual jsi::Value finalizeMultiFactorEnrollment(jsi::Runtime &rt, jsi::String appName, jsi::String verificationId, jsi::String verificationCode, std::optional displayName) = 0; + virtual jsi::Value finalizeTotpEnrollment(jsi::Runtime &rt, jsi::String appName, jsi::String totpSecret, jsi::String verificationCode, std::optional displayName) = 0; + virtual jsi::Value confirmationResultConfirm(jsi::Runtime &rt, jsi::String appName, jsi::String verificationCode) = 0; + virtual void verifyPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String requestKey, double timeout, bool forceResend) = 0; + virtual jsi::Value confirmPasswordReset(jsi::Runtime &rt, jsi::String appName, jsi::String code, jsi::String newPassword) = 0; + virtual jsi::Value applyActionCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) = 0; + virtual jsi::Value checkActionCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) = 0; + virtual jsi::Value linkWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) = 0; + virtual jsi::Value linkWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) = 0; + virtual jsi::Value unlink(jsi::Runtime &rt, jsi::String appName, jsi::String providerId) = 0; + virtual jsi::Value reauthenticateWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) = 0; + virtual jsi::Value reauthenticateWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) = 0; + virtual jsi::Value fetchSignInMethodsForEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email) = 0; + virtual void setLanguageCode(jsi::Runtime &rt, jsi::String appName, std::optional code) = 0; + virtual jsi::Value setTenantId(jsi::Runtime &rt, jsi::String appName, std::optional tenantId) = 0; + virtual void useDeviceLanguage(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value verifyPasswordResetCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) = 0; + virtual void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String host, double port) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboAuthCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboAuth"; + +protected: + NativeRNFBTurboAuthCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboAuthCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboAuthCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboAuthCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + void configureAuthDomain(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::configureAuthDomain) == 2, + "Expected configureAuthDomain(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::configureAuthDomain, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value getCustomAuthDomain(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::getCustomAuthDomain) == 2, + "Expected getCustomAuthDomain(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getCustomAuthDomain, jsInvoker_, instance_, std::move(appName)); + } + void addAuthStateListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::addAuthStateListener) == 2, + "Expected addAuthStateListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::addAuthStateListener, jsInvoker_, instance_, std::move(appName)); + } + void removeAuthStateListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::removeAuthStateListener) == 2, + "Expected removeAuthStateListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeAuthStateListener, jsInvoker_, instance_, std::move(appName)); + } + void addIdTokenListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::addIdTokenListener) == 2, + "Expected addIdTokenListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::addIdTokenListener, jsInvoker_, instance_, std::move(appName)); + } + void removeIdTokenListener(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::removeIdTokenListener) == 2, + "Expected removeIdTokenListener(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeIdTokenListener, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value forceRecaptchaFlowForTesting(jsi::Runtime &rt, jsi::String appName, bool forceRecaptchaFlow) override { + static_assert( + bridging::getParameterCount(&T::forceRecaptchaFlowForTesting) == 3, + "Expected forceRecaptchaFlowForTesting(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::forceRecaptchaFlowForTesting, jsInvoker_, instance_, std::move(appName), std::move(forceRecaptchaFlow)); + } + jsi::Value setAutoRetrievedSmsCodeForPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String smsCode) override { + static_assert( + bridging::getParameterCount(&T::setAutoRetrievedSmsCodeForPhoneNumber) == 4, + "Expected setAutoRetrievedSmsCodeForPhoneNumber(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setAutoRetrievedSmsCodeForPhoneNumber, jsInvoker_, instance_, std::move(appName), std::move(phoneNumber), std::move(smsCode)); + } + jsi::Value setAppVerificationDisabledForTesting(jsi::Runtime &rt, jsi::String appName, bool disabled) override { + static_assert( + bridging::getParameterCount(&T::setAppVerificationDisabledForTesting) == 3, + "Expected setAppVerificationDisabledForTesting(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setAppVerificationDisabledForTesting, jsInvoker_, instance_, std::move(appName), std::move(disabled)); + } + jsi::Value useUserAccessGroup(jsi::Runtime &rt, jsi::String appName, jsi::String userAccessGroup) override { + static_assert( + bridging::getParameterCount(&T::useUserAccessGroup) == 3, + "Expected useUserAccessGroup(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::useUserAccessGroup, jsInvoker_, instance_, std::move(appName), std::move(userAccessGroup)); + } + jsi::Value signOut(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::signOut) == 2, + "Expected signOut(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::signOut, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value signInAnonymously(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::signInAnonymously) == 2, + "Expected signInAnonymously(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::signInAnonymously, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value createUserWithEmailAndPassword(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String password) override { + static_assert( + bridging::getParameterCount(&T::createUserWithEmailAndPassword) == 4, + "Expected createUserWithEmailAndPassword(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::createUserWithEmailAndPassword, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(password)); + } + bool isSignInWithEmailLink(jsi::Runtime &rt, jsi::String appName, jsi::String emailLink) override { + static_assert( + bridging::getParameterCount(&T::isSignInWithEmailLink) == 3, + "Expected isSignInWithEmailLink(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::isSignInWithEmailLink, jsInvoker_, instance_, std::move(appName), std::move(emailLink)); + } + jsi::Value signInWithEmailAndPassword(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String password) override { + static_assert( + bridging::getParameterCount(&T::signInWithEmailAndPassword) == 4, + "Expected signInWithEmailAndPassword(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithEmailAndPassword, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(password)); + } + jsi::Value signInWithEmailLink(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::String emailLink) override { + static_assert( + bridging::getParameterCount(&T::signInWithEmailLink) == 4, + "Expected signInWithEmailLink(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithEmailLink, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(emailLink)); + } + jsi::Value signInWithCustomToken(jsi::Runtime &rt, jsi::String appName, jsi::String token) override { + static_assert( + bridging::getParameterCount(&T::signInWithCustomToken) == 3, + "Expected signInWithCustomToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithCustomToken, jsInvoker_, instance_, std::move(appName), std::move(token)); + } + jsi::Value revokeToken(jsi::Runtime &rt, jsi::String appName, jsi::String authorizationCode) override { + static_assert( + bridging::getParameterCount(&T::revokeToken) == 3, + "Expected revokeToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::revokeToken, jsInvoker_, instance_, std::move(appName), std::move(authorizationCode)); + } + jsi::Value sendPasswordResetEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, std::optional actionCodeSettings) override { + static_assert( + bridging::getParameterCount(&T::sendPasswordResetEmail) == 4, + "Expected sendPasswordResetEmail(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::sendPasswordResetEmail, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(actionCodeSettings)); + } + jsi::Value sendSignInLinkToEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, jsi::Object actionCodeSettings) override { + static_assert( + bridging::getParameterCount(&T::sendSignInLinkToEmail) == 4, + "Expected sendSignInLinkToEmail(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::sendSignInLinkToEmail, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(actionCodeSettings)); + } + jsi::Value deleteUser(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::deleteUser) == 2, + "Expected deleteUser(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::deleteUser, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value reload(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::reload) == 2, + "Expected reload(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::reload, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value sendEmailVerification(jsi::Runtime &rt, jsi::String appName, std::optional actionCodeSettings) override { + static_assert( + bridging::getParameterCount(&T::sendEmailVerification) == 3, + "Expected sendEmailVerification(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::sendEmailVerification, jsInvoker_, instance_, std::move(appName), std::move(actionCodeSettings)); + } + jsi::Value verifyBeforeUpdateEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email, std::optional actionCodeSettings) override { + static_assert( + bridging::getParameterCount(&T::verifyBeforeUpdateEmail) == 4, + "Expected verifyBeforeUpdateEmail(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::verifyBeforeUpdateEmail, jsInvoker_, instance_, std::move(appName), std::move(email), std::move(actionCodeSettings)); + } + jsi::Value updateEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email) override { + static_assert( + bridging::getParameterCount(&T::updateEmail) == 3, + "Expected updateEmail(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::updateEmail, jsInvoker_, instance_, std::move(appName), std::move(email)); + } + jsi::Value updatePassword(jsi::Runtime &rt, jsi::String appName, jsi::String password) override { + static_assert( + bridging::getParameterCount(&T::updatePassword) == 3, + "Expected updatePassword(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::updatePassword, jsInvoker_, instance_, std::move(appName), std::move(password)); + } + jsi::Value updatePhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) override { + static_assert( + bridging::getParameterCount(&T::updatePhoneNumber) == 5, + "Expected updatePhoneNumber(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::updatePhoneNumber, jsInvoker_, instance_, std::move(appName), std::move(provider), std::move(authToken), std::move(authSecret)); + } + jsi::Value updateProfile(jsi::Runtime &rt, jsi::String appName, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::updateProfile) == 3, + "Expected updateProfile(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::updateProfile, jsInvoker_, instance_, std::move(appName), std::move(props)); + } + jsi::Value getIdToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) override { + static_assert( + bridging::getParameterCount(&T::getIdToken) == 3, + "Expected getIdToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getIdToken, jsInvoker_, instance_, std::move(appName), std::move(forceRefresh)); + } + jsi::Value getIdTokenResult(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) override { + static_assert( + bridging::getParameterCount(&T::getIdTokenResult) == 3, + "Expected getIdTokenResult(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getIdTokenResult, jsInvoker_, instance_, std::move(appName), std::move(forceRefresh)); + } + jsi::Value signInWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) override { + static_assert( + bridging::getParameterCount(&T::signInWithCredential) == 5, + "Expected signInWithCredential(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithCredential, jsInvoker_, instance_, std::move(appName), std::move(provider), std::move(authToken), std::move(authSecret)); + } + jsi::Value signInWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) override { + static_assert( + bridging::getParameterCount(&T::signInWithProvider) == 3, + "Expected signInWithProvider(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithProvider, jsInvoker_, instance_, std::move(appName), std::move(provider)); + } + jsi::Value signInWithPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, bool forceResend) override { + static_assert( + bridging::getParameterCount(&T::signInWithPhoneNumber) == 4, + "Expected signInWithPhoneNumber(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::signInWithPhoneNumber, jsInvoker_, instance_, std::move(appName), std::move(phoneNumber), std::move(forceResend)); + } + jsi::Value verifyPhoneNumberWithMultiFactorInfo(jsi::Runtime &rt, jsi::String appName, jsi::String hintUid, jsi::String sessionKey) override { + static_assert( + bridging::getParameterCount(&T::verifyPhoneNumberWithMultiFactorInfo) == 4, + "Expected verifyPhoneNumberWithMultiFactorInfo(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::verifyPhoneNumberWithMultiFactorInfo, jsInvoker_, instance_, std::move(appName), std::move(hintUid), std::move(sessionKey)); + } + jsi::Value verifyPhoneNumberForMultiFactor(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String sessionKey) override { + static_assert( + bridging::getParameterCount(&T::verifyPhoneNumberForMultiFactor) == 4, + "Expected verifyPhoneNumberForMultiFactor(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::verifyPhoneNumberForMultiFactor, jsInvoker_, instance_, std::move(appName), std::move(phoneNumber), std::move(sessionKey)); + } + jsi::Value resolveMultiFactorSignIn(jsi::Runtime &rt, jsi::String appName, jsi::String session, jsi::String verificationId, jsi::String verificationCode) override { + static_assert( + bridging::getParameterCount(&T::resolveMultiFactorSignIn) == 5, + "Expected resolveMultiFactorSignIn(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::resolveMultiFactorSignIn, jsInvoker_, instance_, std::move(appName), std::move(session), std::move(verificationId), std::move(verificationCode)); + } + jsi::Value resolveTotpSignIn(jsi::Runtime &rt, jsi::String appName, jsi::String sessionKey, jsi::String uid, jsi::String oneTimePassword) override { + static_assert( + bridging::getParameterCount(&T::resolveTotpSignIn) == 5, + "Expected resolveTotpSignIn(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::resolveTotpSignIn, jsInvoker_, instance_, std::move(appName), std::move(sessionKey), std::move(uid), std::move(oneTimePassword)); + } + jsi::Value generateTotpSecret(jsi::Runtime &rt, jsi::String appName, jsi::String sessionKey) override { + static_assert( + bridging::getParameterCount(&T::generateTotpSecret) == 3, + "Expected generateTotpSecret(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::generateTotpSecret, jsInvoker_, instance_, std::move(appName), std::move(sessionKey)); + } + jsi::String generateQrCodeUrl(jsi::Runtime &rt, jsi::String appName, jsi::String secretKey, jsi::String account, jsi::String issuer) override { + static_assert( + bridging::getParameterCount(&T::generateQrCodeUrl) == 5, + "Expected generateQrCodeUrl(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::generateQrCodeUrl, jsInvoker_, instance_, std::move(appName), std::move(secretKey), std::move(account), std::move(issuer)); + } + void openInOtpApp(jsi::Runtime &rt, jsi::String appName, jsi::String secretKey, jsi::String qrCodeUri) override { + static_assert( + bridging::getParameterCount(&T::openInOtpApp) == 4, + "Expected openInOtpApp(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::openInOtpApp, jsInvoker_, instance_, std::move(appName), std::move(secretKey), std::move(qrCodeUri)); + } + jsi::Value getSession(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::getSession) == 2, + "Expected getSession(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getSession, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value unenrollMultiFactor(jsi::Runtime &rt, jsi::String appName, jsi::String factorUID) override { + static_assert( + bridging::getParameterCount(&T::unenrollMultiFactor) == 3, + "Expected unenrollMultiFactor(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::unenrollMultiFactor, jsInvoker_, instance_, std::move(appName), std::move(factorUID)); + } + jsi::Value finalizeMultiFactorEnrollment(jsi::Runtime &rt, jsi::String appName, jsi::String verificationId, jsi::String verificationCode, std::optional displayName) override { + static_assert( + bridging::getParameterCount(&T::finalizeMultiFactorEnrollment) == 5, + "Expected finalizeMultiFactorEnrollment(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::finalizeMultiFactorEnrollment, jsInvoker_, instance_, std::move(appName), std::move(verificationId), std::move(verificationCode), std::move(displayName)); + } + jsi::Value finalizeTotpEnrollment(jsi::Runtime &rt, jsi::String appName, jsi::String totpSecret, jsi::String verificationCode, std::optional displayName) override { + static_assert( + bridging::getParameterCount(&T::finalizeTotpEnrollment) == 5, + "Expected finalizeTotpEnrollment(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::finalizeTotpEnrollment, jsInvoker_, instance_, std::move(appName), std::move(totpSecret), std::move(verificationCode), std::move(displayName)); + } + jsi::Value confirmationResultConfirm(jsi::Runtime &rt, jsi::String appName, jsi::String verificationCode) override { + static_assert( + bridging::getParameterCount(&T::confirmationResultConfirm) == 3, + "Expected confirmationResultConfirm(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::confirmationResultConfirm, jsInvoker_, instance_, std::move(appName), std::move(verificationCode)); + } + void verifyPhoneNumber(jsi::Runtime &rt, jsi::String appName, jsi::String phoneNumber, jsi::String requestKey, double timeout, bool forceResend) override { + static_assert( + bridging::getParameterCount(&T::verifyPhoneNumber) == 6, + "Expected verifyPhoneNumber(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::verifyPhoneNumber, jsInvoker_, instance_, std::move(appName), std::move(phoneNumber), std::move(requestKey), std::move(timeout), std::move(forceResend)); + } + jsi::Value confirmPasswordReset(jsi::Runtime &rt, jsi::String appName, jsi::String code, jsi::String newPassword) override { + static_assert( + bridging::getParameterCount(&T::confirmPasswordReset) == 4, + "Expected confirmPasswordReset(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::confirmPasswordReset, jsInvoker_, instance_, std::move(appName), std::move(code), std::move(newPassword)); + } + jsi::Value applyActionCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) override { + static_assert( + bridging::getParameterCount(&T::applyActionCode) == 3, + "Expected applyActionCode(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::applyActionCode, jsInvoker_, instance_, std::move(appName), std::move(code)); + } + jsi::Value checkActionCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) override { + static_assert( + bridging::getParameterCount(&T::checkActionCode) == 3, + "Expected checkActionCode(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::checkActionCode, jsInvoker_, instance_, std::move(appName), std::move(code)); + } + jsi::Value linkWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) override { + static_assert( + bridging::getParameterCount(&T::linkWithCredential) == 5, + "Expected linkWithCredential(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::linkWithCredential, jsInvoker_, instance_, std::move(appName), std::move(provider), std::move(authToken), std::move(authSecret)); + } + jsi::Value linkWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) override { + static_assert( + bridging::getParameterCount(&T::linkWithProvider) == 3, + "Expected linkWithProvider(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::linkWithProvider, jsInvoker_, instance_, std::move(appName), std::move(provider)); + } + jsi::Value unlink(jsi::Runtime &rt, jsi::String appName, jsi::String providerId) override { + static_assert( + bridging::getParameterCount(&T::unlink) == 3, + "Expected unlink(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::unlink, jsInvoker_, instance_, std::move(appName), std::move(providerId)); + } + jsi::Value reauthenticateWithCredential(jsi::Runtime &rt, jsi::String appName, jsi::String provider, jsi::String authToken, jsi::String authSecret) override { + static_assert( + bridging::getParameterCount(&T::reauthenticateWithCredential) == 5, + "Expected reauthenticateWithCredential(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::reauthenticateWithCredential, jsInvoker_, instance_, std::move(appName), std::move(provider), std::move(authToken), std::move(authSecret)); + } + jsi::Value reauthenticateWithProvider(jsi::Runtime &rt, jsi::String appName, jsi::Object provider) override { + static_assert( + bridging::getParameterCount(&T::reauthenticateWithProvider) == 3, + "Expected reauthenticateWithProvider(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::reauthenticateWithProvider, jsInvoker_, instance_, std::move(appName), std::move(provider)); + } + jsi::Value fetchSignInMethodsForEmail(jsi::Runtime &rt, jsi::String appName, jsi::String email) override { + static_assert( + bridging::getParameterCount(&T::fetchSignInMethodsForEmail) == 3, + "Expected fetchSignInMethodsForEmail(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::fetchSignInMethodsForEmail, jsInvoker_, instance_, std::move(appName), std::move(email)); + } + void setLanguageCode(jsi::Runtime &rt, jsi::String appName, std::optional code) override { + static_assert( + bridging::getParameterCount(&T::setLanguageCode) == 3, + "Expected setLanguageCode(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setLanguageCode, jsInvoker_, instance_, std::move(appName), std::move(code)); + } + jsi::Value setTenantId(jsi::Runtime &rt, jsi::String appName, std::optional tenantId) override { + static_assert( + bridging::getParameterCount(&T::setTenantId) == 3, + "Expected setTenantId(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setTenantId, jsInvoker_, instance_, std::move(appName), std::move(tenantId)); + } + void useDeviceLanguage(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::useDeviceLanguage) == 2, + "Expected useDeviceLanguage(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::useDeviceLanguage, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value verifyPasswordResetCode(jsi::Runtime &rt, jsi::String appName, jsi::String code) override { + static_assert( + bridging::getParameterCount(&T::verifyPasswordResetCode) == 3, + "Expected verifyPasswordResetCode(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::verifyPasswordResetCode, jsInvoker_, instance_, std::move(appName), std::move(code)); + } + void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String host, double port) override { + static_assert( + bridging::getParameterCount(&T::useEmulator) == 4, + "Expected useEmulator(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::useEmulator, jsInvoker_, instance_, std::move(appName), std::move(host), std::move(port)); + } + + private: + friend class NativeRNFBTurboAuthCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/auth/ios/generated/ReactAppDependencyProvider.podspec b/packages/auth/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/auth/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/auth/lib/TotpSecret.ts b/packages/auth/lib/TotpSecret.ts index 7512641380..e55b261848 100644 --- a/packages/auth/lib/TotpSecret.ts +++ b/packages/auth/lib/TotpSecret.ts @@ -15,6 +15,7 @@ */ import { isString } from '@react-native-firebase/app/dist/module/common'; +import { rethrowAuthSyncNativeError } from './internal/syncNativeError'; import type { AuthInternal } from './types/internal'; export class TotpSecret { @@ -41,17 +42,29 @@ export class TotpSecret { * * @param accountName the name of the account/app along with a user identifier. * @param issuer issuer of the TOTP (likely the app name). - * @returns A Promise that resolves to a QR code URL string. Unlike the firebase-js-sdk synchronous - * return type, this method is async because QR code generation is performed through the React Native - * native auth bridge. + * @returns A QR code URL string. */ - async generateQrCodeUrl(accountName?: string, issuer?: string): Promise { - // accountName and issure are nullable in the API specification but are - // required by tha native SDK. The JS SDK returns '' if they are missing/empty. - if (!isString(accountName) || !isString(issuer) || accountName === '' || issuer === '') { - return ''; + generateQrCodeUrl(accountName?: string, issuer?: string): string { + let resolvedAccountName = accountName; + let resolvedIssuer = issuer; + + if (!isString(resolvedAccountName) || resolvedAccountName === '') { + resolvedAccountName = this.auth.currentUser?.email ?? 'unknownuser'; + } + + if (!isString(resolvedIssuer) || resolvedIssuer === '') { + resolvedIssuer = this.auth.app.name; + } + + try { + return this.auth.native.generateQrCodeUrl( + this.secretKey, + resolvedAccountName, + resolvedIssuer, + ); + } catch (error) { + rethrowAuthSyncNativeError(error); } - return this.auth.native.generateQrCodeUrl(this.secretKey, accountName, issuer); } /** diff --git a/packages/auth/lib/User.ts b/packages/auth/lib/User.ts index 469c1bc01b..e43f693e24 100644 --- a/packages/auth/lib/User.ts +++ b/packages/auth/lib/User.ts @@ -108,7 +108,7 @@ export default class User { } delete(): Promise { - return this._auth.native.delete().then(() => { + return this._auth.native.deleteUser().then(() => { this._auth._setUser(null); }); } diff --git a/packages/auth/lib/index.ts b/packages/auth/lib/index.ts index 3fbbf8afa3..bc8585f575 100644 --- a/packages/auth/lib/index.ts +++ b/packages/auth/lib/index.ts @@ -148,7 +148,7 @@ type AuthErrorWithCodeInternal = Error & { const nativeEvents = ['auth_state_changed', 'auth_id_token_changed', 'phone_auth_state_changed']; const namespace = 'auth'; -const nativeModuleName = 'RNFBAuthModule'; +const nativeModuleName = 'NativeRNFBTurboAuth'; const config: ModuleConfig = { namespace, @@ -156,6 +156,7 @@ const config: ModuleConfig = { nativeEvents, hasMultiAppSupport: true, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; type BeforeAuthStateChangedEntry = { @@ -474,20 +475,8 @@ class FirebaseAuthModule extends FirebaseModule { } signInWithPhoneNumber(phoneNumber: string, forceResend?: boolean): Promise { - if (isAndroid) { - return this.native - .signInWithPhoneNumber(phoneNumber, forceResend || false) - .then( - (result: NativePhoneAuthCredentialInternal) => - new ConfirmationResultClass( - this as unknown as AuthInternal, - result.verificationId, - ) as unknown as ConfirmationResult, - ); - } - return this.native - .signInWithPhoneNumber(phoneNumber) + .signInWithPhoneNumber(phoneNumber, forceResend || false) .then( (result: NativePhoneAuthCredentialInternal) => new ConfirmationResultClass( @@ -655,7 +644,7 @@ class FirebaseAuthModule extends FirebaseModule { ); } - isSignInWithEmailLink(emailLink: string): Promise { + isSignInWithEmailLink(emailLink: string): boolean { return this.native.isSignInWithEmailLink(emailLink); } @@ -1163,10 +1152,8 @@ export function getRedirectResult( /** * Checks whether an email link is a valid sign-in with email link URL. * - * @remarks React Native Firebase performs this check through the native bridge and returns - * `Promise`. The firebase-js-sdk returns a synchronous `boolean`. */ -export function isSignInWithEmailLink(auth: Auth, emailLink: string): Promise { +export function isSignInWithEmailLink(auth: Auth, emailLink: string): boolean { const authInternal = getAuthInternal(auth); return callAuthMethod(authInternal, authInternal.isSignInWithEmailLink, emailLink); } @@ -1507,7 +1494,8 @@ export function setLanguageCode(auth: Auth, languageCode: string | null): Promis /** * Configures iOS keychain access group sharing for the Auth instance. * - * @remarks React Native Firebase-specific iOS helper with no firebase-js-sdk equivalent. + * @remarks **iOS only** React Native Firebase helper with no firebase-js-sdk equivalent. + * Enables sharing auth state across apps in the same access group (e.g. app extensions). */ export function useUserAccessGroup(auth: Auth, userAccessGroup: string): Promise { const authInternal = getAuthInternal(auth); @@ -1835,7 +1823,8 @@ export function getAdditionalUserInfo(userCredential: UserCredential): Additiona /** * Returns the configured custom auth domain for the Auth instance. * - * @remarks React Native Firebase-specific helper with no firebase-js-sdk equivalent. + * @remarks React Native Firebase-specific helper with no firebase-js-sdk modular equivalent. + * Reads the custom domain configured for the Firebase project through the native Auth SDK. */ export function getCustomAuthDomain(auth: Auth): Promise { const authInternal = getAuthInternal(auth); diff --git a/packages/auth/lib/internal/syncNativeError.ts b/packages/auth/lib/internal/syncNativeError.ts new file mode 100644 index 0000000000..53fdb42665 --- /dev/null +++ b/packages/auth/lib/internal/syncNativeError.ts @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { isObject } from '@react-native-firebase/app/dist/module/common'; +import NativeFirebaseError from '@react-native-firebase/app/dist/module/internal/NativeFirebaseError'; +import type { NativeError } from '@react-native-firebase/app/dist/module/types/internal'; + +const INVALID_TOTP_SECRET_CODE = 'invalid-multi-factor-secret'; +const INVALID_TOTP_SECRET_MESSAGE = "can't find secret for provided key"; + +function hasAuthFirebaseErrorCode(error: unknown): error is { code: string } { + return ( + isObject(error) && + 'code' in error && + typeof (error as { code?: unknown }).code === 'string' && + ((error as { code: string }).code.startsWith('auth/') || + (error as { code: string }).code === INVALID_TOTP_SECRET_CODE) + ); +} + +function getNativeErrorUserInfo(error: unknown): NativeError['userInfo'] | null { + if (!isObject(error)) { + return null; + } + + if ('userInfo' in error && isObject((error as NativeError).userInfo)) { + return (error as NativeError).userInfo; + } + + if ('code' in error && 'message' in error) { + const code = (error as { code?: unknown }).code; + const message = (error as { message?: unknown }).message; + if (typeof code === 'string' && typeof message === 'string') { + return { code, message }; + } + } + + return null; +} + +/** + * Converts sync native TurboModule throws into {@link NativeFirebaseError} using the same + * {@code code}/{@code message} shape as promise rejects. + */ +export function rethrowAuthSyncNativeError(error: unknown): never { + if (error instanceof NativeFirebaseError) { + throw error; + } + + if (hasAuthFirebaseErrorCode(error)) { + throw error; + } + + const userInfo = getNativeErrorUserInfo(error); + if (userInfo?.code && userInfo.message) { + throw new NativeFirebaseError({ userInfo }, new Error().stack!, 'auth'); + } + + const message = error instanceof Error ? error.message : String(error); + const name = error instanceof Error ? error.name : undefined; + + if (message === INVALID_TOTP_SECRET_MESSAGE || name === INVALID_TOTP_SECRET_CODE) { + throw new NativeFirebaseError( + { + userInfo: { + code: INVALID_TOTP_SECRET_CODE, + message: INVALID_TOTP_SECRET_MESSAGE, + }, + }, + new Error().stack!, + 'auth', + ); + } + + throw error; +} diff --git a/packages/auth/lib/types/internal.ts b/packages/auth/lib/types/internal.ts index 00c58921c9..3121be7ac3 100644 --- a/packages/auth/lib/types/internal.ts +++ b/packages/auth/lib/types/internal.ts @@ -274,7 +274,7 @@ export interface RNFBAuthModule { actionCodeSettings?: ActionCodeSettings | null, ): Promise; sendSignInLinkToEmail(email: string, actionCodeSettings?: ActionCodeSettings): Promise; - isSignInWithEmailLink(emailLink: string): Promise; + isSignInWithEmailLink(emailLink: string): boolean; signInWithEmailLink(email: string, emailLink?: string): Promise; confirmPasswordReset(code: string, newPassword: string): Promise; applyActionCode(code: string): Promise; @@ -286,7 +286,7 @@ export interface RNFBAuthModule { useEmulator(host: string, port?: number): void; getCustomAuthDomain(): Promise; confirmationResultConfirm(verificationCode: string): Promise; - delete(): Promise; + deleteUser(): Promise; getIdToken(forceRefresh: boolean): Promise; getIdTokenResult(forceRefresh: boolean): Promise; linkWithCredential( @@ -334,7 +334,7 @@ export interface RNFBAuthModule { unenrollMultiFactor(enrollmentId: string | MultiFactorInfo): Promise; getMultiFactorResolver(error: unknown): MultiFactorResolverResultInternal | null; generateTotpSecret(session: MultiFactorSession): Promise<{ secretKey: string }>; - generateQrCodeUrl(secretKey: string, accountName: string, issuer: string): Promise; + generateQrCodeUrl(secretKey: string, accountName: string, issuer: string): string; openInOtpApp(secretKey: string, qrCodeUrl: string): string | void; assertionForSignIn( uid: string, @@ -355,7 +355,7 @@ export type AuthInternal = Auth & { fetchSignInMethodsForEmail(email: string): Promise; getCustomAuthDomain(): Promise; getMultiFactorResolver(error: unknown): MultiFactorResolverResultInternal | null; - isSignInWithEmailLink(emailLink: string): Promise; + isSignInWithEmailLink(emailLink: string): boolean; onAuthStateChanged( listenerOrObserver: import('./auth').CallbackOrObserver, ): () => void; @@ -465,6 +465,6 @@ export type MultiFactorResolverInternal = MultiFactorResolver; declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBAuthModule: RNFBAuthModule; + NativeRNFBTurboAuth: RNFBAuthModule; } } diff --git a/packages/auth/lib/web/RNFBAuthModule.ts b/packages/auth/lib/web/RNFBAuthModule.ts index 862b790c72..964d5aea0b 100644 --- a/packages/auth/lib/web/RNFBAuthModule.ts +++ b/packages/auth/lib/web/RNFBAuthModule.ts @@ -583,13 +583,15 @@ export default { * Check if a sign in with email link is valid * @param {string} appName - The name of the app to get the auth instance for. * @param {string} emailLink - The email link to sign in with. - * @returns {Promise} - Whether the link is a valid sign in with email link. + * @returns {boolean} - Whether the link is a valid sign in with email link. */ - async isSignInWithEmailLink(appName: string, emailLink: string) { - return guard(async () => { + isSignInWithEmailLink(appName: string, emailLink: string) { + try { const auth = getCachedAuthInstance(appName); - return await isSignInWithEmailLink(auth, emailLink); - }); + return isSignInWithEmailLink(auth, emailLink); + } catch (e) { + throw getWebError(e as Error & { code?: string }); + } }, /** @@ -667,7 +669,7 @@ export default { * @param {string} appName - The name of the app to get the auth instance for. * @returns {Promise} */ - async delete(appName: string) { + async deleteUser(appName: string) { return guard(async () => { const auth = getCachedAuthInstance(appName); @@ -1254,10 +1256,11 @@ export default { generateQrCodeUrl(_appName: string, secretKey: string, accountName?: string, issuer?: string) { const totpSecret = totpSecretMap.get(secretKey); if (!totpSecret) { - return rejectPromiseWithCodeAndMessage( - 'invalid-multi-factor-secret', - "can't find secret for provided key", - ); + throw getWebError({ + name: 'FirebaseError', + code: 'auth/invalid-multi-factor-secret', + message: "can't find secret for provided key", + }); } return totpSecret.generateQrCodeUrl(accountName, issuer); }, diff --git a/packages/auth/package.json b/packages/auth/package.json index 09e498a4e3..3e5c0e68a7 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -5,13 +5,30 @@ "description": "React Native Firebase - The authentication module provides an easy-to-use API to integrate an authentication workflow into new and existing applications. React Native Firebase provides access to all Firebase authentication methods and identity providers.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBAuthTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.auth" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboAuth": "RNFBAuthModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "build:plugin": "rimraf plugin/build && tsc --build plugin", "compile": "bob build", "lint:plugin": "eslint plugin/src/*", - "prepare": "yarn run build && yarn compile && yarn run build:plugin" + "prepare": "yarn run build && yarn compile && yarn run build:plugin", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/main/java/io/invertase/firebase/auth/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/auth/react-native.config.js b/packages/auth/react-native.config.js new file mode 100644 index 0000000000..adb85ef48b --- /dev/null +++ b/packages/auth/react-native.config.js @@ -0,0 +1,9 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: './src/main/java/io/invertase/firebase/auth/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/auth/specs/NativeRNFBTurboAuth.ts b/packages/auth/specs/NativeRNFBTurboAuth.ts new file mode 100644 index 0000000000..328281a9e1 --- /dev/null +++ b/packages/auth/specs/NativeRNFBTurboAuth.ts @@ -0,0 +1,143 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + getConstants(): { + APP_LANGUAGE: Object; + APP_USER: Object; + }; + + configureAuthDomain(appName: string): void; + getCustomAuthDomain(appName: string): Promise; + addAuthStateListener(appName: string): void; + removeAuthStateListener(appName: string): void; + addIdTokenListener(appName: string): void; + removeIdTokenListener(appName: string): void; + forceRecaptchaFlowForTesting(appName: string, forceRecaptchaFlow: boolean): Promise; + setAutoRetrievedSmsCodeForPhoneNumber( + appName: string, + phoneNumber: string, + smsCode: string, + ): Promise; + setAppVerificationDisabledForTesting(appName: string, disabled: boolean): Promise; + useUserAccessGroup(appName: string, userAccessGroup: string): Promise; + signOut(appName: string): Promise; + signInAnonymously(appName: string): Promise; + createUserWithEmailAndPassword(appName: string, email: string, password: string): Promise; + isSignInWithEmailLink(appName: string, emailLink: string): boolean; + signInWithEmailAndPassword(appName: string, email: string, password: string): Promise; + signInWithEmailLink(appName: string, email: string, emailLink: string): Promise; + signInWithCustomToken(appName: string, token: string): Promise; + revokeToken(appName: string, authorizationCode: string): Promise; + sendPasswordResetEmail( + appName: string, + email: string, + actionCodeSettings?: Object | null, + ): Promise; + sendSignInLinkToEmail(appName: string, email: string, actionCodeSettings: Object): Promise; + deleteUser(appName: string): Promise; + reload(appName: string): Promise; + sendEmailVerification(appName: string, actionCodeSettings?: Object | null): Promise; + verifyBeforeUpdateEmail( + appName: string, + email: string, + actionCodeSettings?: Object | null, + ): Promise; + updateEmail(appName: string, email: string): Promise; + updatePassword(appName: string, password: string): Promise; + updatePhoneNumber( + appName: string, + provider: string, + authToken: string, + authSecret: string, + ): Promise; + updateProfile(appName: string, props: Object): Promise; + getIdToken(appName: string, forceRefresh: boolean): Promise; + getIdTokenResult(appName: string, forceRefresh: boolean): Promise; + signInWithCredential( + appName: string, + provider: string, + authToken: string, + authSecret: string, + ): Promise; + signInWithProvider(appName: string, provider: Object): Promise; + signInWithPhoneNumber( + appName: string, + phoneNumber: string, + forceResend: boolean, + ): Promise; + verifyPhoneNumberWithMultiFactorInfo( + appName: string, + hintUid: string, + sessionKey: string, + ): Promise; + verifyPhoneNumberForMultiFactor( + appName: string, + phoneNumber: string, + sessionKey: string, + ): Promise; + resolveMultiFactorSignIn( + appName: string, + session: string, + verificationId: string, + verificationCode: string, + ): Promise; + resolveTotpSignIn( + appName: string, + sessionKey: string, + uid: string, + oneTimePassword: string, + ): Promise; + generateTotpSecret(appName: string, sessionKey: string): Promise; + generateQrCodeUrl(appName: string, secretKey: string, account: string, issuer: string): string; + openInOtpApp(appName: string, secretKey: string, qrCodeUri: string): void; + getSession(appName: string): Promise; + unenrollMultiFactor(appName: string, factorUID: string): Promise; + finalizeMultiFactorEnrollment( + appName: string, + verificationId: string, + verificationCode: string, + displayName?: string | null, + ): Promise; + finalizeTotpEnrollment( + appName: string, + totpSecret: string, + verificationCode: string, + displayName?: string | null, + ): Promise; + confirmationResultConfirm(appName: string, verificationCode: string): Promise; + verifyPhoneNumber( + appName: string, + phoneNumber: string, + requestKey: string, + timeout: number, + forceResend: boolean, + ): void; + confirmPasswordReset(appName: string, code: string, newPassword: string): Promise; + applyActionCode(appName: string, code: string): Promise; + checkActionCode(appName: string, code: string): Promise; + linkWithCredential( + appName: string, + provider: string, + authToken: string, + authSecret: string, + ): Promise; + linkWithProvider(appName: string, provider: Object): Promise; + unlink(appName: string, providerId: string): Promise; + reauthenticateWithCredential( + appName: string, + provider: string, + authToken: string, + authSecret: string, + ): Promise; + reauthenticateWithProvider(appName: string, provider: Object): Promise; + fetchSignInMethodsForEmail(appName: string, email: string): Promise>; + setLanguageCode(appName: string, code: string | null): void; + setTenantId(appName: string, tenantId: string | null): Promise; + useDeviceLanguage(appName: string): void; + verifyPasswordResetCode(appName: string, code: string): Promise; + useEmulator(appName: string, host: string, port: number): void; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboAuth'); diff --git a/packages/auth/type-test.ts b/packages/auth/type-test.ts index e51e1ee020..a2b86104c4 100644 --- a/packages/auth/type-test.ts +++ b/packages/auth/type-test.ts @@ -230,8 +230,10 @@ const totpAssertionForEnrollment: TotpMultiFactorAssertion = TotpMultiFactorGenerator.assertionForEnrollment(totpSecret, '123456'); const generatedTotpSecret: Promise = TotpMultiFactorGenerator.generateSecret(multiFactorSession); +const isEmailLink: boolean = isSignInWithEmailLink(modularAuth, 'https://example.com/link'); +const totpQrCodeUrl: string = totpSecret.generateQrCodeUrl('account@example.com', 'Example App'); console.log(modularAuth.app.name, modularAuthFromApp.app.name, initializedAuth.app.name); -console.log(phoneVerificationId); +console.log(phoneVerificationId, isEmailLink, totpQrCodeUrl); console.log(totpAssertionForSignIn, totpAssertionForEnrollment, generatedTotpSecret); const emailCredential = EmailAuthProvider.credential('test@example.com', 'password123'); diff --git a/packages/crashlytics/RNFBCrashlytics.podspec b/packages/crashlytics/RNFBCrashlytics.podspec index d33b3f729f..47300cdd24 100644 --- a/packages/crashlytics/RNFBCrashlytics.podspec +++ b/packages/crashlytics/RNFBCrashlytics.podspec @@ -29,15 +29,19 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.private_header_files = "ios/**/*.h" + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ios/generated/RNFBCrashlyticsTurboModules\" \"$(PODS_TARGET_SRCROOT)/ios/generated\"", + } s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/crashlytics/__tests__/nativeModuleContract.test.ts b/packages/crashlytics/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..3bda54dab8 --- /dev/null +++ b/packages/crashlytics/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,108 @@ +import { describe, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'checkForUnsentReports', + 'crash', + 'crashWithStackPromise', + 'deleteUnsentReports', + 'didCrashOnPreviousExecution', + 'log', + 'logPromise', + 'sendUnsentReports', + 'setAttribute', + 'setAttributes', + 'setUserId', + 'recordError', + 'recordErrorPromise', + 'setCrashlyticsCollectionEnabled', +] as const; + +const ERROR_FIXTURE = { + message: 'test', + isUnhandledRejection: false, + frames: [{ src: '', line: 0, col: 0, fn: '', file: 'test:0:0' }], +}; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper', function () { + assertTurboContract( + { + namespace: 'crashlytics', + nativeModuleName: 'NativeRNFBTurboCrashlytics', + nativeEvents: false, + hasMultiAppSupport: false, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + specMethods: SPEC_METHODS, + createMock: method => + jest.fn(() => + method.startsWith('check') || method.startsWith('did') + ? Promise.resolve(false) + : Promise.resolve(), + ), + customizeRaw: raw => { + Object.defineProperty(raw, 'getConstants', { + value: jest.fn(() => ({ + isCrashlyticsCollectionEnabled: false, + isErrorGenerationOnJSCrashEnabled: false, + isCrashlyticsJavascriptExceptionHandlerChainingEnabled: false, + })), + enumerable: true, + configurable: true, + }); + Object.defineProperty(raw, 'isCrashlyticsCollectionEnabled', { + value: false, + enumerable: true, + configurable: true, + }); + Object.defineProperty(raw, 'isErrorGenerationOnJSCrashEnabled', { + value: false, + enumerable: true, + configurable: true, + }); + Object.defineProperty(raw, 'isCrashlyticsJavascriptExceptionHandlerChainingEnabled', { + value: false, + enumerable: true, + configurable: true, + }); + }, + }, + { + setAttribute: wrapped => { + void wrapped.setAttribute('key', 'value'); + }, + setAttributes: wrapped => { + void wrapped.setAttributes({ key: 'value' }); + }, + setUserId: wrapped => { + void wrapped.setUserId('user'); + }, + setCrashlyticsCollectionEnabled: wrapped => { + void wrapped.setCrashlyticsCollectionEnabled(true); + }, + log: wrapped => { + wrapped.log('message'); + }, + logPromise: wrapped => { + wrapped.logPromise('message'); + }, + recordError: wrapped => { + wrapped.recordError(ERROR_FIXTURE); + }, + recordErrorPromise: wrapped => { + void wrapped.recordErrorPromise(ERROR_FIXTURE); + }, + crashWithStackPromise: wrapped => { + void wrapped.crashWithStackPromise(ERROR_FIXTURE); + }, + crash: wrapped => { + wrapped.crash(); + }, + sendUnsentReports: wrapped => { + wrapped.sendUnsentReports(); + }, + }, + ); + }); +}); diff --git a/packages/crashlytics/android/build.gradle b/packages/crashlytics/android/build.gradle index dfb9b21e96..733a25554a 100644 --- a/packages/crashlytics/android/build.gradle +++ b/packages/crashlytics/android/build.gradle @@ -82,6 +82,11 @@ android { targetCompatibility = JavaVersion.VERSION_11 } } + sourceSets { + main { + java.excludes = ['**/generated/jni/**'] + } + } } repositories { @@ -100,3 +105,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/crashlytics") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsModule.java b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/NativeRNFBTurboCrashlytics.java similarity index 87% rename from packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsModule.java rename to packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/NativeRNFBTurboCrashlytics.java index 940ae86857..a449e81ac8 100644 --- a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsModule.java +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/NativeRNFBTurboCrashlytics.java @@ -17,24 +17,46 @@ * */ +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage; + import android.os.Handler; import android.util.Log; -import com.facebook.react.bridge.*; +import com.facebook.fbreact.specs.NativeRNFBTurboCrashlyticsSpec; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.ReadableMapKeySetIterator; import com.google.firebase.crashlytics.FirebaseCrashlytics; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import io.invertase.firebase.common.ReactNativeFirebasePreferences; import java.util.HashMap; import java.util.Map; import java.util.Objects; -public class ReactNativeFirebaseCrashlyticsModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboCrashlytics extends NativeRNFBTurboCrashlyticsSpec { private static final String TAG = "Crashlytics"; - ReactNativeFirebaseCrashlyticsModule(ReactApplicationContext reactContext) { - super(reactContext, TAG); + public NativeRNFBTurboCrashlytics(ReactApplicationContext reactContext) { + super(reactContext); } - @ReactMethod + @Override + protected Map getTypedExportedConstants() { + final Map constants = new HashMap<>(); + constants.put( + "isCrashlyticsCollectionEnabled", + ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()); + constants.put( + "isErrorGenerationOnJSCrashEnabled", + ReactNativeFirebaseCrashlyticsInitProvider.isErrorGenerationOnJSCrashEnabled()); + constants.put( + "isCrashlyticsJavascriptExceptionHandlerChainingEnabled", + ReactNativeFirebaseCrashlyticsInitProvider + .isCrashlyticsJavascriptExceptionHandlerChainingEnabled()); + return constants; + } + + @Override public void checkForUnsentReports(Promise promise) { FirebaseCrashlytics.getInstance() .checkForUnsentReports() @@ -58,7 +80,7 @@ public void checkForUnsentReports(Promise promise) { }); } - @ReactMethod + @Override public void crashWithStackPromise(ReadableMap jsErrorMap, Promise promise) { if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) { Exception e = recordJavaScriptError(jsErrorMap); @@ -71,10 +93,9 @@ public void crashWithStackPromise(ReadableMap jsErrorMap, Promise promise) { promise.resolve(null); } - @ReactMethod + @Override public void crash() { if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) { - // async task so as not to get caught by the React Native redbox handler in debug new Handler() .postDelayed( new Runnable() { @@ -89,25 +110,25 @@ public void run() { } } - @ReactMethod - public void deleteUnsentReports() { + @Override + public void deleteUnsentReports(Promise promise) { FirebaseCrashlytics.getInstance().deleteUnsentReports(); + promise.resolve(null); } - @ReactMethod + @Override public void didCrashOnPreviousExecution(Promise promise) { promise.resolve(FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution()); } - @ReactMethod + @Override public void log(String message) { if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) { FirebaseCrashlytics.getInstance().log(message); } } - // For internal use only. - @ReactMethod + @Override public void logPromise(String message, Promise promise) { if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) { FirebaseCrashlytics.getInstance().log(message); @@ -115,7 +136,7 @@ public void logPromise(String message, Promise promise) { promise.resolve(null); } - @ReactMethod + @Override public void setAttribute(String key, String value, Promise promise) { if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) { FirebaseCrashlytics.getInstance().setCustomKey(key, value); @@ -123,7 +144,7 @@ public void setAttribute(String key, String value, Promise promise) { promise.resolve(null); } - @ReactMethod + @Override public void setAttributes(ReadableMap keyValuesMap, Promise promise) { if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) { ReadableMapKeySetIterator iterator = keyValuesMap.keySetIterator(); @@ -139,12 +160,12 @@ public void setAttributes(ReadableMap keyValuesMap, Promise promise) { promise.resolve(null); } - @ReactMethod + @Override public void sendUnsentReports() { FirebaseCrashlytics.getInstance().sendUnsentReports(); } - @ReactMethod + @Override public void setUserId(String userId, Promise promise) { if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) { FirebaseCrashlytics.getInstance().setUserId(userId); @@ -152,14 +173,14 @@ public void setUserId(String userId, Promise promise) { promise.resolve(null); } - @ReactMethod - public void setCrashlyticsCollectionEnabled(Boolean enabled, Promise promise) { + @Override + public void setCrashlyticsCollectionEnabled(boolean enabled, Promise promise) { ReactNativeFirebasePreferences.getSharedInstance() .setBooleanValue(Constants.KEY_CRASHLYTICS_AUTO_COLLECTION_ENABLED, enabled); promise.resolve(null); } - @ReactMethod + @Override public void recordError(ReadableMap jsErrorMap) { if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) { recordJavaScriptError(jsErrorMap); @@ -168,7 +189,7 @@ public void recordError(ReadableMap jsErrorMap) { } } - @ReactMethod + @Override public void recordErrorPromise(ReadableMap jsErrorMap, Promise promise) { if (ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()) { recordJavaScriptError(jsErrorMap); @@ -204,20 +225,4 @@ private Exception recordJavaScriptError(ReadableMap jsErrorMap) { FirebaseCrashlytics.getInstance().recordException(customException); return customException; } - - @Override - public Map getConstants() { - final Map constants = new HashMap<>(); - constants.put( - "isCrashlyticsCollectionEnabled", - ReactNativeFirebaseCrashlyticsInitProvider.isCrashlyticsCollectionEnabled()); - constants.put( - "isErrorGenerationOnJSCrashEnabled", - ReactNativeFirebaseCrashlyticsInitProvider.isErrorGenerationOnJSCrashEnabled()); - constants.put( - "isCrashlyticsJavascriptExceptionHandlerChainingEnabled", - ReactNativeFirebaseCrashlyticsInitProvider - .isCrashlyticsJavascriptExceptionHandlerChainingEnabled()); - return constants; - } } diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsPackage.java b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsPackage.java index 20d6f87f97..fd74b7e342 100644 --- a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsPackage.java +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/ReactNativeFirebaseCrashlyticsPackage.java @@ -30,7 +30,7 @@ public class ReactNativeFirebaseCrashlyticsPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseCrashlyticsModule(reactContext)); + modules.add(new NativeRNFBTurboCrashlytics(reactContext)); return modules; } diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboCrashlyticsSpec.java b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboCrashlyticsSpec.java new file mode 100644 index 0000000000..1ad6f8f7b1 --- /dev/null +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboCrashlyticsSpec.java @@ -0,0 +1,125 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboCrashlyticsSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboCrashlytics"; + + public NativeRNFBTurboCrashlyticsSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + protected abstract Map getTypedExportedConstants(); + + @Override + @DoNotStrip + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "isCrashlyticsCollectionEnabled", + "isCrashlyticsJavascriptExceptionHandlerChainingEnabled", + "isErrorGenerationOnJSCrashEnabled" + )); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } + + @ReactMethod + @DoNotStrip + public abstract void checkForUnsentReports(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void crash(); + + @ReactMethod + @DoNotStrip + public abstract void crashWithStackPromise(ReadableMap jsErrorDict, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void deleteUnsentReports(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void didCrashOnPreviousExecution(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void log(String message); + + @ReactMethod + @DoNotStrip + public abstract void logPromise(String message, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void sendUnsentReports(); + + @ReactMethod + @DoNotStrip + public abstract void setAttribute(String key, String value, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setAttributes(ReadableMap attributes, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setUserId(String userId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void recordError(ReadableMap jsErrorDict); + + @ReactMethod + @DoNotStrip + public abstract void recordErrorPromise(ReadableMap jsErrorDict, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setCrashlyticsCollectionEnabled(boolean enabled, Promise promise); +} diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/CMakeLists.txt b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..87578b1b43 --- /dev/null +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBCrashlyticsTurboModules/*.cpp) + +add_library( + react_codegen_RNFBCrashlyticsTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBCrashlyticsTurboModules PUBLIC . react/renderer/components/RNFBCrashlyticsTurboModules) + +target_link_libraries( + react_codegen_RNFBCrashlyticsTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBCrashlyticsTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/RNFBCrashlyticsTurboModules-generated.cpp b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/RNFBCrashlyticsTurboModules-generated.cpp new file mode 100644 index 0000000000..27e92e35d5 --- /dev/null +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/RNFBCrashlyticsTurboModules-generated.cpp @@ -0,0 +1,116 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBCrashlyticsTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "getConstants", "()Ljava/util/Map;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_checkForUnsentReports(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "checkForUnsentReports", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_crash(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "crash", "()V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_crashWithStackPromise(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "crashWithStackPromise", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_deleteUnsentReports(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "deleteUnsentReports", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_didCrashOnPreviousExecution(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "didCrashOnPreviousExecution", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_log(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "log", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_logPromise(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "logPromise", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_sendUnsentReports(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "sendUnsentReports", "()V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setAttribute(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setAttribute", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setAttributes(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setAttributes", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setUserId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setUserId", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_recordError(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "recordError", "(Lcom/facebook/react/bridge/ReadableMap;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_recordErrorPromise(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "recordErrorPromise", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setCrashlyticsCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setCrashlyticsCollectionEnabled", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboCrashlyticsSpecJSI::NativeRNFBTurboCrashlyticsSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_getConstants}; + methodMap_["checkForUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_checkForUnsentReports}; + methodMap_["crash"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_crash}; + methodMap_["crashWithStackPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_crashWithStackPromise}; + methodMap_["deleteUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_deleteUnsentReports}; + methodMap_["didCrashOnPreviousExecution"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_didCrashOnPreviousExecution}; + methodMap_["log"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_log}; + methodMap_["logPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_logPromise}; + methodMap_["sendUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_sendUnsentReports}; + methodMap_["setAttribute"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setAttribute}; + methodMap_["setAttributes"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setAttributes}; + methodMap_["setUserId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setUserId}; + methodMap_["recordError"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_recordError}; + methodMap_["recordErrorPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_recordErrorPromise}; + methodMap_["setCrashlyticsCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setCrashlyticsCollectionEnabled}; +} + +std::shared_ptr RNFBCrashlyticsTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboCrashlytics") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/RNFBCrashlyticsTurboModules.h b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/RNFBCrashlyticsTurboModules.h new file mode 100644 index 0000000000..8ee54cc0bb --- /dev/null +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/RNFBCrashlyticsTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboCrashlytics' + */ +class JSI_EXPORT NativeRNFBTurboCrashlyticsSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboCrashlyticsSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBCrashlyticsTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/react/renderer/components/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModulesJSI-generated.cpp b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/react/renderer/components/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..2cced4c468 --- /dev/null +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/react/renderer/components/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModulesJSI-generated.cpp @@ -0,0 +1,124 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBCrashlyticsTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_checkForUnsentReports(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->checkForUnsentReports( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_crash(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->crash( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_crashWithStackPromise(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->crashWithStackPromise( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_deleteUnsentReports(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteUnsentReports( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_didCrashOnPreviousExecution(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->didCrashOnPreviousExecution( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_log(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->log( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_logPromise(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->logPromise( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_sendUnsentReports(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->sendUnsentReports( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setAttribute(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAttribute( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setAttributes(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAttributes( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setUserId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setUserId( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_recordError(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->recordError( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_recordErrorPromise(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->recordErrorPromise( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setCrashlyticsCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setCrashlyticsCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} + +NativeRNFBTurboCrashlyticsCxxSpecJSI::NativeRNFBTurboCrashlyticsCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboCrashlytics", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_getConstants}; + methodMap_["checkForUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_checkForUnsentReports}; + methodMap_["crash"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_crash}; + methodMap_["crashWithStackPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_crashWithStackPromise}; + methodMap_["deleteUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_deleteUnsentReports}; + methodMap_["didCrashOnPreviousExecution"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_didCrashOnPreviousExecution}; + methodMap_["log"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_log}; + methodMap_["logPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_logPromise}; + methodMap_["sendUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_sendUnsentReports}; + methodMap_["setAttribute"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setAttribute}; + methodMap_["setAttributes"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setAttributes}; + methodMap_["setUserId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setUserId}; + methodMap_["recordError"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_recordError}; + methodMap_["recordErrorPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_recordErrorPromise}; + methodMap_["setCrashlyticsCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setCrashlyticsCollectionEnabled}; +} + + +} // namespace facebook::react diff --git a/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/react/renderer/components/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModulesJSI.h b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/react/renderer/components/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModulesJSI.h new file mode 100644 index 0000000000..9ec0c424d0 --- /dev/null +++ b/packages/crashlytics/android/src/main/java/io/invertase/firebase/crashlytics/generated/jni/react/renderer/components/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModulesJSI.h @@ -0,0 +1,320 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboCrashlyticsCrashlyticsStackFrame + +template +struct NativeRNFBTurboCrashlyticsCrashlyticsStackFrame { + P0 src; + P1 line; + P2 col; + P3 fn; + P4 file; + bool operator==(const NativeRNFBTurboCrashlyticsCrashlyticsStackFrame &other) const { + return src == other.src && line == other.line && col == other.col && fn == other.fn && file == other.file; + } +}; + +template +struct NativeRNFBTurboCrashlyticsCrashlyticsStackFrameBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "src"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "line"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "col"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "fn"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "file"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String srcToJs(jsi::Runtime &rt, decltype(types.src) value) { + return bridging::toJs(rt, value); + } + + static double lineToJs(jsi::Runtime &rt, decltype(types.line) value) { + return bridging::toJs(rt, value); + } + + static double colToJs(jsi::Runtime &rt, decltype(types.col) value) { + return bridging::toJs(rt, value); + } + + static jsi::String fnToJs(jsi::Runtime &rt, decltype(types.fn) value) { + return bridging::toJs(rt, value); + } + + static jsi::String fileToJs(jsi::Runtime &rt, decltype(types.file) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "src", bridging::toJs(rt, value.src, jsInvoker)); + result.setProperty(rt, "line", bridging::toJs(rt, value.line, jsInvoker)); + result.setProperty(rt, "col", bridging::toJs(rt, value.col, jsInvoker)); + result.setProperty(rt, "fn", bridging::toJs(rt, value.fn, jsInvoker)); + result.setProperty(rt, "file", bridging::toJs(rt, value.file, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboCrashlyticsJavaScriptErrorObject + +template +struct NativeRNFBTurboCrashlyticsJavaScriptErrorObject { + P0 message; + P1 isUnhandledRejection; + P2 frames; + bool operator==(const NativeRNFBTurboCrashlyticsJavaScriptErrorObject &other) const { + return message == other.message && isUnhandledRejection == other.isUnhandledRejection && frames == other.frames; + } +}; + +template +struct NativeRNFBTurboCrashlyticsJavaScriptErrorObjectBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "message"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "isUnhandledRejection"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "frames"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String messageToJs(jsi::Runtime &rt, decltype(types.message) value) { + return bridging::toJs(rt, value); + } + + static bool isUnhandledRejectionToJs(jsi::Runtime &rt, decltype(types.isUnhandledRejection) value) { + return bridging::toJs(rt, value); + } + + static jsi::Array framesToJs(jsi::Runtime &rt, decltype(types.frames) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "message", bridging::toJs(rt, value.message, jsInvoker)); + result.setProperty(rt, "isUnhandledRejection", bridging::toJs(rt, value.isUnhandledRejection, jsInvoker)); + result.setProperty(rt, "frames", bridging::toJs(rt, value.frames, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboCrashlyticsCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboCrashlyticsCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value checkForUnsentReports(jsi::Runtime &rt) = 0; + virtual void crash(jsi::Runtime &rt) = 0; + virtual jsi::Value crashWithStackPromise(jsi::Runtime &rt, jsi::Object jsErrorDict) = 0; + virtual jsi::Value deleteUnsentReports(jsi::Runtime &rt) = 0; + virtual jsi::Value didCrashOnPreviousExecution(jsi::Runtime &rt) = 0; + virtual void log(jsi::Runtime &rt, jsi::String message) = 0; + virtual jsi::Value logPromise(jsi::Runtime &rt, jsi::String message) = 0; + virtual void sendUnsentReports(jsi::Runtime &rt) = 0; + virtual jsi::Value setAttribute(jsi::Runtime &rt, jsi::String key, jsi::String value) = 0; + virtual jsi::Value setAttributes(jsi::Runtime &rt, jsi::Object attributes) = 0; + virtual jsi::Value setUserId(jsi::Runtime &rt, jsi::String userId) = 0; + virtual void recordError(jsi::Runtime &rt, jsi::Object jsErrorDict) = 0; + virtual jsi::Value recordErrorPromise(jsi::Runtime &rt, jsi::Object jsErrorDict) = 0; + virtual jsi::Value setCrashlyticsCollectionEnabled(jsi::Runtime &rt, bool enabled) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboCrashlyticsCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboCrashlytics"; + +protected: + NativeRNFBTurboCrashlyticsCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboCrashlyticsCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboCrashlyticsCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboCrashlyticsCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value checkForUnsentReports(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::checkForUnsentReports) == 1, + "Expected checkForUnsentReports(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::checkForUnsentReports, jsInvoker_, instance_); + } + void crash(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::crash) == 1, + "Expected crash(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::crash, jsInvoker_, instance_); + } + jsi::Value crashWithStackPromise(jsi::Runtime &rt, jsi::Object jsErrorDict) override { + static_assert( + bridging::getParameterCount(&T::crashWithStackPromise) == 2, + "Expected crashWithStackPromise(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::crashWithStackPromise, jsInvoker_, instance_, std::move(jsErrorDict)); + } + jsi::Value deleteUnsentReports(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::deleteUnsentReports) == 1, + "Expected deleteUnsentReports(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::deleteUnsentReports, jsInvoker_, instance_); + } + jsi::Value didCrashOnPreviousExecution(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::didCrashOnPreviousExecution) == 1, + "Expected didCrashOnPreviousExecution(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::didCrashOnPreviousExecution, jsInvoker_, instance_); + } + void log(jsi::Runtime &rt, jsi::String message) override { + static_assert( + bridging::getParameterCount(&T::log) == 2, + "Expected log(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::log, jsInvoker_, instance_, std::move(message)); + } + jsi::Value logPromise(jsi::Runtime &rt, jsi::String message) override { + static_assert( + bridging::getParameterCount(&T::logPromise) == 2, + "Expected logPromise(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::logPromise, jsInvoker_, instance_, std::move(message)); + } + void sendUnsentReports(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::sendUnsentReports) == 1, + "Expected sendUnsentReports(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::sendUnsentReports, jsInvoker_, instance_); + } + jsi::Value setAttribute(jsi::Runtime &rt, jsi::String key, jsi::String value) override { + static_assert( + bridging::getParameterCount(&T::setAttribute) == 3, + "Expected setAttribute(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setAttribute, jsInvoker_, instance_, std::move(key), std::move(value)); + } + jsi::Value setAttributes(jsi::Runtime &rt, jsi::Object attributes) override { + static_assert( + bridging::getParameterCount(&T::setAttributes) == 2, + "Expected setAttributes(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setAttributes, jsInvoker_, instance_, std::move(attributes)); + } + jsi::Value setUserId(jsi::Runtime &rt, jsi::String userId) override { + static_assert( + bridging::getParameterCount(&T::setUserId) == 2, + "Expected setUserId(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setUserId, jsInvoker_, instance_, std::move(userId)); + } + void recordError(jsi::Runtime &rt, jsi::Object jsErrorDict) override { + static_assert( + bridging::getParameterCount(&T::recordError) == 2, + "Expected recordError(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::recordError, jsInvoker_, instance_, std::move(jsErrorDict)); + } + jsi::Value recordErrorPromise(jsi::Runtime &rt, jsi::Object jsErrorDict) override { + static_assert( + bridging::getParameterCount(&T::recordErrorPromise) == 2, + "Expected recordErrorPromise(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::recordErrorPromise, jsInvoker_, instance_, std::move(jsErrorDict)); + } + jsi::Value setCrashlyticsCollectionEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setCrashlyticsCollectionEnabled) == 2, + "Expected setCrashlyticsCollectionEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setCrashlyticsCollectionEnabled, jsInvoker_, instance_, std::move(enabled)); + } + + private: + friend class NativeRNFBTurboCrashlyticsCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/crashlytics/ios/RNFBCrashlytics.xcodeproj/project.pbxproj b/packages/crashlytics/ios/RNFBCrashlytics.xcodeproj/project.pbxproj index 486abd917e..ff6ad1639d 100644 --- a/packages/crashlytics/ios/RNFBCrashlytics.xcodeproj/project.pbxproj +++ b/packages/crashlytics/ios/RNFBCrashlytics.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBCrashlyticsModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBCrashlyticsModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBCrashlyticsModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBCrashlyticsModule.mm */; }; 2748D82422371C1C00FC8DC8 /* RNFBCrashlyticsInitProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 2748D82322371C1C00FC8DC8 /* RNFBCrashlyticsInitProvider.m */; }; C66637BB25FA560700DCAA51 /* RNFBCrashlyticsNativeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = C66637BA25FA560700DCAA51 /* RNFBCrashlyticsNativeHelper.m */; }; /* End PBXBuildFile section */ @@ -27,7 +27,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBCrashlytics.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBCrashlytics.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBCrashlyticsModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBCrashlyticsModule.h; path = RNFBCrashlytics/RNFBCrashlyticsModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBCrashlyticsModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBCrashlyticsModule.m; path = RNFBCrashlytics/RNFBCrashlyticsModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBCrashlyticsModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = RNFBCrashlyticsModule.mm; path = RNFBCrashlytics/RNFBCrashlyticsModule.mm; sourceTree = SOURCE_ROOT; }; 2748D82222371C0900FC8DC8 /* RNFBCrashlyticsInitProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBCrashlyticsInitProvider.h; sourceTree = ""; }; 2748D82322371C1C00FC8DC8 /* RNFBCrashlyticsInitProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBCrashlyticsInitProvider.m; sourceTree = ""; }; C66637BA25FA560700DCAA51 /* RNFBCrashlyticsNativeHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBCrashlyticsNativeHelper.m; sourceTree = ""; }; @@ -57,7 +57,7 @@ isa = PBXGroup; children = ( 2744B98421F45429004F8E3F /* RNFBCrashlyticsModule.h */, - 2744B98521F45429004F8E3F /* RNFBCrashlyticsModule.m */, + 2744B98521F45429004F8E3F /* RNFBCrashlyticsModule.mm */, 2748D82222371C0900FC8DC8 /* RNFBCrashlyticsInitProvider.h */, 2748D82322371C1C00FC8DC8 /* RNFBCrashlyticsInitProvider.m */, C66637BD25FA561D00DCAA51 /* RNFBCrashlyticsNativeHelper.h */, @@ -134,7 +134,7 @@ files = ( C66637BB25FA560700DCAA51 /* RNFBCrashlyticsNativeHelper.m in Sources */, 2748D82422371C1C00FC8DC8 /* RNFBCrashlyticsInitProvider.m in Sources */, - 2744B98621F45429004F8E3F /* RNFBCrashlyticsModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBCrashlyticsModule.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.h b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.h index c7b17392df..d9a51bb4b2 100644 --- a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.h +++ b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.h @@ -16,9 +16,8 @@ */ #import +#import "RNFBCrashlyticsTurboModules.h" -#import - -@interface RNFBCrashlyticsModule : NSObject +@interface RNFBCrashlyticsModule : NSObject @end diff --git a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.m b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.mm similarity index 58% rename from packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.m rename to packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.mm index ada982b7a1..6187c16ee9 100644 --- a/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.m +++ b/packages/crashlytics/ios/RNFBCrashlytics/RNFBCrashlyticsModule.mm @@ -29,12 +29,19 @@ #import "RNFBPreferences.h" @implementation RNFBCrashlyticsModule -#pragma mark - -#pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboCrashlytics) -- (NSDictionary *)constantsToExport { ++ (BOOL)requiresMainQueueSetup { + return NO; +} + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +- (NSDictionary *)crashlyticsConstantsDictionary { NSMutableDictionary *constants = [NSMutableDictionary new]; constants[@"isCrashlyticsCollectionEnabled"] = @([RCTConvert BOOL:@([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled])]); @@ -50,31 +57,29 @@ - (NSDictionary *)constantsToExport { return constants; } -+ (BOOL)requiresMainQueueSetup { - return NO; +- (facebook::react::ModuleConstants) + constantsToExport { + return [_RCTTypedModuleConstants newWithUnsafeDictionary:[self crashlyticsConstantsDictionary]]; } -#pragma mark - -#pragma mark Firebase Crashlytics Methods +- (facebook::react::ModuleConstants) + getConstants { + return [self constantsToExport]; +} -RCT_EXPORT_METHOD(checkForUnsentReports - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)checkForUnsentReports:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { [[FIRCrashlytics crashlytics] checkForUnsentReportsWithCompletion:^(BOOL unsentReports) { resolve([NSNumber numberWithBool:unsentReports]); }]; } -RCT_EXPORT_METHOD(crash) { +- (void)crash { if ([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled]) { if ([self isDebuggerAttached]) { RCTLog( @"Crashlytics - WARNING: Debugger detected. Crashlytics will not receive crash reports."); } - // https://firebase.google.com/docs/crashlytics/test-implementation?platform=ios recommends - // using "@[][1]" to crash, but that gets caught by react-native and shown as a red box for - // debug builds. Raise SIGSEGV here to generate a hard crash. int *p = 0; *p = 0; } else { @@ -82,10 +87,9 @@ + (BOOL)requiresMainQueueSetup { } } -RCT_EXPORT_METHOD(crashWithStackPromise - : (NSDictionary *)jsErrorDict resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)crashWithStackPromise:(JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject &)jsErrorDict + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { if ([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled]) { if ([self isDebuggerAttached]) { RCTLog( @@ -93,9 +97,6 @@ + (BOOL)requiresMainQueueSetup { } [self recordJavaScriptError:jsErrorDict]; - // This is strongly discouraged by Apple as "it will appear as though your app has crashed". - // Coincidentally, we are *in* a crash handler and have logged a crash report. - // It seems like the one place calling exit cleanly is valid. ELog(@"Crashlytics - Crash logged. Terminating app."); exit(0); } else { @@ -104,42 +105,45 @@ + (BOOL)requiresMainQueueSetup { resolve([NSNull null]); } -RCT_EXPORT_METHOD(deleteUnsentReports) { [[FIRCrashlytics crashlytics] deleteUnsentReports]; } +- (void)deleteUnsentReports:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { + [[FIRCrashlytics crashlytics] deleteUnsentReports]; + resolve([NSNull null]); +} -RCT_EXPORT_METHOD(didCrashOnPreviousExecution - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)didCrashOnPreviousExecution:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { BOOL didCrash = [[FIRCrashlytics crashlytics] didCrashDuringPreviousExecution]; resolve([NSNumber numberWithBool:didCrash]); } -RCT_EXPORT_METHOD(log : (NSString *)message) { [[FIRCrashlytics crashlytics] log:message]; } +- (void)log:(NSString *)message { + [[FIRCrashlytics crashlytics] log:message]; +} -RCT_EXPORT_METHOD(logPromise - : (NSString *)message resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)logPromise:(NSString *)message + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [[FIRCrashlytics crashlytics] log:message]; resolve([NSNull null]); } -RCT_EXPORT_METHOD(sendUnsentReports) { [[FIRCrashlytics crashlytics] sendUnsentReports]; } +- (void)sendUnsentReports { + [[FIRCrashlytics crashlytics] sendUnsentReports]; +} -RCT_EXPORT_METHOD(setAttribute - : (NSString *)key value - : (NSString *)value resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setAttribute:(NSString *)key + value:(NSString *)value + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { if ([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled]) { [[FIRCrashlytics crashlytics] setCustomValue:value forKey:key]; } resolve([NSNull null]); } -RCT_EXPORT_METHOD(setAttributes - : (NSDictionary *)attributes resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setAttributes:(NSDictionary *)attributes + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { if ([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled]) { NSArray *keys = [attributes allKeys]; @@ -150,52 +154,48 @@ + (BOOL)requiresMainQueueSetup { resolve([NSNull null]); } -RCT_EXPORT_METHOD(setUserId - : (NSString *)userId resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setUserId:(NSString *)userId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { if ([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled]) { [[FIRCrashlytics crashlytics] setUserID:userId]; } resolve([NSNull null]); } -RCT_EXPORT_METHOD(recordError : (NSDictionary *)jsErrorDict) { +- (void)recordError:(JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject &)jsErrorDict { if ([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled]) { [self recordJavaScriptError:jsErrorDict]; } } -RCT_EXPORT_METHOD(recordErrorPromise - : (NSDictionary *)jsErrorDict resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)recordErrorPromise:(JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject &)jsErrorDict + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { if ([RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled]) { [self recordJavaScriptError:jsErrorDict]; } resolve([NSNull null]); } -RCT_EXPORT_METHOD(setCrashlyticsCollectionEnabled - : (BOOL)enabled resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setCrashlyticsCollectionEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [[RNFBPreferences shared] setBooleanValue:@"crashlytics_auto_collection_enabled" boolValue:enabled]; resolve([NSNull null]); } -- (void)recordJavaScriptError:(NSDictionary *)jsErrorDict { - NSString *message = jsErrorDict[@"message"]; - NSDictionary *stackFrames = jsErrorDict[@"frames"]; +- (void)recordJavaScriptError:(JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject &)jsErrorDict { + NSString *message = jsErrorDict.message(); + auto stackFrames = jsErrorDict.frames(); NSMutableArray *stackTrace = [[NSMutableArray alloc] init]; - BOOL isUnhandledPromiseRejection = [jsErrorDict[@"isUnhandledRejection"] boolValue]; + BOOL isUnhandledPromiseRejection = jsErrorDict.isUnhandledRejection(); - for (NSDictionary *stackFrame in stackFrames) { - FIRStackFrame *customFrame = - [FIRStackFrame stackFrameWithSymbol:stackFrame[@"fn"] - file:stackFrame[@"file"] - line:(uint32_t)[stackFrame[@"line"] intValue]]; + for (const auto &stackFrame : stackFrames) { + FIRStackFrame *customFrame = [FIRStackFrame stackFrameWithSymbol:stackFrame.fn() + file:stackFrame.file() + line:(uint32_t)stackFrame.line()]; [stackTrace addObject:customFrame]; } @@ -211,14 +211,6 @@ - (void)recordJavaScriptError:(NSDictionary *)jsErrorDict { [[FIRCrashlytics crashlytics] recordExceptionModel:exceptionModel]; } -/** - * Check if the debugger is attached - * - * Taken from - * https://github.com/plausiblelabs/plcrashreporter/blob/2dd862ce049e6f43feb355308dfc710f3af54c4d/Source/Crash%20Demo/main.m#L96 - * - * @return `YES` if the debugger is attached to the current process, `NO` otherwise - */ - (BOOL)isDebuggerAttached { static BOOL debuggerIsAttached = NO; @@ -231,7 +223,7 @@ - (BOOL)isDebuggerAttached { name[0] = CTL_KERN; name[1] = KERN_PROC; name[2] = KERN_PROC_PID; - name[3] = getpid(); // from unistd.h, included by Foundation + name[3] = getpid(); if (sysctl(name, 4, &info, &info_size, NULL, 0) == -1) { ELog(@"Crashlytics ERROR: Checking for a running debugger via sysctl() failed: %s", diff --git a/packages/crashlytics/ios/generated/RCTAppDependencyProvider.h b/packages/crashlytics/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/crashlytics/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/crashlytics/ios/generated/RCTAppDependencyProvider.mm b/packages/crashlytics/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/crashlytics/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/crashlytics/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/crashlytics/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/crashlytics/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/crashlytics/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/crashlytics/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/crashlytics/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/crashlytics/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/crashlytics/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/crashlytics/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/crashlytics/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/crashlytics/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/crashlytics/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModules-generated.mm b/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModules-generated.mm new file mode 100644 index 0000000000..ae83d8eea8 --- /dev/null +++ b/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModules-generated.mm @@ -0,0 +1,148 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBCrashlyticsTurboModules.h" + + +@implementation NativeRNFBTurboCrashlyticsSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + +@implementation RCTCxxConvert (NativeRNFBTurboCrashlytics_CrashlyticsStackFrame) ++ (RCTManagedPointer *)JS_NativeRNFBTurboCrashlytics_CrashlyticsStackFrame:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +@implementation RCTCxxConvert (NativeRNFBTurboCrashlytics_JavaScriptErrorObject) ++ (RCTManagedPointer *)JS_NativeRNFBTurboCrashlytics_JavaScriptErrorObject:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_checkForUnsentReports(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "checkForUnsentReports", @selector(checkForUnsentReports:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_crash(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "crash", @selector(crash), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_crashWithStackPromise(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "crashWithStackPromise", @selector(crashWithStackPromise:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_deleteUnsentReports(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "deleteUnsentReports", @selector(deleteUnsentReports:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_didCrashOnPreviousExecution(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "didCrashOnPreviousExecution", @selector(didCrashOnPreviousExecution:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_log(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "log", @selector(log:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_logPromise(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "logPromise", @selector(logPromise:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_sendUnsentReports(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "sendUnsentReports", @selector(sendUnsentReports), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setAttribute(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setAttribute", @selector(setAttribute:value:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setAttributes(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setAttributes", @selector(setAttributes:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setUserId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setUserId", @selector(setUserId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_recordError(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "recordError", @selector(recordError:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_recordErrorPromise(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "recordErrorPromise", @selector(recordErrorPromise:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setCrashlyticsCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setCrashlyticsCollectionEnabled", @selector(setCrashlyticsCollectionEnabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + NativeRNFBTurboCrashlyticsSpecJSI::NativeRNFBTurboCrashlyticsSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["checkForUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_checkForUnsentReports}; + + + methodMap_["crash"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_crash}; + + + methodMap_["crashWithStackPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_crashWithStackPromise}; + setMethodArgConversionSelector(@"crashWithStackPromise", 0, @"JS_NativeRNFBTurboCrashlytics_JavaScriptErrorObject:"); + + methodMap_["deleteUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_deleteUnsentReports}; + + + methodMap_["didCrashOnPreviousExecution"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_didCrashOnPreviousExecution}; + + + methodMap_["log"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_log}; + + + methodMap_["logPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_logPromise}; + + + methodMap_["sendUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_sendUnsentReports}; + + + methodMap_["setAttribute"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setAttribute}; + + + methodMap_["setAttributes"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setAttributes}; + + + methodMap_["setUserId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setUserId}; + + + methodMap_["recordError"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_recordError}; + setMethodArgConversionSelector(@"recordError", 0, @"JS_NativeRNFBTurboCrashlytics_JavaScriptErrorObject:"); + + methodMap_["recordErrorPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_recordErrorPromise}; + setMethodArgConversionSelector(@"recordErrorPromise", 0, @"JS_NativeRNFBTurboCrashlytics_JavaScriptErrorObject:"); + + methodMap_["setCrashlyticsCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_setCrashlyticsCollectionEnabled}; + + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsSpecJSI_getConstants}; + + } +} // namespace facebook::react diff --git a/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModules.h b/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModules.h new file mode 100644 index 0000000000..2ceb253e7b --- /dev/null +++ b/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModules/RNFBCrashlyticsTurboModules.h @@ -0,0 +1,211 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBCrashlyticsTurboModules symbols +#ifndef RNFBCrashlyticsTurboModules_H +#define RNFBCrashlyticsTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN +namespace JS { + namespace NativeRNFBTurboCrashlytics { + struct CrashlyticsStackFrame { + NSString *src() const; + double line() const; + double col() const; + NSString *fn() const; + NSString *file() const; + + CrashlyticsStackFrame(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboCrashlytics_CrashlyticsStackFrame) ++ (RCTManagedPointer *)JS_NativeRNFBTurboCrashlytics_CrashlyticsStackFrame:(id)json; +@end +namespace JS { + namespace NativeRNFBTurboCrashlytics { + struct JavaScriptErrorObject { + NSString *message() const; + bool isUnhandledRejection() const; + facebook::react::LazyVector frames() const; + + JavaScriptErrorObject(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboCrashlytics_JavaScriptErrorObject) ++ (RCTManagedPointer *)JS_NativeRNFBTurboCrashlytics_JavaScriptErrorObject:(id)json; +@end +namespace JS { + namespace NativeRNFBTurboCrashlytics { + struct Constants { + + struct Builder { + struct Input { + RCTRequired isCrashlyticsCollectionEnabled; + RCTRequired isErrorGenerationOnJSCrashEnabled; + RCTRequired isCrashlyticsJavascriptExceptionHandlerChainingEnabled; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeRNFBTurboCrashlyticsSpec + +- (void)checkForUnsentReports:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)crash; +- (void)crashWithStackPromise:(JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject &)jsErrorDict + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)deleteUnsentReports:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)didCrashOnPreviousExecution:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)log:(NSString *)message; +- (void)logPromise:(NSString *)message + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)sendUnsentReports; +- (void)setAttribute:(NSString *)key + value:(NSString *)value + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setAttributes:(NSDictionary *)attributes + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setUserId:(NSString *)userId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)recordError:(JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject &)jsErrorDict; +- (void)recordErrorPromise:(JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject &)jsErrorDict + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setCrashlyticsCollectionEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end + +@interface NativeRNFBTurboCrashlyticsSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboCrashlytics' + */ + class JSI_EXPORT NativeRNFBTurboCrashlyticsSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboCrashlyticsSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +inline NSString *JS::NativeRNFBTurboCrashlytics::CrashlyticsStackFrame::src() const +{ + id const p = _v[@"src"]; + return RCTBridgingToString(p); +} +inline double JS::NativeRNFBTurboCrashlytics::CrashlyticsStackFrame::line() const +{ + id const p = _v[@"line"]; + return RCTBridgingToDouble(p); +} +inline double JS::NativeRNFBTurboCrashlytics::CrashlyticsStackFrame::col() const +{ + id const p = _v[@"col"]; + return RCTBridgingToDouble(p); +} +inline NSString *JS::NativeRNFBTurboCrashlytics::CrashlyticsStackFrame::fn() const +{ + id const p = _v[@"fn"]; + return RCTBridgingToString(p); +} +inline NSString *JS::NativeRNFBTurboCrashlytics::CrashlyticsStackFrame::file() const +{ + id const p = _v[@"file"]; + return RCTBridgingToString(p); +} +inline NSString *JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject::message() const +{ + id const p = _v[@"message"]; + return RCTBridgingToString(p); +} +inline bool JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject::isUnhandledRejection() const +{ + id const p = _v[@"isUnhandledRejection"]; + return RCTBridgingToBool(p); +} +inline facebook::react::LazyVector JS::NativeRNFBTurboCrashlytics::JavaScriptErrorObject::frames() const +{ + id const p = _v[@"frames"]; + return RCTBridgingToVec(p, ^JS::NativeRNFBTurboCrashlytics::CrashlyticsStackFrame(id itemValue_0) { return JS::NativeRNFBTurboCrashlytics::CrashlyticsStackFrame(itemValue_0); }); +} +inline JS::NativeRNFBTurboCrashlytics::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto isCrashlyticsCollectionEnabled = i.isCrashlyticsCollectionEnabled.get(); + d[@"isCrashlyticsCollectionEnabled"] = @(isCrashlyticsCollectionEnabled); + auto isErrorGenerationOnJSCrashEnabled = i.isErrorGenerationOnJSCrashEnabled.get(); + d[@"isErrorGenerationOnJSCrashEnabled"] = @(isErrorGenerationOnJSCrashEnabled); + auto isCrashlyticsJavascriptExceptionHandlerChainingEnabled = i.isCrashlyticsJavascriptExceptionHandlerChainingEnabled.get(); + d[@"isCrashlyticsJavascriptExceptionHandlerChainingEnabled"] = @(isCrashlyticsJavascriptExceptionHandlerChainingEnabled); + return d; +}) {} +inline JS::NativeRNFBTurboCrashlytics::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +NS_ASSUME_NONNULL_END +#endif // RNFBCrashlyticsTurboModules_H diff --git a/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModulesJSI-generated.cpp b/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..2cced4c468 --- /dev/null +++ b/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModulesJSI-generated.cpp @@ -0,0 +1,124 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBCrashlyticsTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_checkForUnsentReports(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->checkForUnsentReports( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_crash(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->crash( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_crashWithStackPromise(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->crashWithStackPromise( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_deleteUnsentReports(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteUnsentReports( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_didCrashOnPreviousExecution(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->didCrashOnPreviousExecution( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_log(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->log( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_logPromise(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->logPromise( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_sendUnsentReports(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->sendUnsentReports( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setAttribute(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAttribute( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setAttributes(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAttributes( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setUserId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setUserId( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_recordError(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->recordError( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_recordErrorPromise(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->recordErrorPromise( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setCrashlyticsCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setCrashlyticsCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} + +NativeRNFBTurboCrashlyticsCxxSpecJSI::NativeRNFBTurboCrashlyticsCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboCrashlytics", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_getConstants}; + methodMap_["checkForUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_checkForUnsentReports}; + methodMap_["crash"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_crash}; + methodMap_["crashWithStackPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_crashWithStackPromise}; + methodMap_["deleteUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_deleteUnsentReports}; + methodMap_["didCrashOnPreviousExecution"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_didCrashOnPreviousExecution}; + methodMap_["log"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_log}; + methodMap_["logPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_logPromise}; + methodMap_["sendUnsentReports"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_sendUnsentReports}; + methodMap_["setAttribute"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setAttribute}; + methodMap_["setAttributes"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setAttributes}; + methodMap_["setUserId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setUserId}; + methodMap_["recordError"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_recordError}; + methodMap_["recordErrorPromise"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_recordErrorPromise}; + methodMap_["setCrashlyticsCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboCrashlyticsCxxSpecJSI_setCrashlyticsCollectionEnabled}; +} + + +} // namespace facebook::react diff --git a/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModulesJSI.h b/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModulesJSI.h new file mode 100644 index 0000000000..9ec0c424d0 --- /dev/null +++ b/packages/crashlytics/ios/generated/RNFBCrashlyticsTurboModulesJSI.h @@ -0,0 +1,320 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboCrashlyticsCrashlyticsStackFrame + +template +struct NativeRNFBTurboCrashlyticsCrashlyticsStackFrame { + P0 src; + P1 line; + P2 col; + P3 fn; + P4 file; + bool operator==(const NativeRNFBTurboCrashlyticsCrashlyticsStackFrame &other) const { + return src == other.src && line == other.line && col == other.col && fn == other.fn && file == other.file; + } +}; + +template +struct NativeRNFBTurboCrashlyticsCrashlyticsStackFrameBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "src"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "line"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "col"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "fn"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "file"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String srcToJs(jsi::Runtime &rt, decltype(types.src) value) { + return bridging::toJs(rt, value); + } + + static double lineToJs(jsi::Runtime &rt, decltype(types.line) value) { + return bridging::toJs(rt, value); + } + + static double colToJs(jsi::Runtime &rt, decltype(types.col) value) { + return bridging::toJs(rt, value); + } + + static jsi::String fnToJs(jsi::Runtime &rt, decltype(types.fn) value) { + return bridging::toJs(rt, value); + } + + static jsi::String fileToJs(jsi::Runtime &rt, decltype(types.file) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "src", bridging::toJs(rt, value.src, jsInvoker)); + result.setProperty(rt, "line", bridging::toJs(rt, value.line, jsInvoker)); + result.setProperty(rt, "col", bridging::toJs(rt, value.col, jsInvoker)); + result.setProperty(rt, "fn", bridging::toJs(rt, value.fn, jsInvoker)); + result.setProperty(rt, "file", bridging::toJs(rt, value.file, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboCrashlyticsJavaScriptErrorObject + +template +struct NativeRNFBTurboCrashlyticsJavaScriptErrorObject { + P0 message; + P1 isUnhandledRejection; + P2 frames; + bool operator==(const NativeRNFBTurboCrashlyticsJavaScriptErrorObject &other) const { + return message == other.message && isUnhandledRejection == other.isUnhandledRejection && frames == other.frames; + } +}; + +template +struct NativeRNFBTurboCrashlyticsJavaScriptErrorObjectBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "message"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "isUnhandledRejection"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "frames"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String messageToJs(jsi::Runtime &rt, decltype(types.message) value) { + return bridging::toJs(rt, value); + } + + static bool isUnhandledRejectionToJs(jsi::Runtime &rt, decltype(types.isUnhandledRejection) value) { + return bridging::toJs(rt, value); + } + + static jsi::Array framesToJs(jsi::Runtime &rt, decltype(types.frames) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "message", bridging::toJs(rt, value.message, jsInvoker)); + result.setProperty(rt, "isUnhandledRejection", bridging::toJs(rt, value.isUnhandledRejection, jsInvoker)); + result.setProperty(rt, "frames", bridging::toJs(rt, value.frames, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboCrashlyticsCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboCrashlyticsCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value checkForUnsentReports(jsi::Runtime &rt) = 0; + virtual void crash(jsi::Runtime &rt) = 0; + virtual jsi::Value crashWithStackPromise(jsi::Runtime &rt, jsi::Object jsErrorDict) = 0; + virtual jsi::Value deleteUnsentReports(jsi::Runtime &rt) = 0; + virtual jsi::Value didCrashOnPreviousExecution(jsi::Runtime &rt) = 0; + virtual void log(jsi::Runtime &rt, jsi::String message) = 0; + virtual jsi::Value logPromise(jsi::Runtime &rt, jsi::String message) = 0; + virtual void sendUnsentReports(jsi::Runtime &rt) = 0; + virtual jsi::Value setAttribute(jsi::Runtime &rt, jsi::String key, jsi::String value) = 0; + virtual jsi::Value setAttributes(jsi::Runtime &rt, jsi::Object attributes) = 0; + virtual jsi::Value setUserId(jsi::Runtime &rt, jsi::String userId) = 0; + virtual void recordError(jsi::Runtime &rt, jsi::Object jsErrorDict) = 0; + virtual jsi::Value recordErrorPromise(jsi::Runtime &rt, jsi::Object jsErrorDict) = 0; + virtual jsi::Value setCrashlyticsCollectionEnabled(jsi::Runtime &rt, bool enabled) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboCrashlyticsCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboCrashlytics"; + +protected: + NativeRNFBTurboCrashlyticsCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboCrashlyticsCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboCrashlyticsCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboCrashlyticsCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value checkForUnsentReports(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::checkForUnsentReports) == 1, + "Expected checkForUnsentReports(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::checkForUnsentReports, jsInvoker_, instance_); + } + void crash(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::crash) == 1, + "Expected crash(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::crash, jsInvoker_, instance_); + } + jsi::Value crashWithStackPromise(jsi::Runtime &rt, jsi::Object jsErrorDict) override { + static_assert( + bridging::getParameterCount(&T::crashWithStackPromise) == 2, + "Expected crashWithStackPromise(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::crashWithStackPromise, jsInvoker_, instance_, std::move(jsErrorDict)); + } + jsi::Value deleteUnsentReports(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::deleteUnsentReports) == 1, + "Expected deleteUnsentReports(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::deleteUnsentReports, jsInvoker_, instance_); + } + jsi::Value didCrashOnPreviousExecution(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::didCrashOnPreviousExecution) == 1, + "Expected didCrashOnPreviousExecution(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::didCrashOnPreviousExecution, jsInvoker_, instance_); + } + void log(jsi::Runtime &rt, jsi::String message) override { + static_assert( + bridging::getParameterCount(&T::log) == 2, + "Expected log(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::log, jsInvoker_, instance_, std::move(message)); + } + jsi::Value logPromise(jsi::Runtime &rt, jsi::String message) override { + static_assert( + bridging::getParameterCount(&T::logPromise) == 2, + "Expected logPromise(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::logPromise, jsInvoker_, instance_, std::move(message)); + } + void sendUnsentReports(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::sendUnsentReports) == 1, + "Expected sendUnsentReports(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::sendUnsentReports, jsInvoker_, instance_); + } + jsi::Value setAttribute(jsi::Runtime &rt, jsi::String key, jsi::String value) override { + static_assert( + bridging::getParameterCount(&T::setAttribute) == 3, + "Expected setAttribute(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setAttribute, jsInvoker_, instance_, std::move(key), std::move(value)); + } + jsi::Value setAttributes(jsi::Runtime &rt, jsi::Object attributes) override { + static_assert( + bridging::getParameterCount(&T::setAttributes) == 2, + "Expected setAttributes(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setAttributes, jsInvoker_, instance_, std::move(attributes)); + } + jsi::Value setUserId(jsi::Runtime &rt, jsi::String userId) override { + static_assert( + bridging::getParameterCount(&T::setUserId) == 2, + "Expected setUserId(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setUserId, jsInvoker_, instance_, std::move(userId)); + } + void recordError(jsi::Runtime &rt, jsi::Object jsErrorDict) override { + static_assert( + bridging::getParameterCount(&T::recordError) == 2, + "Expected recordError(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::recordError, jsInvoker_, instance_, std::move(jsErrorDict)); + } + jsi::Value recordErrorPromise(jsi::Runtime &rt, jsi::Object jsErrorDict) override { + static_assert( + bridging::getParameterCount(&T::recordErrorPromise) == 2, + "Expected recordErrorPromise(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::recordErrorPromise, jsInvoker_, instance_, std::move(jsErrorDict)); + } + jsi::Value setCrashlyticsCollectionEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setCrashlyticsCollectionEnabled) == 2, + "Expected setCrashlyticsCollectionEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setCrashlyticsCollectionEnabled, jsInvoker_, instance_, std::move(enabled)); + } + + private: + friend class NativeRNFBTurboCrashlyticsCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/crashlytics/ios/generated/ReactAppDependencyProvider.podspec b/packages/crashlytics/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/crashlytics/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/crashlytics/lib/index.ts b/packages/crashlytics/lib/index.ts index 7b1e612499..6a6740cd61 100644 --- a/packages/crashlytics/lib/index.ts +++ b/packages/crashlytics/lib/index.ts @@ -40,7 +40,7 @@ import type { Crashlytics } from './types/crashlytics'; import type { CrashlyticsInternal } from './types/internal'; import type { ReactNativeFirebase } from '@react-native-firebase/app'; -const nativeModuleName = 'RNFBCrashlyticsModule'; +const nativeModuleName = 'NativeRNFBTurboCrashlytics'; class FirebaseCrashlyticsModule extends FirebaseModule { _isCrashlyticsCollectionEnabled: boolean; @@ -124,9 +124,13 @@ class FirebaseCrashlyticsModule extends FirebaseModule { recordError(error: Error, jsErrorName?: string): void { if (isError(error)) { - StackTrace.fromError(error, { offline: true }).then(stackFrames => { - this.native.recordError(createNativeErrorObj(error, stackFrames, false, jsErrorName)); - }); + StackTrace.fromError(error, { offline: true }) + .then(stackFrames => + this.native.recordErrorPromise( + createNativeErrorObj(error, stackFrames, false, jsErrorName), + ), + ) + .catch(() => {}); } else { console.warn( 'firebase.crashlytics().recordError(*) expects an instance of Error. Non Errors will be ignored.', @@ -158,6 +162,7 @@ const config: ModuleConfig = { nativeEvents: false, hasMultiAppSupport: false, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; export const SDK_VERSION = version; diff --git a/packages/crashlytics/lib/types/internal.ts b/packages/crashlytics/lib/types/internal.ts index bbffb2201a..aac8e13d4a 100644 --- a/packages/crashlytics/lib/types/internal.ts +++ b/packages/crashlytics/lib/types/internal.ts @@ -17,7 +17,7 @@ import type { Crashlytics } from './crashlytics'; -export interface RNFBCrashlyticsModule { +export interface NativeRNFBTurboCrashlytics { isCrashlyticsCollectionEnabled: boolean; isErrorGenerationOnJSCrashEnabled: boolean; isCrashlyticsJavascriptExceptionHandlerChainingEnabled: boolean; @@ -39,7 +39,7 @@ export interface RNFBCrashlyticsModule { declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBCrashlyticsModule: RNFBCrashlyticsModule; + NativeRNFBTurboCrashlytics: NativeRNFBTurboCrashlytics; } } @@ -55,5 +55,5 @@ export interface CrashlyticsInternal extends Crashlytics { setAttribute(name: string, value: string): Promise; setAttributes(attributes: { [key: string]: string }): Promise; setCrashlyticsCollectionEnabled(enabled: boolean): Promise; - readonly native: RNFBCrashlyticsModule; + readonly native: NativeRNFBTurboCrashlytics; } diff --git a/packages/crashlytics/package.json b/packages/crashlytics/package.json index 8dde143234..e66d7c51dc 100644 --- a/packages/crashlytics/package.json +++ b/packages/crashlytics/package.json @@ -5,13 +5,30 @@ "description": "React Native Firebase - Firebase Crashlytics is a lightweight, realtime crash reporter that helps you track, prioritize, and fix stability issues that erode your app quality. React Native Firebase provides automatic crash reporting for both native and JavaScript errors, including unhandled promise rejections.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBCrashlyticsTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.crashlytics" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboCrashlytics": "RNFBCrashlyticsModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "build:plugin": "rimraf plugin/build && tsc --build plugin", "lint:plugin": "eslint plugin/src/*", "compile": "bob build", - "prepare": "yarn run build && yarn run build:plugin && yarn compile" + "prepare": "yarn run build && yarn run build:plugin && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/main/java/io/invertase/firebase/crashlytics/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/crashlytics/react-native.config.js b/packages/crashlytics/react-native.config.js index d2fbbc575e..aee6e5a1f1 100644 --- a/packages/crashlytics/react-native.config.js +++ b/packages/crashlytics/react-native.config.js @@ -1,34 +1,9 @@ -/* - * Copyright (c) 2016-present Invertase Limited & Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this library except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - module.exports = { dependency: { platforms: { - ios: { - scriptPhases: [ - { - name: '[RNFB] Crashlytics Configuration', - path: './ios_config.sh', - execution_position: 'after_compile', - input_files: [ - '${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}', - '$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)', - ], - }, - ], + android: { + cmakeListsPath: + './src/main/java/io/invertase/firebase/crashlytics/generated/jni/CMakeLists.txt', }, }, }, diff --git a/packages/crashlytics/specs/NativeRNFBTurboCrashlytics.ts b/packages/crashlytics/specs/NativeRNFBTurboCrashlytics.ts new file mode 100644 index 0000000000..d9a6d552a8 --- /dev/null +++ b/packages/crashlytics/specs/NativeRNFBTurboCrashlytics.ts @@ -0,0 +1,41 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface CrashlyticsStackFrame { + src: string; + line: number; + col: number; + fn: string; + file: string; +} + +export interface JavaScriptErrorObject { + message: string; + isUnhandledRejection: boolean; + frames: ReadonlyArray; +} + +export interface Spec extends TurboModule { + getConstants(): { + isCrashlyticsCollectionEnabled: boolean; + isErrorGenerationOnJSCrashEnabled: boolean; + isCrashlyticsJavascriptExceptionHandlerChainingEnabled: boolean; + }; + + checkForUnsentReports(): Promise; + crash(): void; + crashWithStackPromise(jsErrorDict: JavaScriptErrorObject): Promise; + deleteUnsentReports(): Promise; + didCrashOnPreviousExecution(): Promise; + log(message: string): void; + logPromise(message: string): Promise; + sendUnsentReports(): void; + setAttribute(key: string, value: string): Promise; + setAttributes(attributes: { [key: string]: string }): Promise; + setUserId(userId: string): Promise; + recordError(jsErrorDict: JavaScriptErrorObject): void; + recordErrorPromise(jsErrorDict: JavaScriptErrorObject): Promise; + setCrashlyticsCollectionEnabled(enabled: boolean): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboCrashlytics'); diff --git a/packages/database/RNFBDatabase.podspec b/packages/database/RNFBDatabase.podspec index cc37ff2a6b..020ecc9e2f 100644 --- a/packages/database/RNFBDatabase.podspec +++ b/packages/database/RNFBDatabase.podspec @@ -28,15 +28,27 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp}' + s.private_header_files = [ + 'ios/RNFBDatabase/RNFBDatabaseModule.h', + 'ios/RNFBDatabase/RNFBDatabaseReferenceModule.h', + 'ios/RNFBDatabase/RNFBDatabaseQueryModule.h', + 'ios/RNFBDatabase/RNFBDatabaseOnDisconnectModule.h', + 'ios/RNFBDatabase/RNFBDatabaseTransactionModule.h', + 'ios/generated/**/*.h', + ] + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' + + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ios/generated/RNFBDatabaseTurboModules\" \"$(PODS_TARGET_SRCROOT)/ios/generated\"", + } s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/database/__tests__/database.test.ts b/packages/database/__tests__/database.test.ts index fc1d58fb11..05a20a924b 100644 --- a/packages/database/__tests__/database.test.ts +++ b/packages/database/__tests__/database.test.ts @@ -229,4 +229,33 @@ describe('Database', function () { expect(update).toBeDefined(); }); }); + + describe('synchronous connection control parity', function () { + it('`goOnline()` and `goOffline()` return synchronously (not Promises)', function () { + const db = getDatabase(); + + const onlineResult = goOnline(db); + expect(onlineResult).toBeUndefined(); + expect(onlineResult).not.toBeInstanceOf(Promise); + + const offlineResult = goOffline(db); + expect(offlineResult).toBeUndefined(); + expect(offlineResult).not.toBeInstanceOf(Promise); + }); + + it('database instance `goOnline()` / `goOffline()` return synchronously (not Promises)', function () { + const db = getDatabase() as ReturnType & { + goOnline(): void; + goOffline(): void; + }; + + const onlineResult = db.goOnline(); + expect(onlineResult).toBeUndefined(); + expect(onlineResult).not.toBeInstanceOf(Promise); + + const offlineResult = db.goOffline(); + expect(offlineResult).toBeUndefined(); + expect(offlineResult).not.toBeInstanceOf(Promise); + }); + }); }); diff --git a/packages/database/__tests__/nativeModuleContract.test.ts b/packages/database/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..a6000e3e35 --- /dev/null +++ b/packages/database/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,199 @@ +import { beforeEach, describe, expect, it, jest } from '@jest/globals'; +import { TurboModuleRegistry } from 'react-native'; +import type { ModuleConfig } from '@react-native-firebase/app/dist/module/internal'; +import FirebaseModule from '@react-native-firebase/app/dist/module/internal/FirebaseModule'; +import { getNativeModule } from '@react-native-firebase/app/dist/module/internal/registry/nativeModule'; +import type { WrappedNativeModule } from '@react-native-firebase/app/dist/module/internal/NativeModules'; +import { createTurboModuleFixture } from '../../app/__tests__/turboModuleContractHelper'; + +const defaultTurboModuleRegistryGet = jest.mocked(TurboModuleRegistry.get).getMockImplementation(); + +const MAIN_METHODS = [ + 'goOnline', + 'goOffline', + 'setPersistenceEnabled', + 'setLoggingEnabled', + 'setPersistenceCacheSizeBytes', + 'useEmulator', +] as const; + +const REFERENCE_METHODS = ['set', 'update', 'setWithPriority', 'remove', 'setPriority'] as const; + +const QUERY_METHODS = ['once', 'on', 'off', 'keepSynced'] as const; + +const ON_DISCONNECT_METHODS = [ + 'onDisconnectCancel', + 'onDisconnectRemove', + 'onDisconnectSet', + 'onDisconnectSetWithPriority', + 'onDisconnectUpdate', +] as const; + +const TRANSACTION_METHODS = ['transactionStart', 'transactionTryCommit'] as const; + +const HOST_METHOD_GROUPS = [ + { host: 'NativeRNFBTurboDatabase', methods: MAIN_METHODS }, + { host: 'NativeRNFBTurboDatabaseReference', methods: REFERENCE_METHODS }, + { host: 'NativeRNFBTurboDatabaseQuery', methods: QUERY_METHODS }, + { host: 'NativeRNFBTurboDatabaseOnDisconnect', methods: ON_DISCONNECT_METHODS }, + { host: 'NativeRNFBTurboDatabaseTransaction', methods: TRANSACTION_METHODS }, +] as const; + +const ALL_SPEC_METHODS = [ + ...MAIN_METHODS, + ...REFERENCE_METHODS, + ...QUERY_METHODS, + ...ON_DISCONNECT_METHODS, + ...TRANSACTION_METHODS, +]; + +const MERGE_CONFIG: ModuleConfig = { + namespace: 'databaseContract', + nativeModuleName: HOST_METHOD_GROUPS.map(group => group.host), + nativeEvents: ['database_transaction_event', 'database_sync_event'], + hasMultiAppSupport: true, + hasCustomUrlOrRegionSupport: true, + turboModule: true, +}; + +function createMergeModule(namespace = MERGE_CONFIG.namespace): FirebaseModule { + class MergeModule extends FirebaseModule { + constructor() { + super({ name: '[DEFAULT]' } as any, { ...MERGE_CONFIG, namespace }); + } + } + + return new MergeModule(); +} + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + beforeEach(function () { + const turboModuleGet = jest.mocked(TurboModuleRegistry.get); + turboModuleGet.mockReset(); + if (defaultTurboModuleRegistryGet) { + turboModuleGet.mockImplementation(defaultTurboModuleRegistryGet); + } + }); + + it('asserts merged Database spec method names are unique (NewArch-AD-11)', function () { + expect(new Set(ALL_SPEC_METHODS).size).toBe(ALL_SPEC_METHODS.length); + expect(ALL_SPEC_METHODS).toHaveLength(22); + }); + + it('asserts per-host method counts match ALL_SPEC_METHODS grouping', function () { + expect(MAIN_METHODS).toHaveLength(6); + expect(REFERENCE_METHODS).toHaveLength(5); + expect(QUERY_METHODS).toHaveLength(4); + expect(ON_DISCONNECT_METHODS).toHaveLength(5); + expect(TRANSACTION_METHODS).toHaveLength(2); + expect(HOST_METHOD_GROUPS).toHaveLength(5); + + const groupedMethods = HOST_METHOD_GROUPS.flatMap(group => group.methods); + expect(groupedMethods).toEqual(ALL_SPEC_METHODS); + expect(new Set(groupedMethods).size).toBe(ALL_SPEC_METHODS.length); + }); + + it('routes methods through a 5-host merge composite Proxy (NewArch-AD-14a)', function () { + const mainMethod = jest.fn(() => 'main'); + const referenceMethod = jest.fn(() => 'reference'); + const queryMethod = jest.fn(() => 'query'); + const onDisconnectMethod = jest.fn(() => 'onDisconnect'); + const transactionMethod = jest.fn(() => 'transaction'); + + const hostMain = createTurboModuleFixture({ goOnline: mainMethod }); + const hostReference = createTurboModuleFixture({ set: referenceMethod }); + const hostQuery = createTurboModuleFixture({ once: queryMethod }); + const hostOnDisconnect = createTurboModuleFixture({ onDisconnectSet: onDisconnectMethod }); + const hostTransaction = createTurboModuleFixture({ transactionStart: transactionMethod }); + + jest + .mocked(TurboModuleRegistry.get) + .mockReturnValueOnce(hostMain) + .mockReturnValueOnce(hostReference) + .mockReturnValueOnce(hostQuery) + .mockReturnValueOnce(hostOnDisconnect) + .mockReturnValueOnce(hostTransaction); + + const wrapped = getNativeModule(createMergeModule()) as WrappedNativeModule & { + goOnline: () => string; + set: () => string; + once: () => string; + onDisconnectSet: () => string; + transactionStart: () => string; + }; + + expect(wrapped.goOnline()).toBe('main'); + expect(wrapped.set()).toBe('reference'); + expect(wrapped.once()).toBe('query'); + expect(wrapped.onDisconnectSet()).toBe('onDisconnect'); + expect(wrapped.transactionStart()).toBe('transaction'); + expect(mainMethod).toHaveBeenCalledTimes(1); + expect(referenceMethod).toHaveBeenCalledTimes(1); + expect(queryMethod).toHaveBeenCalledTimes(1); + expect(onDisconnectMethod).toHaveBeenCalledTimes(1); + expect(transactionMethod).toHaveBeenCalledTimes(1); + expect(Object.keys(wrapped).sort()).toEqual([ + 'goOnline', + 'onDisconnectSet', + 'once', + 'set', + 'transactionStart', + ]); + }); + + it('routes every host method through the 5-host merge composite Proxy', function () { + const mocks = Object.fromEntries( + ALL_SPEC_METHODS.map(method => [method, jest.fn(() => method)]), + ) as Record<(typeof ALL_SPEC_METHODS)[number], jest.Mock>; + + for (const group of HOST_METHOD_GROUPS) { + const hostMethods = Object.fromEntries(group.methods.map(method => [method, mocks[method]])); + jest + .mocked(TurboModuleRegistry.get) + .mockReturnValueOnce(createTurboModuleFixture(hostMethods)); + } + + const wrapped = getNativeModule( + createMergeModule('databaseContractAllMethods'), + ) as WrappedNativeModule & Record<(typeof ALL_SPEC_METHODS)[number], () => string>; + + for (const method of ALL_SPEC_METHODS) { + expect(wrapped[method]()).toBe(method); + expect(mocks[method]).toHaveBeenCalledTimes(1); + expect(Object.keys(wrapped)).toContain(method); + } + + expect(Object.keys(wrapped).sort()).toEqual([...ALL_SPEC_METHODS].sort()); + }); + it('returns synchronously from goOnline and goOffline on the main host (Phase S)', function () { + const goOnlineMock = jest.fn(); + const goOfflineMock = jest.fn(); + + jest + .mocked(TurboModuleRegistry.get) + .mockReturnValueOnce( + createTurboModuleFixture({ goOnline: goOnlineMock, goOffline: goOfflineMock }), + ) + .mockReturnValueOnce(createTurboModuleFixture({})) + .mockReturnValueOnce(createTurboModuleFixture({})) + .mockReturnValueOnce(createTurboModuleFixture({})) + .mockReturnValueOnce(createTurboModuleFixture({})); + + const wrapped = getNativeModule( + createMergeModule('databaseSyncConnection'), + ) as WrappedNativeModule & { + goOnline: () => unknown; + goOffline: () => unknown; + }; + + const onlineResult = wrapped.goOnline(); + expect(onlineResult).toBeUndefined(); + expect(onlineResult).not.toBeInstanceOf(Promise); + expect(goOnlineMock).toHaveBeenCalledTimes(1); + + const offlineResult = wrapped.goOffline(); + expect(offlineResult).toBeUndefined(); + expect(offlineResult).not.toBeInstanceOf(Promise); + expect(goOfflineMock).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/database/android/build.gradle b/packages/database/android/build.gradle index 99d32b0939..5786070293 100644 --- a/packages/database/android/build.gradle +++ b/packages/database/android/build.gradle @@ -79,6 +79,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -98,3 +99,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/database") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/database/android/src/main/java/io/invertase/firebase/database/UniversalFirebaseDatabaseModule.java b/packages/database/android/src/main/java/io/invertase/firebase/database/UniversalFirebaseDatabaseModule.java index f098e16e3c..b122309e00 100644 --- a/packages/database/android/src/main/java/io/invertase/firebase/database/UniversalFirebaseDatabaseModule.java +++ b/packages/database/android/src/main/java/io/invertase/firebase/database/UniversalFirebaseDatabaseModule.java @@ -20,8 +20,6 @@ import static io.invertase.firebase.database.UniversalFirebaseDatabaseCommon.getDatabaseForApp; import android.content.Context; -import com.google.android.gms.tasks.Task; -import com.google.android.gms.tasks.Tasks; import io.invertase.firebase.common.UniversalFirebaseModule; public class UniversalFirebaseDatabaseModule extends UniversalFirebaseModule { @@ -30,19 +28,11 @@ public class UniversalFirebaseDatabaseModule extends UniversalFirebaseModule { super(context, serviceName); } - Task goOnline(String appName, String dbURL) { - return Tasks.call( - () -> { - getDatabaseForApp(appName, dbURL).goOnline(); - return null; - }); + void goOnline(String appName, String dbURL) { + getDatabaseForApp(appName, dbURL).goOnline(); } - Task goOffline(String appName, String dbURL) { - return Tasks.call( - () -> { - getDatabaseForApp(appName, dbURL).goOffline(); - return null; - }); + void goOffline(String appName, String dbURL) { + getDatabaseForApp(appName, dbURL).goOffline(); } } diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/DatabaseTurboModuleSupport.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/DatabaseTurboModuleSupport.java new file mode 100644 index 0000000000..4b9a0c13e2 --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/DatabaseTurboModuleSupport.java @@ -0,0 +1,56 @@ +package io.invertase.firebase.database; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import androidx.annotation.CallSuper; +import io.invertase.firebase.common.TaskExecutorService; +import java.util.concurrent.ExecutorService; + +/** + * Shared executor helpers for Database TurboModule shells (replaces ReactNativeFirebaseModule + * inheritance when extending generated *Spec classes). + */ +final class DatabaseTurboModuleSupport { + private final TaskExecutorService executorService; + + DatabaseTurboModuleSupport(String moduleName) { + executorService = new TaskExecutorService(moduleName); + } + + ExecutorService getExecutor() { + return executorService.getExecutor(); + } + + ExecutorService getTransactionalExecutor() { + return executorService.getTransactionalExecutor(); + } + + ExecutorService getTransactionalExecutor(String identifier) { + return executorService.getTransactionalExecutor(identifier); + } + + void removeEventListeningExecutor(String identifier) { + String executorName = executorService.getExecutorName(true, identifier); + executorService.removeExecutor(executorName); + } + + @CallSuper + void invalidate() { + executorService.shutdown(); + } +} diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseModule.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabase.java similarity index 59% rename from packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseModule.java rename to packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabase.java index bebefbda5b..cda2bb55ed 100644 --- a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseModule.java +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabase.java @@ -19,70 +19,50 @@ import static io.invertase.firebase.database.UniversalFirebaseDatabaseCommon.addEmulatorConfig; -import com.facebook.react.bridge.Promise; +import com.facebook.fbreact.specs.NativeRNFBTurboDatabaseSpec; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import io.invertase.firebase.common.UniversalFirebasePreferences; -public class ReactNativeFirebaseDatabaseModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboDatabase extends NativeRNFBTurboDatabaseSpec { private static final String SERVICE_NAME = "Database"; private final UniversalFirebaseDatabaseModule module; - ReactNativeFirebaseDatabaseModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboDatabase(ReactApplicationContext reactContext) { + super(reactContext); module = new UniversalFirebaseDatabaseModule(reactContext, SERVICE_NAME); } - @ReactMethod - public void goOnline(String app, String dbURL, Promise promise) { - module - .goOnline(app, dbURL) - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - promise.resolve(task.getResult()); - } else { - rejectPromiseWithExceptionMap(promise, task.getException()); - } - }); + @Override + public void goOnline(String app, String dbURL) { + module.goOnline(app, dbURL); } - @ReactMethod - public void goOffline(String app, String dbURL, Promise promise) { - module - .goOffline(app, dbURL) - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - promise.resolve(task.getResult()); - } else { - rejectPromiseWithExceptionMap(promise, task.getException()); - } - }); + @Override + public void goOffline(String app, String dbURL) { + module.goOffline(app, dbURL); } - @ReactMethod + @Override public void setPersistenceEnabled(String app, String dbURL, boolean enabled) { UniversalFirebasePreferences.getSharedInstance() .setBooleanValue(UniversalDatabaseStatics.DATABASE_PERSISTENCE_ENABLED, enabled); } - @ReactMethod + @Override public void setLoggingEnabled(String app, String dbURL, boolean bool) { UniversalFirebasePreferences.getSharedInstance() .setBooleanValue(UniversalDatabaseStatics.DATABASE_LOGGING_ENABLED, bool); } - @ReactMethod + @Override public void setPersistenceCacheSizeBytes(String app, String dbURL, double cacheSizeBytes) { UniversalFirebasePreferences.getSharedInstance() .setLongValue( UniversalDatabaseStatics.DATABASE_PERSISTENCE_CACHE_SIZE, (long) cacheSizeBytes); } - @ReactMethod - public void useEmulator(String app, String dbURL, String host, int port) { - addEmulatorConfig(app, dbURL, host, port); + @Override + public void useEmulator(String app, String dbURL, String host, double port) { + addEmulatorConfig(app, dbURL, host, (int) port); } } diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseOnDisconnectModule.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseOnDisconnect.java similarity index 77% rename from packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseOnDisconnectModule.java rename to packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseOnDisconnect.java index c9d79be38b..90459e1f1d 100644 --- a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseOnDisconnectModule.java +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseOnDisconnect.java @@ -19,23 +19,23 @@ import static io.invertase.firebase.common.RCTConvertFirebase.toHashMap; +import com.facebook.fbreact.specs.NativeRNFBTurboDatabaseOnDisconnectSpec; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import io.invertase.firebase.common.ReactNativeFirebaseModule; import java.util.Map; -public class ReactNativeFirebaseDatabaseOnDisconnectModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboDatabaseOnDisconnect extends NativeRNFBTurboDatabaseOnDisconnectSpec { private static final String SERVICE_NAME = "DatabaseOnDisconnect"; private final UniversalFirebaseDatabaseOnDisconnectModule module; - ReactNativeFirebaseDatabaseOnDisconnectModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboDatabaseOnDisconnect(ReactApplicationContext reactContext) { + super(reactContext); module = new UniversalFirebaseDatabaseOnDisconnectModule(reactContext, SERVICE_NAME); } - @ReactMethod + @Override public void onDisconnectCancel(String app, String dbURL, String path, Promise promise) { module .onDisconnectCancel(app, dbURL, path) @@ -44,12 +44,13 @@ public void onDisconnectCancel(String app, String dbURL, String path, Promise pr if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void onDisconnectRemove(String app, String dbURL, String path, Promise promise) { module .onDisconnectRemove(app, dbURL, path) @@ -58,12 +59,13 @@ public void onDisconnectRemove(String app, String dbURL, String path, Promise pr if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void onDisconnectSet( String app, String dbURL, String path, ReadableMap props, Promise promise) { module @@ -73,12 +75,13 @@ public void onDisconnectSet( if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void onDisconnectSetWithPriority( String app, String dbURL, String path, ReadableMap props, Promise promise) { module @@ -89,12 +92,13 @@ app, dbURL, path, toHashMap(props).get("value"), toHashMap(props).get("priority" if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void onDisconnectUpdate( String app, String dbURL, String path, ReadableMap props, Promise promise) { @SuppressWarnings("unchecked") @@ -106,7 +110,8 @@ public void onDisconnectUpdate( if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseQueryModule.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseQuery.java similarity index 82% rename from packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseQueryModule.java rename to packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseQuery.java index da7c0409b8..e628b84ce3 100644 --- a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseQueryModule.java +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseQuery.java @@ -21,6 +21,8 @@ import static io.invertase.firebase.database.ReactNativeFirebaseDatabaseCommon.*; import static io.invertase.firebase.database.UniversalFirebaseDatabaseCommon.getDatabaseForApp; +import androidx.annotation.CallSuper; +import com.facebook.fbreact.specs.NativeRNFBTurboDatabaseQuerySpec; import com.facebook.react.bridge.*; import com.google.android.gms.tasks.Tasks; import com.google.firebase.database.*; @@ -33,15 +35,17 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -public class ReactNativeFirebaseDatabaseQueryModule extends ReactNativeFirebaseModule { - private static final String SERVICE_NAME = "DatabaseQuery"; +public class NativeRNFBTurboDatabaseQuery extends NativeRNFBTurboDatabaseQuerySpec { + private final DatabaseTurboModuleSupport turboSupport = + new DatabaseTurboModuleSupport("RNFBDatabaseQuery"); private HashMap queryMap = new HashMap<>(); - ReactNativeFirebaseDatabaseQueryModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboDatabaseQuery(ReactApplicationContext reactContext) { + super(reactContext); } @Override + @CallSuper public void invalidate() { Iterator refIterator = queryMap.entrySet().iterator(); while (refIterator.hasNext()) { @@ -49,31 +53,18 @@ public void invalidate() { ReactNativeFirebaseDatabaseQuery databaseQuery = (ReactNativeFirebaseDatabaseQuery) pair.getValue(); databaseQuery.removeAllEventListeners(); - refIterator.remove(); // avoids a ConcurrentModificationException + refIterator.remove(); } + turboSupport.invalidate(); super.invalidate(); } - /** - * Returns an uncached ReactNativeFirebaseDatabaseQuery instance, used when no cleanup is needed - * (e.g. once). - * - * @param reference - * @param modifiers - */ private ReactNativeFirebaseDatabaseQuery getDatabaseQueryInstance( DatabaseReference reference, ReadableArray modifiers) { return new ReactNativeFirebaseDatabaseQuery(reference, modifiers); } - /** - * Caches a ReactNativeFirebaseDatabaseQuery instance from the query key and caches it for later - * use (e.g. on/off) - * - * @param reference - * @param modifiers - */ private ReactNativeFirebaseDatabaseQuery getDatabaseQueryInstance( String key, DatabaseReference reference, ReadableArray modifiers) { ReactNativeFirebaseDatabaseQuery cachedDatabaseQuery = queryMap.get(key); @@ -89,12 +80,6 @@ private ReactNativeFirebaseDatabaseQuery getDatabaseQueryInstance( return databaseQuery; } - /** - * ref().once('value') - * - * @param databaseQuery - * @param promise - */ private void addOnceValueEventListener( ReactNativeFirebaseDatabaseQuery databaseQuery, Promise promise) { ValueEventListener onceValueEventListener = @@ -102,17 +87,18 @@ private void addOnceValueEventListener( @Override public void onDataChange(@Nonnull DataSnapshot dataSnapshot) { try { - Tasks.call(getExecutor(), () -> snapshotToMap(dataSnapshot)) + Tasks.call(turboSupport.getExecutor(), () -> snapshotToMap(dataSnapshot)) .addOnCompleteListener( task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } catch (java.util.concurrent.RejectedExecutionException e) { - rejectPromiseWithExceptionMap(promise, e); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap(promise, e); } } @@ -128,13 +114,6 @@ public void onCancelled(@Nonnull DatabaseError error) { databaseQuery.addSingleValueEventListener(onceValueEventListener); } - /** - * ref().once('child_*') handler - * - * @param eventType - * @param databaseQuery - * @param promise - */ private void addChildOnceEventListener( String eventType, ReactNativeFirebaseDatabaseQuery databaseQuery, Promise promise) { ChildEventListener childEventListener = @@ -145,18 +124,19 @@ public void onChildAdded(@Nonnull DataSnapshot dataSnapshot, String previousChil databaseQuery.removeEventListener(this); try { Tasks.call( - getExecutor(), + turboSupport.getExecutor(), () -> snapshotWithPreviousChildToMap(dataSnapshot, previousChildName)) .addOnCompleteListener( task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } catch (java.util.concurrent.RejectedExecutionException e) { - rejectPromiseWithExceptionMap(promise, e); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap(promise, e); } } } @@ -167,18 +147,19 @@ public void onChildChanged(@Nonnull DataSnapshot dataSnapshot, String previousCh databaseQuery.removeEventListener(this); try { Tasks.call( - getExecutor(), + turboSupport.getExecutor(), () -> snapshotWithPreviousChildToMap(dataSnapshot, previousChildName)) .addOnCompleteListener( task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } catch (java.util.concurrent.RejectedExecutionException e) { - rejectPromiseWithExceptionMap(promise, e); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap(promise, e); } } } @@ -188,17 +169,20 @@ public void onChildRemoved(@Nonnull DataSnapshot dataSnapshot) { if ("child_removed".equals(eventType)) { databaseQuery.removeEventListener(this); try { - Tasks.call(getExecutor(), () -> snapshotWithPreviousChildToMap(dataSnapshot, null)) + Tasks.call( + turboSupport.getExecutor(), + () -> snapshotWithPreviousChildToMap(dataSnapshot, null)) .addOnCompleteListener( task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } catch (java.util.concurrent.RejectedExecutionException e) { - rejectPromiseWithExceptionMap(promise, e); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap(promise, e); } } } @@ -209,18 +193,19 @@ public void onChildMoved(@Nonnull DataSnapshot dataSnapshot, String previousChil databaseQuery.removeEventListener(this); try { Tasks.call( - getExecutor(), + turboSupport.getExecutor(), () -> snapshotWithPreviousChildToMap(dataSnapshot, previousChildName)) .addOnCompleteListener( task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } catch (java.util.concurrent.RejectedExecutionException e) { - rejectPromiseWithExceptionMap(promise, e); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap(promise, e); } } } @@ -238,13 +223,6 @@ public void onCancelled(@Nonnull DatabaseError error) { databaseQuery.addSingleChildEventListener(childEventListener); } - /** - * ref().on('value') handler - * - * @param key - * @param databaseQuery - * @param registration - */ private void addValueEventListener( String key, ReactNativeFirebaseDatabaseQuery databaseQuery, ReadableMap registration) { final String eventRegistrationKey = registration.getString("eventRegistrationKey"); @@ -321,13 +299,6 @@ public void onCancelled(@Nonnull DatabaseError error) { } } - /** - * Handles value/child update events. - * - * @param eventType - * @param dataSnapshot - * @param previousChildName - */ private void handleDatabaseEvent( final String key, final String eventType, @@ -337,7 +308,7 @@ private void handleDatabaseEvent( final String eventRegistrationKey = registration.getString("eventRegistrationKey"); try { Tasks.call( - getTransactionalExecutor(eventRegistrationKey), + turboSupport.getTransactionalExecutor(eventRegistrationKey), () -> { if (eventType.equals("value")) { return snapshotToMap(dataSnapshot); @@ -346,7 +317,7 @@ private void handleDatabaseEvent( } }) .addOnCompleteListener( - getExecutor(), + turboSupport.getExecutor(), task -> { if (task.isSuccessful()) { WritableMap data = task.getResult(); @@ -366,16 +337,9 @@ private void handleDatabaseEvent( }); } catch (java.util.concurrent.RejectedExecutionException e) { // Event arrived after module invalidation shut down an executor. - // Safe to drop when tearing down; no JS listener will consume the event. } } - /** - * Handles a database listener cancellation error. - * - * @param registration - * @param error - */ private void handleDatabaseEventError(String key, ReadableMap registration, DatabaseError error) { WritableMap event = Arguments.createMap(); UniversalDatabaseException databaseException = @@ -395,17 +359,7 @@ private void handleDatabaseEventError(String key, ReadableMap registration, Data new ReactNativeFirebaseDatabaseEvent(ReactNativeFirebaseDatabaseEvent.EVENT_SYNC, event)); } - /** - * ref().once('*') - * - * @param app - * @param dbURL - * @param path - * @param modifiers - * @param eventType - * @param promise - */ - @ReactMethod + @Override public void once( String app, String dbURL, @@ -422,14 +376,7 @@ public void once( } } - /** - * ref().on('*') - * - * @param app - * @param dbURL - * @param props - */ - @ReactMethod + @Override public void on(String app, String dbURL, ReadableMap props) { String key = props.getString("key"); ReadableArray modifiers = props.getArray("modifiers"); @@ -447,14 +394,13 @@ public void on(String app, String dbURL, ReadableMap props) { } } - /** ref().off('*') */ - @ReactMethod + @Override public void off(String queryKey, String eventRegistrationKey) { ReactNativeFirebaseDatabaseQuery databaseQuery = queryMap.get(queryKey); if (databaseQuery != null) { databaseQuery.removeEventListener(eventRegistrationKey); - removeEventListeningExecutor(eventRegistrationKey); + turboSupport.removeEventListeningExecutor(eventRegistrationKey); if (!databaseQuery.hasListeners()) { queryMap.remove(queryKey); @@ -462,27 +408,17 @@ public void off(String queryKey, String eventRegistrationKey) { } } - /** - * ref().keepSynced('*') - * - * @param app - * @param dbURL - * @param path - * @param modifiers - * @param bool - * @param promise - */ - @ReactMethod + @Override public void keepSynced( String app, String dbURL, String key, String path, ReadableArray modifiers, - Boolean bool, + boolean enabled, Promise promise) { DatabaseReference reference = getDatabaseForApp(app, dbURL).getReference(path); - getDatabaseQueryInstance(key, reference, modifiers).query.keepSynced(bool); + getDatabaseQueryInstance(key, reference, modifiers).query.keepSynced(enabled); promise.resolve(null); } } diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseReferenceModule.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseReference.java similarity index 76% rename from packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseReferenceModule.java rename to packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseReference.java index 900dec37dd..90a696818b 100644 --- a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseReferenceModule.java +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseReference.java @@ -20,29 +20,38 @@ import static io.invertase.firebase.common.RCTConvertFirebase.toHashMap; import static io.invertase.firebase.database.ReactNativeFirebaseDatabaseCommon.rejectPromiseDatabaseException; +import androidx.annotation.CallSuper; +import com.facebook.fbreact.specs.NativeRNFBTurboDatabaseReferenceSpec; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.google.android.gms.tasks.Tasks; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import java.util.Map; -public class ReactNativeFirebaseDatabaseReferenceModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboDatabaseReference extends NativeRNFBTurboDatabaseReferenceSpec { private static final String SERVICE_NAME = "DatabaseReference"; private final UniversalFirebaseDatabaseReferenceModule module; + private final DatabaseTurboModuleSupport turboSupport = + new DatabaseTurboModuleSupport("RNFBDatabaseReference"); - ReactNativeFirebaseDatabaseReferenceModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboDatabaseReference(ReactApplicationContext reactContext) { + super(reactContext); module = new UniversalFirebaseDatabaseReferenceModule(reactContext, SERVICE_NAME); } - @ReactMethod + @Override + @CallSuper + public void invalidate() { + turboSupport.invalidate(); + super.invalidate(); + } + + @Override public void set(String app, String dbURL, String path, ReadableMap props, Promise promise) { - Tasks.call(getTransactionalExecutor(), () -> toHashMap(props).get("value")) + Tasks.call(turboSupport.getTransactionalExecutor(), () -> toHashMap(props).get("value")) .onSuccessTask(aValue -> module.set(app, dbURL, path, aValue)) .addOnCompleteListener( - getTransactionalExecutor(), + turboSupport.getTransactionalExecutor(), task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); @@ -53,12 +62,12 @@ public void set(String app, String dbURL, String path, ReadableMap props, Promis } @SuppressWarnings("unchecked") - @ReactMethod + @Override public void update(String app, String dbURL, String path, ReadableMap props, Promise promise) { - Tasks.call(getTransactionalExecutor(), () -> toHashMap(props).get("values")) + Tasks.call(turboSupport.getTransactionalExecutor(), () -> toHashMap(props).get("values")) .onSuccessTask(aMap -> module.update(app, dbURL, path, (Map) aMap)) .addOnCompleteListener( - getTransactionalExecutor(), + turboSupport.getTransactionalExecutor(), task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); @@ -68,15 +77,15 @@ public void update(String app, String dbURL, String path, ReadableMap props, Pro }); } - @ReactMethod + @Override public void setWithPriority( String app, String dbURL, String path, ReadableMap props, Promise promise) { - Tasks.call(getTransactionalExecutor(), () -> toHashMap(props)) + Tasks.call(turboSupport.getTransactionalExecutor(), () -> toHashMap(props)) .onSuccessTask( aMap -> module.setWithPriority(app, dbURL, path, aMap.get("value"), aMap.get("priority"))) .addOnCompleteListener( - getTransactionalExecutor(), + turboSupport.getTransactionalExecutor(), task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); @@ -86,13 +95,12 @@ public void setWithPriority( }); } - @ReactMethod + @Override public void remove(String app, String dbURL, String path, Promise promise) { - // continuation tasks not needed for this as no data module .remove(app, dbURL, path) .addOnCompleteListener( - getTransactionalExecutor(), + turboSupport.getTransactionalExecutor(), task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); @@ -102,14 +110,13 @@ public void remove(String app, String dbURL, String path, Promise promise) { }); } - @ReactMethod + @Override public void setPriority( String app, String dbURL, String path, ReadableMap props, Promise promise) { - // continuation tasks not needed for this as minimal data module .setPriority(app, dbURL, path, toHashMap(props).get("priority")) .addOnCompleteListener( - getTransactionalExecutor(), + turboSupport.getTransactionalExecutor(), task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseTransactionModule.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseTransaction.java similarity index 70% rename from packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseTransactionModule.java rename to packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseTransaction.java index 540b365c98..bf431b2814 100644 --- a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseTransactionModule.java +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/NativeRNFBTurboDatabaseTransaction.java @@ -21,27 +21,44 @@ import android.os.AsyncTask; import android.util.SparseArray; +import com.facebook.fbreact.specs.NativeRNFBTurboDatabaseTransactionSpec; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.google.firebase.database.*; import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import javax.annotation.Nonnull; -public class ReactNativeFirebaseDatabaseTransactionModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboDatabaseTransaction extends NativeRNFBTurboDatabaseTransactionSpec { private static final String SERVICE_NAME = "DatabaseTransaction"; private static SparseArray transactionHandlers = new SparseArray<>(); + private final DatabaseTurboModuleSupport turboSupport = + new DatabaseTurboModuleSupport("RNFBDatabaseTransaction"); - ReactNativeFirebaseDatabaseTransactionModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboDatabaseTransaction(ReactApplicationContext reactContext) { + super(reactContext); } - @ReactMethod + @Override + public void invalidate() { + for (int i = 0, size = transactionHandlers.size(); i < size; i++) { + int key = transactionHandlers.keyAt(i); + ReactNativeFirebaseDatabaseTransactionHandler transactionHandler = + transactionHandlers.get(key); + + if (transactionHandler != null) { + transactionHandler.abort(); + } + } + + transactionHandlers.clear(); + turboSupport.invalidate(); + } + + @Override public void transactionStart( - String app, String dbURL, String path, int transactionId, Boolean applyLocally) { + String app, String dbURL, String path, double transactionId, boolean applyLocally) { AsyncTask.execute( () -> { DatabaseReference reference = getDatabaseForApp(app, dbURL).getReference(path); @@ -52,12 +69,11 @@ public void transactionStart( @Override public Transaction.Result doTransaction(@Nonnull MutableData mutableData) { final ReactNativeFirebaseDatabaseTransactionHandler transactionHandler = - new ReactNativeFirebaseDatabaseTransactionHandler(transactionId, app, dbURL); - transactionHandlers.put(transactionId, transactionHandler); + new ReactNativeFirebaseDatabaseTransactionHandler( + (int) transactionId, app, dbURL); + transactionHandlers.put((int) transactionId, transactionHandler); final WritableMap updatesMap = transactionHandler.createUpdateMap(mutableData); - // emit the updates to js using an async task - // otherwise it gets blocked by the lock await AsyncTask.execute( () -> { ReactNativeFirebaseEventEmitter emitter = @@ -68,10 +84,9 @@ public Transaction.Result doTransaction(@Nonnull MutableData mutableData) { ReactNativeFirebaseTransactionEvent.EVENT_TRANSACTION, updatesMap, app, - transactionId)); + (int) transactionId)); }); - // wait for js to return the updates (js calls transactionTryCommit) try { transactionHandler.await(); } catch (InterruptedException e) { @@ -95,7 +110,13 @@ public Transaction.Result doTransaction(@Nonnull MutableData mutableData) { public void onComplete( DatabaseError error, boolean committed, DataSnapshot snapshot) { ReactNativeFirebaseDatabaseTransactionHandler transactionHandler = - transactionHandlers.get(transactionId); + transactionHandlers.get((int) transactionId); + + if (transactionHandler == null) { + transactionHandlers.delete((int) transactionId); + return; + } + WritableMap resultMap = transactionHandler.createResultMap(error, committed, snapshot); @@ -107,19 +128,20 @@ public void onComplete( ReactNativeFirebaseTransactionEvent.EVENT_TRANSACTION, resultMap, app, - transactionId)); + (int) transactionId)); - transactionHandlers.delete(transactionId); + transactionHandlers.delete((int) transactionId); } }, applyLocally); }); } - @ReactMethod + @Override public void transactionTryCommit( - String app, String dbURL, int transactionId, ReadableMap updates) { - ReactNativeFirebaseDatabaseTransactionHandler handler = transactionHandlers.get(transactionId); + String app, String dbURL, double transactionId, ReadableMap updates) { + ReactNativeFirebaseDatabaseTransactionHandler handler = + transactionHandlers.get((int) transactionId); if (handler != null) { handler.signalUpdateReceived(updates); diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabasePackage.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabasePackage.java index 72d4cd58c0..17c56b7234 100644 --- a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabasePackage.java +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabasePackage.java @@ -30,11 +30,11 @@ public class ReactNativeFirebaseDatabasePackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseDatabaseModule(reactContext)); - modules.add(new ReactNativeFirebaseDatabaseReferenceModule(reactContext)); - modules.add(new ReactNativeFirebaseDatabaseQueryModule(reactContext)); - modules.add(new ReactNativeFirebaseDatabaseOnDisconnectModule(reactContext)); - modules.add(new ReactNativeFirebaseDatabaseTransactionModule(reactContext)); + modules.add(new NativeRNFBTurboDatabase(reactContext)); + modules.add(new NativeRNFBTurboDatabaseReference(reactContext)); + modules.add(new NativeRNFBTurboDatabaseQuery(reactContext)); + modules.add(new NativeRNFBTurboDatabaseOnDisconnect(reactContext)); + modules.add(new NativeRNFBTurboDatabaseTransaction(reactContext)); return modules; } diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseTransactionHandler.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseTransactionHandler.java index 318654f7ae..09bb851cc0 100644 --- a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseTransactionHandler.java +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/ReactNativeFirebaseDatabaseTransactionHandler.java @@ -81,6 +81,17 @@ void signalUpdateReceived(ReadableMap updates) { } } + /** Abort the currently in progress transaction if any. */ + void abort() { + lock.lock(); + try { + abort = true; + condition.signalAll(); + } finally { + lock.unlock(); + } + } + /** Wait for signalUpdateReceived to signal condition */ void await() throws InterruptedException { lock.lock(); diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseOnDisconnectSpec.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseOnDisconnectSpec.java new file mode 100644 index 0000000000..0d0c8b23d3 --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseOnDisconnectSpec.java @@ -0,0 +1,55 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboDatabaseOnDisconnectSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboDatabaseOnDisconnect"; + + public NativeRNFBTurboDatabaseOnDisconnectSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void onDisconnectCancel(String app, String dbURL, String path, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void onDisconnectRemove(String app, String dbURL, String path, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void onDisconnectSet(String app, String dbURL, String path, ReadableMap props, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void onDisconnectSetWithPriority(String app, String dbURL, String path, ReadableMap props, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void onDisconnectUpdate(String app, String dbURL, String path, ReadableMap props, Promise promise); +} diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseQuerySpec.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseQuerySpec.java new file mode 100644 index 0000000000..8c8da78d90 --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseQuerySpec.java @@ -0,0 +1,52 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboDatabaseQuerySpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboDatabaseQuery"; + + public NativeRNFBTurboDatabaseQuerySpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void once(String app, String dbURL, String path, ReadableArray modifiers, String eventType, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void on(String app, String dbURL, ReadableMap props); + + @ReactMethod + @DoNotStrip + public abstract void off(String queryKey, String eventRegistrationKey); + + @ReactMethod + @DoNotStrip + public abstract void keepSynced(String app, String dbURL, String key, String path, ReadableArray modifiers, boolean enabled, Promise promise); +} diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseReferenceSpec.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseReferenceSpec.java new file mode 100644 index 0000000000..26aa0b92bc --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseReferenceSpec.java @@ -0,0 +1,55 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboDatabaseReferenceSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboDatabaseReference"; + + public NativeRNFBTurboDatabaseReferenceSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void set(String app, String dbURL, String path, ReadableMap props, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void update(String app, String dbURL, String path, ReadableMap props, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setWithPriority(String app, String dbURL, String path, ReadableMap props, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void remove(String app, String dbURL, String path, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setPriority(String app, String dbURL, String path, ReadableMap props, Promise promise); +} diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseSpec.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseSpec.java new file mode 100644 index 0000000000..6f8a5e7662 --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseSpec.java @@ -0,0 +1,57 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboDatabaseSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboDatabase"; + + public NativeRNFBTurboDatabaseSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void goOnline(String app, String dbURL); + + @ReactMethod + @DoNotStrip + public abstract void goOffline(String app, String dbURL); + + @ReactMethod + @DoNotStrip + public abstract void setPersistenceEnabled(String app, String dbURL, boolean enabled); + + @ReactMethod + @DoNotStrip + public abstract void setLoggingEnabled(String app, String dbURL, boolean enabled); + + @ReactMethod + @DoNotStrip + public abstract void setPersistenceCacheSizeBytes(String app, String dbURL, double cacheSizeBytes); + + @ReactMethod + @DoNotStrip + public abstract void useEmulator(String app, String dbURL, String host, double port); +} diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseTransactionSpec.java b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseTransactionSpec.java new file mode 100644 index 0000000000..d9b4d375ce --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboDatabaseTransactionSpec.java @@ -0,0 +1,42 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboDatabaseTransactionSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboDatabaseTransaction"; + + public NativeRNFBTurboDatabaseTransactionSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void transactionStart(String app, String dbURL, String path, double transactionId, boolean applyLocally); + + @ReactMethod + @DoNotStrip + public abstract void transactionTryCommit(String app, String dbURL, double transactionId, ReadableMap updates); +} diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/CMakeLists.txt b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..a90fbd262b --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBDatabaseTurboModules/*.cpp) + +add_library( + react_codegen_RNFBDatabaseTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBDatabaseTurboModules PUBLIC . react/renderer/components/RNFBDatabaseTurboModules) + +target_link_libraries( + react_codegen_RNFBDatabaseTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBDatabaseTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/RNFBDatabaseTurboModules-generated.cpp b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/RNFBDatabaseTurboModules-generated.cpp new file mode 100644 index 0000000000..560c3b84c6 --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/RNFBDatabaseTurboModules-generated.cpp @@ -0,0 +1,182 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBDatabaseTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_goOnline(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "goOnline", "(Ljava/lang/String;Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_goOffline(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "goOffline", "(Ljava/lang/String;Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setPersistenceEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "setPersistenceEnabled", "(Ljava/lang/String;Ljava/lang/String;Z)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setLoggingEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "setLoggingEnabled", "(Ljava/lang/String;Ljava/lang/String;Z)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setPersistenceCacheSizeBytes(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "setPersistenceCacheSizeBytes", "(Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_useEmulator(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "useEmulator", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +NativeRNFBTurboDatabaseSpecJSI::NativeRNFBTurboDatabaseSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["goOnline"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_goOnline}; + methodMap_["goOffline"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_goOffline}; + methodMap_["setPersistenceEnabled"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setPersistenceEnabled}; + methodMap_["setLoggingEnabled"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setLoggingEnabled}; + methodMap_["setPersistenceCacheSizeBytes"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setPersistenceCacheSizeBytes}; + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_useEmulator}; +} +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectCancel(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "onDisconnectCancel", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectRemove(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "onDisconnectRemove", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectSet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "onDisconnectSet", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectSetWithPriority(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "onDisconnectSetWithPriority", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectUpdate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "onDisconnectUpdate", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboDatabaseOnDisconnectSpecJSI::NativeRNFBTurboDatabaseOnDisconnectSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["onDisconnectCancel"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectCancel}; + methodMap_["onDisconnectRemove"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectRemove}; + methodMap_["onDisconnectSet"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectSet}; + methodMap_["onDisconnectSetWithPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectSetWithPriority}; + methodMap_["onDisconnectUpdate"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectUpdate}; +} +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_once(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "once", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_on(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "on", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_off(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "off", "(Ljava/lang/String;Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_keepSynced(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "keepSynced", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboDatabaseQuerySpecJSI::NativeRNFBTurboDatabaseQuerySpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["once"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_once}; + methodMap_["on"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_on}; + methodMap_["off"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_off}; + methodMap_["keepSynced"] = MethodMetadata {6, __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_keepSynced}; +} +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_set(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "set", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_update(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "update", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_setWithPriority(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setWithPriority", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_remove(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "remove", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_setPriority(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setPriority", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboDatabaseReferenceSpecJSI::NativeRNFBTurboDatabaseReferenceSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["set"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_set}; + methodMap_["update"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_update}; + methodMap_["setWithPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_setWithPriority}; + methodMap_["remove"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_remove}; + methodMap_["setPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_setPriority}; +} +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseTransactionSpecJSI_transactionStart(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "transactionStart", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DZ)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseTransactionSpecJSI_transactionTryCommit(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "transactionTryCommit", "(Ljava/lang/String;Ljava/lang/String;DLcom/facebook/react/bridge/ReadableMap;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboDatabaseTransactionSpecJSI::NativeRNFBTurboDatabaseTransactionSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["transactionStart"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboDatabaseTransactionSpecJSI_transactionStart}; + methodMap_["transactionTryCommit"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseTransactionSpecJSI_transactionTryCommit}; +} + +std::shared_ptr RNFBDatabaseTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboDatabase") { + return std::make_shared(params); + } + if (moduleName == "NativeRNFBTurboDatabaseOnDisconnect") { + return std::make_shared(params); + } + if (moduleName == "NativeRNFBTurboDatabaseQuery") { + return std::make_shared(params); + } + if (moduleName == "NativeRNFBTurboDatabaseReference") { + return std::make_shared(params); + } + if (moduleName == "NativeRNFBTurboDatabaseTransaction") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/RNFBDatabaseTurboModules.h b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/RNFBDatabaseTurboModules.h new file mode 100644 index 0000000000..1ee449bef7 --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/RNFBDatabaseTurboModules.h @@ -0,0 +1,63 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboDatabase' + */ +class JSI_EXPORT NativeRNFBTurboDatabaseSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboDatabaseSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + +/** + * JNI C++ class for module 'NativeRNFBTurboDatabaseOnDisconnect' + */ +class JSI_EXPORT NativeRNFBTurboDatabaseOnDisconnectSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboDatabaseOnDisconnectSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + +/** + * JNI C++ class for module 'NativeRNFBTurboDatabaseQuery' + */ +class JSI_EXPORT NativeRNFBTurboDatabaseQuerySpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboDatabaseQuerySpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + +/** + * JNI C++ class for module 'NativeRNFBTurboDatabaseReference' + */ +class JSI_EXPORT NativeRNFBTurboDatabaseReferenceSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboDatabaseReferenceSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + +/** + * JNI C++ class for module 'NativeRNFBTurboDatabaseTransaction' + */ +class JSI_EXPORT NativeRNFBTurboDatabaseTransactionSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboDatabaseTransactionSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBDatabaseTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/react/renderer/components/RNFBDatabaseTurboModules/RNFBDatabaseTurboModulesJSI-generated.cpp b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/react/renderer/components/RNFBDatabaseTurboModules/RNFBDatabaseTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..84eae9eccb --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/react/renderer/components/RNFBDatabaseTurboModules/RNFBDatabaseTurboModulesJSI-generated.cpp @@ -0,0 +1,257 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBDatabaseTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_goOnline(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->goOnline( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_goOffline(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->goOffline( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setPersistenceEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setPersistenceEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setLoggingEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setLoggingEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setPersistenceCacheSizeBytes(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setPersistenceCacheSizeBytes( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_useEmulator(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useEmulator( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber() + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboDatabaseCxxSpecJSI::NativeRNFBTurboDatabaseCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabase", jsInvoker) { + methodMap_["goOnline"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_goOnline}; + methodMap_["goOffline"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_goOffline}; + methodMap_["setPersistenceEnabled"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setPersistenceEnabled}; + methodMap_["setLoggingEnabled"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setLoggingEnabled}; + methodMap_["setPersistenceCacheSizeBytes"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setPersistenceCacheSizeBytes}; + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_useEmulator}; +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectCancel(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectCancel( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectRemove(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectRemove( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectSet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectSet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectSetWithPriority(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectSetWithPriority( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectUpdate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectUpdate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} + +NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI::NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabaseOnDisconnect", jsInvoker) { + methodMap_["onDisconnectCancel"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectCancel}; + methodMap_["onDisconnectRemove"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectRemove}; + methodMap_["onDisconnectSet"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectSet}; + methodMap_["onDisconnectSetWithPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectSetWithPriority}; + methodMap_["onDisconnectUpdate"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectUpdate}; +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_once(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->once( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt).asArray(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_on(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->on( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_off(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->off( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_keepSynced(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->keepSynced( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asBool() + ); +} + +NativeRNFBTurboDatabaseQueryCxxSpecJSI::NativeRNFBTurboDatabaseQueryCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabaseQuery", jsInvoker) { + methodMap_["once"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_once}; + methodMap_["on"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_on}; + methodMap_["off"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_off}; + methodMap_["keepSynced"] = MethodMetadata {6, __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_keepSynced}; +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_set(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->set( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_update(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->update( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_setWithPriority(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setWithPriority( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_remove(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->remove( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_setPriority(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setPriority( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} + +NativeRNFBTurboDatabaseReferenceCxxSpecJSI::NativeRNFBTurboDatabaseReferenceCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabaseReference", jsInvoker) { + methodMap_["set"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_set}; + methodMap_["update"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_update}; + methodMap_["setWithPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_setWithPriority}; + methodMap_["remove"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_remove}; + methodMap_["setPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_setPriority}; +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseTransactionCxxSpecJSI_transactionStart(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionStart( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseTransactionCxxSpecJSI_transactionTryCommit(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionTryCommit( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboDatabaseTransactionCxxSpecJSI::NativeRNFBTurboDatabaseTransactionCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabaseTransaction", jsInvoker) { + methodMap_["transactionStart"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboDatabaseTransactionCxxSpecJSI_transactionStart}; + methodMap_["transactionTryCommit"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseTransactionCxxSpecJSI_transactionTryCommit}; +} + + +} // namespace facebook::react diff --git a/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/react/renderer/components/RNFBDatabaseTurboModules/RNFBDatabaseTurboModulesJSI.h b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/react/renderer/components/RNFBDatabaseTurboModules/RNFBDatabaseTurboModulesJSI.h new file mode 100644 index 0000000000..b6dbe4b3d6 --- /dev/null +++ b/packages/database/android/src/reactnative/java/io/invertase/firebase/database/generated/jni/react/renderer/components/RNFBDatabaseTurboModules/RNFBDatabaseTurboModulesJSI.h @@ -0,0 +1,440 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboDatabaseCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void goOnline(jsi::Runtime &rt, jsi::String app, jsi::String dbURL) = 0; + virtual void goOffline(jsi::Runtime &rt, jsi::String app, jsi::String dbURL) = 0; + virtual void setPersistenceEnabled(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, bool enabled) = 0; + virtual void setLoggingEnabled(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, bool enabled) = 0; + virtual void setPersistenceCacheSizeBytes(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, double cacheSizeBytes) = 0; + virtual void useEmulator(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String host, double port) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabase"; + +protected: + NativeRNFBTurboDatabaseCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void goOnline(jsi::Runtime &rt, jsi::String app, jsi::String dbURL) override { + static_assert( + bridging::getParameterCount(&T::goOnline) == 3, + "Expected goOnline(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::goOnline, jsInvoker_, instance_, std::move(app), std::move(dbURL)); + } + void goOffline(jsi::Runtime &rt, jsi::String app, jsi::String dbURL) override { + static_assert( + bridging::getParameterCount(&T::goOffline) == 3, + "Expected goOffline(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::goOffline, jsInvoker_, instance_, std::move(app), std::move(dbURL)); + } + void setPersistenceEnabled(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setPersistenceEnabled) == 4, + "Expected setPersistenceEnabled(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setPersistenceEnabled, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(enabled)); + } + void setLoggingEnabled(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setLoggingEnabled) == 4, + "Expected setLoggingEnabled(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setLoggingEnabled, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(enabled)); + } + void setPersistenceCacheSizeBytes(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, double cacheSizeBytes) override { + static_assert( + bridging::getParameterCount(&T::setPersistenceCacheSizeBytes) == 4, + "Expected setPersistenceCacheSizeBytes(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setPersistenceCacheSizeBytes, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(cacheSizeBytes)); + } + void useEmulator(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String host, double port) override { + static_assert( + bridging::getParameterCount(&T::useEmulator) == 5, + "Expected useEmulator(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::useEmulator, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(host), std::move(port)); + } + + private: + friend class NativeRNFBTurboDatabaseCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value onDisconnectCancel(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) = 0; + virtual jsi::Value onDisconnectRemove(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) = 0; + virtual jsi::Value onDisconnectSet(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value onDisconnectSetWithPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value onDisconnectUpdate(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseOnDisconnectCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabaseOnDisconnect"; + +protected: + NativeRNFBTurboDatabaseOnDisconnectCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseOnDisconnectCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value onDisconnectCancel(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectCancel) == 4, + "Expected onDisconnectCancel(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectCancel, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path)); + } + jsi::Value onDisconnectRemove(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectRemove) == 4, + "Expected onDisconnectRemove(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectRemove, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path)); + } + jsi::Value onDisconnectSet(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectSet) == 5, + "Expected onDisconnectSet(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectSet, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value onDisconnectSetWithPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectSetWithPriority) == 5, + "Expected onDisconnectSetWithPriority(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectSetWithPriority, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value onDisconnectUpdate(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectUpdate) == 5, + "Expected onDisconnectUpdate(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectUpdate, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + + private: + friend class NativeRNFBTurboDatabaseOnDisconnectCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboDatabaseQueryCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseQueryCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value once(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Array modifiers, jsi::String eventType) = 0; + virtual void on(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::Object props) = 0; + virtual void off(jsi::Runtime &rt, jsi::String queryKey, jsi::String eventRegistrationKey) = 0; + virtual jsi::Value keepSynced(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String key, jsi::String path, jsi::Array modifiers, bool enabled) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseQueryCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabaseQuery"; + +protected: + NativeRNFBTurboDatabaseQueryCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseQueryCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseQueryCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseQueryCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value once(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Array modifiers, jsi::String eventType) override { + static_assert( + bridging::getParameterCount(&T::once) == 6, + "Expected once(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::once, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(modifiers), std::move(eventType)); + } + void on(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::on) == 4, + "Expected on(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::on, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(props)); + } + void off(jsi::Runtime &rt, jsi::String queryKey, jsi::String eventRegistrationKey) override { + static_assert( + bridging::getParameterCount(&T::off) == 3, + "Expected off(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::off, jsInvoker_, instance_, std::move(queryKey), std::move(eventRegistrationKey)); + } + jsi::Value keepSynced(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String key, jsi::String path, jsi::Array modifiers, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::keepSynced) == 7, + "Expected keepSynced(...) to have 7 parameters"); + + return bridging::callFromJs( + rt, &T::keepSynced, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(key), std::move(path), std::move(modifiers), std::move(enabled)); + } + + private: + friend class NativeRNFBTurboDatabaseQueryCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboDatabaseReferenceCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseReferenceCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value set(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value update(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value setWithPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value remove(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) = 0; + virtual jsi::Value setPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseReferenceCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabaseReference"; + +protected: + NativeRNFBTurboDatabaseReferenceCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseReferenceCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseReferenceCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseReferenceCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value set(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::set) == 5, + "Expected set(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::set, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value update(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::update) == 5, + "Expected update(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::update, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value setWithPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::setWithPriority) == 5, + "Expected setWithPriority(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::setWithPriority, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value remove(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::remove) == 4, + "Expected remove(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::remove, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path)); + } + jsi::Value setPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::setPriority) == 5, + "Expected setPriority(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::setPriority, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + + private: + friend class NativeRNFBTurboDatabaseReferenceCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboDatabaseTransactionCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseTransactionCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void transactionStart(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, double transactionId, bool applyLocally) = 0; + virtual void transactionTryCommit(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, double transactionId, jsi::Object updates) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseTransactionCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabaseTransaction"; + +protected: + NativeRNFBTurboDatabaseTransactionCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseTransactionCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseTransactionCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseTransactionCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void transactionStart(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, double transactionId, bool applyLocally) override { + static_assert( + bridging::getParameterCount(&T::transactionStart) == 6, + "Expected transactionStart(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::transactionStart, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(transactionId), std::move(applyLocally)); + } + void transactionTryCommit(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, double transactionId, jsi::Object updates) override { + static_assert( + bridging::getParameterCount(&T::transactionTryCommit) == 5, + "Expected transactionTryCommit(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::transactionTryCommit, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(transactionId), std::move(updates)); + } + + private: + friend class NativeRNFBTurboDatabaseTransactionCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/database/e2e/database.e2e.js b/packages/database/e2e/database.e2e.js index 36d777d32e..d4ef72abfd 100644 --- a/packages/database/e2e/database.e2e.js +++ b/packages/database/e2e/database.e2e.js @@ -112,7 +112,7 @@ describe('database()', function () { describe('goOnline()', function () { it('calls goOnline successfully', async function () { const { getDatabase, goOnline } = databaseModular; - await goOnline(getDatabase()); + goOnline(getDatabase()); }); }); @@ -122,9 +122,9 @@ describe('database()', function () { const db = getDatabase(); // await Utils.sleep(5000); - await goOffline(db); + goOffline(db); - await goOnline(db); + goOnline(db); }); }); diff --git a/packages/database/e2e/internal/connected.e2e.js b/packages/database/e2e/internal/connected.e2e.js index c78fb5a890..3db8f65462 100644 --- a/packages/database/e2e/internal/connected.e2e.js +++ b/packages/database/e2e/internal/connected.e2e.js @@ -23,13 +23,13 @@ describe("database().ref('.info/connected')", function () { before(async function () { const { getDatabase, goOnline } = databaseModular; - await goOnline(getDatabase()); + goOnline(getDatabase()); }); after(async function () { const { getDatabase, goOnline } = databaseModular; - await goOnline(getDatabase()); + goOnline(getDatabase()); }); xit('returns true when used with once', async function () { @@ -60,9 +60,9 @@ describe("database().ref('.info/connected')", function () { }; onValue(dbRef, handler); - await goOffline(db); + goOffline(db); await Utils.sleep(1000); // FIXME why is this sleep needed here? callback is called immediately - await goOnline(db); + goOnline(db); off('value', handler); await Utils.spyToBeCalledTimesAsync(callback, 2); diff --git a/packages/database/e2e/onDisconnect/cancel.e2e.js b/packages/database/e2e/onDisconnect/cancel.e2e.js index 5d49eabe87..cbf46a45c4 100644 --- a/packages/database/e2e/onDisconnect/cancel.e2e.js +++ b/packages/database/e2e/onDisconnect/cancel.e2e.js @@ -30,7 +30,7 @@ describe('database().ref().onDisconnect().cancel()', function () { const db = getDatabase(); // Ensures the db is online before running each test - await goOnline(db); + goOnline(db); }); it('throws if onComplete is not a function', function () { @@ -58,8 +58,8 @@ describe('database().ref().onDisconnect().cancel()', function () { await onDisconnect(dbRef).set(value); await onDisconnect(dbRef).cancel(); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); const snapshot = await get(dbRef); snapshot.val().should.eql('foobar'); @@ -77,8 +77,8 @@ describe('database().ref().onDisconnect().cancel()', function () { await onDisconnect(dbRef).set('bar'); await onDisconnect(dbRef).cancel(callback); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); callback.should.be.calledOnce(); }); diff --git a/packages/database/e2e/onDisconnect/remove.e2e.js b/packages/database/e2e/onDisconnect/remove.e2e.js index ce505e8eaf..423015f7d4 100644 --- a/packages/database/e2e/onDisconnect/remove.e2e.js +++ b/packages/database/e2e/onDisconnect/remove.e2e.js @@ -30,7 +30,7 @@ describe('database().ref().onDisconnect().remove()', function () { const db = getDatabase(); // Ensures the db is online before running each test - await goOnline(db); + goOnline(db); }); it('throws if onComplete is not a function', function () { @@ -61,8 +61,8 @@ describe('database().ref().onDisconnect().remove()', function () { await set(childRef, 'foobar'); await onDisconnect(childRef).remove(); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); const snapshot = await get(childRef); snapshot.exists().should.eql(false); }); @@ -79,8 +79,8 @@ describe('database().ref().onDisconnect().remove()', function () { await set(childRef, 'foo'); await onDisconnect(childRef).remove(callback); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); callback.should.be.calledOnce(); }); diff --git a/packages/database/e2e/onDisconnect/set.e2e.js b/packages/database/e2e/onDisconnect/set.e2e.js index 9d0c3c6de9..723b583858 100644 --- a/packages/database/e2e/onDisconnect/set.e2e.js +++ b/packages/database/e2e/onDisconnect/set.e2e.js @@ -30,7 +30,7 @@ describe('database().ref().onDisconnect().set()', function () { const db = getDatabase(); // Ensures the db is online before running each test - await goOnline(db); + goOnline(db); }); it('throws if value is not a defined', function () { @@ -75,8 +75,8 @@ describe('database().ref().onDisconnect().set()', function () { const value = Date.now(); await onDisconnect(dbRef).set(value); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); const snapshot = await get(dbRef); snapshot.val().should.eql(value); @@ -93,8 +93,8 @@ describe('database().ref().onDisconnect().set()', function () { await set(dbRef, 'foo'); await onDisconnect(dbRef).set('bar', callback); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); callback.should.be.calledOnce(); }); diff --git a/packages/database/e2e/onDisconnect/setWithPriority.e2e.js b/packages/database/e2e/onDisconnect/setWithPriority.e2e.js index 1975f8d23b..43219960d4 100644 --- a/packages/database/e2e/onDisconnect/setWithPriority.e2e.js +++ b/packages/database/e2e/onDisconnect/setWithPriority.e2e.js @@ -30,7 +30,7 @@ describe('database().ref().onDisconnect().setWithPriority()', function () { const db = getDatabase(); // Ensures the db is online before running each test - await goOnline(db); + goOnline(db); }); it('throws if value is not a defined', function () { @@ -90,8 +90,8 @@ describe('database().ref().onDisconnect().setWithPriority()', function () { const value = Date.now(); await onDisconnect(dbRef).setWithPriority(value, 3); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); const snapshot = await get(dbRef); snapshot.exportVal()['.value'].should.eql(value); @@ -109,8 +109,8 @@ describe('database().ref().onDisconnect().setWithPriority()', function () { await set(dbRef, 'foo'); await onDisconnect(dbRef).setWithPriority('bar', 2, callback); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); callback.should.be.calledOnce(); }); diff --git a/packages/database/e2e/onDisconnect/update.e2e.js b/packages/database/e2e/onDisconnect/update.e2e.js index 91186d1756..35208c2178 100644 --- a/packages/database/e2e/onDisconnect/update.e2e.js +++ b/packages/database/e2e/onDisconnect/update.e2e.js @@ -30,7 +30,7 @@ describe('database().ref().onDisconnect().update()', function () { const db = getDatabase(); // Ensures the db is online before running each test - await goOnline(db); + goOnline(db); }); it('throws if values is not an object', async function () { @@ -112,8 +112,8 @@ describe('database().ref().onDisconnect().update()', function () { await onDisconnect(child(dbRef, 'foo')).update({ bar: value, }); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); const snapshot = await get(child(dbRef, 'foo'), 'value'); snapshot.val().should.eql( @@ -133,8 +133,8 @@ describe('database().ref().onDisconnect().update()', function () { // Set an initial value await set(dbRef, 'foo'); await onDisconnect(dbRef).update({ foo: 'bar' }, callback); - await goOffline(db); - await goOnline(db); + goOffline(db); + goOnline(db); callback.should.be.calledOnce(); }); diff --git a/packages/database/ios/RNFBDatabase.xcodeproj/project.pbxproj b/packages/database/ios/RNFBDatabase.xcodeproj/project.pbxproj index 2f9c2caa01..c6092a9c2b 100644 --- a/packages/database/ios/RNFBDatabase.xcodeproj/project.pbxproj +++ b/packages/database/ios/RNFBDatabase.xcodeproj/project.pbxproj @@ -7,13 +7,13 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBDatabaseModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBDatabaseModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBDatabaseModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBDatabaseModule.mm */; }; 8B9DD3BA22A03C7900A16945 /* RNFBDatabaseQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3B922A03C7900A16945 /* RNFBDatabaseQuery.m */; }; - 8B9DD3BD22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3BC22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.m */; }; + 8B9DD3BD22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3BC22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.mm */; }; 8B9DD3C222A0617400A16945 /* RNFBDatabaseCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3C122A0617400A16945 /* RNFBDatabaseCommon.m */; }; - 8B9DD3C622A11F4F00A16945 /* RNFBDatabaseReferenceModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3C522A11F4F00A16945 /* RNFBDatabaseReferenceModule.m */; }; - 8B9DD3C922A1258B00A16945 /* RNFBDatabaseQueryModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3C822A1258B00A16945 /* RNFBDatabaseQueryModule.m */; }; - 8B9DD3CE22A43D1400A16945 /* RNFBDatabaseTransactionModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3CD22A43D1400A16945 /* RNFBDatabaseTransactionModule.m */; }; + 8B9DD3C622A11F4F00A16945 /* RNFBDatabaseReferenceModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3C522A11F4F00A16945 /* RNFBDatabaseReferenceModule.mm */; }; + 8B9DD3C922A1258B00A16945 /* RNFBDatabaseQueryModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3C822A1258B00A16945 /* RNFBDatabaseQueryModule.mm */; }; + 8B9DD3CE22A43D1400A16945 /* RNFBDatabaseTransactionModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B9DD3CD22A43D1400A16945 /* RNFBDatabaseTransactionModule.mm */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -31,19 +31,19 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBDatabase.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBDatabase.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBDatabaseModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBDatabaseModule.h; path = RNFBDatabase/RNFBDatabaseModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBDatabaseModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBDatabaseModule.m; path = RNFBDatabase/RNFBDatabaseModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBDatabaseModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBDatabaseModule.mm; path = RNFBDatabase/RNFBDatabaseModule.mm; sourceTree = SOURCE_ROOT; }; 8B9DD3B822A03C6700A16945 /* RNFBDatabaseQuery.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBDatabaseQuery.h; sourceTree = ""; }; 8B9DD3B922A03C7900A16945 /* RNFBDatabaseQuery.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseQuery.m; sourceTree = ""; }; - 8B9DD3BC22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseOnDisconnectModule.m; sourceTree = ""; }; + 8B9DD3BC22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseOnDisconnectModule.mm; sourceTree = ""; }; 8B9DD3BE22A05D0400A16945 /* RNFBDatabaseOnDisconnectModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBDatabaseOnDisconnectModule.h; sourceTree = ""; }; 8B9DD3C022A0616300A16945 /* RNFBDatabaseCommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBDatabaseCommon.h; sourceTree = ""; }; 8B9DD3C122A0617400A16945 /* RNFBDatabaseCommon.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseCommon.m; sourceTree = ""; }; 8B9DD3C422A11F3E00A16945 /* RNFBDatabaseReferenceModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBDatabaseReferenceModule.h; sourceTree = ""; }; - 8B9DD3C522A11F4F00A16945 /* RNFBDatabaseReferenceModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseReferenceModule.m; sourceTree = ""; }; - 8B9DD3C822A1258B00A16945 /* RNFBDatabaseQueryModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseQueryModule.m; sourceTree = ""; }; + 8B9DD3C522A11F4F00A16945 /* RNFBDatabaseReferenceModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseReferenceModule.mm; sourceTree = ""; }; + 8B9DD3C822A1258B00A16945 /* RNFBDatabaseQueryModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseQueryModule.mm; sourceTree = ""; }; 8B9DD3CA22A1259F00A16945 /* RNFBDatabaseQueryModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBDatabaseQueryModule.h; sourceTree = ""; }; 8B9DD3CC22A43D0300A16945 /* RNFBDatabaseTransactionModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBDatabaseTransactionModule.h; sourceTree = ""; }; - 8B9DD3CD22A43D1400A16945 /* RNFBDatabaseTransactionModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseTransactionModule.m; sourceTree = ""; }; + 8B9DD3CD22A43D1400A16945 /* RNFBDatabaseTransactionModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBDatabaseTransactionModule.mm; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -69,19 +69,19 @@ isa = PBXGroup; children = ( 2744B98421F45429004F8E3F /* RNFBDatabaseModule.h */, - 2744B98521F45429004F8E3F /* RNFBDatabaseModule.m */, + 2744B98521F45429004F8E3F /* RNFBDatabaseModule.mm */, 8B9DD3B822A03C6700A16945 /* RNFBDatabaseQuery.h */, 8B9DD3B922A03C7900A16945 /* RNFBDatabaseQuery.m */, - 8B9DD3BC22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.m */, + 8B9DD3BC22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.mm */, 8B9DD3BE22A05D0400A16945 /* RNFBDatabaseOnDisconnectModule.h */, 8B9DD3C022A0616300A16945 /* RNFBDatabaseCommon.h */, 8B9DD3C122A0617400A16945 /* RNFBDatabaseCommon.m */, 8B9DD3C422A11F3E00A16945 /* RNFBDatabaseReferenceModule.h */, - 8B9DD3C522A11F4F00A16945 /* RNFBDatabaseReferenceModule.m */, - 8B9DD3C822A1258B00A16945 /* RNFBDatabaseQueryModule.m */, + 8B9DD3C522A11F4F00A16945 /* RNFBDatabaseReferenceModule.mm */, + 8B9DD3C822A1258B00A16945 /* RNFBDatabaseQueryModule.mm */, 8B9DD3CA22A1259F00A16945 /* RNFBDatabaseQueryModule.h */, 8B9DD3CC22A43D0300A16945 /* RNFBDatabaseTransactionModule.h */, - 8B9DD3CD22A43D1400A16945 /* RNFBDatabaseTransactionModule.m */, + 8B9DD3CD22A43D1400A16945 /* RNFBDatabaseTransactionModule.mm */, ); path = RNFBDatabase; sourceTree = ""; @@ -153,12 +153,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8B9DD3BD22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.m in Sources */, - 8B9DD3C922A1258B00A16945 /* RNFBDatabaseQueryModule.m in Sources */, - 8B9DD3CE22A43D1400A16945 /* RNFBDatabaseTransactionModule.m in Sources */, + 8B9DD3BD22A05CEB00A16945 /* RNFBDatabaseOnDisconnectModule.mm in Sources */, + 8B9DD3C922A1258B00A16945 /* RNFBDatabaseQueryModule.mm in Sources */, + 8B9DD3CE22A43D1400A16945 /* RNFBDatabaseTransactionModule.mm in Sources */, 8B9DD3C222A0617400A16945 /* RNFBDatabaseCommon.m in Sources */, - 8B9DD3C622A11F4F00A16945 /* RNFBDatabaseReferenceModule.m in Sources */, - 2744B98621F45429004F8E3F /* RNFBDatabaseModule.m in Sources */, + 8B9DD3C622A11F4F00A16945 /* RNFBDatabaseReferenceModule.mm in Sources */, + 2744B98621F45429004F8E3F /* RNFBDatabaseModule.mm in Sources */, 8B9DD3BA22A03C7900A16945 /* RNFBDatabaseQuery.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/packages/database/ios/RNFBDatabase/RNFBDatabaseModule.m b/packages/database/ios/RNFBDatabase/RNFBDatabaseModule.mm similarity index 53% rename from packages/database/ios/RNFBDatabase/RNFBDatabaseModule.m rename to packages/database/ios/RNFBDatabase/RNFBDatabaseModule.mm index b4789169e6..4c90fde6b4 100644 --- a/packages/database/ios/RNFBDatabase/RNFBDatabaseModule.m +++ b/packages/database/ios/RNFBDatabase/RNFBDatabaseModule.mm @@ -18,17 +18,31 @@ #import #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBDatabaseCommon.h" #import "RNFBDatabaseModule.h" +#import "RNFBDatabaseTurboModules.h" #import "RNFBPreferences.h" static __strong NSMutableDictionary *emulatorSettings; +@interface RNFBDatabaseModule () +@end + @implementation RNFBDatabaseModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +RCT_EXPORT_MODULE(NativeRNFBTurboDatabase); + ++ (BOOL)requiresMainQueueSetup { + return NO; +} - (dispatch_queue_t)methodQueue { return [RNFBDatabaseCommon getDispatchQueue]; @@ -37,31 +51,21 @@ - (dispatch_queue_t)methodQueue { #pragma mark - #pragma mark Firebase Database -RCT_EXPORT_METHOD(goOnline - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)goOnline:(NSString *)app dbURL:(NSString *)dbURL { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; [[RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL] goOnline]; - resolve([NSNull null]); } -RCT_EXPORT_METHOD(goOffline - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)goOffline:(NSString *)app dbURL:(NSString *)dbURL { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; [[RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL] goOffline]; - resolve([NSNull null]); } -RCT_EXPORT_METHOD(useEmulator - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (nonnull NSString *)host - : (NSInteger)port) { - // javascript may hot reload, losing state, and native throws an error if you double-request - // so we keep track of useEmulator calls here to avoid calling native twice +- (void)useEmulator:(NSString *)app + dbURL:(NSString *)dbURL + host:(NSString *)host + port:(double)port { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; if (emulatorSettings == nil) { emulatorSettings = [NSMutableDictionary dictionary]; } @@ -72,29 +76,25 @@ - (dispatch_queue_t)methodQueue { } if (!emulatorSettings[configKey]) { - [[RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL] useEmulatorWithHost:host - port:port]; + [[RNFBDatabaseCommon getDatabaseForApp:firebaseApp + dbURL:dbURL] useEmulatorWithHost:host port:(NSInteger)port]; emulatorSettings[configKey] = @YES; } } -RCT_EXPORT_METHOD(setPersistenceEnabled - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (BOOL)enabled) { +- (void)setPersistenceEnabled:(NSString *)app dbURL:(NSString *)dbURL enabled:(BOOL)enabled { [[RNFBPreferences shared] setBooleanValue:DATABASE_PERSISTENCE_ENABLED boolValue:enabled]; } -RCT_EXPORT_METHOD(setLoggingEnabled : (FIRApp *)firebaseApp : (NSString *)dbURL : (BOOL)enabled) { +- (void)setLoggingEnabled:(NSString *)app dbURL:(NSString *)dbURL enabled:(BOOL)enabled { [[RNFBPreferences shared] setBooleanValue:DATABASE_LOGGING_ENABLED boolValue:enabled]; } -RCT_EXPORT_METHOD(setPersistenceCacheSizeBytes - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSNumber *_Nonnull)bytes) { +- (void)setPersistenceCacheSizeBytes:(NSString *)app + dbURL:(NSString *)dbURL + cacheSizeBytes:(double)cacheSizeBytes { [[RNFBPreferences shared] setIntegerValue:DATABASE_PERSISTENCE_CACHE_SIZE - integerValue:[bytes intValue]]; + integerValue:(NSInteger)cacheSizeBytes]; } @end diff --git a/packages/database/ios/RNFBDatabase/RNFBDatabaseOnDisconnectModule.m b/packages/database/ios/RNFBDatabase/RNFBDatabaseOnDisconnectModule.mm similarity index 65% rename from packages/database/ios/RNFBDatabase/RNFBDatabaseOnDisconnectModule.m rename to packages/database/ios/RNFBDatabase/RNFBDatabaseOnDisconnectModule.mm index c1454dded9..45af2401bb 100644 --- a/packages/database/ios/RNFBDatabase/RNFBDatabaseOnDisconnectModule.m +++ b/packages/database/ios/RNFBDatabase/RNFBDatabaseOnDisconnectModule.mm @@ -18,14 +18,29 @@ #import #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBDatabaseCommon.h" #import "RNFBDatabaseOnDisconnectModule.h" +#import "RNFBDatabaseTurboModules.h" + +@interface RNFBDatabaseOnDisconnectModule () +@end @implementation RNFBDatabaseOnDisconnectModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +RCT_EXPORT_MODULE(NativeRNFBTurboDatabaseOnDisconnect); + ++ (BOOL)requiresMainQueueSetup { + return NO; +} - (dispatch_queue_t)methodQueue { return [RNFBDatabaseCommon getDispatchQueue]; @@ -34,12 +49,12 @@ - (dispatch_queue_t)methodQueue { #pragma mark - #pragma mark Firebase Database -RCT_EXPORT_METHOD(onDisconnectCancel - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)onDisconnectCancel:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -54,12 +69,12 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(onDisconnectRemove - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)onDisconnectRemove:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -74,13 +89,13 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(onDisconnectSet - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (NSDictionary *)props - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)onDisconnectSet:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -95,13 +110,13 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(onDisconnectSetWithPriority - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (NSDictionary *)props - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)onDisconnectSetWithPriority:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -117,13 +132,13 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(onDisconnectUpdate - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (NSDictionary *)props - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)onDisconnectUpdate:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; diff --git a/packages/database/ios/RNFBDatabase/RNFBDatabaseQueryModule.m b/packages/database/ios/RNFBDatabase/RNFBDatabaseQueryModule.mm similarity index 87% rename from packages/database/ios/RNFBDatabase/RNFBDatabaseQueryModule.m rename to packages/database/ios/RNFBDatabase/RNFBDatabaseQueryModule.mm index fbbfff24b8..ff4f356edd 100644 --- a/packages/database/ios/RNFBDatabase/RNFBDatabaseQueryModule.m +++ b/packages/database/ios/RNFBDatabase/RNFBDatabaseQueryModule.mm @@ -17,19 +17,33 @@ #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBDatabaseCommon.h" #import "RNFBDatabaseQuery.h" #import "RNFBDatabaseQueryModule.h" +#import "RNFBDatabaseTurboModules.h" #import "RNFBRCTEventEmitter.h" static __strong NSMutableDictionary *queryDictionary; static NSString *const RNFB_DATABASE_SYNC = @"database_sync_event"; +@interface RNFBDatabaseQueryModule () +@end + @implementation RNFBDatabaseQueryModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +RCT_EXPORT_MODULE(NativeRNFBTurboDatabaseQuery); + ++ (BOOL)requiresMainQueueSetup { + return NO; +} - (dispatch_queue_t)methodQueue { return [RNFBDatabaseCommon getDispatchQueue]; @@ -85,7 +99,6 @@ - (void)addOnceEventListener:(RNFBDatabaseQuery *)databaseQuery FIRDataEventType firDataEventType = (FIRDataEventType)[RNFBDatabaseCommon getEventTypeFromName:eventType]; - // On success id andPreviousSiblingKeyWithBlock = ^(FIRDataSnapshot *_Nonnull dataSnapshot, NSString *_Nullable previousChildName) { NSDictionary *data; @@ -98,7 +111,6 @@ - (void)addOnceEventListener:(RNFBDatabaseQuery *)databaseQuery resolve(data); }; - // On error id errorBlock = ^(NSError *_Nonnull error) { [RNFBDatabaseCommon promiseRejectDatabaseException:reject error:error]; }; @@ -181,14 +193,14 @@ - (void)handleDatabaseEventError:(NSString *)key #pragma mark - #pragma mark Firebase Database -RCT_EXPORT_METHOD(once - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (NSArray *)modifiers - : (NSString *)eventType - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)once:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + modifiers:(NSArray *)modifiers + eventType:(NSString *)eventType + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -198,13 +210,14 @@ - (void)handleDatabaseEventError:(NSString *)key [self addOnceEventListener:databaseQuery eventType:eventType resolve:resolve reject:reject]; } -RCT_EXPORT_METHOD(on : (FIRApp *)firebaseApp : (NSString *)dbURL : (NSDictionary *)props) { +- (void)on:(NSString *)app dbURL:(NSString *)dbURL props:(NSDictionary *)props { NSString *key = [props valueForKey:@"key"]; NSString *path = [props valueForKey:@"path"]; NSString *eventType = [props valueForKey:@"eventType"]; NSArray *modifiers = [props valueForKey:@"modifiers"]; NSDictionary *registration = [props valueForKey:@"registration"]; + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:key firebaseDatabase:firDatabase path:path]; @@ -214,9 +227,7 @@ - (void)handleDatabaseEventError:(NSString *)key [self addEventListener:databaseQuery eventType:eventType registration:registration]; } -RCT_EXPORT_METHOD(off - : (NSString *)queryKey eventRegistrationKey - : (NSString *)eventRegistrationKey) { +- (void)off:(NSString *)queryKey eventRegistrationKey:(NSString *)eventRegistrationKey { RNFBDatabaseQuery *databaseQuery = queryDictionary[queryKey]; if (databaseQuery != nil) { @@ -229,15 +240,15 @@ - (void)handleDatabaseEventError:(NSString *)key } } -RCT_EXPORT_METHOD(keepSynced - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)key - : (NSString *)path - : (NSArray *)modifiers - : (BOOL)value - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)keepSynced:(NSString *)app + dbURL:(NSString *)dbURL + key:(NSString *)key + path:(NSString *)path + modifiers:(NSArray *)modifiers + enabled:(BOOL)value + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -247,8 +258,4 @@ - (void)handleDatabaseEventError:(NSString *)key resolve([NSNull null]); } -+ (BOOL)requiresMainQueueSetup { - return YES; -} - @end diff --git a/packages/database/ios/RNFBDatabase/RNFBDatabaseReferenceModule.m b/packages/database/ios/RNFBDatabase/RNFBDatabaseReferenceModule.mm similarity index 66% rename from packages/database/ios/RNFBDatabase/RNFBDatabaseReferenceModule.m rename to packages/database/ios/RNFBDatabase/RNFBDatabaseReferenceModule.mm index 0c7350f88a..762109e8a3 100644 --- a/packages/database/ios/RNFBDatabase/RNFBDatabaseReferenceModule.m +++ b/packages/database/ios/RNFBDatabase/RNFBDatabaseReferenceModule.mm @@ -18,29 +18,50 @@ #import #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBDatabaseCommon.h" #import "RNFBDatabaseReferenceModule.h" +#import "RNFBDatabaseTurboModules.h" + +@interface RNFBDatabaseReferenceModule () +@end @implementation RNFBDatabaseReferenceModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +RCT_EXPORT_MODULE(NativeRNFBTurboDatabaseReference); + ++ (BOOL)requiresMainQueueSetup { + return NO; +} - (dispatch_queue_t)methodQueue { return [RNFBDatabaseCommon getDispatchQueue]; } +- (void)dealloc { + [self invalidate]; +} + +- (void)invalidate { +} + #pragma mark - #pragma mark Firebase Database -RCT_EXPORT_METHOD(set - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (NSDictionary *)props - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)set:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -55,13 +76,13 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(update - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (NSDictionary *)props - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)update:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -76,13 +97,13 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(setWithPriority - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (NSDictionary *)props - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)setWithPriority:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -98,12 +119,12 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(remove - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)remove:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; @@ -118,13 +139,13 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(setPriority - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (NSDictionary *)props - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)setPriority:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; diff --git a/packages/database/ios/RNFBDatabase/RNFBDatabaseTransactionModule.m b/packages/database/ios/RNFBDatabase/RNFBDatabaseTransactionModule.mm similarity index 72% rename from packages/database/ios/RNFBDatabase/RNFBDatabaseTransactionModule.m rename to packages/database/ios/RNFBDatabase/RNFBDatabaseTransactionModule.mm index bd2f1ea614..8352cd7c81 100644 --- a/packages/database/ios/RNFBDatabase/RNFBDatabaseTransactionModule.m +++ b/packages/database/ios/RNFBDatabase/RNFBDatabaseTransactionModule.mm @@ -18,19 +18,34 @@ #import #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBDatabaseCommon.h" #import "RNFBDatabaseTransactionModule.h" +#import "RNFBDatabaseTurboModules.h" #import "RNFBRCTEventEmitter.h" #import "RNFBSharedUtils.h" static __strong NSMutableDictionary *transactions; static NSString *const RNFB_DATABASE_TRANSACTION_EVENT = @"database_transaction_event"; +@interface RNFBDatabaseTransactionModule () +@end + @implementation RNFBDatabaseTransactionModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +RCT_EXPORT_MODULE(NativeRNFBTurboDatabaseTransaction); + ++ (BOOL)requiresMainQueueSetup { + return NO; +} - (dispatch_queue_t)methodQueue { return [RNFBDatabaseCommon getDispatchQueue]; @@ -48,15 +63,32 @@ - (id)init { return self; } +- (void)dealloc { + [self invalidate]; +} + +- (void)invalidate { + dispatch_sync(_transactionQueue, ^{ + for (NSString *key in [transactions allKeys]) { + NSMutableDictionary *transactionState = transactions[key]; + [transactionState setValue:@true forKey:@"abort"]; + dispatch_semaphore_t sema = [transactionState valueForKey:@"semaphore"]; + if (sema) { + dispatch_semaphore_signal(sema); + } + [transactions removeObjectForKey:key]; + } + }); +} + #pragma mark - #pragma mark Firebase Database -RCT_EXPORT_METHOD(transactionStart - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (NSString *)path - : (nonnull NSNumber *)transactionId - : (BOOL)applyLocally) { +- (void)transactionStart:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + transactionId:(double)transactionId + applyLocally:(BOOL)applyLocally { dispatch_async(_transactionQueue, ^{ NSMutableDictionary *transactionState = [NSMutableDictionary new]; dispatch_semaphore_t sema = dispatch_semaphore_create(0); @@ -64,19 +96,20 @@ - (id)init { #pragma ide diagnostic ignored "err_typecheck_convert_incompatible" transactionState[@"semaphore"] = sema; #pragma clang diagnostic pop + FIRApp *firebaseApp = [RCTConvert firAppFromString:app]; FIRDatabase *firDatabase = [RNFBDatabaseCommon getDatabaseForApp:firebaseApp dbURL:dbURL]; FIRDatabaseReference *firDatabaseReference = [RNFBDatabaseCommon getReferenceForDatabase:firDatabase path:path]; id runTransactionBlock = ^FIRTransactionResult *(FIRMutableData *currentData) { dispatch_barrier_async(self->_transactionQueue, ^{ - [transactions setValue:transactionState forKey:[transactionId stringValue]]; + [transactions setValue:transactionState forKey:[@(transactionId) stringValue]]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_DATABASE_TRANSACTION_EVENT body:@{ @"appName" : [RNFBSharedUtils getAppJavaScriptName:firDatabase.app.name], - @"id" : transactionId, + @"id" : @(transactionId), @"body" : @{ @"type" : @"update", @"value" : currentData.value, @@ -84,10 +117,6 @@ - (id)init { }]; }); - // wait for the js event handler to call tryCommitTransaction - // this wait occurs on the Firebase Worker Queue - // so if the tryCommitTransaction fails to signal the semaphore - // no further blocks will be executed by Firebase until the timeout expires dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC); BOOL timedout = dispatch_semaphore_wait(sema, delayTime) != 0; @@ -95,7 +124,7 @@ - (id)init { id value = [transactionState valueForKey:@"value"]; dispatch_barrier_async(self->_transactionQueue, ^{ - [transactions removeObjectForKey:[transactionId stringValue]]; + [transactions removeObjectForKey:[@(transactionId) stringValue]]; }); if (abort) { @@ -125,7 +154,7 @@ - (id)init { [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_DATABASE_TRANSACTION_EVENT body:@{ - @"id" : transactionId, + @"id" : @(transactionId), @"appName" : [RNFBSharedUtils getAppJavaScriptName:firDatabase.app.name], @"body" : resultMap, }]; @@ -137,19 +166,18 @@ - (id)init { }); } -RCT_EXPORT_METHOD(transactionTryCommit - : (FIRApp *)firebaseApp - : (NSString *)dbURL - : (nonnull NSNumber *)transactionId - : (NSDictionary *)updates) { +- (void)transactionTryCommit:(NSString *)app + dbURL:(NSString *)dbURL + transactionId:(double)transactionId + updates:(NSDictionary *)updates { __block NSMutableDictionary *transactionState; dispatch_sync(_transactionQueue, ^{ - transactionState = transactions[[transactionId stringValue]]; + transactionState = transactions[[@(transactionId) stringValue]]; }); if (!transactionState) { - NSLog(@"tryCommitTransaction for unknown ID %@", transactionId); + NSLog(@"tryCommitTransaction for unknown ID %@", @(transactionId)); return; } @@ -165,8 +193,4 @@ - (id)init { dispatch_semaphore_signal([transactionState valueForKey:@"semaphore"]); } -+ (BOOL)requiresMainQueueSetup { - return YES; -} - @end diff --git a/packages/database/ios/generated/RCTAppDependencyProvider.h b/packages/database/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/database/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/database/ios/generated/RCTAppDependencyProvider.mm b/packages/database/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/database/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/database/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/database/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/database/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/database/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/database/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/database/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/database/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/database/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/database/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/database/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/database/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/database/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/database/ios/generated/RNFBDatabaseTurboModules/RNFBDatabaseTurboModules-generated.mm b/packages/database/ios/generated/RNFBDatabaseTurboModules/RNFBDatabaseTurboModules-generated.mm new file mode 100644 index 0000000000..65b8894e8e --- /dev/null +++ b/packages/database/ios/generated/RNFBDatabaseTurboModules/RNFBDatabaseTurboModules-generated.mm @@ -0,0 +1,254 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBDatabaseTurboModules.h" + + +@implementation NativeRNFBTurboDatabaseSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_goOnline(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "goOnline", @selector(goOnline:dbURL:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_goOffline(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "goOffline", @selector(goOffline:dbURL:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setPersistenceEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setPersistenceEnabled", @selector(setPersistenceEnabled:dbURL:enabled:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setLoggingEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setLoggingEnabled", @selector(setLoggingEnabled:dbURL:enabled:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setPersistenceCacheSizeBytes(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setPersistenceCacheSizeBytes", @selector(setPersistenceCacheSizeBytes:dbURL:cacheSizeBytes:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseSpecJSI_useEmulator(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "useEmulator", @selector(useEmulator:dbURL:host:port:), args, count); + } + + NativeRNFBTurboDatabaseSpecJSI::NativeRNFBTurboDatabaseSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["goOnline"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_goOnline}; + + + methodMap_["goOffline"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_goOffline}; + + + methodMap_["setPersistenceEnabled"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setPersistenceEnabled}; + + + methodMap_["setLoggingEnabled"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setLoggingEnabled}; + + + methodMap_["setPersistenceCacheSizeBytes"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_setPersistenceCacheSizeBytes}; + + + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseSpecJSI_useEmulator}; + + } +} // namespace facebook::react + +@implementation NativeRNFBTurboDatabaseOnDisconnectSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectCancel(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "onDisconnectCancel", @selector(onDisconnectCancel:dbURL:path:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectRemove(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "onDisconnectRemove", @selector(onDisconnectRemove:dbURL:path:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectSet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "onDisconnectSet", @selector(onDisconnectSet:dbURL:path:props:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectSetWithPriority(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "onDisconnectSetWithPriority", @selector(onDisconnectSetWithPriority:dbURL:path:props:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectUpdate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "onDisconnectUpdate", @selector(onDisconnectUpdate:dbURL:path:props:resolve:reject:), args, count); + } + + NativeRNFBTurboDatabaseOnDisconnectSpecJSI::NativeRNFBTurboDatabaseOnDisconnectSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["onDisconnectCancel"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectCancel}; + + + methodMap_["onDisconnectRemove"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectRemove}; + + + methodMap_["onDisconnectSet"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectSet}; + + + methodMap_["onDisconnectSetWithPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectSetWithPriority}; + + + methodMap_["onDisconnectUpdate"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectSpecJSI_onDisconnectUpdate}; + + } +} // namespace facebook::react + +@implementation NativeRNFBTurboDatabaseQuerySpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_once(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "once", @selector(once:dbURL:path:modifiers:eventType:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_on(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "on", @selector(on:dbURL:props:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_off(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "off", @selector(off:eventRegistrationKey:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_keepSynced(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "keepSynced", @selector(keepSynced:dbURL:key:path:modifiers:enabled:resolve:reject:), args, count); + } + + NativeRNFBTurboDatabaseQuerySpecJSI::NativeRNFBTurboDatabaseQuerySpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["once"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_once}; + + + methodMap_["on"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_on}; + + + methodMap_["off"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_off}; + + + methodMap_["keepSynced"] = MethodMetadata {6, __hostFunction_NativeRNFBTurboDatabaseQuerySpecJSI_keepSynced}; + + } +} // namespace facebook::react + +@implementation NativeRNFBTurboDatabaseReferenceSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_set(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "set", @selector(set:dbURL:path:props:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_update(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "update", @selector(update:dbURL:path:props:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_setWithPriority(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setWithPriority", @selector(setWithPriority:dbURL:path:props:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_remove(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "remove", @selector(remove:dbURL:path:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_setPriority(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setPriority", @selector(setPriority:dbURL:path:props:resolve:reject:), args, count); + } + + NativeRNFBTurboDatabaseReferenceSpecJSI::NativeRNFBTurboDatabaseReferenceSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["set"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_set}; + + + methodMap_["update"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_update}; + + + methodMap_["setWithPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_setWithPriority}; + + + methodMap_["remove"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_remove}; + + + methodMap_["setPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceSpecJSI_setPriority}; + + } +} // namespace facebook::react + +@implementation NativeRNFBTurboDatabaseTransactionSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseTransactionSpecJSI_transactionStart(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "transactionStart", @selector(transactionStart:dbURL:path:transactionId:applyLocally:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboDatabaseTransactionSpecJSI_transactionTryCommit(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "transactionTryCommit", @selector(transactionTryCommit:dbURL:transactionId:updates:), args, count); + } + + NativeRNFBTurboDatabaseTransactionSpecJSI::NativeRNFBTurboDatabaseTransactionSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["transactionStart"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboDatabaseTransactionSpecJSI_transactionStart}; + + + methodMap_["transactionTryCommit"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseTransactionSpecJSI_transactionTryCommit}; + + } +} // namespace facebook::react diff --git a/packages/database/ios/generated/RNFBDatabaseTurboModules/RNFBDatabaseTurboModules.h b/packages/database/ios/generated/RNFBDatabaseTurboModules/RNFBDatabaseTurboModules.h new file mode 100644 index 0000000000..2c7b953c20 --- /dev/null +++ b/packages/database/ios/generated/RNFBDatabaseTurboModules/RNFBDatabaseTurboModules.h @@ -0,0 +1,264 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBDatabaseTurboModules symbols +#ifndef RNFBDatabaseTurboModules_H +#define RNFBDatabaseTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@protocol NativeRNFBTurboDatabaseSpec + +- (void)goOnline:(NSString *)app + dbURL:(NSString *)dbURL; +- (void)goOffline:(NSString *)app + dbURL:(NSString *)dbURL; +- (void)setPersistenceEnabled:(NSString *)app + dbURL:(NSString *)dbURL + enabled:(BOOL)enabled; +- (void)setLoggingEnabled:(NSString *)app + dbURL:(NSString *)dbURL + enabled:(BOOL)enabled; +- (void)setPersistenceCacheSizeBytes:(NSString *)app + dbURL:(NSString *)dbURL + cacheSizeBytes:(double)cacheSizeBytes; +- (void)useEmulator:(NSString *)app + dbURL:(NSString *)dbURL + host:(NSString *)host + port:(double)port; + +@end + +@interface NativeRNFBTurboDatabaseSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboDatabase' + */ + class JSI_EXPORT NativeRNFBTurboDatabaseSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboDatabaseSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +@protocol NativeRNFBTurboDatabaseOnDisconnectSpec + +- (void)onDisconnectCancel:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)onDisconnectRemove:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)onDisconnectSet:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)onDisconnectSetWithPriority:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)onDisconnectUpdate:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end + +@interface NativeRNFBTurboDatabaseOnDisconnectSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboDatabaseOnDisconnect' + */ + class JSI_EXPORT NativeRNFBTurboDatabaseOnDisconnectSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboDatabaseOnDisconnectSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +@protocol NativeRNFBTurboDatabaseQuerySpec + +- (void)once:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + modifiers:(NSArray *)modifiers + eventType:(NSString *)eventType + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)on:(NSString *)app + dbURL:(NSString *)dbURL + props:(NSDictionary *)props; +- (void)off:(NSString *)queryKey +eventRegistrationKey:(NSString *)eventRegistrationKey; +- (void)keepSynced:(NSString *)app + dbURL:(NSString *)dbURL + key:(NSString *)key + path:(NSString *)path + modifiers:(NSArray *)modifiers + enabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end + +@interface NativeRNFBTurboDatabaseQuerySpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboDatabaseQuery' + */ + class JSI_EXPORT NativeRNFBTurboDatabaseQuerySpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboDatabaseQuerySpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +@protocol NativeRNFBTurboDatabaseReferenceSpec + +- (void)set:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)update:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setWithPriority:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)remove:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setPriority:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + props:(NSDictionary *)props + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end + +@interface NativeRNFBTurboDatabaseReferenceSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboDatabaseReference' + */ + class JSI_EXPORT NativeRNFBTurboDatabaseReferenceSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboDatabaseReferenceSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +@protocol NativeRNFBTurboDatabaseTransactionSpec + +- (void)transactionStart:(NSString *)app + dbURL:(NSString *)dbURL + path:(NSString *)path + transactionId:(double)transactionId + applyLocally:(BOOL)applyLocally; +- (void)transactionTryCommit:(NSString *)app + dbURL:(NSString *)dbURL + transactionId:(double)transactionId + updates:(NSDictionary *)updates; + +@end + +@interface NativeRNFBTurboDatabaseTransactionSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboDatabaseTransaction' + */ + class JSI_EXPORT NativeRNFBTurboDatabaseTransactionSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboDatabaseTransactionSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + + + + + +NS_ASSUME_NONNULL_END +#endif // RNFBDatabaseTurboModules_H diff --git a/packages/database/ios/generated/RNFBDatabaseTurboModulesJSI-generated.cpp b/packages/database/ios/generated/RNFBDatabaseTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..84eae9eccb --- /dev/null +++ b/packages/database/ios/generated/RNFBDatabaseTurboModulesJSI-generated.cpp @@ -0,0 +1,257 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBDatabaseTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_goOnline(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->goOnline( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_goOffline(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->goOffline( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setPersistenceEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setPersistenceEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setLoggingEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setLoggingEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setPersistenceCacheSizeBytes(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setPersistenceCacheSizeBytes( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_useEmulator(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useEmulator( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber() + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboDatabaseCxxSpecJSI::NativeRNFBTurboDatabaseCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabase", jsInvoker) { + methodMap_["goOnline"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_goOnline}; + methodMap_["goOffline"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_goOffline}; + methodMap_["setPersistenceEnabled"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setPersistenceEnabled}; + methodMap_["setLoggingEnabled"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setLoggingEnabled}; + methodMap_["setPersistenceCacheSizeBytes"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_setPersistenceCacheSizeBytes}; + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseCxxSpecJSI_useEmulator}; +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectCancel(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectCancel( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectRemove(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectRemove( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectSet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectSet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectSetWithPriority(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectSetWithPriority( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectUpdate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->onDisconnectUpdate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} + +NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI::NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabaseOnDisconnect", jsInvoker) { + methodMap_["onDisconnectCancel"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectCancel}; + methodMap_["onDisconnectRemove"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectRemove}; + methodMap_["onDisconnectSet"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectSet}; + methodMap_["onDisconnectSetWithPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectSetWithPriority}; + methodMap_["onDisconnectUpdate"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI_onDisconnectUpdate}; +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_once(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->once( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt).asArray(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_on(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->on( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_off(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->off( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_keepSynced(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->keepSynced( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asBool() + ); +} + +NativeRNFBTurboDatabaseQueryCxxSpecJSI::NativeRNFBTurboDatabaseQueryCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabaseQuery", jsInvoker) { + methodMap_["once"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_once}; + methodMap_["on"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_on}; + methodMap_["off"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_off}; + methodMap_["keepSynced"] = MethodMetadata {6, __hostFunction_NativeRNFBTurboDatabaseQueryCxxSpecJSI_keepSynced}; +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_set(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->set( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_update(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->update( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_setWithPriority(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setWithPriority( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_remove(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->remove( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_setPriority(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setPriority( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} + +NativeRNFBTurboDatabaseReferenceCxxSpecJSI::NativeRNFBTurboDatabaseReferenceCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabaseReference", jsInvoker) { + methodMap_["set"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_set}; + methodMap_["update"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_update}; + methodMap_["setWithPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_setWithPriority}; + methodMap_["remove"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_remove}; + methodMap_["setPriority"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseReferenceCxxSpecJSI_setPriority}; +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseTransactionCxxSpecJSI_transactionStart(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionStart( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asBool() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboDatabaseTransactionCxxSpecJSI_transactionTryCommit(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionTryCommit( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboDatabaseTransactionCxxSpecJSI::NativeRNFBTurboDatabaseTransactionCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboDatabaseTransaction", jsInvoker) { + methodMap_["transactionStart"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboDatabaseTransactionCxxSpecJSI_transactionStart}; + methodMap_["transactionTryCommit"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboDatabaseTransactionCxxSpecJSI_transactionTryCommit}; +} + + +} // namespace facebook::react diff --git a/packages/database/ios/generated/RNFBDatabaseTurboModulesJSI.h b/packages/database/ios/generated/RNFBDatabaseTurboModulesJSI.h new file mode 100644 index 0000000000..b6dbe4b3d6 --- /dev/null +++ b/packages/database/ios/generated/RNFBDatabaseTurboModulesJSI.h @@ -0,0 +1,440 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboDatabaseCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void goOnline(jsi::Runtime &rt, jsi::String app, jsi::String dbURL) = 0; + virtual void goOffline(jsi::Runtime &rt, jsi::String app, jsi::String dbURL) = 0; + virtual void setPersistenceEnabled(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, bool enabled) = 0; + virtual void setLoggingEnabled(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, bool enabled) = 0; + virtual void setPersistenceCacheSizeBytes(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, double cacheSizeBytes) = 0; + virtual void useEmulator(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String host, double port) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabase"; + +protected: + NativeRNFBTurboDatabaseCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void goOnline(jsi::Runtime &rt, jsi::String app, jsi::String dbURL) override { + static_assert( + bridging::getParameterCount(&T::goOnline) == 3, + "Expected goOnline(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::goOnline, jsInvoker_, instance_, std::move(app), std::move(dbURL)); + } + void goOffline(jsi::Runtime &rt, jsi::String app, jsi::String dbURL) override { + static_assert( + bridging::getParameterCount(&T::goOffline) == 3, + "Expected goOffline(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::goOffline, jsInvoker_, instance_, std::move(app), std::move(dbURL)); + } + void setPersistenceEnabled(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setPersistenceEnabled) == 4, + "Expected setPersistenceEnabled(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setPersistenceEnabled, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(enabled)); + } + void setLoggingEnabled(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setLoggingEnabled) == 4, + "Expected setLoggingEnabled(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setLoggingEnabled, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(enabled)); + } + void setPersistenceCacheSizeBytes(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, double cacheSizeBytes) override { + static_assert( + bridging::getParameterCount(&T::setPersistenceCacheSizeBytes) == 4, + "Expected setPersistenceCacheSizeBytes(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setPersistenceCacheSizeBytes, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(cacheSizeBytes)); + } + void useEmulator(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String host, double port) override { + static_assert( + bridging::getParameterCount(&T::useEmulator) == 5, + "Expected useEmulator(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::useEmulator, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(host), std::move(port)); + } + + private: + friend class NativeRNFBTurboDatabaseCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value onDisconnectCancel(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) = 0; + virtual jsi::Value onDisconnectRemove(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) = 0; + virtual jsi::Value onDisconnectSet(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value onDisconnectSetWithPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value onDisconnectUpdate(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseOnDisconnectCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabaseOnDisconnect"; + +protected: + NativeRNFBTurboDatabaseOnDisconnectCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseOnDisconnectCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseOnDisconnectCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value onDisconnectCancel(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectCancel) == 4, + "Expected onDisconnectCancel(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectCancel, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path)); + } + jsi::Value onDisconnectRemove(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectRemove) == 4, + "Expected onDisconnectRemove(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectRemove, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path)); + } + jsi::Value onDisconnectSet(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectSet) == 5, + "Expected onDisconnectSet(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectSet, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value onDisconnectSetWithPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectSetWithPriority) == 5, + "Expected onDisconnectSetWithPriority(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectSetWithPriority, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value onDisconnectUpdate(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::onDisconnectUpdate) == 5, + "Expected onDisconnectUpdate(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::onDisconnectUpdate, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + + private: + friend class NativeRNFBTurboDatabaseOnDisconnectCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboDatabaseQueryCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseQueryCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value once(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Array modifiers, jsi::String eventType) = 0; + virtual void on(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::Object props) = 0; + virtual void off(jsi::Runtime &rt, jsi::String queryKey, jsi::String eventRegistrationKey) = 0; + virtual jsi::Value keepSynced(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String key, jsi::String path, jsi::Array modifiers, bool enabled) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseQueryCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabaseQuery"; + +protected: + NativeRNFBTurboDatabaseQueryCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseQueryCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseQueryCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseQueryCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value once(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Array modifiers, jsi::String eventType) override { + static_assert( + bridging::getParameterCount(&T::once) == 6, + "Expected once(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::once, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(modifiers), std::move(eventType)); + } + void on(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::on) == 4, + "Expected on(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::on, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(props)); + } + void off(jsi::Runtime &rt, jsi::String queryKey, jsi::String eventRegistrationKey) override { + static_assert( + bridging::getParameterCount(&T::off) == 3, + "Expected off(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::off, jsInvoker_, instance_, std::move(queryKey), std::move(eventRegistrationKey)); + } + jsi::Value keepSynced(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String key, jsi::String path, jsi::Array modifiers, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::keepSynced) == 7, + "Expected keepSynced(...) to have 7 parameters"); + + return bridging::callFromJs( + rt, &T::keepSynced, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(key), std::move(path), std::move(modifiers), std::move(enabled)); + } + + private: + friend class NativeRNFBTurboDatabaseQueryCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboDatabaseReferenceCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseReferenceCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value set(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value update(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value setWithPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + virtual jsi::Value remove(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) = 0; + virtual jsi::Value setPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseReferenceCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabaseReference"; + +protected: + NativeRNFBTurboDatabaseReferenceCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseReferenceCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseReferenceCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseReferenceCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value set(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::set) == 5, + "Expected set(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::set, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value update(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::update) == 5, + "Expected update(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::update, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value setWithPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::setWithPriority) == 5, + "Expected setWithPriority(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::setWithPriority, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + jsi::Value remove(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::remove) == 4, + "Expected remove(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::remove, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path)); + } + jsi::Value setPriority(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, jsi::Object props) override { + static_assert( + bridging::getParameterCount(&T::setPriority) == 5, + "Expected setPriority(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::setPriority, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(props)); + } + + private: + friend class NativeRNFBTurboDatabaseReferenceCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboDatabaseTransactionCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboDatabaseTransactionCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void transactionStart(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, double transactionId, bool applyLocally) = 0; + virtual void transactionTryCommit(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, double transactionId, jsi::Object updates) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboDatabaseTransactionCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboDatabaseTransaction"; + +protected: + NativeRNFBTurboDatabaseTransactionCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboDatabaseTransactionCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboDatabaseTransactionCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboDatabaseTransactionCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void transactionStart(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, jsi::String path, double transactionId, bool applyLocally) override { + static_assert( + bridging::getParameterCount(&T::transactionStart) == 6, + "Expected transactionStart(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::transactionStart, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(path), std::move(transactionId), std::move(applyLocally)); + } + void transactionTryCommit(jsi::Runtime &rt, jsi::String app, jsi::String dbURL, double transactionId, jsi::Object updates) override { + static_assert( + bridging::getParameterCount(&T::transactionTryCommit) == 5, + "Expected transactionTryCommit(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::transactionTryCommit, jsInvoker_, instance_, std::move(app), std::move(dbURL), std::move(transactionId), std::move(updates)); + } + + private: + friend class NativeRNFBTurboDatabaseTransactionCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/database/ios/generated/ReactAppDependencyProvider.podspec b/packages/database/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/database/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/database/lib/DatabaseSyncTree.ts b/packages/database/lib/DatabaseSyncTree.ts index 1cffb83270..ffc38779e0 100644 --- a/packages/database/lib/DatabaseSyncTree.ts +++ b/packages/database/lib/DatabaseSyncTree.ts @@ -79,7 +79,8 @@ class DatabaseSyncTree { } private get native(): RNFBDatabaseModule { - return getReactNativeModule('RNFBDatabaseQueryModule') as unknown as RNFBDatabaseModule; + // NewArch-AD-18 E9: query host for sync tree off(); merged surface exposes off via composite. + return getReactNativeModule('NativeRNFBTurboDatabaseQuery') as unknown as RNFBDatabaseModule; } private _allocate( diff --git a/packages/database/lib/index.ts b/packages/database/lib/index.ts index fc82496925..21381c0bf5 100644 --- a/packages/database/lib/index.ts +++ b/packages/database/lib/index.ts @@ -50,14 +50,14 @@ import type { import { version } from './version'; import fallBackModule from './web/RNFBDatabaseModule'; -const nativeModuleName = 'RNFBDatabaseModule'; +const nativeModuleName = 'NativeRNFBTurboDatabase'; const nativeModuleNames = [ nativeModuleName, - 'RNFBDatabaseReferenceModule', - 'RNFBDatabaseQueryModule', - 'RNFBDatabaseOnDisconnectModule', - 'RNFBDatabaseTransactionModule', + 'NativeRNFBTurboDatabaseReference', + 'NativeRNFBTurboDatabaseQuery', + 'NativeRNFBTurboDatabaseOnDisconnect', + 'NativeRNFBTurboDatabaseTransaction', ] as const; function ap(reference: DatabaseReference): DatabaseReferenceInternal { @@ -133,12 +133,12 @@ class FirebaseDatabaseModule extends FirebaseModule { return new DatabaseReferenceImpl(this, path || '/'); } - goOnline(): Promise { - return this.nativeModule.goOnline(); + goOnline(): void { + this.nativeModule.goOnline(); } - goOffline(): Promise { - return this.nativeModule.goOffline(); + goOffline(): void { + this.nativeModule.goOffline(); } setPersistenceEnabled(enabled: boolean): Promise { @@ -218,6 +218,7 @@ const config: ModuleConfig = { nativeEvents: ['database_transaction_event', 'database_sync_event'], hasMultiAppSupport: true, hasCustomUrlOrRegionSupport: true, + turboModule: true, }; export const SDK_VERSION = version; @@ -244,10 +245,16 @@ export function connectDatabaseEmulator( (db as DatabaseWithMethodsInternal).useEmulator(host, port, options); } +/** + * Manually disconnects the Realtime Database client from the server. + */ export function goOffline(db: Database): void { (db as DatabaseWithMethodsInternal).goOffline(); } +/** + * Manually re-establishes the Realtime Database connection. + */ export function goOnline(db: Database): void { (db as DatabaseWithMethodsInternal).goOnline(); } @@ -260,6 +267,13 @@ export function refFromURL(db: Database, url: string): DatabaseReference { return (db as DatabaseWithMethodsInternal).refFromURL(url); } +/** + * Enables or disables disk persistence for the Realtime Database instance. + * + * @remarks React Native Firebase-specific API with no firebase-js-sdk modular equivalent. + * Must be called before any database references are used. Persistence is provided by the + * native iOS/Android SDK, not the web IndexedDB stack. + */ export function setPersistenceEnabled(db: Database, enabled: boolean): Promise { return (db as DatabaseWithMethodsInternal).setPersistenceEnabled(enabled) as Promise; } @@ -268,14 +282,28 @@ export function setLoggingEnabled(db: Database, enabled: boolean): Promise return (db as DatabaseWithMethodsInternal).setLoggingEnabled(enabled) as Promise; } +/** + * Sets the on-disk persistence cache size in bytes. + * + * @remarks React Native Firebase-specific API with no firebase-js-sdk modular equivalent. + * Valid range is 1 MB–100 MB. Must be called before any database references are used. + */ export function setPersistenceCacheSizeBytes(db: Database, bytes: number): Promise { return (db as DatabaseWithMethodsInternal).setPersistenceCacheSizeBytes(bytes) as Promise; } +/** + * @remarks **Not implemented on React Native Firebase.** Always throws — transport mode is + * controlled by the native Realtime Database SDK. + */ export function forceLongPolling(): void { throw new Error('forceLongPolling() is not implemented'); } +/** + * @remarks **Not implemented on React Native Firebase.** Always throws — transport mode is + * controlled by the native Realtime Database SDK. + */ export function forceWebSockets(): void { throw new Error('forceWebSockets() is not implemented'); } @@ -284,6 +312,12 @@ export function serverTimestamp(): object { return ServerValue.TIMESTAMP; } +/** + * Returns the current server time as a `Date`, adjusted for clock skew. + * + * @remarks React Native Firebase-specific helper with no firebase-js-sdk modular equivalent. + * Reads the native `.info/serverTimeOffset` listener maintained by the database module. + */ export function getServerTime(db: Database): Date { return (db as DatabaseWithMethodsInternal).getServerTime(); } diff --git a/packages/database/lib/types/internal.ts b/packages/database/lib/types/internal.ts index 0b45cf3ea9..0d53ee0b44 100644 --- a/packages/database/lib/types/internal.ts +++ b/packages/database/lib/types/internal.ts @@ -132,8 +132,8 @@ export interface DatabaseEventEmitterInternal { /** Wrapped native module interface for database. */ export interface RNFBDatabaseModule { - goOnline(): Promise; - goOffline(): Promise; + goOnline(): void; + goOffline(): void; setPersistenceEnabled(enabled: boolean): Promise; setLoggingEnabled(enabled: boolean): Promise; setPersistenceCacheSizeBytes(bytes: number): Promise; @@ -181,7 +181,11 @@ export interface RNFBDatabaseModule { declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBDatabaseModule: RNFBDatabaseModule; + NativeRNFBTurboDatabase: RNFBDatabaseModule; + NativeRNFBTurboDatabaseReference: RNFBDatabaseModule; + NativeRNFBTurboDatabaseQuery: RNFBDatabaseModule; + NativeRNFBTurboDatabaseOnDisconnect: RNFBDatabaseModule; + NativeRNFBTurboDatabaseTransaction: RNFBDatabaseModule; } } diff --git a/packages/database/lib/web/RNFBDatabaseModule.ts b/packages/database/lib/web/RNFBDatabaseModule.ts index 637586515f..746bbc07e9 100644 --- a/packages/database/lib/web/RNFBDatabaseModule.ts +++ b/packages/database/lib/web/RNFBDatabaseModule.ts @@ -126,18 +126,14 @@ function getCachedOnDisconnectInstance(refValue: WebDatabaseReference): WebOnDis } const databaseFallbackModule: Record = { - goOnline(appName: string, dbURL: string): Promise { - return guard(async () => { - const db = getCachedDatabaseInstance(appName, dbURL); - goOnline(db); - }); + goOnline(appName: string, dbURL: string): void { + const db = getCachedDatabaseInstance(appName, dbURL); + goOnline(db); }, - goOffline(appName: string, dbURL: string): Promise { - return guard(async () => { - const db = getCachedDatabaseInstance(appName, dbURL); - goOffline(db); - }); + goOffline(appName: string, dbURL: string): void { + const db = getCachedDatabaseInstance(appName, dbURL); + goOffline(db); }, setPersistenceEnabled(): Promise { diff --git a/packages/database/package.json b/packages/database/package.json index f5e845fc46..0f2e3a13fe 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -5,11 +5,32 @@ "description": "React Native Firebase - The Firebase Realtime Database is a cloud-hosted database. Data is stored as JSON and synchronized in realtime to every connected client. React Native Firebase provides native integration with the Android & iOS Firebase SDKs, supporting both realtime data sync and offline capabilities.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBDatabaseTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.database" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboDatabase": "RNFBDatabaseModule", + "NativeRNFBTurboDatabaseReference": "RNFBDatabaseReferenceModule", + "NativeRNFBTurboDatabaseQuery": "RNFBDatabaseQueryModule", + "NativeRNFBTurboDatabaseOnDisconnect": "RNFBDatabaseOnDisconnectModule", + "NativeRNFBTurboDatabaseTransaction": "RNFBDatabaseTransactionModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "compile": "bob build", - "prepare": "yarn run build && yarn compile" + "prepare": "yarn run build && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/reactnative/java/io/invertase/firebase/database/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/database/react-native.config.js b/packages/database/react-native.config.js new file mode 100644 index 0000000000..0c0fea8283 --- /dev/null +++ b/packages/database/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/reactnative/java/io/invertase/firebase/database/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/database/specs/NativeRNFBTurboDatabase.ts b/packages/database/specs/NativeRNFBTurboDatabase.ts new file mode 100644 index 0000000000..1be2279a57 --- /dev/null +++ b/packages/database/specs/NativeRNFBTurboDatabase.ts @@ -0,0 +1,13 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + goOnline(app: string, dbURL: string): void; + goOffline(app: string, dbURL: string): void; + setPersistenceEnabled(app: string, dbURL: string, enabled: boolean): void; + setLoggingEnabled(app: string, dbURL: string, enabled: boolean): void; + setPersistenceCacheSizeBytes(app: string, dbURL: string, cacheSizeBytes: number): void; + useEmulator(app: string, dbURL: string, host: string, port: number): void; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboDatabase'); diff --git a/packages/database/specs/NativeRNFBTurboDatabaseOnDisconnect.ts b/packages/database/specs/NativeRNFBTurboDatabaseOnDisconnect.ts new file mode 100644 index 0000000000..052a57e753 --- /dev/null +++ b/packages/database/specs/NativeRNFBTurboDatabaseOnDisconnect.ts @@ -0,0 +1,18 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + onDisconnectCancel(app: string, dbURL: string, path: string): Promise; + onDisconnectRemove(app: string, dbURL: string, path: string): Promise; + onDisconnectSet(app: string, dbURL: string, path: string, props: Object): Promise; + onDisconnectSetWithPriority( + app: string, + dbURL: string, + path: string, + props: Object, + ): Promise; + onDisconnectUpdate(app: string, dbURL: string, path: string, props: Object): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboDatabaseOnDisconnect'); diff --git a/packages/database/specs/NativeRNFBTurboDatabaseQuery.ts b/packages/database/specs/NativeRNFBTurboDatabaseQuery.ts new file mode 100644 index 0000000000..2c9fb08e69 --- /dev/null +++ b/packages/database/specs/NativeRNFBTurboDatabaseQuery.ts @@ -0,0 +1,25 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + once( + app: string, + dbURL: string, + path: string, + modifiers: ReadonlyArray, + eventType: string, + ): Promise; + on(app: string, dbURL: string, props: Object): void; + off(queryKey: string, eventRegistrationKey: string): void; + keepSynced( + app: string, + dbURL: string, + key: string, + path: string, + modifiers: ReadonlyArray, + enabled: boolean, + ): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboDatabaseQuery'); diff --git a/packages/database/specs/NativeRNFBTurboDatabaseReference.ts b/packages/database/specs/NativeRNFBTurboDatabaseReference.ts new file mode 100644 index 0000000000..4b5de6f6df --- /dev/null +++ b/packages/database/specs/NativeRNFBTurboDatabaseReference.ts @@ -0,0 +1,13 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + set(app: string, dbURL: string, path: string, props: Object): Promise; + update(app: string, dbURL: string, path: string, props: Object): Promise; + setWithPriority(app: string, dbURL: string, path: string, props: Object): Promise; + remove(app: string, dbURL: string, path: string): Promise; + setPriority(app: string, dbURL: string, path: string, props: Object): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboDatabaseReference'); diff --git a/packages/database/specs/NativeRNFBTurboDatabaseTransaction.ts b/packages/database/specs/NativeRNFBTurboDatabaseTransaction.ts new file mode 100644 index 0000000000..eab8670c91 --- /dev/null +++ b/packages/database/specs/NativeRNFBTurboDatabaseTransaction.ts @@ -0,0 +1,16 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + transactionStart( + app: string, + dbURL: string, + path: string, + transactionId: number, + applyLocally: boolean, + ): void; + transactionTryCommit(app: string, dbURL: string, transactionId: number, updates: Object): void; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboDatabaseTransaction'); diff --git a/packages/firestore/RNFBFirestore.podspec b/packages/firestore/RNFBFirestore.podspec index a153aa395d..cadda65679 100644 --- a/packages/firestore/RNFBFirestore.podspec +++ b/packages/firestore/RNFBFirestore.podspec @@ -28,15 +28,28 @@ Pod::Spec.new do |s| s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target s.swift_version = '5.10' - s.source_files = 'ios/**/*.{h,m,mm,swift}' + s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.private_header_files = [ + 'ios/RNFBFirestore/RNFBFirestoreModule.h', + 'ios/RNFBFirestore/RNFBFirestoreCollectionModule.h', + 'ios/RNFBFirestore/RNFBFirestoreDocumentModule.h', + 'ios/RNFBFirestore/RNFBFirestoreTransactionModule.h', + 'ios/generated/**/*.h', + ] + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' + + s.pod_target_xcconfig = { + "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/ios/generated/RNFBFirestoreTurboModules\" \"$(PODS_TARGET_SRCROOT)/ios/generated\"", + } s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + # Fail fast for old architecture users, but safely in case the variable goes away + # completely in future react-native versions + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/firestore/__tests__/nativeModuleContract.test.ts b/packages/firestore/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..1f72236b28 --- /dev/null +++ b/packages/firestore/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,125 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { TurboModuleRegistry } from 'react-native'; +import type { ModuleConfig } from '@react-native-firebase/app/dist/module/internal'; +import FirebaseModule from '@react-native-firebase/app/dist/module/internal/FirebaseModule'; +import { getNativeModule } from '@react-native-firebase/app/dist/module/internal/registry/nativeModule'; +import type { WrappedNativeModule } from '@react-native-firebase/app/dist/module/internal/NativeModules'; +import { createTurboModuleFixture } from '../../app/__tests__/turboModuleContractHelper'; + +const MAIN_METHODS = [ + 'setLogLevel', + 'loadBundle', + 'clearPersistence', + 'waitForPendingWrites', + 'disableNetwork', + 'enableNetwork', + 'useEmulator', + 'settings', + 'terminate', + 'persistenceCacheIndexManager', + 'addSnapshotsInSync', + 'removeSnapshotsInSync', +] as const; + +const COLLECTION_METHODS = [ + 'namedQueryOnSnapshot', + 'collectionOnSnapshot', + 'collectionOffSnapshot', + 'namedQueryGet', + 'collectionCount', + 'aggregateQuery', + 'pipelineExecute', + 'collectionGet', +] as const; + +const DOCUMENT_METHODS = [ + 'documentOnSnapshot', + 'documentOffSnapshot', + 'documentGet', + 'documentDelete', + 'documentSet', + 'documentUpdate', + 'documentBatch', +] as const; + +const TRANSACTION_METHODS = [ + 'transactionBegin', + 'transactionGetDocument', + 'transactionDispose', + 'transactionApplyBuffer', +] as const; + +const ALL_SPEC_METHODS = [ + ...MAIN_METHODS, + ...COLLECTION_METHODS, + ...DOCUMENT_METHODS, + ...TRANSACTION_METHODS, +]; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('asserts merged Firestore spec method names are unique (NewArch-AD-11)', function () { + expect(new Set(ALL_SPEC_METHODS).size).toBe(ALL_SPEC_METHODS.length); + expect(ALL_SPEC_METHODS).toHaveLength(31); + }); + + it('routes methods through a 4-host merge composite Proxy (NewArch-AD-14a)', function () { + const mainMethod = jest.fn(() => 'main'); + const collectionMethod = jest.fn(() => 'collection'); + const documentMethod = jest.fn(() => 'document'); + const transactionMethod = jest.fn(() => 'transaction'); + + const hostMain = createTurboModuleFixture({ setLogLevel: mainMethod }); + const hostCollection = createTurboModuleFixture({ collectionGet: collectionMethod }); + const hostDocument = createTurboModuleFixture({ documentGet: documentMethod }); + const hostTransaction = createTurboModuleFixture({ transactionBegin: transactionMethod }); + + jest + .mocked(TurboModuleRegistry.get) + .mockReturnValueOnce(hostMain) + .mockReturnValueOnce(hostCollection) + .mockReturnValueOnce(hostDocument) + .mockReturnValueOnce(hostTransaction); + + const config: ModuleConfig = { + namespace: 'firestoreContract', + nativeModuleName: [ + 'NativeRNFBTurboFirestore', + 'NativeRNFBTurboFirestoreCollection', + 'NativeRNFBTurboFirestoreDocument', + 'NativeRNFBTurboFirestoreTransaction', + ], + nativeEvents: false, + hasMultiAppSupport: true, + hasCustomUrlOrRegionSupport: true, + turboModule: true, + }; + + class MergeModule extends FirebaseModule { + constructor() { + super({ name: '[DEFAULT]' } as any, config); + } + } + + const wrapped = getNativeModule(new MergeModule()) as WrappedNativeModule & { + setLogLevel: () => string; + collectionGet: () => string; + documentGet: () => string; + transactionBegin: () => string; + }; + + expect(wrapped.setLogLevel()).toBe('main'); + expect(wrapped.collectionGet()).toBe('collection'); + expect(wrapped.documentGet()).toBe('document'); + expect(wrapped.transactionBegin()).toBe('transaction'); + expect(mainMethod).toHaveBeenCalledTimes(1); + expect(collectionMethod).toHaveBeenCalledTimes(1); + expect(documentMethod).toHaveBeenCalledTimes(1); + expect(transactionMethod).toHaveBeenCalledTimes(1); + expect(Object.keys(wrapped).sort()).toEqual([ + 'collectionGet', + 'documentGet', + 'setLogLevel', + 'transactionBegin', + ]); + }); +}); diff --git a/packages/firestore/android/build.gradle b/packages/firestore/android/build.gradle index 2704ef66c2..7a1ca3252f 100644 --- a/packages/firestore/android/build.gradle +++ b/packages/firestore/android/build.gradle @@ -79,6 +79,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -98,3 +99,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/firestore") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/FirestoreTurboModuleSupport.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/FirestoreTurboModuleSupport.java new file mode 100644 index 0000000000..3e778c9a03 --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/FirestoreTurboModuleSupport.java @@ -0,0 +1,56 @@ +package io.invertase.firebase.firestore; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import androidx.annotation.CallSuper; +import io.invertase.firebase.common.TaskExecutorService; +import java.util.concurrent.ExecutorService; + +/** + * Shared executor helpers for Firestore TurboModule shells (replaces ReactNativeFirebaseModule + * inheritance when extending generated *Spec classes). + */ +final class FirestoreTurboModuleSupport { + private final TaskExecutorService executorService; + + FirestoreTurboModuleSupport(String moduleName) { + executorService = new TaskExecutorService(moduleName); + } + + ExecutorService getExecutor() { + return executorService.getExecutor(); + } + + ExecutorService getTransactionalExecutor() { + return executorService.getTransactionalExecutor(); + } + + ExecutorService getTransactionalExecutor(String identifier) { + return executorService.getTransactionalExecutor(identifier); + } + + void removeEventListeningExecutor(String identifier) { + String executorName = executorService.getExecutorName(true, identifier); + executorService.removeExecutor(executorName); + } + + @CallSuper + void invalidate() { + executorService.shutdown(); + } +} diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreModule.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestore.java similarity index 82% rename from packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreModule.java rename to packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestore.java index 1be4991e46..785e0cac5d 100644 --- a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreModule.java +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestore.java @@ -22,27 +22,26 @@ import static io.invertase.firebase.firestore.UniversalFirebaseFirestoreCommon.createFirestoreKey; import static io.invertase.firebase.firestore.UniversalFirebaseFirestoreCommon.getFirestoreForApp; +import com.facebook.fbreact.specs.NativeRNFBTurboFirestoreSpec; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.LoadBundleTaskProgress; import com.google.firebase.firestore.PersistentCacheIndexManager; -import io.invertase.firebase.common.ReactNativeFirebaseModule; -public class ReactNativeFirebaseFirestoreModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboFirestore extends NativeRNFBTurboFirestoreSpec { private static final String SERVICE_NAME = "Firestore"; private final UniversalFirebaseFirestoreModule module; - ReactNativeFirebaseFirestoreModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboFirestore(ReactApplicationContext reactContext) { + super(reactContext); module = new UniversalFirebaseFirestoreModule(reactContext, SERVICE_NAME); } - @ReactMethod + @Override public void setLogLevel(String logLevel) { if ("debug".equals(logLevel) || "error".equals(logLevel)) { FirebaseFirestore.setLoggingEnabled(true); @@ -51,7 +50,7 @@ public void setLogLevel(String logLevel) { } } - @ReactMethod + @Override public void loadBundle(String appName, String databaseId, String bundle, Promise promise) { module .loadBundle(appName, databaseId, bundle) @@ -66,7 +65,7 @@ public void loadBundle(String appName, String databaseId, String bundle, Promise }); } - @ReactMethod + @Override public void clearPersistence(String appName, String databaseId, Promise promise) { module .clearPersistence(appName, databaseId) @@ -80,7 +79,7 @@ public void clearPersistence(String appName, String databaseId, Promise promise) }); } - @ReactMethod + @Override public void waitForPendingWrites(String appName, String databaseId, Promise promise) { module .waitForPendingWrites(appName, databaseId) @@ -94,7 +93,7 @@ public void waitForPendingWrites(String appName, String databaseId, Promise prom }); } - @ReactMethod + @Override public void disableNetwork(String appName, String databaseId, Promise promise) { module .disableNetwork(appName, databaseId) @@ -108,7 +107,7 @@ public void disableNetwork(String appName, String databaseId, Promise promise) { }); } - @ReactMethod + @Override public void enableNetwork(String appName, String databaseId, Promise promise) { module .enableNetwork(appName, databaseId) @@ -122,22 +121,12 @@ public void enableNetwork(String appName, String databaseId, Promise promise) { }); } - @ReactMethod - public void useEmulator( - String appName, String databaseId, String host, int port, Promise promise) { - module - .useEmulator(appName, databaseId, host, port) - .addOnCompleteListener( - task -> { - if (task.isSuccessful()) { - promise.resolve(null); - } else { - rejectPromiseFirestoreException(promise, task.getException()); - } - }); + @Override + public void useEmulator(String appName, String databaseId, String host, double port) { + module.useEmulator(appName, databaseId, host, (int) port); } - @ReactMethod + @Override public void settings(String appName, String databaseId, ReadableMap settings, Promise promise) { String firestoreKey = createFirestoreKey(appName, databaseId); module @@ -152,7 +141,7 @@ public void settings(String appName, String databaseId, ReadableMap settings, Pr }); } - @ReactMethod + @Override public void terminate(String appName, String databaseId, Promise promise) { module .terminate(appName, databaseId) @@ -166,13 +155,14 @@ public void terminate(String appName, String databaseId, Promise promise) { }); } - @ReactMethod + @Override public void persistenceCacheIndexManager( - String appName, String databaseId, int requestType, Promise promise) { + String appName, String databaseId, double requestType, Promise promise) { + int mode = (int) requestType; PersistentCacheIndexManager indexManager = getFirestoreForApp(appName, databaseId).getPersistentCacheIndexManager(); if (indexManager != null) { - switch (requestType) { + switch (mode) { case 0: indexManager.enableIndexAutoCreation(); break; @@ -193,18 +183,14 @@ public void persistenceCacheIndexManager( promise.resolve(null); } - @ReactMethod - public void addSnapshotsInSync( - String appName, String databaseId, int listenerId, Promise promise) { - module.addSnapshotsInSync(appName, databaseId, listenerId); - promise.resolve(null); + @Override + public void addSnapshotsInSync(String appName, String databaseId, double listenerId) { + module.addSnapshotsInSync(appName, databaseId, (int) listenerId); } - @ReactMethod - public void removeSnapshotsInSync( - String appName, String databaseId, int listenerId, Promise promise) { - module.removeSnapshotsInSync(appName, databaseId, listenerId); - promise.resolve(null); + @Override + public void removeSnapshotsInSync(String appName, String databaseId, double listenerId) { + module.removeSnapshotsInSync(appName, databaseId, (int) listenerId); } private WritableMap taskProgressToWritableMap(LoadBundleTaskProgress progress) { diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreCollectionModule.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestoreCollection.java similarity index 91% rename from packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreCollectionModule.java rename to packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestoreCollection.java index 54a8c3c562..632c9edfa3 100644 --- a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreCollectionModule.java +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestoreCollection.java @@ -19,26 +19,29 @@ import static com.google.firebase.firestore.AggregateField.average; import static com.google.firebase.firestore.AggregateField.sum; +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage; import static io.invertase.firebase.firestore.ReactNativeFirebaseFirestoreCommon.rejectPromiseFirestoreException; import static io.invertase.firebase.firestore.ReactNativeFirebaseFirestoreSerialize.snapshotToWritableMap; import static io.invertase.firebase.firestore.UniversalFirebaseFirestoreCommon.getFirestoreForApp; import static io.invertase.firebase.firestore.UniversalFirebaseFirestoreCommon.getQueryForFirestore; import android.util.SparseArray; +import com.facebook.fbreact.specs.NativeRNFBTurboFirestoreCollectionSpec; import com.facebook.react.bridge.*; import com.google.android.gms.tasks.Tasks; import com.google.firebase.firestore.*; import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import java.util.ArrayList; -public class ReactNativeFirebaseFirestoreCollectionModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboFirestoreCollection extends NativeRNFBTurboFirestoreCollectionSpec { + private final FirestoreTurboModuleSupport turboSupport = + new FirestoreTurboModuleSupport("RNFBCollection"); private static final String SERVICE_NAME = "FirestoreCollection"; private static SparseArray collectionSnapshotListeners = new SparseArray<>(); - ReactNativeFirebaseFirestoreCollectionModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboFirestoreCollection(ReactApplicationContext reactContext) { + super(reactContext); } @Override @@ -50,10 +53,10 @@ public void invalidate() { } collectionSnapshotListeners.clear(); - super.invalidate(); + turboSupport.invalidate(); } - @ReactMethod + @Override public void namedQueryOnSnapshot( String appName, String databaseId, @@ -62,9 +65,9 @@ public void namedQueryOnSnapshot( ReadableArray filters, ReadableArray orders, ReadableMap options, - int listenerId, + double listenerId, ReadableMap listenerOptions) { - if (collectionSnapshotListeners.get(listenerId) != null) { + if (collectionSnapshotListeners.get((int) listenerId) != null) { return; } @@ -90,7 +93,7 @@ public void namedQueryOnSnapshot( }); } - @ReactMethod + @Override public void collectionOnSnapshot( String appName, String databaseId, @@ -99,9 +102,9 @@ public void collectionOnSnapshot( ReadableArray filters, ReadableArray orders, ReadableMap options, - int listenerId, + double listenerId, ReadableMap listenerOptions) { - if (collectionSnapshotListeners.get(listenerId) != null) { + if (collectionSnapshotListeners.get((int) listenerId) != null) { return; } @@ -118,17 +121,17 @@ public void collectionOnSnapshot( handleQueryOnSnapshot(firestoreQuery, appName, databaseId, listenerId, listenerOptions); } - @ReactMethod - public void collectionOffSnapshot(String appName, String databaseId, int listenerId) { - ListenerRegistration listenerRegistration = collectionSnapshotListeners.get(listenerId); + @Override + public void collectionOffSnapshot(String appName, String databaseId, double listenerId) { + ListenerRegistration listenerRegistration = collectionSnapshotListeners.get((int) listenerId); if (listenerRegistration != null) { listenerRegistration.remove(); - collectionSnapshotListeners.remove(listenerId); - removeEventListeningExecutor(Integer.toString(listenerId)); + collectionSnapshotListeners.remove((int) listenerId); + turboSupport.removeEventListeningExecutor(Integer.toString((int) listenerId)); } } - @ReactMethod + @Override public void namedQueryGet( String appName, String databaseId, @@ -160,7 +163,7 @@ public void namedQueryGet( }); } - @ReactMethod + @Override public void collectionCount( String appName, String databaseId, @@ -196,7 +199,7 @@ public void collectionCount( }); } - @ReactMethod + @Override public void aggregateQuery( String appName, String databaseId, @@ -304,7 +307,7 @@ public void aggregateQuery( }); } - @ReactMethod + @Override public void pipelineExecute( String appName, String databaseId, @@ -317,7 +320,7 @@ public void pipelineExecute( pipelineExecutor.execute(pipeline, options, promise); } - @ReactMethod + @Override public void collectionGet( String appName, String databaseId, @@ -344,7 +347,7 @@ private void handleQueryOnSnapshot( ReactNativeFirebaseFirestoreQuery firestoreQuery, String appName, String databaseId, - int listenerId, + double listenerId, ReadableMap listenerOptions) { MetadataChanges metadataChanges; SnapshotListenOptions.Builder snapshotListenOptionsBuilder = @@ -370,10 +373,11 @@ private void handleQueryOnSnapshot( final EventListener listener = (querySnapshot, exception) -> { if (exception != null) { - ListenerRegistration listenerRegistration = collectionSnapshotListeners.get(listenerId); + ListenerRegistration listenerRegistration = + collectionSnapshotListeners.get((int) listenerId); if (listenerRegistration != null) { listenerRegistration.remove(); - collectionSnapshotListeners.remove(listenerId); + collectionSnapshotListeners.remove((int) listenerId); } sendOnSnapshotError(appName, databaseId, listenerId, exception); } else { @@ -384,14 +388,14 @@ private void handleQueryOnSnapshot( ListenerRegistration listenerRegistration = firestoreQuery.query.addSnapshotListener(snapshotListenOptionsBuilder.build(), listener); - collectionSnapshotListeners.put(listenerId, listenerRegistration); + collectionSnapshotListeners.put((int) listenerId, listenerRegistration); } private void handleQueryGet( ReactNativeFirebaseFirestoreQuery firestoreQuery, Source source, Promise promise) { try { firestoreQuery - .get(getExecutor(), source) + .get(turboSupport.getExecutor(), source) .addOnCompleteListener( task -> { if (task.isSuccessful()) { @@ -408,12 +412,12 @@ private void handleQueryGet( private void sendOnSnapshotEvent( String appName, String databaseId, - int listenerId, + double listenerId, QuerySnapshot querySnapshot, MetadataChanges metadataChanges) { try { Tasks.call( - getTransactionalExecutor(Integer.toString(listenerId)), + turboSupport.getTransactionalExecutor(Integer.toString((int) listenerId)), () -> snapshotToWritableMap( appName, databaseId, "onSnapshot", querySnapshot, metadataChanges)) @@ -432,7 +436,7 @@ private void sendOnSnapshotEvent( body, appName, databaseId, - listenerId)); + (int) listenerId)); } else { sendOnSnapshotError(appName, databaseId, listenerId, task.getException()); } @@ -444,7 +448,7 @@ private void sendOnSnapshotEvent( } private void sendOnSnapshotError( - String appName, String databaseId, int listenerId, Exception exception) { + String appName, String databaseId, double listenerId, Exception exception) { WritableMap body = Arguments.createMap(); WritableMap error = Arguments.createMap(); @@ -468,7 +472,7 @@ private void sendOnSnapshotError( body, appName, databaseId, - listenerId)); + (int) listenerId)); } private Source getSource(ReadableMap getOptions) { diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreDocumentModule.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestoreDocument.java similarity index 85% rename from packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreDocumentModule.java rename to packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestoreDocument.java index 81473d98e0..46a1ae0e46 100644 --- a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreDocumentModule.java +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestoreDocument.java @@ -23,23 +23,25 @@ import static io.invertase.firebase.firestore.UniversalFirebaseFirestoreCommon.getFirestoreForApp; import android.util.SparseArray; +import com.facebook.fbreact.specs.NativeRNFBTurboFirestoreDocumentSpec; import com.facebook.react.bridge.*; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.google.firebase.firestore.*; import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; -public class ReactNativeFirebaseFirestoreDocumentModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboFirestoreDocument extends NativeRNFBTurboFirestoreDocumentSpec { + private final FirestoreTurboModuleSupport turboSupport = + new FirestoreTurboModuleSupport("RNFBDocument"); private static final String SERVICE_NAME = "FirestoreDocument"; private static SparseArray documentSnapshotListeners = new SparseArray<>(); - ReactNativeFirebaseFirestoreDocumentModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboFirestoreDocument(ReactApplicationContext reactContext) { + super(reactContext); } @Override @@ -51,13 +53,17 @@ public void invalidate() { } documentSnapshotListeners.clear(); - super.invalidate(); + turboSupport.invalidate(); } - @ReactMethod + @Override public void documentOnSnapshot( - String appName, String databaseId, String path, int listenerId, ReadableMap listenerOptions) { - if (documentSnapshotListeners.get(listenerId) != null) { + String appName, + String databaseId, + String path, + double listenerId, + ReadableMap listenerOptions) { + if (documentSnapshotListeners.get((int) listenerId) != null) { return; } @@ -67,10 +73,11 @@ public void documentOnSnapshot( final EventListener listener = (documentSnapshot, exception) -> { if (exception != null) { - ListenerRegistration listenerRegistration = documentSnapshotListeners.get(listenerId); + ListenerRegistration listenerRegistration = + documentSnapshotListeners.get((int) listenerId); if (listenerRegistration != null) { listenerRegistration.remove(); - documentSnapshotListeners.remove(listenerId); + documentSnapshotListeners.remove((int) listenerId); } sendOnSnapshotError(appName, databaseId, listenerId, exception); } else { @@ -100,19 +107,19 @@ public void documentOnSnapshot( ListenerRegistration listenerRegistration = documentReference.addSnapshotListener(snapshotListenOptionsBuilder.build(), listener); - documentSnapshotListeners.put(listenerId, listenerRegistration); + documentSnapshotListeners.put((int) listenerId, listenerRegistration); } - @ReactMethod - public void documentOffSnapshot(String appName, String databaseId, int listenerId) { - ListenerRegistration listenerRegistration = documentSnapshotListeners.get(listenerId); + @Override + public void documentOffSnapshot(String appName, String databaseId, double listenerId) { + ListenerRegistration listenerRegistration = documentSnapshotListeners.get((int) listenerId); if (listenerRegistration != null) { listenerRegistration.remove(); - documentSnapshotListeners.remove(listenerId); + documentSnapshotListeners.remove((int) listenerId); } } - @ReactMethod + @Override public void documentGet( String appName, String databaseId, String path, ReadableMap getOptions, Promise promise) { FirebaseFirestore firebaseFirestore = getFirestoreForApp(appName, databaseId); @@ -134,7 +141,7 @@ public void documentGet( } Tasks.call( - getExecutor(), + turboSupport.getExecutor(), () -> { DocumentSnapshot documentSnapshot = Tasks.await(documentReference.get(source)); return snapshotToWritableMap(appName, databaseId, documentSnapshot); @@ -149,11 +156,11 @@ public void documentGet( }); } - @ReactMethod + @Override public void documentDelete(String appName, String databaseId, String path, Promise promise) { FirebaseFirestore firebaseFirestore = getFirestoreForApp(appName, databaseId); DocumentReference documentReference = getDocumentForFirestore(firebaseFirestore, path); - Tasks.call(getTransactionalExecutor(), documentReference::delete) + Tasks.call(turboSupport.getTransactionalExecutor(), documentReference::delete) .addOnCompleteListener( task -> { if (task.isSuccessful()) { @@ -164,7 +171,7 @@ public void documentDelete(String appName, String databaseId, String path, Promi }); } - @ReactMethod + @Override public void documentSet( String appName, String databaseId, @@ -175,9 +182,11 @@ public void documentSet( FirebaseFirestore firebaseFirestore = getFirestoreForApp(appName, databaseId); DocumentReference documentReference = getDocumentForFirestore(firebaseFirestore, path); - Tasks.call(getTransactionalExecutor(), () -> parseReadableMap(firebaseFirestore, data)) + Tasks.call( + turboSupport.getTransactionalExecutor(), + () -> parseReadableMap(firebaseFirestore, data)) .continueWithTask( - getTransactionalExecutor(), + turboSupport.getTransactionalExecutor(), task -> { Task setTask; Map settableData = Objects.requireNonNull(task.getResult()); @@ -209,15 +218,17 @@ public void documentSet( }); } - @ReactMethod + @Override public void documentUpdate( String appName, String databaseId, String path, ReadableMap data, Promise promise) { FirebaseFirestore firebaseFirestore = getFirestoreForApp(appName, databaseId); DocumentReference documentReference = getDocumentForFirestore(firebaseFirestore, path); - Tasks.call(getTransactionalExecutor(), () -> parseReadableMap(firebaseFirestore, data)) + Tasks.call( + turboSupport.getTransactionalExecutor(), + () -> parseReadableMap(firebaseFirestore, data)) .continueWithTask( - getTransactionalExecutor(), + turboSupport.getTransactionalExecutor(), task -> documentReference.update(Objects.requireNonNull(task.getResult()))) .addOnCompleteListener( task -> { @@ -229,14 +240,16 @@ public void documentUpdate( }); } - @ReactMethod + @Override public void documentBatch( String appName, String databaseId, ReadableArray writes, Promise promise) { FirebaseFirestore firebaseFirestore = getFirestoreForApp(appName, databaseId); - Tasks.call(getTransactionalExecutor(), () -> parseDocumentBatches(firebaseFirestore, writes)) + Tasks.call( + turboSupport.getTransactionalExecutor(), + () -> parseDocumentBatches(firebaseFirestore, writes)) .continueWithTask( - getTransactionalExecutor(), + turboSupport.getTransactionalExecutor(), task -> { WriteBatch batch = firebaseFirestore.batch(); List writesArray = task.getResult(); @@ -299,9 +312,11 @@ public void documentBatch( } private void sendOnSnapshotEvent( - String appName, String databaseId, int listenerId, DocumentSnapshot documentSnapshot) { + String appName, String databaseId, double listenerId, DocumentSnapshot documentSnapshot) { try { - Tasks.call(getExecutor(), () -> snapshotToWritableMap(appName, databaseId, documentSnapshot)) + Tasks.call( + turboSupport.getExecutor(), + () -> snapshotToWritableMap(appName, databaseId, documentSnapshot)) .addOnCompleteListener( task -> { if (task.isSuccessful()) { @@ -317,7 +332,7 @@ private void sendOnSnapshotEvent( body, appName, databaseId, - listenerId)); + (int) listenerId)); } else { sendOnSnapshotError(appName, databaseId, listenerId, task.getException()); } @@ -329,7 +344,7 @@ private void sendOnSnapshotEvent( } private void sendOnSnapshotError( - String appName, String databaseId, int listenerId, Exception exception) { + String appName, String databaseId, double listenerId, Exception exception) { WritableMap body = Arguments.createMap(); WritableMap error = Arguments.createMap(); @@ -353,6 +368,6 @@ private void sendOnSnapshotError( body, appName, databaseId, - listenerId)); + (int) listenerId)); } } diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreTransactionModule.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestoreTransaction.java similarity index 87% rename from packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreTransactionModule.java rename to packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestoreTransaction.java index 23fe331d5d..0191908724 100644 --- a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestoreTransactionModule.java +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/NativeRNFBTurboFirestoreTransaction.java @@ -18,6 +18,8 @@ */ import static io.invertase.firebase.common.RCTConvertFirebase.toArrayList; +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage; +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithExceptionMap; import static io.invertase.firebase.firestore.ReactNativeFirebaseFirestoreSerialize.parseReadableMap; import static io.invertase.firebase.firestore.ReactNativeFirebaseFirestoreSerialize.snapshotToWritableMap; import static io.invertase.firebase.firestore.UniversalFirebaseFirestoreCommon.getDocumentForFirestore; @@ -25,23 +27,25 @@ import android.os.AsyncTask; import android.util.SparseArray; +import com.facebook.fbreact.specs.NativeRNFBTurboFirestoreTransactionSpec; import com.facebook.react.bridge.*; import com.google.android.gms.tasks.Tasks; import com.google.firebase.firestore.*; import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter; -import io.invertase.firebase.common.ReactNativeFirebaseModule; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; -public class ReactNativeFirebaseFirestoreTransactionModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboFirestoreTransaction extends NativeRNFBTurboFirestoreTransactionSpec { + private final FirestoreTurboModuleSupport turboSupport = + new FirestoreTurboModuleSupport("RNFBTransaction"); private static final String SERVICE_NAME = "FirestoreTransaction"; private SparseArray transactionHandlers = new SparseArray<>(); - ReactNativeFirebaseFirestoreTransactionModule(ReactApplicationContext reactContext) { - super(reactContext, SERVICE_NAME); + public NativeRNFBTurboFirestoreTransaction(ReactApplicationContext reactContext) { + super(reactContext); } @Override @@ -57,14 +61,14 @@ public void invalidate() { } transactionHandlers.clear(); - super.invalidate(); + turboSupport.invalidate(); } - @ReactMethod + @Override public void transactionGetDocument( - String appName, String databaseId, int transactionId, String path, Promise promise) { + String appName, String databaseId, double transactionId, String path, Promise promise) { ReactNativeFirebaseFirestoreTransactionHandler transactionHandler = - transactionHandlers.get(transactionId); + transactionHandlers.get((int) transactionId); if (transactionHandler == null) { rejectPromiseWithCodeAndMessage( @@ -79,7 +83,7 @@ public void transactionGetDocument( try { Tasks.call( - getTransactionalExecutor(), + turboSupport.getTransactionalExecutor(), () -> snapshotToWritableMap( appName, databaseId, transactionHandler.getDocument(documentReference))) @@ -96,32 +100,33 @@ public void transactionGetDocument( } } - @ReactMethod - public void transactionDispose(String appName, String databaseId, int transactionId) { + @Override + public void transactionDispose(String appName, String databaseId, double transactionId) { ReactNativeFirebaseFirestoreTransactionHandler transactionHandler = - transactionHandlers.get(transactionId); + transactionHandlers.get((int) transactionId); if (transactionHandler != null) { transactionHandler.abort(); - transactionHandlers.delete(transactionId); + transactionHandlers.delete((int) transactionId); } } - @ReactMethod + @Override public void transactionApplyBuffer( - String appName, String databaseId, int transactionId, ReadableArray commandBuffer) { - ReactNativeFirebaseFirestoreTransactionHandler handler = transactionHandlers.get(transactionId); + String appName, String databaseId, double transactionId, ReadableArray commandBuffer) { + ReactNativeFirebaseFirestoreTransactionHandler handler = + transactionHandlers.get((int) transactionId); if (handler != null) { handler.signalBufferReceived(commandBuffer); } } - @ReactMethod - public void transactionBegin(String appName, String databaseId, int transactionId) { + @Override + public void transactionBegin(String appName, String databaseId, double transactionId) { ReactNativeFirebaseFirestoreTransactionHandler transactionHandler = - new ReactNativeFirebaseFirestoreTransactionHandler(appName, transactionId); - transactionHandlers.put(transactionId, transactionHandler); + new ReactNativeFirebaseFirestoreTransactionHandler(appName, (int) transactionId); + transactionHandlers.put((int) transactionId, transactionHandler); FirebaseFirestore firebaseFirestore = getFirestoreForApp(appName, databaseId); ReactNativeFirebaseEventEmitter emitter = ReactNativeFirebaseEventEmitter.getSharedInstance(); diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestorePackage.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestorePackage.java index 97202d8971..1427984899 100644 --- a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestorePackage.java +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/ReactNativeFirebaseFirestorePackage.java @@ -30,10 +30,10 @@ public class ReactNativeFirebaseFirestorePackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseFirestoreModule(reactContext)); - modules.add(new ReactNativeFirebaseFirestoreCollectionModule(reactContext)); - modules.add(new ReactNativeFirebaseFirestoreDocumentModule(reactContext)); - modules.add(new ReactNativeFirebaseFirestoreTransactionModule(reactContext)); + modules.add(new NativeRNFBTurboFirestore(reactContext)); + modules.add(new NativeRNFBTurboFirestoreCollection(reactContext)); + modules.add(new NativeRNFBTurboFirestoreDocument(reactContext)); + modules.add(new NativeRNFBTurboFirestoreTransaction(reactContext)); return modules; } diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreCollectionSpec.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreCollectionSpec.java new file mode 100644 index 0000000000..e1f106fdce --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreCollectionSpec.java @@ -0,0 +1,69 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboFirestoreCollectionSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboFirestoreCollection"; + + public NativeRNFBTurboFirestoreCollectionSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void namedQueryOnSnapshot(String appName, String databaseId, String queryName, String type, ReadableArray filters, ReadableArray orders, ReadableMap options, double listenerId, ReadableMap snapshotListenOptions); + + @ReactMethod + @DoNotStrip + public abstract void collectionOnSnapshot(String appName, String databaseId, String path, String type, ReadableArray filters, ReadableArray orders, ReadableMap options, double listenerId, ReadableMap snapshotListenOptions); + + @ReactMethod + @DoNotStrip + public abstract void collectionOffSnapshot(String appName, String databaseId, double listenerId); + + @ReactMethod + @DoNotStrip + public abstract void namedQueryGet(String appName, String databaseId, String queryName, String type, ReadableArray filters, ReadableArray orders, ReadableMap options, @Nullable ReadableMap getOptions, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void collectionGet(String appName, String databaseId, String path, String type, ReadableArray filters, ReadableArray orders, ReadableMap options, @Nullable ReadableMap getOptions, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void collectionCount(String appName, String databaseId, String path, String type, ReadableArray filters, ReadableArray orders, ReadableMap options, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void aggregateQuery(String appName, String databaseId, String path, String type, ReadableArray filters, ReadableArray orders, ReadableMap options, ReadableArray aggregateQueries, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void pipelineExecute(String appName, String databaseId, ReadableMap pipeline, @Nullable ReadableMap options, Promise promise); +} diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreDocumentSpec.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreDocumentSpec.java new file mode 100644 index 0000000000..9e500c02bf --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreDocumentSpec.java @@ -0,0 +1,65 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboFirestoreDocumentSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboFirestoreDocument"; + + public NativeRNFBTurboFirestoreDocumentSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void documentOnSnapshot(String appName, String databaseId, String path, double listenerId, ReadableMap snapshotListenOptions); + + @ReactMethod + @DoNotStrip + public abstract void documentOffSnapshot(String appName, String databaseId, double listenerId); + + @ReactMethod + @DoNotStrip + public abstract void documentGet(String appName, String databaseId, String path, @Nullable ReadableMap getOptions, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void documentDelete(String appName, String databaseId, String path, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void documentSet(String appName, String databaseId, String path, ReadableMap data, ReadableMap options, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void documentUpdate(String appName, String databaseId, String path, ReadableMap data, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void documentBatch(String appName, String databaseId, ReadableArray writes, Promise promise); +} diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreSpec.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreSpec.java new file mode 100644 index 0000000000..511165fca3 --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreSpec.java @@ -0,0 +1,83 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboFirestoreSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboFirestore"; + + public NativeRNFBTurboFirestoreSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void setLogLevel(String logLevel); + + @ReactMethod + @DoNotStrip + public abstract void loadBundle(String appName, String databaseId, String bundle, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void clearPersistence(String appName, String databaseId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void waitForPendingWrites(String appName, String databaseId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void disableNetwork(String appName, String databaseId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void enableNetwork(String appName, String databaseId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void useEmulator(String appName, String databaseId, String host, double port); + + @ReactMethod + @DoNotStrip + public abstract void settings(String appName, String databaseId, ReadableMap settings, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void terminate(String appName, String databaseId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void persistenceCacheIndexManager(String appName, String databaseId, double requestType, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void addSnapshotsInSync(String appName, String databaseId, double listenerId); + + @ReactMethod + @DoNotStrip + public abstract void removeSnapshotsInSync(String appName, String databaseId, double listenerId); +} diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreTransactionSpec.java b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreTransactionSpec.java new file mode 100644 index 0000000000..b10cbd061a --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFirestoreTransactionSpec.java @@ -0,0 +1,51 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboFirestoreTransactionSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboFirestoreTransaction"; + + public NativeRNFBTurboFirestoreTransactionSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void transactionBegin(String appName, String databaseId, double transactionId); + + @ReactMethod + @DoNotStrip + public abstract void transactionGetDocument(String appName, String databaseId, double transactionId, String path, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void transactionDispose(String appName, String databaseId, double transactionId); + + @ReactMethod + @DoNotStrip + public abstract void transactionApplyBuffer(String appName, String databaseId, double transactionId, ReadableArray commandBuffer); +} diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/CMakeLists.txt b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..60992b1c48 --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBFirestoreTurboModules/*.cpp) + +add_library( + react_codegen_RNFBFirestoreTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBFirestoreTurboModules PUBLIC . react/renderer/components/RNFBFirestoreTurboModules) + +target_link_libraries( + react_codegen_RNFBFirestoreTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBFirestoreTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/RNFBFirestoreTurboModules-generated.cpp b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/RNFBFirestoreTurboModules-generated.cpp new file mode 100644 index 0000000000..d1d668ed6b --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/RNFBFirestoreTurboModules-generated.cpp @@ -0,0 +1,230 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBFirestoreTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_setLogLevel(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "setLogLevel", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_loadBundle(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "loadBundle", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_clearPersistence(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "clearPersistence", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_waitForPendingWrites(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "waitForPendingWrites", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_disableNetwork(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "disableNetwork", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_enableNetwork(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "enableNetwork", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_useEmulator(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "useEmulator", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_settings(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "settings", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_terminate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "terminate", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_persistenceCacheIndexManager(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "persistenceCacheIndexManager", "(Ljava/lang/String;Ljava/lang/String;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_addSnapshotsInSync(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "addSnapshotsInSync", "(Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_removeSnapshotsInSync(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeSnapshotsInSync", "(Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +NativeRNFBTurboFirestoreSpecJSI::NativeRNFBTurboFirestoreSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["setLogLevel"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_setLogLevel}; + methodMap_["loadBundle"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_loadBundle}; + methodMap_["clearPersistence"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_clearPersistence}; + methodMap_["waitForPendingWrites"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_waitForPendingWrites}; + methodMap_["disableNetwork"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_disableNetwork}; + methodMap_["enableNetwork"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_enableNetwork}; + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_useEmulator}; + methodMap_["settings"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_settings}; + methodMap_["terminate"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_terminate}; + methodMap_["persistenceCacheIndexManager"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_persistenceCacheIndexManager}; + methodMap_["addSnapshotsInSync"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_addSnapshotsInSync}; + methodMap_["removeSnapshotsInSync"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_removeSnapshotsInSync}; +} +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_namedQueryOnSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "namedQueryOnSnapshot", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableMap;DLcom/facebook/react/bridge/ReadableMap;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionOnSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "collectionOnSnapshot", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableMap;DLcom/facebook/react/bridge/ReadableMap;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionOffSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "collectionOffSnapshot", "(Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_namedQueryGet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "namedQueryGet", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionGet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "collectionGet", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionCount(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "collectionCount", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_aggregateQuery(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "aggregateQuery", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_pipelineExecute(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "pipelineExecute", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboFirestoreCollectionSpecJSI::NativeRNFBTurboFirestoreCollectionSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["namedQueryOnSnapshot"] = MethodMetadata {9, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_namedQueryOnSnapshot}; + methodMap_["collectionOnSnapshot"] = MethodMetadata {9, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionOnSnapshot}; + methodMap_["collectionOffSnapshot"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionOffSnapshot}; + methodMap_["namedQueryGet"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_namedQueryGet}; + methodMap_["collectionGet"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionGet}; + methodMap_["collectionCount"] = MethodMetadata {7, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionCount}; + methodMap_["aggregateQuery"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_aggregateQuery}; + methodMap_["pipelineExecute"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_pipelineExecute}; +} +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentOnSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "documentOnSnapshot", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DLcom/facebook/react/bridge/ReadableMap;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentOffSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "documentOffSnapshot", "(Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentGet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "documentGet", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentDelete(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "documentDelete", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentSet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "documentSet", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentUpdate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "documentUpdate", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentBatch(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "documentBatch", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboFirestoreDocumentSpecJSI::NativeRNFBTurboFirestoreDocumentSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["documentOnSnapshot"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentOnSnapshot}; + methodMap_["documentOffSnapshot"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentOffSnapshot}; + methodMap_["documentGet"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentGet}; + methodMap_["documentDelete"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentDelete}; + methodMap_["documentSet"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentSet}; + methodMap_["documentUpdate"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentUpdate}; + methodMap_["documentBatch"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentBatch}; +} +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionBegin(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "transactionBegin", "(Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionGetDocument(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "transactionGetDocument", "(Ljava/lang/String;Ljava/lang/String;DLjava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionDispose(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "transactionDispose", "(Ljava/lang/String;Ljava/lang/String;D)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionApplyBuffer(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "transactionApplyBuffer", "(Ljava/lang/String;Ljava/lang/String;DLcom/facebook/react/bridge/ReadableArray;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboFirestoreTransactionSpecJSI::NativeRNFBTurboFirestoreTransactionSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["transactionBegin"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionBegin}; + methodMap_["transactionGetDocument"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionGetDocument}; + methodMap_["transactionDispose"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionDispose}; + methodMap_["transactionApplyBuffer"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionApplyBuffer}; +} + +std::shared_ptr RNFBFirestoreTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboFirestore") { + return std::make_shared(params); + } + if (moduleName == "NativeRNFBTurboFirestoreCollection") { + return std::make_shared(params); + } + if (moduleName == "NativeRNFBTurboFirestoreDocument") { + return std::make_shared(params); + } + if (moduleName == "NativeRNFBTurboFirestoreTransaction") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/RNFBFirestoreTurboModules.h b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/RNFBFirestoreTurboModules.h new file mode 100644 index 0000000000..771b5ca0f5 --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/RNFBFirestoreTurboModules.h @@ -0,0 +1,55 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboFirestore' + */ +class JSI_EXPORT NativeRNFBTurboFirestoreSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboFirestoreSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + +/** + * JNI C++ class for module 'NativeRNFBTurboFirestoreCollection' + */ +class JSI_EXPORT NativeRNFBTurboFirestoreCollectionSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboFirestoreCollectionSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + +/** + * JNI C++ class for module 'NativeRNFBTurboFirestoreDocument' + */ +class JSI_EXPORT NativeRNFBTurboFirestoreDocumentSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboFirestoreDocumentSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + +/** + * JNI C++ class for module 'NativeRNFBTurboFirestoreTransaction' + */ +class JSI_EXPORT NativeRNFBTurboFirestoreTransactionSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboFirestoreTransactionSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBFirestoreTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/react/renderer/components/RNFBFirestoreTurboModules/RNFBFirestoreTurboModulesJSI-generated.cpp b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/react/renderer/components/RNFBFirestoreTurboModules/RNFBFirestoreTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..3a1062e6af --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/react/renderer/components/RNFBFirestoreTurboModules/RNFBFirestoreTurboModulesJSI-generated.cpp @@ -0,0 +1,357 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBFirestoreTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_setLogLevel(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setLogLevel( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_loadBundle(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->loadBundle( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_clearPersistence(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->clearPersistence( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_waitForPendingWrites(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->waitForPendingWrites( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_disableNetwork(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->disableNetwork( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_enableNetwork(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->enableNetwork( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_useEmulator(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useEmulator( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_settings(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->settings( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_terminate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->terminate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_persistenceCacheIndexManager(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->persistenceCacheIndexManager( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_addSnapshotsInSync(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addSnapshotsInSync( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_removeSnapshotsInSync(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeSnapshotsInSync( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboFirestoreCxxSpecJSI::NativeRNFBTurboFirestoreCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFirestore", jsInvoker) { + methodMap_["setLogLevel"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_setLogLevel}; + methodMap_["loadBundle"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_loadBundle}; + methodMap_["clearPersistence"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_clearPersistence}; + methodMap_["waitForPendingWrites"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_waitForPendingWrites}; + methodMap_["disableNetwork"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_disableNetwork}; + methodMap_["enableNetwork"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_enableNetwork}; + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_useEmulator}; + methodMap_["settings"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_settings}; + methodMap_["terminate"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_terminate}; + methodMap_["persistenceCacheIndexManager"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_persistenceCacheIndexManager}; + methodMap_["addSnapshotsInSync"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_addSnapshotsInSync}; + methodMap_["removeSnapshotsInSync"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_removeSnapshotsInSync}; +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_namedQueryOnSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->namedQueryOnSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 ? throw jsi::JSError(rt, "Expected argument in position 7 to be passed") : args[7].asNumber(), + count <= 8 ? throw jsi::JSError(rt, "Expected argument in position 8 to be passed") : args[8].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionOnSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->collectionOnSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 ? throw jsi::JSError(rt, "Expected argument in position 7 to be passed") : args[7].asNumber(), + count <= 8 ? throw jsi::JSError(rt, "Expected argument in position 8 to be passed") : args[8].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionOffSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->collectionOffSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_namedQueryGet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->namedQueryGet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 || args[7].isUndefined() ? std::nullopt : std::make_optional(args[7].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionGet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->collectionGet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 || args[7].isUndefined() ? std::nullopt : std::make_optional(args[7].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionCount(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->collectionCount( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_aggregateQuery(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->aggregateQuery( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 ? throw jsi::JSError(rt, "Expected argument in position 7 to be passed") : args[7].asObject(rt).asArray(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_pipelineExecute(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->pipelineExecute( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt), + count <= 3 || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asObject(rt)) + ); +} + +NativeRNFBTurboFirestoreCollectionCxxSpecJSI::NativeRNFBTurboFirestoreCollectionCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFirestoreCollection", jsInvoker) { + methodMap_["namedQueryOnSnapshot"] = MethodMetadata {9, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_namedQueryOnSnapshot}; + methodMap_["collectionOnSnapshot"] = MethodMetadata {9, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionOnSnapshot}; + methodMap_["collectionOffSnapshot"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionOffSnapshot}; + methodMap_["namedQueryGet"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_namedQueryGet}; + methodMap_["collectionGet"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionGet}; + methodMap_["collectionCount"] = MethodMetadata {7, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionCount}; + methodMap_["aggregateQuery"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_aggregateQuery}; + methodMap_["pipelineExecute"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_pipelineExecute}; +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentOnSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->documentOnSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentOffSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->documentOffSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentGet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentGet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentDelete(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentDelete( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentSet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentSet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentUpdate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentUpdate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentBatch(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentBatch( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt).asArray(rt) + ); +} + +NativeRNFBTurboFirestoreDocumentCxxSpecJSI::NativeRNFBTurboFirestoreDocumentCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFirestoreDocument", jsInvoker) { + methodMap_["documentOnSnapshot"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentOnSnapshot}; + methodMap_["documentOffSnapshot"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentOffSnapshot}; + methodMap_["documentGet"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentGet}; + methodMap_["documentDelete"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentDelete}; + methodMap_["documentSet"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentSet}; + methodMap_["documentUpdate"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentUpdate}; + methodMap_["documentBatch"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentBatch}; +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionBegin(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionBegin( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionGetDocument(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->transactionGetDocument( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionDispose(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionDispose( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionApplyBuffer(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionApplyBuffer( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt).asArray(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboFirestoreTransactionCxxSpecJSI::NativeRNFBTurboFirestoreTransactionCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFirestoreTransaction", jsInvoker) { + methodMap_["transactionBegin"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionBegin}; + methodMap_["transactionGetDocument"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionGetDocument}; + methodMap_["transactionDispose"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionDispose}; + methodMap_["transactionApplyBuffer"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionApplyBuffer}; +} + + +} // namespace facebook::react diff --git a/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/react/renderer/components/RNFBFirestoreTurboModules/RNFBFirestoreTurboModulesJSI.h b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/react/renderer/components/RNFBFirestoreTurboModules/RNFBFirestoreTurboModulesJSI.h new file mode 100644 index 0000000000..0a6983ebd3 --- /dev/null +++ b/packages/firestore/android/src/reactnative/java/io/invertase/firebase/firestore/generated/jni/react/renderer/components/RNFBFirestoreTurboModules/RNFBFirestoreTurboModulesJSI.h @@ -0,0 +1,637 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboFirestoreFirestoreLoadBundleTaskProgress + +template +struct NativeRNFBTurboFirestoreFirestoreLoadBundleTaskProgress { + P0 bytesLoaded; + P1 documentsLoaded; + P2 totalBytes; + P3 totalDocuments; + P4 taskState; + bool operator==(const NativeRNFBTurboFirestoreFirestoreLoadBundleTaskProgress &other) const { + return bytesLoaded == other.bytesLoaded && documentsLoaded == other.documentsLoaded && totalBytes == other.totalBytes && totalDocuments == other.totalDocuments && taskState == other.taskState; + } +}; + +template +struct NativeRNFBTurboFirestoreFirestoreLoadBundleTaskProgressBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "bytesLoaded"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "documentsLoaded"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "totalBytes"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "totalDocuments"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "taskState"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double bytesLoadedToJs(jsi::Runtime &rt, decltype(types.bytesLoaded) value) { + return bridging::toJs(rt, value); + } + + static double documentsLoadedToJs(jsi::Runtime &rt, decltype(types.documentsLoaded) value) { + return bridging::toJs(rt, value); + } + + static double totalBytesToJs(jsi::Runtime &rt, decltype(types.totalBytes) value) { + return bridging::toJs(rt, value); + } + + static double totalDocumentsToJs(jsi::Runtime &rt, decltype(types.totalDocuments) value) { + return bridging::toJs(rt, value); + } + + static jsi::String taskStateToJs(jsi::Runtime &rt, decltype(types.taskState) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "bytesLoaded", bridging::toJs(rt, value.bytesLoaded, jsInvoker)); + result.setProperty(rt, "documentsLoaded", bridging::toJs(rt, value.documentsLoaded, jsInvoker)); + result.setProperty(rt, "totalBytes", bridging::toJs(rt, value.totalBytes, jsInvoker)); + result.setProperty(rt, "totalDocuments", bridging::toJs(rt, value.totalDocuments, jsInvoker)); + result.setProperty(rt, "taskState", bridging::toJs(rt, value.taskState, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboFirestoreCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFirestoreCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void setLogLevel(jsi::Runtime &rt, jsi::String logLevel) = 0; + virtual jsi::Value loadBundle(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String bundle) = 0; + virtual jsi::Value clearPersistence(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual jsi::Value waitForPendingWrites(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual jsi::Value disableNetwork(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual jsi::Value enableNetwork(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String host, double port) = 0; + virtual jsi::Value settings(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Object settings) = 0; + virtual jsi::Value terminate(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual jsi::Value persistenceCacheIndexManager(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double requestType) = 0; + virtual void addSnapshotsInSync(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) = 0; + virtual void removeSnapshotsInSync(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFirestoreCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFirestore"; + +protected: + NativeRNFBTurboFirestoreCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFirestoreCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFirestoreCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFirestoreCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void setLogLevel(jsi::Runtime &rt, jsi::String logLevel) override { + static_assert( + bridging::getParameterCount(&T::setLogLevel) == 2, + "Expected setLogLevel(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setLogLevel, jsInvoker_, instance_, std::move(logLevel)); + } + jsi::Value loadBundle(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String bundle) override { + static_assert( + bridging::getParameterCount(&T::loadBundle) == 4, + "Expected loadBundle(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::loadBundle, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(bundle)); + } + jsi::Value clearPersistence(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::clearPersistence) == 3, + "Expected clearPersistence(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::clearPersistence, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + jsi::Value waitForPendingWrites(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::waitForPendingWrites) == 3, + "Expected waitForPendingWrites(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::waitForPendingWrites, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + jsi::Value disableNetwork(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::disableNetwork) == 3, + "Expected disableNetwork(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::disableNetwork, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + jsi::Value enableNetwork(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::enableNetwork) == 3, + "Expected enableNetwork(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::enableNetwork, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String host, double port) override { + static_assert( + bridging::getParameterCount(&T::useEmulator) == 5, + "Expected useEmulator(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::useEmulator, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(host), std::move(port)); + } + jsi::Value settings(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Object settings) override { + static_assert( + bridging::getParameterCount(&T::settings) == 4, + "Expected settings(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::settings, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(settings)); + } + jsi::Value terminate(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::terminate) == 3, + "Expected terminate(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::terminate, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + jsi::Value persistenceCacheIndexManager(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double requestType) override { + static_assert( + bridging::getParameterCount(&T::persistenceCacheIndexManager) == 4, + "Expected persistenceCacheIndexManager(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::persistenceCacheIndexManager, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(requestType)); + } + void addSnapshotsInSync(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) override { + static_assert( + bridging::getParameterCount(&T::addSnapshotsInSync) == 4, + "Expected addSnapshotsInSync(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::addSnapshotsInSync, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(listenerId)); + } + void removeSnapshotsInSync(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) override { + static_assert( + bridging::getParameterCount(&T::removeSnapshotsInSync) == 4, + "Expected removeSnapshotsInSync(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::removeSnapshotsInSync, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(listenerId)); + } + + private: + friend class NativeRNFBTurboFirestoreCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + +#pragma mark - NativeRNFBTurboFirestoreCollectionFirestoreCollectionCountResult + +template +struct NativeRNFBTurboFirestoreCollectionFirestoreCollectionCountResult { + P0 count; + bool operator==(const NativeRNFBTurboFirestoreCollectionFirestoreCollectionCountResult &other) const { + return count == other.count; + } +}; + +template +struct NativeRNFBTurboFirestoreCollectionFirestoreCollectionCountResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "count"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double countToJs(jsi::Runtime &rt, decltype(types.count) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.count) { + result.setProperty(rt, "count", bridging::toJs(rt, value.count.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboFirestoreCollectionCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFirestoreCollectionCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void namedQueryOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String queryName, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, double listenerId, jsi::Object snapshotListenOptions) = 0; + virtual void collectionOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, double listenerId, jsi::Object snapshotListenOptions) = 0; + virtual void collectionOffSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) = 0; + virtual jsi::Value namedQueryGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String queryName, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, std::optional getOptions) = 0; + virtual jsi::Value collectionGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, std::optional getOptions) = 0; + virtual jsi::Value collectionCount(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options) = 0; + virtual jsi::Value aggregateQuery(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, jsi::Array aggregateQueries) = 0; + virtual jsi::Value pipelineExecute(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Object pipeline, std::optional options) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFirestoreCollectionCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFirestoreCollection"; + +protected: + NativeRNFBTurboFirestoreCollectionCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFirestoreCollectionCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFirestoreCollectionCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFirestoreCollectionCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void namedQueryOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String queryName, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, double listenerId, jsi::Object snapshotListenOptions) override { + static_assert( + bridging::getParameterCount(&T::namedQueryOnSnapshot) == 10, + "Expected namedQueryOnSnapshot(...) to have 10 parameters"); + + return bridging::callFromJs( + rt, &T::namedQueryOnSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(queryName), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(listenerId), std::move(snapshotListenOptions)); + } + void collectionOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, double listenerId, jsi::Object snapshotListenOptions) override { + static_assert( + bridging::getParameterCount(&T::collectionOnSnapshot) == 10, + "Expected collectionOnSnapshot(...) to have 10 parameters"); + + return bridging::callFromJs( + rt, &T::collectionOnSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(listenerId), std::move(snapshotListenOptions)); + } + void collectionOffSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) override { + static_assert( + bridging::getParameterCount(&T::collectionOffSnapshot) == 4, + "Expected collectionOffSnapshot(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::collectionOffSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(listenerId)); + } + jsi::Value namedQueryGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String queryName, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, std::optional getOptions) override { + static_assert( + bridging::getParameterCount(&T::namedQueryGet) == 9, + "Expected namedQueryGet(...) to have 9 parameters"); + + return bridging::callFromJs( + rt, &T::namedQueryGet, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(queryName), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(getOptions)); + } + jsi::Value collectionGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, std::optional getOptions) override { + static_assert( + bridging::getParameterCount(&T::collectionGet) == 9, + "Expected collectionGet(...) to have 9 parameters"); + + return bridging::callFromJs( + rt, &T::collectionGet, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(getOptions)); + } + jsi::Value collectionCount(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options) override { + static_assert( + bridging::getParameterCount(&T::collectionCount) == 8, + "Expected collectionCount(...) to have 8 parameters"); + + return bridging::callFromJs( + rt, &T::collectionCount, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(type), std::move(filters), std::move(orders), std::move(options)); + } + jsi::Value aggregateQuery(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, jsi::Array aggregateQueries) override { + static_assert( + bridging::getParameterCount(&T::aggregateQuery) == 9, + "Expected aggregateQuery(...) to have 9 parameters"); + + return bridging::callFromJs( + rt, &T::aggregateQuery, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(aggregateQueries)); + } + jsi::Value pipelineExecute(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Object pipeline, std::optional options) override { + static_assert( + bridging::getParameterCount(&T::pipelineExecute) == 5, + "Expected pipelineExecute(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::pipelineExecute, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(pipeline), std::move(options)); + } + + private: + friend class NativeRNFBTurboFirestoreCollectionCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + +#pragma mark - NativeRNFBTurboFirestoreDocumentFirestoreSnapshotListenOptions + +template +struct NativeRNFBTurboFirestoreDocumentFirestoreSnapshotListenOptions { + P0 includeMetadataChanges; + P1 source; + bool operator==(const NativeRNFBTurboFirestoreDocumentFirestoreSnapshotListenOptions &other) const { + return includeMetadataChanges == other.includeMetadataChanges && source == other.source; + } +}; + +template +struct NativeRNFBTurboFirestoreDocumentFirestoreSnapshotListenOptionsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "includeMetadataChanges"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "source"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool includeMetadataChangesToJs(jsi::Runtime &rt, decltype(types.includeMetadataChanges) value) { + return bridging::toJs(rt, value); + } + + static jsi::String sourceToJs(jsi::Runtime &rt, decltype(types.source) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.includeMetadataChanges) { + result.setProperty(rt, "includeMetadataChanges", bridging::toJs(rt, value.includeMetadataChanges.value(), jsInvoker)); + } + if (value.source) { + result.setProperty(rt, "source", bridging::toJs(rt, value.source.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboFirestoreDocumentCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFirestoreDocumentCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void documentOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, double listenerId, jsi::Object snapshotListenOptions) = 0; + virtual void documentOffSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) = 0; + virtual jsi::Value documentGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, std::optional getOptions) = 0; + virtual jsi::Value documentDelete(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path) = 0; + virtual jsi::Value documentSet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::Object data, jsi::Object options) = 0; + virtual jsi::Value documentUpdate(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::Object data) = 0; + virtual jsi::Value documentBatch(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Array writes) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFirestoreDocumentCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFirestoreDocument"; + +protected: + NativeRNFBTurboFirestoreDocumentCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFirestoreDocumentCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFirestoreDocumentCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFirestoreDocumentCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void documentOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, double listenerId, jsi::Object snapshotListenOptions) override { + static_assert( + bridging::getParameterCount(&T::documentOnSnapshot) == 6, + "Expected documentOnSnapshot(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::documentOnSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(listenerId), std::move(snapshotListenOptions)); + } + void documentOffSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) override { + static_assert( + bridging::getParameterCount(&T::documentOffSnapshot) == 4, + "Expected documentOffSnapshot(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::documentOffSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(listenerId)); + } + jsi::Value documentGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, std::optional getOptions) override { + static_assert( + bridging::getParameterCount(&T::documentGet) == 5, + "Expected documentGet(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::documentGet, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(getOptions)); + } + jsi::Value documentDelete(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::documentDelete) == 4, + "Expected documentDelete(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::documentDelete, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path)); + } + jsi::Value documentSet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::Object data, jsi::Object options) override { + static_assert( + bridging::getParameterCount(&T::documentSet) == 6, + "Expected documentSet(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::documentSet, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(data), std::move(options)); + } + jsi::Value documentUpdate(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::Object data) override { + static_assert( + bridging::getParameterCount(&T::documentUpdate) == 5, + "Expected documentUpdate(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::documentUpdate, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(data)); + } + jsi::Value documentBatch(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Array writes) override { + static_assert( + bridging::getParameterCount(&T::documentBatch) == 4, + "Expected documentBatch(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::documentBatch, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(writes)); + } + + private: + friend class NativeRNFBTurboFirestoreDocumentCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboFirestoreTransactionCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFirestoreTransactionCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void transactionBegin(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId) = 0; + virtual jsi::Value transactionGetDocument(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId, jsi::String path) = 0; + virtual void transactionDispose(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId) = 0; + virtual void transactionApplyBuffer(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId, jsi::Array commandBuffer) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFirestoreTransactionCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFirestoreTransaction"; + +protected: + NativeRNFBTurboFirestoreTransactionCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFirestoreTransactionCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFirestoreTransactionCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFirestoreTransactionCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void transactionBegin(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId) override { + static_assert( + bridging::getParameterCount(&T::transactionBegin) == 4, + "Expected transactionBegin(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::transactionBegin, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(transactionId)); + } + jsi::Value transactionGetDocument(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::transactionGetDocument) == 5, + "Expected transactionGetDocument(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::transactionGetDocument, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(transactionId), std::move(path)); + } + void transactionDispose(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId) override { + static_assert( + bridging::getParameterCount(&T::transactionDispose) == 4, + "Expected transactionDispose(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::transactionDispose, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(transactionId)); + } + void transactionApplyBuffer(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId, jsi::Array commandBuffer) override { + static_assert( + bridging::getParameterCount(&T::transactionApplyBuffer) == 5, + "Expected transactionApplyBuffer(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::transactionApplyBuffer, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(transactionId), std::move(commandBuffer)); + } + + private: + friend class NativeRNFBTurboFirestoreTransactionCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/firestore/ios/RNFBFirestore.xcodeproj/project.pbxproj b/packages/firestore/ios/RNFBFirestore.xcodeproj/project.pbxproj index 9f15e6c527..01bf93de3a 100644 --- a/packages/firestore/ios/RNFBFirestore.xcodeproj/project.pbxproj +++ b/packages/firestore/ios/RNFBFirestore.xcodeproj/project.pbxproj @@ -7,14 +7,14 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBFirestoreModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBFirestoreModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBFirestoreModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBFirestoreModule.mm */; }; 8B21821222CB9C4700A0A296 /* RCTConvert+FIRLoggerLevel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B21821122CB9C4700A0A296 /* RCTConvert+FIRLoggerLevel.m */; }; 8B627A8122CB9ECD0056BCB3 /* RNFBFirestoreCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B627A8022CB9ECD0056BCB3 /* RNFBFirestoreCommon.m */; }; - 8B9B6AE522CC9AC50062975D /* RNFBFirestoreDocumentModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9B6AE422CC9AC50062975D /* RNFBFirestoreDocumentModule.m */; }; + 8B9B6AE522CC9AC50062975D /* RNFBFirestoreDocumentModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B9B6AE422CC9AC50062975D /* RNFBFirestoreDocumentModule.mm */; }; 8B9B6AE922CC9DBD0062975D /* RNFBFirestoreSerialize.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9B6AE822CC9DBD0062975D /* RNFBFirestoreSerialize.m */; }; - 8B9B6AED22CCE11D0062975D /* RNFBFirestoreCollectionModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9B6AEC22CCE11D0062975D /* RNFBFirestoreCollectionModule.m */; }; + 8B9B6AED22CCE11D0062975D /* RNFBFirestoreCollectionModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B9B6AEC22CCE11D0062975D /* RNFBFirestoreCollectionModule.mm */; }; 8B9B6AF122CCE2B90062975D /* RNFBFirestoreQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9B6AF022CCE2B90062975D /* RNFBFirestoreQuery.m */; }; - 8B9B6AF722D634AC0062975D /* RNFBFirestoreTransactionModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B9B6AF622D634AC0062975D /* RNFBFirestoreTransactionModule.m */; }; + 8B9B6AF722D634AC0062975D /* RNFBFirestoreTransactionModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B9B6AF622D634AC0062975D /* RNFBFirestoreTransactionModule.mm */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -32,21 +32,21 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBFirestore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBFirestore.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBFirestoreModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBFirestoreModule.h; path = RNFBFirestore/RNFBFirestoreModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBFirestoreModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBFirestoreModule.m; path = RNFBFirestore/RNFBFirestoreModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBFirestoreModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBFirestoreModule.mm; path = RNFBFirestore/RNFBFirestoreModule.mm; sourceTree = SOURCE_ROOT; }; 8B21821022CB9C3800A0A296 /* RCTConvert+FIRLoggerLevel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTConvert+FIRLoggerLevel.h"; sourceTree = ""; }; 8B21821122CB9C4700A0A296 /* RCTConvert+FIRLoggerLevel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+FIRLoggerLevel.m"; sourceTree = ""; }; 8B627A7F22CB9EC00056BCB3 /* RNFBFirestoreCommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBFirestoreCommon.h; sourceTree = ""; }; 8B627A8022CB9ECD0056BCB3 /* RNFBFirestoreCommon.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBFirestoreCommon.m; sourceTree = ""; }; 8B9B6AE322CC9AB90062975D /* RNFBFirestoreDocumentModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBFirestoreDocumentModule.h; sourceTree = ""; }; - 8B9B6AE422CC9AC50062975D /* RNFBFirestoreDocumentModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBFirestoreDocumentModule.m; sourceTree = ""; }; + 8B9B6AE422CC9AC50062975D /* RNFBFirestoreDocumentModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBFirestoreDocumentModule.mm; sourceTree = ""; }; 8B9B6AE722CC9DB20062975D /* RNFBFirestoreSerialize.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBFirestoreSerialize.h; sourceTree = ""; }; 8B9B6AE822CC9DBD0062975D /* RNFBFirestoreSerialize.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBFirestoreSerialize.m; sourceTree = ""; }; 8B9B6AEB22CCE1120062975D /* RNFBFirestoreCollectionModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBFirestoreCollectionModule.h; sourceTree = ""; }; - 8B9B6AEC22CCE11D0062975D /* RNFBFirestoreCollectionModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBFirestoreCollectionModule.m; sourceTree = ""; }; + 8B9B6AEC22CCE11D0062975D /* RNFBFirestoreCollectionModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBFirestoreCollectionModule.mm; sourceTree = ""; }; 8B9B6AEF22CCE2AF0062975D /* RNFBFirestoreQuery.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBFirestoreQuery.h; sourceTree = ""; }; 8B9B6AF022CCE2B90062975D /* RNFBFirestoreQuery.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBFirestoreQuery.m; sourceTree = ""; }; 8B9B6AF522D634A00062975D /* RNFBFirestoreTransactionModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBFirestoreTransactionModule.h; sourceTree = ""; }; - 8B9B6AF622D634AC0062975D /* RNFBFirestoreTransactionModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBFirestoreTransactionModule.m; sourceTree = ""; }; + 8B9B6AF622D634AC0062975D /* RNFBFirestoreTransactionModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBFirestoreTransactionModule.mm; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,21 +72,21 @@ isa = PBXGroup; children = ( 2744B98421F45429004F8E3F /* RNFBFirestoreModule.h */, - 2744B98521F45429004F8E3F /* RNFBFirestoreModule.m */, + 2744B98521F45429004F8E3F /* RNFBFirestoreModule.mm */, 8B21821022CB9C3800A0A296 /* RCTConvert+FIRLoggerLevel.h */, 8B21821122CB9C4700A0A296 /* RCTConvert+FIRLoggerLevel.m */, 8B627A7F22CB9EC00056BCB3 /* RNFBFirestoreCommon.h */, 8B627A8022CB9ECD0056BCB3 /* RNFBFirestoreCommon.m */, 8B9B6AE322CC9AB90062975D /* RNFBFirestoreDocumentModule.h */, - 8B9B6AE422CC9AC50062975D /* RNFBFirestoreDocumentModule.m */, + 8B9B6AE422CC9AC50062975D /* RNFBFirestoreDocumentModule.mm */, 8B9B6AE722CC9DB20062975D /* RNFBFirestoreSerialize.h */, 8B9B6AE822CC9DBD0062975D /* RNFBFirestoreSerialize.m */, 8B9B6AEB22CCE1120062975D /* RNFBFirestoreCollectionModule.h */, - 8B9B6AEC22CCE11D0062975D /* RNFBFirestoreCollectionModule.m */, + 8B9B6AEC22CCE11D0062975D /* RNFBFirestoreCollectionModule.mm */, 8B9B6AEF22CCE2AF0062975D /* RNFBFirestoreQuery.h */, 8B9B6AF022CCE2B90062975D /* RNFBFirestoreQuery.m */, 8B9B6AF522D634A00062975D /* RNFBFirestoreTransactionModule.h */, - 8B9B6AF622D634AC0062975D /* RNFBFirestoreTransactionModule.m */, + 8B9B6AF622D634AC0062975D /* RNFBFirestoreTransactionModule.mm */, ); path = RNFBFirestore; sourceTree = ""; @@ -159,12 +159,12 @@ buildActionMask = 2147483647; files = ( 8B9B6AF122CCE2B90062975D /* RNFBFirestoreQuery.m in Sources */, - 8B9B6AE522CC9AC50062975D /* RNFBFirestoreDocumentModule.m in Sources */, - 8B9B6AED22CCE11D0062975D /* RNFBFirestoreCollectionModule.m in Sources */, + 8B9B6AE522CC9AC50062975D /* RNFBFirestoreDocumentModule.mm in Sources */, + 8B9B6AED22CCE11D0062975D /* RNFBFirestoreCollectionModule.mm in Sources */, 8B21821222CB9C4700A0A296 /* RCTConvert+FIRLoggerLevel.m in Sources */, - 8B9B6AF722D634AC0062975D /* RNFBFirestoreTransactionModule.m in Sources */, + 8B9B6AF722D634AC0062975D /* RNFBFirestoreTransactionModule.mm in Sources */, 8B627A8122CB9ECD0056BCB3 /* RNFBFirestoreCommon.m in Sources */, - 2744B98621F45429004F8E3F /* RNFBFirestoreModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBFirestoreModule.mm in Sources */, 8B9B6AE922CC9DBD0062975D /* RNFBFirestoreSerialize.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/packages/firestore/ios/RNFBFirestore/RNFBFirestoreCollectionModule.m b/packages/firestore/ios/RNFBFirestore/RNFBFirestoreCollectionModule.mm similarity index 75% rename from packages/firestore/ios/RNFBFirestore/RNFBFirestoreCollectionModule.m rename to packages/firestore/ios/RNFBFirestore/RNFBFirestoreCollectionModule.mm index dd21cf1896..e9c087c4b7 100644 --- a/packages/firestore/ios/RNFBFirestore/RNFBFirestoreCollectionModule.m +++ b/packages/firestore/ios/RNFBFirestore/RNFBFirestoreCollectionModule.mm @@ -27,26 +27,34 @@ // directory. See firebase-ios-sdk#12611 for more context. #import "RNFBFirestore-Swift.h" #endif +#import #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBFirestoreCollectionModule.h" #import "RNFBFirestoreCommon.h" +#import "RNFBFirestoreTurboModules.h" static __strong NSMutableDictionary *collectionSnapshotListeners; static NSString *const RNFB_FIRESTORE_COLLECTION_SYNC = @"firestore_collection_sync_event"; +@interface RNFBFirestoreCollectionModule () +@end + @implementation RNFBFirestoreCollectionModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); - -- (dispatch_queue_t)methodQueue { - return [RNFBFirestoreCommon getFirestoreQueue]; +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); } +RCT_EXPORT_MODULE(NativeRNFBTurboFirestoreCollection); + + (BOOL)requiresMainQueueSetup { - return YES; + return NO; } - (id)init { @@ -73,28 +81,30 @@ - (void)invalidate { #pragma mark - #pragma mark Firebase Firestore Methods -RCT_EXPORT_METHOD(namedQueryOnSnapshot - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)name - : (NSString *)type - : (NSArray *)filters - : (NSArray *)orders - : (NSDictionary *)options - : (nonnull NSNumber *)listenerId - : (NSDictionary *)listenerOptions) { - if (collectionSnapshotListeners[listenerId]) { +- (void)namedQueryOnSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + queryName:(NSString *)queryName + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + listenerId:(double)listenerId + snapshotListenOptions:(NSDictionary *)snapshotListenOptions { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSNumber *listenerIdNumber = @(listenerId); + + if (collectionSnapshotListeners[listenerIdNumber]) { return; } FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; - [firestore getQueryNamed:name + [firestore getQueryNamed:queryName completion:^(FIRQuery *query) { if (query == nil) { [self sendSnapshotError:firebaseApp databaseId:databaseId - listenerId:listenerId + listenerId:listenerIdNumber error:nil]; return; } @@ -108,22 +118,24 @@ - (void)invalidate { [self handleQueryOnSnapshot:firebaseApp databaseId:databaseId firestoreQuery:firestoreQuery - listenerId:listenerId - listenerOptions:listenerOptions]; + listenerId:listenerIdNumber + listenerOptions:snapshotListenOptions]; }]; } -RCT_EXPORT_METHOD(collectionOnSnapshot - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)path - : (NSString *)type - : (NSArray *)filters - : (NSArray *)orders - : (NSDictionary *)options - : (nonnull NSNumber *)listenerId - : (NSDictionary *)listenerOptions) { - if (collectionSnapshotListeners[listenerId]) { +- (void)collectionOnSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + listenerId:(double)listenerId + snapshotListenOptions:(NSDictionary *)snapshotListenOptions { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSNumber *listenerIdNumber = @(listenerId); + + if (collectionSnapshotListeners[listenerIdNumber]) { return; } @@ -139,35 +151,36 @@ - (void)invalidate { [self handleQueryOnSnapshot:firebaseApp databaseId:databaseId firestoreQuery:firestoreQuery - listenerId:listenerId - listenerOptions:listenerOptions]; + listenerId:listenerIdNumber + listenerOptions:snapshotListenOptions]; } -RCT_EXPORT_METHOD(collectionOffSnapshot - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSNumber *)listenerId) { - id listener = collectionSnapshotListeners[listenerId]; +- (void)collectionOffSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + listenerId:(double)listenerId { + NSNumber *listenerIdNumber = @(listenerId); + id listener = collectionSnapshotListeners[listenerIdNumber]; if (listener) { [listener remove]; - [collectionSnapshotListeners removeObjectForKey:listenerId]; + [collectionSnapshotListeners removeObjectForKey:listenerIdNumber]; } } -RCT_EXPORT_METHOD(namedQueryGet - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)name - : (NSString *)type - : (NSArray *)filters - : (NSArray *)orders - : (NSDictionary *)options - : (NSDictionary *)getOptions - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)namedQueryGet:(NSString *)appName + databaseId:(NSString *)databaseId + queryName:(NSString *)queryName + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + getOptions:(NSDictionary *)getOptions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; - [firestore getQueryNamed:name + [firestore getQueryNamed:queryName completion:^(FIRQuery *query) { if (query == nil) { return [RNFBFirestoreCommon promiseRejectFirestoreException:reject error:nil]; @@ -189,16 +202,17 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(collectionCount - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)path - : (NSString *)type - : (NSArray *)filters - : (NSArray *)orders - : (NSDictionary *)options - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)collectionCount:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; FIRQuery *query = [RNFBFirestoreCommon getQueryForFirestore:firestore path:path type:type]; @@ -228,17 +242,19 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(aggregateQuery - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)path - : (NSString *)type - : (NSArray *)filters - : (NSArray *)orders - : (NSDictionary *)options - : (NSArray *)aggregateQueries - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)aggregateQuery:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + aggregateQueries:(NSArray *)aggregateQueries + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSArray *aggregateQueriesArray = aggregateQueries; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; @@ -257,9 +273,9 @@ - (void)invalidate { NSMutableArray *aggregateFields = [[NSMutableArray alloc] init]; - for (NSDictionary *aggregateQuery in aggregateQueries) { - NSString *aggregateType = aggregateQuery[@"aggregateType"]; - NSString *fieldPath = aggregateQuery[@"field"]; + for (NSDictionary *aggregateQueryItem in aggregateQueriesArray) { + NSString *aggregateType = aggregateQueryItem[@"aggregateType"]; + NSString *fieldPath = aggregateQueryItem[@"field"]; if ([aggregateType isEqualToString:@"count"]) { [aggregateFields addObject:[FIRAggregateField aggregateFieldForCount]]; @@ -271,17 +287,18 @@ - (void)invalidate { NSString *reason = [@"Invalid Aggregate Type: " stringByAppendingString:aggregateType]; [RNFBFirestoreCommon promiseRejectFirestoreException:reject - error:[NSException exceptionWithName: - @"RNFB Firestore: Invalid Aggregate Type" - reason:reason - userInfo:nil]]; + error:[NSError errorWithDomain:@"RNFB Firestore" + code:0 + userInfo:@{ + NSLocalizedDescriptionKey : reason + }]]; return; } } - FIRAggregateQuery *aggregateQuery = [query aggregate:aggregateFields]; + FIRAggregateQuery *aggregateQueryInstance = [query aggregate:aggregateFields]; - [aggregateQuery + [aggregateQueryInstance aggregationWithSource:FIRAggregateSourceServer completion:^(FIRAggregateQuerySnapshot *_Nullable snapshot, NSError *_Nullable error) { @@ -290,10 +307,10 @@ - (void)invalidate { } else { NSMutableDictionary *snapshotMap = [NSMutableDictionary dictionary]; - for (NSDictionary *aggregateQuery in aggregateQueries) { - NSString *aggregateType = aggregateQuery[@"aggregateType"]; - NSString *fieldPath = aggregateQuery[@"field"]; - NSString *key = aggregateQuery[@"key"]; + for (NSDictionary *aggregateQueryItem in aggregateQueriesArray) { + NSString *aggregateType = aggregateQueryItem[@"aggregateType"]; + NSString *fieldPath = aggregateQueryItem[@"field"]; + NSString *key = aggregateQueryItem[@"key"]; if ([aggregateType isEqualToString:@"count"]) { snapshotMap[key] = snapshot.count; @@ -314,13 +331,14 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(pipelineExecute - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSDictionary *)pipeline - : (NSDictionary *)options - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)pipelineExecute:(NSString *)appName + databaseId:(NSString *)databaseId + pipeline:(NSDictionary *)pipeline + options:(NSDictionary *)options + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; RNFBFirestorePipelineCallHandler *handler = [[RNFBFirestorePipelineCallHandler alloc] init]; @@ -352,17 +370,18 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(collectionGet - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)path - : (NSString *)type - : (NSArray *)filters - : (NSArray *)orders - : (NSDictionary *)options - : (NSDictionary *)getOptions - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)collectionGet:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + getOptions:(NSDictionary *)getOptions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; FIRQuery *query = [RNFBFirestoreCommon getQueryForFirestore:firestore path:path type:type]; diff --git a/packages/firestore/ios/RNFBFirestore/RNFBFirestoreDocumentModule.m b/packages/firestore/ios/RNFBFirestore/RNFBFirestoreDocumentModule.mm similarity index 72% rename from packages/firestore/ios/RNFBFirestore/RNFBFirestoreDocumentModule.m rename to packages/firestore/ios/RNFBFirestore/RNFBFirestoreDocumentModule.mm index 6e51e42d12..5f3d35f300 100644 --- a/packages/firestore/ios/RNFBFirestore/RNFBFirestoreDocumentModule.m +++ b/packages/firestore/ios/RNFBFirestore/RNFBFirestoreDocumentModule.mm @@ -17,24 +17,30 @@ #import #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBFirestoreDocumentModule.h" +#import "RNFBFirestoreTurboModules.h" static __strong NSMutableDictionary *documentSnapshotListeners; static NSString *const RNFB_FIRESTORE_DOCUMENT_SYNC = @"firestore_document_sync_event"; +@interface RNFBFirestoreDocumentModule () +@end + @implementation RNFBFirestoreDocumentModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); - -- (dispatch_queue_t)methodQueue { - return [RNFBFirestoreCommon getFirestoreQueue]; +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); } +RCT_EXPORT_MODULE(NativeRNFBTurboFirestoreDocument); + + (BOOL)requiresMainQueueSetup { - return YES; + return NO; } - (id)init { @@ -61,16 +67,29 @@ - (void)invalidate { #pragma mark - #pragma mark Firebase Firestore Methods -RCT_EXPORT_METHOD(documentOnSnapshot - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)path - : (nonnull NSNumber *)listenerId - : (NSDictionary *)listenerOptions) { - if (documentSnapshotListeners[listenerId]) { +- (void)documentOnSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + listenerId:(double)listenerId + snapshotListenOptions:(JS::NativeRNFBTurboFirestoreDocument::FirestoreSnapshotListenOptions &) + snapshotListenOptions { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSNumber *listenerIdNumber = @(listenerId); + + if (documentSnapshotListeners[listenerIdNumber]) { return; } + NSMutableDictionary *listenerOptions = [NSMutableDictionary new]; + auto includeMetadataChangesOpt = snapshotListenOptions.includeMetadataChanges(); + if (includeMetadataChangesOpt.has_value()) { + listenerOptions[KEY_INCLUDE_METADATA_CHANGES] = @(*includeMetadataChangesOpt); + } + NSString *sourceString = snapshotListenOptions.source(); + if (sourceString) { + listenerOptions[KEY_SOURCE] = sourceString; + } + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; FIRDocumentReference *documentReference = [RNFBFirestoreCommon getDocumentForFirestore:firestore @@ -79,19 +98,19 @@ - (void)invalidate { __weak RNFBFirestoreDocumentModule *weakSelf = self; id listenerBlock = ^(FIRDocumentSnapshot *snapshot, NSError *error) { if (error) { - id listener = documentSnapshotListeners[listenerId]; + id listener = documentSnapshotListeners[listenerIdNumber]; if (listener) { [listener remove]; - [documentSnapshotListeners removeObjectForKey:listenerId]; + [documentSnapshotListeners removeObjectForKey:listenerIdNumber]; } [weakSelf sendSnapshotError:firebaseApp databaseId:databaseId - listenerId:listenerId + listenerId:listenerIdNumber error:error]; } else { [weakSelf sendSnapshotEvent:firebaseApp databaseId:databaseId - listenerId:listenerId + listenerId:listenerIdNumber snapshot:snapshot]; } }; @@ -105,43 +124,45 @@ - (void)invalidate { source = FIRListenSourceCache; } - FIRSnapshotListenOptions *snapshotListenOptions = [[[[FIRSnapshotListenOptions alloc] init] + FIRSnapshotListenOptions *nativeSnapshotListenOptions = [[[[FIRSnapshotListenOptions alloc] init] optionsWithIncludeMetadataChanges:includeMetadataChanges] optionsWithSource:source]; id listener = - [documentReference addSnapshotListenerWithOptions:snapshotListenOptions + [documentReference addSnapshotListenerWithOptions:nativeSnapshotListenOptions listener:listenerBlock]; - documentSnapshotListeners[listenerId] = listener; + documentSnapshotListeners[listenerIdNumber] = listener; } -RCT_EXPORT_METHOD(documentOffSnapshot - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSNumber *)listenerId) { - id listener = documentSnapshotListeners[listenerId]; +- (void)documentOffSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + listenerId:(double)listenerId { + NSNumber *listenerIdNumber = @(listenerId); + id listener = documentSnapshotListeners[listenerIdNumber]; if (listener) { [listener remove]; - [documentSnapshotListeners removeObjectForKey:listenerId]; + [documentSnapshotListeners removeObjectForKey:listenerIdNumber]; } } -RCT_EXPORT_METHOD(documentGet - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)path - : (NSDictionary *)getOptions - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)documentGet:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + getOptions:(JS::NativeRNFBTurboFirestoreDocument::SpecDocumentGetGetOptions &)getOptions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; FIRDocumentReference *documentReference = [RNFBFirestoreCommon getDocumentForFirestore:firestore path:path]; FIRFirestoreSource source; + NSString *sourceString = getOptions.source(); - if (getOptions[@"source"]) { - if ([getOptions[@"source"] isEqualToString:@"server"]) { + if (sourceString) { + if ([sourceString isEqualToString:@"server"]) { source = FIRFirestoreSourceServer; - } else if ([getOptions[@"source"] isEqualToString:@"cache"]) { + } else if ([sourceString isEqualToString:@"cache"]) { source = FIRFirestoreSourceCache; } else { source = FIRFirestoreSourceDefault; @@ -157,9 +178,10 @@ - (void)invalidate { return [RNFBFirestoreCommon promiseRejectFirestoreException:reject error:error]; } else { - NSString *appName = [RNFBSharedUtils getAppJavaScriptName:firebaseApp.name]; + NSString *resolvedAppName = + [RNFBSharedUtils getAppJavaScriptName:firebaseApp.name]; NSString *firestoreKey = - [RNFBFirestoreCommon createFirestoreKeyWithAppName:appName + [RNFBFirestoreCommon createFirestoreKeyWithAppName:resolvedAppName databaseId:databaseId]; NSDictionary *serialized = [RNFBFirestoreSerialize documentSnapshotToDictionary:snapshot @@ -169,12 +191,13 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(documentDelete - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)path - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)documentDelete:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; FIRDocumentReference *documentReference = [RNFBFirestoreCommon getDocumentForFirestore:firestore @@ -189,14 +212,15 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(documentSet - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)path - : (NSDictionary *)data - : (NSDictionary *)options - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)documentSet:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + data:(NSDictionary *)data + options:(NSDictionary *)options + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; FIRDocumentReference *documentReference = [RNFBFirestoreCommon getDocumentForFirestore:firestore @@ -223,13 +247,14 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(documentUpdate - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSString *)path - : (NSDictionary *)data - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)documentUpdate:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + data:(NSDictionary *)data + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; FIRDocumentReference *documentReference = [RNFBFirestoreCommon getDocumentForFirestore:firestore @@ -248,12 +273,13 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(documentBatch - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSArray *)writes - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)documentBatch:(NSString *)appName + databaseId:(NSString *)databaseId + writes:(NSArray *)writes + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; FIRWriteBatch *batch = [firestore batch]; diff --git a/packages/firestore/ios/RNFBFirestore/RNFBFirestoreModule.m b/packages/firestore/ios/RNFBFirestore/RNFBFirestoreModule.mm similarity index 62% rename from packages/firestore/ios/RNFBFirestore/RNFBFirestoreModule.m rename to packages/firestore/ios/RNFBFirestore/RNFBFirestoreModule.mm index 5b9c7a63c8..475c4ba450 100644 --- a/packages/firestore/ios/RNFBFirestore/RNFBFirestoreModule.m +++ b/packages/firestore/ios/RNFBFirestore/RNFBFirestoreModule.mm @@ -17,41 +17,52 @@ #import "RNFBFirestoreModule.h" #import +#import #import #import "FirebaseFirestoreInternal/FIRPersistentCacheIndexManager.h" +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBFirestoreCommon.h" +#import "RNFBFirestoreTurboModules.h" #import "RNFBPreferences.h" NSMutableDictionary *emulatorConfigs; static __strong NSMutableDictionary *snapshotsInSyncListeners; static NSString *const RNFB_FIRESTORE_SNAPSHOTS_IN_SYNC = @"firestore_snapshots_in_sync_event"; +@interface RNFBFirestoreModule () +@end + @implementation RNFBFirestoreModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); - -- (dispatch_queue_t)methodQueue { - return [RNFBFirestoreCommon getFirestoreQueue]; +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); } +RCT_EXPORT_MODULE(NativeRNFBTurboFirestore); + + (BOOL)requiresMainQueueSetup { - return YES; + return NO; } #pragma mark - #pragma mark Firebase Firestore Methods -RCT_EXPORT_METHOD(setLogLevel : (FIRLoggerLevel)loggerLevel) { - [[FIRConfiguration sharedInstance] setLoggerLevel:loggerLevel]; +- (void)setLogLevel:(NSString *)logLevel { + if ([logLevel isEqualToString:@"debug"] || [logLevel isEqualToString:@"error"]) { + [[FIRConfiguration sharedInstance] setLoggerLevel:FIRLoggerLevelDebug]; + } else { + [[FIRConfiguration sharedInstance] setLoggerLevel:FIRLoggerLevelMin]; + } } -RCT_EXPORT_METHOD(disableNetwork - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)disableNetwork:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; [[RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId] disableNetworkWithCompletion:^(NSError *error) { if (error) { @@ -62,11 +73,11 @@ + (BOOL)requiresMainQueueSetup { }]; } -RCT_EXPORT_METHOD(enableNetwork - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)enableNetwork:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; [[RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId] enableNetworkWithCompletion:^(NSError *error) { if (error) { @@ -77,13 +88,11 @@ + (BOOL)requiresMainQueueSetup { }]; } -RCT_EXPORT_METHOD(settings - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSDictionary *)settings - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - NSString *appName = [RNFBSharedUtils getAppJavaScriptName:firebaseApp.name]; +- (void)settings:(NSString *)appName + databaseId:(NSString *)databaseId + settings:(NSDictionary *)settings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { NSString *firestoreKey = [RNFBFirestoreCommon createFirestoreKeyWithAppName:appName databaseId:databaseId]; @@ -119,12 +128,12 @@ + (BOOL)requiresMainQueueSetup { resolve([NSNull null]); } -RCT_EXPORT_METHOD(loadBundle - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSString *)bundle - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)loadBundle:(NSString *)appName + databaseId:(NSString *)databaseId + bundle:(NSString *)bundle + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; NSData *bundleData = [bundle dataUsingEncoding:NSUTF8StringEncoding]; [[RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId] loadBundle:bundleData @@ -137,11 +146,11 @@ + (BOOL)requiresMainQueueSetup { }]; } -RCT_EXPORT_METHOD(clearPersistence - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)clearPersistence:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; [[RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId] clearPersistenceWithCompletion:^(NSError *error) { if (error) { @@ -152,35 +161,34 @@ + (BOOL)requiresMainQueueSetup { }]; } -RCT_EXPORT_METHOD(useEmulator - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSString *)host - : (NSInteger)port) { +- (void)useEmulator:(NSString *)appName + databaseId:(NSString *)databaseId + host:(NSString *)host + port:(double)port { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; if (emulatorConfigs == nil) { emulatorConfigs = [[NSMutableDictionary alloc] init]; } - NSString *firestoreKey = [RNFBFirestoreCommon createFirestoreKeyWithAppName:firebaseApp.name + NSString *firestoreKey = [RNFBFirestoreCommon createFirestoreKeyWithAppName:appName databaseId:databaseId]; if (!emulatorConfigs[firestoreKey]) { FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; - [firestore useEmulatorWithHost:host port:port]; + [firestore useEmulatorWithHost:host port:(NSInteger)port]; emulatorConfigs[firestoreKey] = @YES; - // It is not sufficient to just use emulator. You have toggle SSL off too. FIRFirestoreSettings *settings = firestore.settings; settings.sslEnabled = FALSE; firestore.settings = settings; } } -RCT_EXPORT_METHOD(waitForPendingWrites - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)waitForPendingWrites:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; [[RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId] waitForPendingWritesWithCompletion:^(NSError *error) { if (error) { @@ -191,11 +199,11 @@ + (BOOL)requiresMainQueueSetup { }]; } -RCT_EXPORT_METHOD(terminate - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)terminate:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRFirestore *instance = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; @@ -203,7 +211,7 @@ + (BOOL)requiresMainQueueSetup { if (error) { [RNFBFirestoreCommon promiseRejectFirestoreException:reject error:error]; } else { - NSString *firestoreKey = [RNFBFirestoreCommon createFirestoreKeyWithAppName:firebaseApp.name + NSString *firestoreKey = [RNFBFirestoreCommon createFirestoreKeyWithAppName:appName databaseId:databaseId]; [instanceCache removeObjectForKey:firestoreKey]; resolve(nil); @@ -211,18 +219,18 @@ + (BOOL)requiresMainQueueSetup { }]; } -RCT_EXPORT_METHOD(persistenceCacheIndexManager - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (NSInteger)requestType - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)persistenceCacheIndexManager:(NSString *)appName + databaseId:(NSString *)databaseId + requestType:(double)requestType + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRPersistentCacheIndexManager *persistentCacheIndexManager = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId] .persistentCacheIndexManager; if (persistentCacheIndexManager) { - switch (requestType) { + switch ((NSInteger)requestType) { case 0: [persistentCacheIndexManager enableIndexAutoCreation]; break; @@ -243,14 +251,12 @@ + (BOOL)requiresMainQueueSetup { resolve(nil); } -RCT_EXPORT_METHOD(addSnapshotsInSync - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSNumber *)listenerId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - if (snapshotsInSyncListeners[listenerId]) { - resolve(nil); +- (void)addSnapshotsInSync:(NSString *)appName + databaseId:(NSString *)databaseId + listenerId:(double)listenerId { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSNumber *listenerIdNumber = @(listenerId); + if (snapshotsInSyncListeners[listenerIdNumber]) { return; } @@ -258,34 +264,27 @@ + (BOOL)requiresMainQueueSetup { databaseId:databaseId]; id listener = [firestore addSnapshotsInSyncListener:^{ - [[RNFBRCTEventEmitter shared] - sendEventWithName:RNFB_FIRESTORE_SNAPSHOTS_IN_SYNC - body:@{ - @"appName" : [RNFBSharedUtils getAppJavaScriptName:firebaseApp.name], - @"databaseId" : databaseId, - @"listenerId" : listenerId, - @"body" : @{} - }]; + [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_FIRESTORE_SNAPSHOTS_IN_SYNC + body:@{ + @"appName" : appName, + @"databaseId" : databaseId, + @"listenerId" : listenerIdNumber, + @"body" : @{} + }]; }]; - snapshotsInSyncListeners[listenerId] = listener; - - resolve(nil); + snapshotsInSyncListeners[listenerIdNumber] = listener; } -RCT_EXPORT_METHOD(removeSnapshotsInSync - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSNumber *)listenerId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - id listener = snapshotsInSyncListeners[listenerId]; +- (void)removeSnapshotsInSync:(NSString *)appName + databaseId:(NSString *)databaseId + listenerId:(double)listenerId { + NSNumber *listenerIdNumber = @(listenerId); + id listener = snapshotsInSyncListeners[listenerIdNumber]; if (listener) { [listener remove]; - [snapshotsInSyncListeners removeObjectForKey:listenerId]; + [snapshotsInSyncListeners removeObjectForKey:listenerIdNumber]; } - - resolve(nil); } - (NSMutableDictionary *)taskProgressToDictionary:(FIRLoadBundleTaskProgress *)progress { diff --git a/packages/firestore/ios/RNFBFirestore/RNFBFirestoreTransactionModule.m b/packages/firestore/ios/RNFBFirestore/RNFBFirestoreTransactionModule.mm similarity index 74% rename from packages/firestore/ios/RNFBFirestore/RNFBFirestoreTransactionModule.m rename to packages/firestore/ios/RNFBFirestore/RNFBFirestoreTransactionModule.mm index bf3dad6dda..1a4032b6b2 100644 --- a/packages/firestore/ios/RNFBFirestore/RNFBFirestoreTransactionModule.m +++ b/packages/firestore/ios/RNFBFirestore/RNFBFirestoreTransactionModule.mm @@ -16,18 +16,30 @@ */ #import +#import #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBFirestoreTransactionModule.h" +#import "RNFBFirestoreTurboModules.h" static __strong NSMutableDictionary *transactions; static NSString *const RNFB_FIRESTORE_TRANSACTION_EVENT = @"firestore_transaction_event"; +@interface RNFBFirestoreTransactionModule () +@end + @implementation RNFBFirestoreTransactionModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +RCT_EXPORT_MODULE(NativeRNFBTurboFirestoreTransaction); - (id)init { self = [super init]; @@ -39,11 +51,7 @@ - (id)init { } + (BOOL)requiresMainQueueSetup { - return YES; -} - -- (dispatch_queue_t)methodQueue { - return [RNFBFirestoreCommon getFirestoreQueue]; + return NO; } - (void)dealloc { @@ -59,87 +67,12 @@ - (void)invalidate { #pragma mark - #pragma mark Firebase Firestore Methods -RCT_EXPORT_METHOD(transactionGetDocument - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSNumber *)transactionId - : (NSString *)path - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - @synchronized(transactions[[transactionId stringValue]]) { - NSMutableDictionary *transactionState = transactions[[transactionId stringValue]]; - - if (!transactionState) { - DLog(@"transactionGetDocument called for non-existent transactionId %@", transactionId); - return; - } - - NSError *error = nil; - FIRTransaction *transaction = [transactionState valueForKey:@"transaction"]; - FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp - databaseId:databaseId]; - FIRDocumentReference *ref = [RNFBFirestoreCommon getDocumentForFirestore:firestore path:path]; - FIRDocumentSnapshot *snapshot = [transaction getDocument:ref error:&error]; - - if (error != nil) { - [RNFBFirestoreCommon promiseRejectFirestoreException:reject error:error]; - } else { - NSString *appName = [RNFBSharedUtils getAppJavaScriptName:firebaseApp.name]; - NSString *firestoreKey = [RNFBFirestoreCommon createFirestoreKeyWithAppName:appName - databaseId:databaseId]; - NSDictionary *snapshotDict = - [RNFBFirestoreSerialize documentSnapshotToDictionary:snapshot firestoreKey:firestoreKey]; - NSString *snapshotPath = snapshotDict[@"path"]; - - if (snapshotPath == nil) { - [snapshotDict setValue:ref.path forKey:@"path"]; - } - - resolve(snapshotDict); - } - } -} - -RCT_EXPORT_METHOD(transactionDispose - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSNumber *)transactionId) { - @synchronized(transactions[[transactionId stringValue]]) { - NSMutableDictionary *transactionState = transactions[[transactionId stringValue]]; - - if (!transactionState) { - return; - } - - dispatch_semaphore_t semaphore = transactionState[@"semaphore"]; - transactionState[@"aborted"] = @(true); - dispatch_semaphore_signal(semaphore); - } -} - -RCT_EXPORT_METHOD(transactionApplyBuffer - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSNumber *)transactionId - : (NSArray *)commandBuffer) { - @synchronized(transactions[[transactionId stringValue]]) { - NSMutableDictionary *transactionState = transactions[[transactionId stringValue]]; - - if (!transactionState) { - DLog(@"transactionGetDocument called for non-existent transactionId %@", transactionId); - return; - } - - dispatch_semaphore_t semaphore = [transactionState valueForKey:@"semaphore"]; - [transactionState setValue:commandBuffer forKey:@"commandBuffer"]; - dispatch_semaphore_signal(semaphore); - } -} +- (void)transactionBegin:(NSString *)appName + databaseId:(NSString *)databaseId + transactionId:(double)transactionId { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSNumber *transactionIdNumber = @(transactionId); -RCT_EXPORT_METHOD(transactionBegin - : (FIRApp *)firebaseApp - : (NSString *)databaseId - : (nonnull NSNumber *)transactionId) { FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp databaseId:databaseId]; __block BOOL aborted = false; @@ -152,18 +85,17 @@ - (void)invalidate { transactionState[@"semaphore"] = semaphore; transactionState[@"transaction"] = transaction; - if (!transactions[[transactionId stringValue]]) { - transactions[[transactionId stringValue]] = transactionState; + if (!transactions[[transactionIdNumber stringValue]]) { + transactions[[transactionIdNumber stringValue]] = transactionState; } - // build and send transaction update event dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSMutableDictionary *eventMap = [NSMutableDictionary new]; eventMap[@"type"] = @"update"; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_FIRESTORE_TRANSACTION_EVENT body:@{ - @"listenerId" : transactionId, + @"listenerId" : transactionIdNumber, @"appName" : [RNFBSharedUtils getAppJavaScriptName:firebaseApp.name], @"databaseId" : databaseId, @"body" : eventMap, @@ -171,10 +103,6 @@ - (void)invalidate { }); } - // wait for the js event handler to call transactionApplyBuffer - // this wait occurs on the RNFirestore Worker Queue so if transactionApplyBuffer fails to - // signal the semaphore then no further blocks will be executed by RNFirestore until the timeout - // expires dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, 15 * NSEC_PER_SEC); BOOL timedOut = dispatch_semaphore_wait(semaphore, delayTime) != 0; @@ -252,18 +180,99 @@ - (void)invalidate { [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_FIRESTORE_TRANSACTION_EVENT body:@{ - @"listenerId" : transactionId, + @"listenerId" : transactionIdNumber, @"appName" : [RNFBSharedUtils getAppJavaScriptName:firebaseApp.name], @"databaseId" : databaseId, @"body" : eventMap, }]; } - [transactions removeObjectForKey:[transactionId stringValue]]; + [transactions removeObjectForKey:[transactionIdNumber stringValue]]; } }; [firestore runTransactionWithBlock:transactionBlock completion:completionBlock]; } +- (void)transactionGetDocument:(NSString *)appName + databaseId:(NSString *)databaseId + transactionId:(double)transactionId + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSNumber *transactionIdNumber = @(transactionId); + + @synchronized(transactions[[transactionIdNumber stringValue]]) { + NSMutableDictionary *transactionState = transactions[[transactionIdNumber stringValue]]; + + if (!transactionState) { + DLog(@"transactionGetDocument called for non-existent transactionId %@", transactionIdNumber); + return; + } + + NSError *error = nil; + FIRTransaction *transaction = [transactionState valueForKey:@"transaction"]; + FIRFirestore *firestore = [RNFBFirestoreCommon getFirestoreForApp:firebaseApp + databaseId:databaseId]; + FIRDocumentReference *ref = [RNFBFirestoreCommon getDocumentForFirestore:firestore path:path]; + FIRDocumentSnapshot *snapshot = [transaction getDocument:ref error:&error]; + + if (error != nil) { + [RNFBFirestoreCommon promiseRejectFirestoreException:reject error:error]; + } else { + NSString *resolvedAppName = [RNFBSharedUtils getAppJavaScriptName:firebaseApp.name]; + NSString *firestoreKey = [RNFBFirestoreCommon createFirestoreKeyWithAppName:resolvedAppName + databaseId:databaseId]; + NSDictionary *snapshotDict = + [RNFBFirestoreSerialize documentSnapshotToDictionary:snapshot firestoreKey:firestoreKey]; + NSString *snapshotPath = snapshotDict[@"path"]; + + if (snapshotPath == nil) { + [snapshotDict setValue:ref.path forKey:@"path"]; + } + + resolve(snapshotDict); + } + } +} + +- (void)transactionDispose:(NSString *)appName + databaseId:(NSString *)databaseId + transactionId:(double)transactionId { + NSNumber *transactionIdNumber = @(transactionId); + + @synchronized(transactions[[transactionIdNumber stringValue]]) { + NSMutableDictionary *transactionState = transactions[[transactionIdNumber stringValue]]; + + if (!transactionState) { + return; + } + + dispatch_semaphore_t semaphore = transactionState[@"semaphore"]; + transactionState[@"aborted"] = @(true); + dispatch_semaphore_signal(semaphore); + } +} + +- (void)transactionApplyBuffer:(NSString *)appName + databaseId:(NSString *)databaseId + transactionId:(double)transactionId + commandBuffer:(NSArray *)commandBuffer { + NSNumber *transactionIdNumber = @(transactionId); + + @synchronized(transactions[[transactionIdNumber stringValue]]) { + NSMutableDictionary *transactionState = transactions[[transactionIdNumber stringValue]]; + + if (!transactionState) { + DLog(@"transactionApplyBuffer called for non-existent transactionId %@", transactionIdNumber); + return; + } + + dispatch_semaphore_t semaphore = [transactionState valueForKey:@"semaphore"]; + [transactionState setValue:commandBuffer forKey:@"commandBuffer"]; + dispatch_semaphore_signal(semaphore); + } +} + @end diff --git a/packages/firestore/ios/generated/RCTAppDependencyProvider.h b/packages/firestore/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/firestore/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/firestore/ios/generated/RCTAppDependencyProvider.mm b/packages/firestore/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/firestore/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/firestore/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/firestore/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/firestore/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/firestore/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/firestore/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/firestore/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/firestore/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/firestore/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/firestore/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/firestore/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/firestore/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/firestore/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/firestore/ios/generated/RNFBFirestoreTurboModules/RNFBFirestoreTurboModules-generated.mm b/packages/firestore/ios/generated/RNFBFirestoreTurboModules/RNFBFirestoreTurboModules-generated.mm new file mode 100644 index 0000000000..780b2d7f87 --- /dev/null +++ b/packages/firestore/ios/generated/RNFBFirestoreTurboModules/RNFBFirestoreTurboModules-generated.mm @@ -0,0 +1,311 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBFirestoreTurboModules.h" + + +@implementation NativeRNFBTurboFirestoreSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_setLogLevel(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setLogLevel", @selector(setLogLevel:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_loadBundle(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "loadBundle", @selector(loadBundle:databaseId:bundle:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_clearPersistence(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "clearPersistence", @selector(clearPersistence:databaseId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_waitForPendingWrites(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "waitForPendingWrites", @selector(waitForPendingWrites:databaseId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_disableNetwork(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "disableNetwork", @selector(disableNetwork:databaseId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_enableNetwork(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "enableNetwork", @selector(enableNetwork:databaseId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_useEmulator(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "useEmulator", @selector(useEmulator:databaseId:host:port:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_settings(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "settings", @selector(settings:databaseId:settings:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_terminate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "terminate", @selector(terminate:databaseId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_persistenceCacheIndexManager(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "persistenceCacheIndexManager", @selector(persistenceCacheIndexManager:databaseId:requestType:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_addSnapshotsInSync(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "addSnapshotsInSync", @selector(addSnapshotsInSync:databaseId:listenerId:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreSpecJSI_removeSnapshotsInSync(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "removeSnapshotsInSync", @selector(removeSnapshotsInSync:databaseId:listenerId:), args, count); + } + + NativeRNFBTurboFirestoreSpecJSI::NativeRNFBTurboFirestoreSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["setLogLevel"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_setLogLevel}; + + + methodMap_["loadBundle"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_loadBundle}; + + + methodMap_["clearPersistence"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_clearPersistence}; + + + methodMap_["waitForPendingWrites"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_waitForPendingWrites}; + + + methodMap_["disableNetwork"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_disableNetwork}; + + + methodMap_["enableNetwork"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_enableNetwork}; + + + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_useEmulator}; + + + methodMap_["settings"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_settings}; + + + methodMap_["terminate"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_terminate}; + + + methodMap_["persistenceCacheIndexManager"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_persistenceCacheIndexManager}; + + + methodMap_["addSnapshotsInSync"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_addSnapshotsInSync}; + + + methodMap_["removeSnapshotsInSync"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreSpecJSI_removeSnapshotsInSync}; + + } +} // namespace facebook::react + +@implementation NativeRNFBTurboFirestoreCollectionSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_namedQueryOnSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "namedQueryOnSnapshot", @selector(namedQueryOnSnapshot:databaseId:queryName:type:filters:orders:options:listenerId:snapshotListenOptions:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionOnSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "collectionOnSnapshot", @selector(collectionOnSnapshot:databaseId:path:type:filters:orders:options:listenerId:snapshotListenOptions:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionOffSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "collectionOffSnapshot", @selector(collectionOffSnapshot:databaseId:listenerId:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_namedQueryGet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "namedQueryGet", @selector(namedQueryGet:databaseId:queryName:type:filters:orders:options:getOptions:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionGet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "collectionGet", @selector(collectionGet:databaseId:path:type:filters:orders:options:getOptions:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionCount(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "collectionCount", @selector(collectionCount:databaseId:path:type:filters:orders:options:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_aggregateQuery(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "aggregateQuery", @selector(aggregateQuery:databaseId:path:type:filters:orders:options:aggregateQueries:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_pipelineExecute(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "pipelineExecute", @selector(pipelineExecute:databaseId:pipeline:options:resolve:reject:), args, count); + } + + NativeRNFBTurboFirestoreCollectionSpecJSI::NativeRNFBTurboFirestoreCollectionSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["namedQueryOnSnapshot"] = MethodMetadata {9, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_namedQueryOnSnapshot}; + + + methodMap_["collectionOnSnapshot"] = MethodMetadata {9, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionOnSnapshot}; + + + methodMap_["collectionOffSnapshot"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionOffSnapshot}; + + + methodMap_["namedQueryGet"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_namedQueryGet}; + + + methodMap_["collectionGet"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionGet}; + + + methodMap_["collectionCount"] = MethodMetadata {7, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_collectionCount}; + + + methodMap_["aggregateQuery"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_aggregateQuery}; + + + methodMap_["pipelineExecute"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreCollectionSpecJSI_pipelineExecute}; + + } +} // namespace facebook::react + +@implementation NativeRNFBTurboFirestoreDocumentSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + +@implementation RCTCxxConvert (NativeRNFBTurboFirestoreDocument_FirestoreSnapshotListenOptions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboFirestoreDocument_FirestoreSnapshotListenOptions:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +@implementation RCTCxxConvert (NativeRNFBTurboFirestoreDocument_SpecDocumentGetGetOptions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboFirestoreDocument_SpecDocumentGetGetOptions:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentOnSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "documentOnSnapshot", @selector(documentOnSnapshot:databaseId:path:listenerId:snapshotListenOptions:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentOffSnapshot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "documentOffSnapshot", @selector(documentOffSnapshot:databaseId:listenerId:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentGet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "documentGet", @selector(documentGet:databaseId:path:getOptions:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentDelete(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "documentDelete", @selector(documentDelete:databaseId:path:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentSet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "documentSet", @selector(documentSet:databaseId:path:data:options:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentUpdate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "documentUpdate", @selector(documentUpdate:databaseId:path:data:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentBatch(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "documentBatch", @selector(documentBatch:databaseId:writes:resolve:reject:), args, count); + } + + NativeRNFBTurboFirestoreDocumentSpecJSI::NativeRNFBTurboFirestoreDocumentSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["documentOnSnapshot"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentOnSnapshot}; + setMethodArgConversionSelector(@"documentOnSnapshot", 4, @"JS_NativeRNFBTurboFirestoreDocument_FirestoreSnapshotListenOptions:"); + + methodMap_["documentOffSnapshot"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentOffSnapshot}; + + + methodMap_["documentGet"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentGet}; + setMethodArgConversionSelector(@"documentGet", 3, @"JS_NativeRNFBTurboFirestoreDocument_SpecDocumentGetGetOptions:"); + + methodMap_["documentDelete"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentDelete}; + + + methodMap_["documentSet"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentSet}; + + + methodMap_["documentUpdate"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentUpdate}; + + + methodMap_["documentBatch"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentSpecJSI_documentBatch}; + + } +} // namespace facebook::react + +@implementation NativeRNFBTurboFirestoreTransactionSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionBegin(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "transactionBegin", @selector(transactionBegin:databaseId:transactionId:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionGetDocument(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "transactionGetDocument", @selector(transactionGetDocument:databaseId:transactionId:path:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionDispose(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "transactionDispose", @selector(transactionDispose:databaseId:transactionId:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionApplyBuffer(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "transactionApplyBuffer", @selector(transactionApplyBuffer:databaseId:transactionId:commandBuffer:), args, count); + } + + NativeRNFBTurboFirestoreTransactionSpecJSI::NativeRNFBTurboFirestoreTransactionSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["transactionBegin"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionBegin}; + + + methodMap_["transactionGetDocument"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionGetDocument}; + + + methodMap_["transactionDispose"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionDispose}; + + + methodMap_["transactionApplyBuffer"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreTransactionSpecJSI_transactionApplyBuffer}; + + } +} // namespace facebook::react diff --git a/packages/firestore/ios/generated/RNFBFirestoreTurboModules/RNFBFirestoreTurboModules.h b/packages/firestore/ios/generated/RNFBFirestoreTurboModules/RNFBFirestoreTurboModules.h new file mode 100644 index 0000000000..b0e2188cf1 --- /dev/null +++ b/packages/firestore/ios/generated/RNFBFirestoreTurboModules/RNFBFirestoreTurboModules.h @@ -0,0 +1,345 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBFirestoreTurboModules symbols +#ifndef RNFBFirestoreTurboModules_H +#define RNFBFirestoreTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@protocol NativeRNFBTurboFirestoreSpec + +- (void)setLogLevel:(NSString *)logLevel; +- (void)loadBundle:(NSString *)appName + databaseId:(NSString *)databaseId + bundle:(NSString *)bundle + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)clearPersistence:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)waitForPendingWrites:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)disableNetwork:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)enableNetwork:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)useEmulator:(NSString *)appName + databaseId:(NSString *)databaseId + host:(NSString *)host + port:(double)port; +- (void)settings:(NSString *)appName + databaseId:(NSString *)databaseId + settings:(NSDictionary *)settings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)terminate:(NSString *)appName + databaseId:(NSString *)databaseId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)persistenceCacheIndexManager:(NSString *)appName + databaseId:(NSString *)databaseId + requestType:(double)requestType + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)addSnapshotsInSync:(NSString *)appName + databaseId:(NSString *)databaseId + listenerId:(double)listenerId; +- (void)removeSnapshotsInSync:(NSString *)appName + databaseId:(NSString *)databaseId + listenerId:(double)listenerId; + +@end + +@interface NativeRNFBTurboFirestoreSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboFirestore' + */ + class JSI_EXPORT NativeRNFBTurboFirestoreSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboFirestoreSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +@protocol NativeRNFBTurboFirestoreCollectionSpec + +- (void)namedQueryOnSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + queryName:(NSString *)queryName + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + listenerId:(double)listenerId + snapshotListenOptions:(NSDictionary *)snapshotListenOptions; +- (void)collectionOnSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + listenerId:(double)listenerId + snapshotListenOptions:(NSDictionary *)snapshotListenOptions; +- (void)collectionOffSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + listenerId:(double)listenerId; +- (void)namedQueryGet:(NSString *)appName + databaseId:(NSString *)databaseId + queryName:(NSString *)queryName + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + getOptions:(NSDictionary *)getOptions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)collectionGet:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + getOptions:(NSDictionary *)getOptions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)collectionCount:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)aggregateQuery:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + type:(NSString *)type + filters:(NSArray *)filters + orders:(NSArray *)orders + options:(NSDictionary *)options + aggregateQueries:(NSArray *)aggregateQueries + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)pipelineExecute:(NSString *)appName + databaseId:(NSString *)databaseId + pipeline:(NSDictionary *)pipeline + options:(NSDictionary *)options + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end + +@interface NativeRNFBTurboFirestoreCollectionSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboFirestoreCollection' + */ + class JSI_EXPORT NativeRNFBTurboFirestoreCollectionSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboFirestoreCollectionSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +namespace JS { + namespace NativeRNFBTurboFirestoreDocument { + struct FirestoreSnapshotListenOptions { + std::optional includeMetadataChanges() const; + NSString *source() const; + + FirestoreSnapshotListenOptions(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboFirestoreDocument_FirestoreSnapshotListenOptions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboFirestoreDocument_FirestoreSnapshotListenOptions:(id)json; +@end +namespace JS { + namespace NativeRNFBTurboFirestoreDocument { + struct SpecDocumentGetGetOptions { + NSString *source() const; + + SpecDocumentGetGetOptions(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboFirestoreDocument_SpecDocumentGetGetOptions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboFirestoreDocument_SpecDocumentGetGetOptions:(id)json; +@end +@protocol NativeRNFBTurboFirestoreDocumentSpec + +- (void)documentOnSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + listenerId:(double)listenerId + snapshotListenOptions:(JS::NativeRNFBTurboFirestoreDocument::FirestoreSnapshotListenOptions &)snapshotListenOptions; +- (void)documentOffSnapshot:(NSString *)appName + databaseId:(NSString *)databaseId + listenerId:(double)listenerId; +- (void)documentGet:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + getOptions:(JS::NativeRNFBTurboFirestoreDocument::SpecDocumentGetGetOptions &)getOptions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)documentDelete:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)documentSet:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + data:(NSDictionary *)data + options:(NSDictionary *)options + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)documentUpdate:(NSString *)appName + databaseId:(NSString *)databaseId + path:(NSString *)path + data:(NSDictionary *)data + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)documentBatch:(NSString *)appName + databaseId:(NSString *)databaseId + writes:(NSArray *)writes + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end + +@interface NativeRNFBTurboFirestoreDocumentSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboFirestoreDocument' + */ + class JSI_EXPORT NativeRNFBTurboFirestoreDocumentSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboFirestoreDocumentSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +@protocol NativeRNFBTurboFirestoreTransactionSpec + +- (void)transactionBegin:(NSString *)appName + databaseId:(NSString *)databaseId + transactionId:(double)transactionId; +- (void)transactionGetDocument:(NSString *)appName + databaseId:(NSString *)databaseId + transactionId:(double)transactionId + path:(NSString *)path + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)transactionDispose:(NSString *)appName + databaseId:(NSString *)databaseId + transactionId:(double)transactionId; +- (void)transactionApplyBuffer:(NSString *)appName + databaseId:(NSString *)databaseId + transactionId:(double)transactionId + commandBuffer:(NSArray *)commandBuffer; + +@end + +@interface NativeRNFBTurboFirestoreTransactionSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboFirestoreTransaction' + */ + class JSI_EXPORT NativeRNFBTurboFirestoreTransactionSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboFirestoreTransactionSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + + +inline std::optional JS::NativeRNFBTurboFirestoreDocument::FirestoreSnapshotListenOptions::includeMetadataChanges() const +{ + id const p = _v[@"includeMetadataChanges"]; + return RCTBridgingToOptionalBool(p); +} +inline NSString *JS::NativeRNFBTurboFirestoreDocument::FirestoreSnapshotListenOptions::source() const +{ + id const p = _v[@"source"]; + return RCTBridgingToOptionalString(p); +} +inline NSString *JS::NativeRNFBTurboFirestoreDocument::SpecDocumentGetGetOptions::source() const +{ + id const p = _v[@"source"]; + return RCTBridgingToOptionalString(p); +} + +NS_ASSUME_NONNULL_END +#endif // RNFBFirestoreTurboModules_H diff --git a/packages/firestore/ios/generated/RNFBFirestoreTurboModulesJSI-generated.cpp b/packages/firestore/ios/generated/RNFBFirestoreTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..3a1062e6af --- /dev/null +++ b/packages/firestore/ios/generated/RNFBFirestoreTurboModulesJSI-generated.cpp @@ -0,0 +1,357 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBFirestoreTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_setLogLevel(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->setLogLevel( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_loadBundle(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->loadBundle( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_clearPersistence(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->clearPersistence( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_waitForPendingWrites(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->waitForPendingWrites( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_disableNetwork(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->disableNetwork( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_enableNetwork(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->enableNetwork( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_useEmulator(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useEmulator( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_settings(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->settings( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_terminate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->terminate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_persistenceCacheIndexManager(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->persistenceCacheIndexManager( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_addSnapshotsInSync(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->addSnapshotsInSync( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_removeSnapshotsInSync(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeSnapshotsInSync( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboFirestoreCxxSpecJSI::NativeRNFBTurboFirestoreCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFirestore", jsInvoker) { + methodMap_["setLogLevel"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_setLogLevel}; + methodMap_["loadBundle"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_loadBundle}; + methodMap_["clearPersistence"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_clearPersistence}; + methodMap_["waitForPendingWrites"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_waitForPendingWrites}; + methodMap_["disableNetwork"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_disableNetwork}; + methodMap_["enableNetwork"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_enableNetwork}; + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_useEmulator}; + methodMap_["settings"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_settings}; + methodMap_["terminate"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_terminate}; + methodMap_["persistenceCacheIndexManager"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_persistenceCacheIndexManager}; + methodMap_["addSnapshotsInSync"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_addSnapshotsInSync}; + methodMap_["removeSnapshotsInSync"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCxxSpecJSI_removeSnapshotsInSync}; +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_namedQueryOnSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->namedQueryOnSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 ? throw jsi::JSError(rt, "Expected argument in position 7 to be passed") : args[7].asNumber(), + count <= 8 ? throw jsi::JSError(rt, "Expected argument in position 8 to be passed") : args[8].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionOnSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->collectionOnSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 ? throw jsi::JSError(rt, "Expected argument in position 7 to be passed") : args[7].asNumber(), + count <= 8 ? throw jsi::JSError(rt, "Expected argument in position 8 to be passed") : args[8].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionOffSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->collectionOffSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_namedQueryGet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->namedQueryGet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 || args[7].isUndefined() ? std::nullopt : std::make_optional(args[7].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionGet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->collectionGet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 || args[7].isUndefined() ? std::nullopt : std::make_optional(args[7].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionCount(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->collectionCount( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_aggregateQuery(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->aggregateQuery( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt).asArray(rt), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asObject(rt).asArray(rt), + count <= 6 ? throw jsi::JSError(rt, "Expected argument in position 6 to be passed") : args[6].asObject(rt), + count <= 7 ? throw jsi::JSError(rt, "Expected argument in position 7 to be passed") : args[7].asObject(rt).asArray(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_pipelineExecute(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->pipelineExecute( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt), + count <= 3 || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asObject(rt)) + ); +} + +NativeRNFBTurboFirestoreCollectionCxxSpecJSI::NativeRNFBTurboFirestoreCollectionCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFirestoreCollection", jsInvoker) { + methodMap_["namedQueryOnSnapshot"] = MethodMetadata {9, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_namedQueryOnSnapshot}; + methodMap_["collectionOnSnapshot"] = MethodMetadata {9, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionOnSnapshot}; + methodMap_["collectionOffSnapshot"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionOffSnapshot}; + methodMap_["namedQueryGet"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_namedQueryGet}; + methodMap_["collectionGet"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionGet}; + methodMap_["collectionCount"] = MethodMetadata {7, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_collectionCount}; + methodMap_["aggregateQuery"] = MethodMetadata {8, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_aggregateQuery}; + methodMap_["pipelineExecute"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreCollectionCxxSpecJSI_pipelineExecute}; +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentOnSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->documentOnSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentOffSnapshot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->documentOffSnapshot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentGet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentGet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentDelete(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentDelete( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentSet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentSet( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentUpdate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentUpdate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentBatch(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->documentBatch( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt).asArray(rt) + ); +} + +NativeRNFBTurboFirestoreDocumentCxxSpecJSI::NativeRNFBTurboFirestoreDocumentCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFirestoreDocument", jsInvoker) { + methodMap_["documentOnSnapshot"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentOnSnapshot}; + methodMap_["documentOffSnapshot"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentOffSnapshot}; + methodMap_["documentGet"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentGet}; + methodMap_["documentDelete"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentDelete}; + methodMap_["documentSet"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentSet}; + methodMap_["documentUpdate"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentUpdate}; + methodMap_["documentBatch"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreDocumentCxxSpecJSI_documentBatch}; +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionBegin(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionBegin( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionGetDocument(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->transactionGetDocument( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionDispose(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionDispose( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionApplyBuffer(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->transactionApplyBuffer( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asObject(rt).asArray(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboFirestoreTransactionCxxSpecJSI::NativeRNFBTurboFirestoreTransactionCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFirestoreTransaction", jsInvoker) { + methodMap_["transactionBegin"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionBegin}; + methodMap_["transactionGetDocument"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionGetDocument}; + methodMap_["transactionDispose"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionDispose}; + methodMap_["transactionApplyBuffer"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboFirestoreTransactionCxxSpecJSI_transactionApplyBuffer}; +} + + +} // namespace facebook::react diff --git a/packages/firestore/ios/generated/RNFBFirestoreTurboModulesJSI.h b/packages/firestore/ios/generated/RNFBFirestoreTurboModulesJSI.h new file mode 100644 index 0000000000..0a6983ebd3 --- /dev/null +++ b/packages/firestore/ios/generated/RNFBFirestoreTurboModulesJSI.h @@ -0,0 +1,637 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboFirestoreFirestoreLoadBundleTaskProgress + +template +struct NativeRNFBTurboFirestoreFirestoreLoadBundleTaskProgress { + P0 bytesLoaded; + P1 documentsLoaded; + P2 totalBytes; + P3 totalDocuments; + P4 taskState; + bool operator==(const NativeRNFBTurboFirestoreFirestoreLoadBundleTaskProgress &other) const { + return bytesLoaded == other.bytesLoaded && documentsLoaded == other.documentsLoaded && totalBytes == other.totalBytes && totalDocuments == other.totalDocuments && taskState == other.taskState; + } +}; + +template +struct NativeRNFBTurboFirestoreFirestoreLoadBundleTaskProgressBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "bytesLoaded"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "documentsLoaded"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "totalBytes"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "totalDocuments"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "taskState"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double bytesLoadedToJs(jsi::Runtime &rt, decltype(types.bytesLoaded) value) { + return bridging::toJs(rt, value); + } + + static double documentsLoadedToJs(jsi::Runtime &rt, decltype(types.documentsLoaded) value) { + return bridging::toJs(rt, value); + } + + static double totalBytesToJs(jsi::Runtime &rt, decltype(types.totalBytes) value) { + return bridging::toJs(rt, value); + } + + static double totalDocumentsToJs(jsi::Runtime &rt, decltype(types.totalDocuments) value) { + return bridging::toJs(rt, value); + } + + static jsi::String taskStateToJs(jsi::Runtime &rt, decltype(types.taskState) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "bytesLoaded", bridging::toJs(rt, value.bytesLoaded, jsInvoker)); + result.setProperty(rt, "documentsLoaded", bridging::toJs(rt, value.documentsLoaded, jsInvoker)); + result.setProperty(rt, "totalBytes", bridging::toJs(rt, value.totalBytes, jsInvoker)); + result.setProperty(rt, "totalDocuments", bridging::toJs(rt, value.totalDocuments, jsInvoker)); + result.setProperty(rt, "taskState", bridging::toJs(rt, value.taskState, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboFirestoreCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFirestoreCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void setLogLevel(jsi::Runtime &rt, jsi::String logLevel) = 0; + virtual jsi::Value loadBundle(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String bundle) = 0; + virtual jsi::Value clearPersistence(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual jsi::Value waitForPendingWrites(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual jsi::Value disableNetwork(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual jsi::Value enableNetwork(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String host, double port) = 0; + virtual jsi::Value settings(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Object settings) = 0; + virtual jsi::Value terminate(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) = 0; + virtual jsi::Value persistenceCacheIndexManager(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double requestType) = 0; + virtual void addSnapshotsInSync(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) = 0; + virtual void removeSnapshotsInSync(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFirestoreCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFirestore"; + +protected: + NativeRNFBTurboFirestoreCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFirestoreCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFirestoreCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFirestoreCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void setLogLevel(jsi::Runtime &rt, jsi::String logLevel) override { + static_assert( + bridging::getParameterCount(&T::setLogLevel) == 2, + "Expected setLogLevel(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setLogLevel, jsInvoker_, instance_, std::move(logLevel)); + } + jsi::Value loadBundle(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String bundle) override { + static_assert( + bridging::getParameterCount(&T::loadBundle) == 4, + "Expected loadBundle(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::loadBundle, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(bundle)); + } + jsi::Value clearPersistence(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::clearPersistence) == 3, + "Expected clearPersistence(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::clearPersistence, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + jsi::Value waitForPendingWrites(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::waitForPendingWrites) == 3, + "Expected waitForPendingWrites(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::waitForPendingWrites, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + jsi::Value disableNetwork(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::disableNetwork) == 3, + "Expected disableNetwork(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::disableNetwork, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + jsi::Value enableNetwork(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::enableNetwork) == 3, + "Expected enableNetwork(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::enableNetwork, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String host, double port) override { + static_assert( + bridging::getParameterCount(&T::useEmulator) == 5, + "Expected useEmulator(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::useEmulator, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(host), std::move(port)); + } + jsi::Value settings(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Object settings) override { + static_assert( + bridging::getParameterCount(&T::settings) == 4, + "Expected settings(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::settings, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(settings)); + } + jsi::Value terminate(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId) override { + static_assert( + bridging::getParameterCount(&T::terminate) == 3, + "Expected terminate(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::terminate, jsInvoker_, instance_, std::move(appName), std::move(databaseId)); + } + jsi::Value persistenceCacheIndexManager(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double requestType) override { + static_assert( + bridging::getParameterCount(&T::persistenceCacheIndexManager) == 4, + "Expected persistenceCacheIndexManager(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::persistenceCacheIndexManager, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(requestType)); + } + void addSnapshotsInSync(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) override { + static_assert( + bridging::getParameterCount(&T::addSnapshotsInSync) == 4, + "Expected addSnapshotsInSync(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::addSnapshotsInSync, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(listenerId)); + } + void removeSnapshotsInSync(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) override { + static_assert( + bridging::getParameterCount(&T::removeSnapshotsInSync) == 4, + "Expected removeSnapshotsInSync(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::removeSnapshotsInSync, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(listenerId)); + } + + private: + friend class NativeRNFBTurboFirestoreCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + +#pragma mark - NativeRNFBTurboFirestoreCollectionFirestoreCollectionCountResult + +template +struct NativeRNFBTurboFirestoreCollectionFirestoreCollectionCountResult { + P0 count; + bool operator==(const NativeRNFBTurboFirestoreCollectionFirestoreCollectionCountResult &other) const { + return count == other.count; + } +}; + +template +struct NativeRNFBTurboFirestoreCollectionFirestoreCollectionCountResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "count"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double countToJs(jsi::Runtime &rt, decltype(types.count) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.count) { + result.setProperty(rt, "count", bridging::toJs(rt, value.count.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboFirestoreCollectionCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFirestoreCollectionCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void namedQueryOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String queryName, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, double listenerId, jsi::Object snapshotListenOptions) = 0; + virtual void collectionOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, double listenerId, jsi::Object snapshotListenOptions) = 0; + virtual void collectionOffSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) = 0; + virtual jsi::Value namedQueryGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String queryName, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, std::optional getOptions) = 0; + virtual jsi::Value collectionGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, std::optional getOptions) = 0; + virtual jsi::Value collectionCount(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options) = 0; + virtual jsi::Value aggregateQuery(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, jsi::Array aggregateQueries) = 0; + virtual jsi::Value pipelineExecute(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Object pipeline, std::optional options) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFirestoreCollectionCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFirestoreCollection"; + +protected: + NativeRNFBTurboFirestoreCollectionCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFirestoreCollectionCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFirestoreCollectionCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFirestoreCollectionCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void namedQueryOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String queryName, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, double listenerId, jsi::Object snapshotListenOptions) override { + static_assert( + bridging::getParameterCount(&T::namedQueryOnSnapshot) == 10, + "Expected namedQueryOnSnapshot(...) to have 10 parameters"); + + return bridging::callFromJs( + rt, &T::namedQueryOnSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(queryName), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(listenerId), std::move(snapshotListenOptions)); + } + void collectionOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, double listenerId, jsi::Object snapshotListenOptions) override { + static_assert( + bridging::getParameterCount(&T::collectionOnSnapshot) == 10, + "Expected collectionOnSnapshot(...) to have 10 parameters"); + + return bridging::callFromJs( + rt, &T::collectionOnSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(listenerId), std::move(snapshotListenOptions)); + } + void collectionOffSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) override { + static_assert( + bridging::getParameterCount(&T::collectionOffSnapshot) == 4, + "Expected collectionOffSnapshot(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::collectionOffSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(listenerId)); + } + jsi::Value namedQueryGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String queryName, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, std::optional getOptions) override { + static_assert( + bridging::getParameterCount(&T::namedQueryGet) == 9, + "Expected namedQueryGet(...) to have 9 parameters"); + + return bridging::callFromJs( + rt, &T::namedQueryGet, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(queryName), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(getOptions)); + } + jsi::Value collectionGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, std::optional getOptions) override { + static_assert( + bridging::getParameterCount(&T::collectionGet) == 9, + "Expected collectionGet(...) to have 9 parameters"); + + return bridging::callFromJs( + rt, &T::collectionGet, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(getOptions)); + } + jsi::Value collectionCount(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options) override { + static_assert( + bridging::getParameterCount(&T::collectionCount) == 8, + "Expected collectionCount(...) to have 8 parameters"); + + return bridging::callFromJs( + rt, &T::collectionCount, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(type), std::move(filters), std::move(orders), std::move(options)); + } + jsi::Value aggregateQuery(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::String type, jsi::Array filters, jsi::Array orders, jsi::Object options, jsi::Array aggregateQueries) override { + static_assert( + bridging::getParameterCount(&T::aggregateQuery) == 9, + "Expected aggregateQuery(...) to have 9 parameters"); + + return bridging::callFromJs( + rt, &T::aggregateQuery, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(type), std::move(filters), std::move(orders), std::move(options), std::move(aggregateQueries)); + } + jsi::Value pipelineExecute(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Object pipeline, std::optional options) override { + static_assert( + bridging::getParameterCount(&T::pipelineExecute) == 5, + "Expected pipelineExecute(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::pipelineExecute, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(pipeline), std::move(options)); + } + + private: + friend class NativeRNFBTurboFirestoreCollectionCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + +#pragma mark - NativeRNFBTurboFirestoreDocumentFirestoreSnapshotListenOptions + +template +struct NativeRNFBTurboFirestoreDocumentFirestoreSnapshotListenOptions { + P0 includeMetadataChanges; + P1 source; + bool operator==(const NativeRNFBTurboFirestoreDocumentFirestoreSnapshotListenOptions &other) const { + return includeMetadataChanges == other.includeMetadataChanges && source == other.source; + } +}; + +template +struct NativeRNFBTurboFirestoreDocumentFirestoreSnapshotListenOptionsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "includeMetadataChanges"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "source"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool includeMetadataChangesToJs(jsi::Runtime &rt, decltype(types.includeMetadataChanges) value) { + return bridging::toJs(rt, value); + } + + static jsi::String sourceToJs(jsi::Runtime &rt, decltype(types.source) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.includeMetadataChanges) { + result.setProperty(rt, "includeMetadataChanges", bridging::toJs(rt, value.includeMetadataChanges.value(), jsInvoker)); + } + if (value.source) { + result.setProperty(rt, "source", bridging::toJs(rt, value.source.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboFirestoreDocumentCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFirestoreDocumentCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void documentOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, double listenerId, jsi::Object snapshotListenOptions) = 0; + virtual void documentOffSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) = 0; + virtual jsi::Value documentGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, std::optional getOptions) = 0; + virtual jsi::Value documentDelete(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path) = 0; + virtual jsi::Value documentSet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::Object data, jsi::Object options) = 0; + virtual jsi::Value documentUpdate(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::Object data) = 0; + virtual jsi::Value documentBatch(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Array writes) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFirestoreDocumentCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFirestoreDocument"; + +protected: + NativeRNFBTurboFirestoreDocumentCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFirestoreDocumentCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFirestoreDocumentCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFirestoreDocumentCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void documentOnSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, double listenerId, jsi::Object snapshotListenOptions) override { + static_assert( + bridging::getParameterCount(&T::documentOnSnapshot) == 6, + "Expected documentOnSnapshot(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::documentOnSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(listenerId), std::move(snapshotListenOptions)); + } + void documentOffSnapshot(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double listenerId) override { + static_assert( + bridging::getParameterCount(&T::documentOffSnapshot) == 4, + "Expected documentOffSnapshot(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::documentOffSnapshot, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(listenerId)); + } + jsi::Value documentGet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, std::optional getOptions) override { + static_assert( + bridging::getParameterCount(&T::documentGet) == 5, + "Expected documentGet(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::documentGet, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(getOptions)); + } + jsi::Value documentDelete(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::documentDelete) == 4, + "Expected documentDelete(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::documentDelete, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path)); + } + jsi::Value documentSet(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::Object data, jsi::Object options) override { + static_assert( + bridging::getParameterCount(&T::documentSet) == 6, + "Expected documentSet(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::documentSet, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(data), std::move(options)); + } + jsi::Value documentUpdate(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::String path, jsi::Object data) override { + static_assert( + bridging::getParameterCount(&T::documentUpdate) == 5, + "Expected documentUpdate(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::documentUpdate, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(path), std::move(data)); + } + jsi::Value documentBatch(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, jsi::Array writes) override { + static_assert( + bridging::getParameterCount(&T::documentBatch) == 4, + "Expected documentBatch(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::documentBatch, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(writes)); + } + + private: + friend class NativeRNFBTurboFirestoreDocumentCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + + + class JSI_EXPORT NativeRNFBTurboFirestoreTransactionCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFirestoreTransactionCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual void transactionBegin(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId) = 0; + virtual jsi::Value transactionGetDocument(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId, jsi::String path) = 0; + virtual void transactionDispose(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId) = 0; + virtual void transactionApplyBuffer(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId, jsi::Array commandBuffer) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFirestoreTransactionCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFirestoreTransaction"; + +protected: + NativeRNFBTurboFirestoreTransactionCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFirestoreTransactionCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFirestoreTransactionCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFirestoreTransactionCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + void transactionBegin(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId) override { + static_assert( + bridging::getParameterCount(&T::transactionBegin) == 4, + "Expected transactionBegin(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::transactionBegin, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(transactionId)); + } + jsi::Value transactionGetDocument(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId, jsi::String path) override { + static_assert( + bridging::getParameterCount(&T::transactionGetDocument) == 5, + "Expected transactionGetDocument(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::transactionGetDocument, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(transactionId), std::move(path)); + } + void transactionDispose(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId) override { + static_assert( + bridging::getParameterCount(&T::transactionDispose) == 4, + "Expected transactionDispose(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::transactionDispose, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(transactionId)); + } + void transactionApplyBuffer(jsi::Runtime &rt, jsi::String appName, jsi::String databaseId, double transactionId, jsi::Array commandBuffer) override { + static_assert( + bridging::getParameterCount(&T::transactionApplyBuffer) == 5, + "Expected transactionApplyBuffer(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::transactionApplyBuffer, jsInvoker_, instance_, std::move(appName), std::move(databaseId), std::move(transactionId), std::move(commandBuffer)); + } + + private: + friend class NativeRNFBTurboFirestoreTransactionCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/firestore/ios/generated/ReactAppDependencyProvider.podspec b/packages/firestore/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/firestore/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/firestore/lib/FirestoreModule.ts b/packages/firestore/lib/FirestoreModule.ts index b70d388b48..d08f09e371 100644 --- a/packages/firestore/lib/FirestoreModule.ts +++ b/packages/firestore/lib/FirestoreModule.ts @@ -45,10 +45,10 @@ import fallBackModule from './web/RNFBFirestoreModule'; const namespace = 'firestore'; export const nativeModuleNames = [ - 'RNFBFirestoreModule', - 'RNFBFirestoreCollectionModule', - 'RNFBFirestoreDocumentModule', - 'RNFBFirestoreTransactionModule', + 'NativeRNFBTurboFirestore', + 'NativeRNFBTurboFirestoreCollection', + 'NativeRNFBTurboFirestoreDocument', + 'NativeRNFBTurboFirestoreTransaction', ] as const; const nativeEvents = [ @@ -64,6 +64,7 @@ export const config: ModuleConfig = { nativeEvents: [...nativeEvents], hasMultiAppSupport: true, hasCustomUrlOrRegionSupport: true, + turboModule: true, }; type FirestoreModuleSettingsState = { @@ -74,7 +75,7 @@ type FirestoreModuleSettingsState = { /** Sync event payload from emitter when fanning out collection/document/snapshots-in-sync events. */ type FirestoreSyncEventWithListenerId = { listenerId: string | number }; -export class FirebaseFirestoreModule extends FirebaseModule<'RNFBFirestoreModule'> { +export class FirebaseFirestoreModule extends FirebaseModule<'NativeRNFBTurboFirestore'> { type = 'firestore' as const; _referencePath: FirestorePath; _transactionHandler: FirestoreTransactionHandler; diff --git a/packages/firestore/lib/FirestoreStatics.ts b/packages/firestore/lib/FirestoreStatics.ts index 47756ebdbd..b5dae39520 100644 --- a/packages/firestore/lib/FirestoreStatics.ts +++ b/packages/firestore/lib/FirestoreStatics.ts @@ -15,7 +15,7 @@ * */ -import { getReactNativeModule } from '@react-native-firebase/app/dist/module/internal/nativeModule'; +import { getStaticFirestoreMainModule } from './internal/staticNativeModule'; import { Blob } from './FirestoreBlob'; import { FieldPath } from './FieldPath'; import { FieldValue } from './FieldValue'; @@ -24,7 +24,6 @@ import { GeoPoint } from './FirestoreGeoPoint'; import { Timestamp } from './FirestoreTimestamp'; import { VectorValue } from './FirestoreVectorValue'; import type { LogLevel } from './types/firestore'; -import type { RNFBFirestoreModule } from './types/internal'; type FirestoreLogLevel = LogLevel; @@ -49,8 +48,8 @@ const FirestoreStatics = { ); } - const native = getReactNativeModule('RNFBFirestoreModule') as unknown as RNFBFirestoreModule; - native.setLogLevel(logLevel); + // NewArch-AD-18 E8: static setLogLevel — no FirebaseModule instance; turbo main host. + getStaticFirestoreMainModule().setLogLevel(logLevel); }, }; diff --git a/packages/firestore/lib/internal/staticNativeModule.ts b/packages/firestore/lib/internal/staticNativeModule.ts new file mode 100644 index 0000000000..363c70081a --- /dev/null +++ b/packages/firestore/lib/internal/staticNativeModule.ts @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { getReactNativeModule } from '@react-native-firebase/app/dist/module/internal/nativeModule'; +import type { LogLevel } from '../types/firestore'; + +const FIRESTORE_MAIN_NATIVE_MODULE = 'NativeRNFBTurboFirestore'; + +type StaticFirestoreMainModule = { + setLogLevel(level: LogLevel): void; +}; + +let memoizedMainModule: StaticFirestoreMainModule | null = null; + +/** Memoized main Firestore turbo host for static helpers (NewArch-AD-18 E8). */ +export function getStaticFirestoreMainModule(): StaticFirestoreMainModule { + if (memoizedMainModule) { + return memoizedMainModule; + } + + const native = getReactNativeModule( + FIRESTORE_MAIN_NATIVE_MODULE, + ) as StaticFirestoreMainModule | null; + + if (!native?.setLogLevel) { + throw new Error(`Native module ${FIRESTORE_MAIN_NATIVE_MODULE} is not registered.`); + } + + memoizedMainModule = { + setLogLevel: native.setLogLevel.bind(native), + }; + + return memoizedMainModule; +} diff --git a/packages/firestore/lib/modular.ts b/packages/firestore/lib/modular.ts index 63add9385a..b234713c56 100644 --- a/packages/firestore/lib/modular.ts +++ b/packages/firestore/lib/modular.ts @@ -329,6 +329,12 @@ export function clearPersistence(firestore: Firestore): Promise { return (firestore as FirestoreInternal).clearPersistence(); } +/** + * Clears IndexedDB persistence for the given Firestore instance. + * + * @remarks Alias for {@link clearPersistence} on React Native Firebase. IndexedDB APIs are + * **web only** — this helper calls the native persistence clear path on iOS/Android. + */ export function clearIndexedDbPersistence(firestore: Firestore): Promise { return (firestore as FirestoreInternal).clearPersistence(); } @@ -341,6 +347,13 @@ export function waitForPendingWrites(firestore: Firestore): Promise { return (firestore as FirestoreInternal).waitForPendingWrites(); } +/** + * Creates a Firestore instance with the given settings. + * + * @remarks **Async on React Native Firebase** — settings are applied through the native bridge. + * Web-only `settings.localCache` values (`memoryLocalCache`, `persistentLocalCache`, IndexedDB + * factories) are **not supported**; persistence is controlled by the native Firestore SDK. + */ export async function initializeFirestore( app: FirebaseApp, settings: FirestoreSettings, diff --git a/packages/firestore/lib/types/internal.ts b/packages/firestore/lib/types/internal.ts index 5bb75c0365..edbbccbafc 100644 --- a/packages/firestore/lib/types/internal.ts +++ b/packages/firestore/lib/types/internal.ts @@ -422,14 +422,14 @@ export interface FirestoreEmitterInternal { * * Note: React Native Firebase internally wraps native methods and auto-prepends app name and * database ID when `hasMultiAppSupport` and `hasCustomUrlOrRegionSupport` are enabled. - * Firestore uses multiple native modules (RNFBFirestoreModule, RNFBFirestoreCollectionModule, - * RNFBFirestoreDocumentModule, RNFBFirestoreTransactionModule) which are merged into a single + * Firestore uses multiple native modules (NativeRNFBTurboFirestore, NativeRNFBTurboFirestoreCollection, + * NativeRNFBTurboFirestoreDocument, NativeRNFBTurboFirestoreTransaction) which are merged into a single * wrapped object. This interface represents that merged *wrapped* module shape exposed as * `this.native` within FirebaseFirestoreModule. */ export interface RNFBFirestoreModule { setLogLevel(level: LogLevel): Promise; - // --- Main Firestore module (RNFBFirestoreModule) --- + // --- Main Firestore module (NativeRNFBTurboFirestore) --- loadBundle(bundle: string): Promise; clearPersistence(): Promise; waitForPendingWrites(): Promise; @@ -450,7 +450,7 @@ export interface RNFBFirestoreModule { */ persistenceCacheIndexManager(mode: number): Promise; - // --- Collection module (RNFBFirestoreCollectionModule) --- + // --- Collection module (NativeRNFBTurboFirestoreCollection) --- collectionOffSnapshot(listenerId: number): void; namedQueryOnSnapshot( queryName: string, @@ -506,7 +506,7 @@ export interface RNFBFirestoreModule { options?: FirestorePipelineExecuteOptionsInternal, ): Promise; - // --- Document module (RNFBFirestoreDocumentModule) --- + // --- Document module (NativeRNFBTurboFirestoreDocument) --- documentDelete(path: string): Promise; documentOffSnapshot(listenerId: number): void; documentOnSnapshot( @@ -523,7 +523,7 @@ export interface RNFBFirestoreModule { documentUpdate(path: string, data: Record): Promise; documentBatch(writes: Array>): Promise; - // --- Transaction module (RNFBFirestoreTransactionModule) --- + // --- Transaction module (NativeRNFBTurboFirestoreTransaction) --- transactionBegin(transactionId: number): Promise; transactionDispose(transactionId: number): void; transactionGetDocument(transactionId: number, path: string): Promise; @@ -532,7 +532,10 @@ export interface RNFBFirestoreModule { declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBFirestoreModule: RNFBFirestoreModule; + NativeRNFBTurboFirestore: RNFBFirestoreModule; + NativeRNFBTurboFirestoreCollection: RNFBFirestoreModule; + NativeRNFBTurboFirestoreDocument: RNFBFirestoreModule; + NativeRNFBTurboFirestoreTransaction: RNFBFirestoreModule; } } diff --git a/packages/firestore/package.json b/packages/firestore/package.json index 72ab42c8e9..ec57a4578d 100644 --- a/packages/firestore/package.json +++ b/packages/firestore/package.json @@ -5,11 +5,31 @@ "description": "React Native Firebase - Cloud Firestore is a NoSQL cloud database to store and sync data between your React Native application and Firebase's database. The API matches the Firebase Web SDK whilst taking advantage of the native SDKs performance and offline capabilities.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBFirestoreTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.firestore" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboFirestore": "RNFBFirestoreModule", + "NativeRNFBTurboFirestoreCollection": "RNFBFirestoreCollectionModule", + "NativeRNFBTurboFirestoreDocument": "RNFBFirestoreDocumentModule", + "NativeRNFBTurboFirestoreTransaction": "RNFBFirestoreTransactionModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "compile": "bob build", - "prepare": "yarn run build && yarn compile" + "prepare": "yarn run build && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/reactnative/java/io/invertase/firebase/firestore/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/firestore/react-native.config.js b/packages/firestore/react-native.config.js new file mode 100644 index 0000000000..a0045be577 --- /dev/null +++ b/packages/firestore/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/reactnative/java/io/invertase/firebase/firestore/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/firestore/specs/NativeRNFBTurboFirestore.ts b/packages/firestore/specs/NativeRNFBTurboFirestore.ts new file mode 100644 index 0000000000..474eeb1f06 --- /dev/null +++ b/packages/firestore/specs/NativeRNFBTurboFirestore.ts @@ -0,0 +1,36 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export type FirestoreLoadBundleTaskProgress = { + bytesLoaded: number; + documentsLoaded: number; + totalBytes: number; + totalDocuments: number; + taskState: 'Running' | 'Success' | 'Error'; +}; + +export interface Spec extends TurboModule { + setLogLevel(logLevel: string): void; + loadBundle( + appName: string, + databaseId: string, + bundle: string, + ): Promise; + clearPersistence(appName: string, databaseId: string): Promise; + waitForPendingWrites(appName: string, databaseId: string): Promise; + disableNetwork(appName: string, databaseId: string): Promise; + enableNetwork(appName: string, databaseId: string): Promise; + useEmulator(appName: string, databaseId: string, host: string, port: number): void; + settings(appName: string, databaseId: string, settings: Object): Promise; + terminate(appName: string, databaseId: string): Promise; + persistenceCacheIndexManager( + appName: string, + databaseId: string, + requestType: number, + ): Promise; + addSnapshotsInSync(appName: string, databaseId: string, listenerId: number): void; + removeSnapshotsInSync(appName: string, databaseId: string, listenerId: number): void; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboFirestore'); diff --git a/packages/firestore/specs/NativeRNFBTurboFirestoreCollection.ts b/packages/firestore/specs/NativeRNFBTurboFirestoreCollection.ts new file mode 100644 index 0000000000..7c459fd7ab --- /dev/null +++ b/packages/firestore/specs/NativeRNFBTurboFirestoreCollection.ts @@ -0,0 +1,80 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export type FirestoreCollectionCountResult = { + count?: number; +}; + +export interface Spec extends TurboModule { + namedQueryOnSnapshot( + appName: string, + databaseId: string, + queryName: string, + type: string, + filters: ReadonlyArray, + orders: ReadonlyArray, + options: Object, + listenerId: number, + snapshotListenOptions: Object, + ): void; + collectionOnSnapshot( + appName: string, + databaseId: string, + path: string, + type: string, + filters: ReadonlyArray, + orders: ReadonlyArray, + options: Object, + listenerId: number, + snapshotListenOptions: Object, + ): void; + collectionOffSnapshot(appName: string, databaseId: string, listenerId: number): void; + namedQueryGet( + appName: string, + databaseId: string, + queryName: string, + type: string, + filters: ReadonlyArray, + orders: ReadonlyArray, + options: Object, + getOptions?: Object, + ): Promise; + collectionGet( + appName: string, + databaseId: string, + path: string, + type: string, + filters: ReadonlyArray, + orders: ReadonlyArray, + options: Object, + getOptions?: Object, + ): Promise; + collectionCount( + appName: string, + databaseId: string, + path: string, + type: string, + filters: ReadonlyArray, + orders: ReadonlyArray, + options: Object, + ): Promise; + aggregateQuery( + appName: string, + databaseId: string, + path: string, + type: string, + filters: ReadonlyArray, + orders: ReadonlyArray, + options: Object, + aggregateQueries: ReadonlyArray, + ): Promise; + pipelineExecute( + appName: string, + databaseId: string, + pipeline: Object, + options?: Object, + ): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboFirestoreCollection'); diff --git a/packages/firestore/specs/NativeRNFBTurboFirestoreDocument.ts b/packages/firestore/specs/NativeRNFBTurboFirestoreDocument.ts new file mode 100644 index 0000000000..79b27999fa --- /dev/null +++ b/packages/firestore/specs/NativeRNFBTurboFirestoreDocument.ts @@ -0,0 +1,37 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export type FirestoreSnapshotListenOptions = { + includeMetadataChanges?: boolean; + source?: string; +}; + +export interface Spec extends TurboModule { + documentOnSnapshot( + appName: string, + databaseId: string, + path: string, + listenerId: number, + snapshotListenOptions: FirestoreSnapshotListenOptions, + ): void; + documentOffSnapshot(appName: string, databaseId: string, listenerId: number): void; + documentGet( + appName: string, + databaseId: string, + path: string, + getOptions?: { source?: string }, + ): Promise; + documentDelete(appName: string, databaseId: string, path: string): Promise; + documentSet( + appName: string, + databaseId: string, + path: string, + data: Object, + options: Object, + ): Promise; + documentUpdate(appName: string, databaseId: string, path: string, data: Object): Promise; + documentBatch(appName: string, databaseId: string, writes: Object[]): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboFirestoreDocument'); diff --git a/packages/firestore/specs/NativeRNFBTurboFirestoreTransaction.ts b/packages/firestore/specs/NativeRNFBTurboFirestoreTransaction.ts new file mode 100644 index 0000000000..32367c6bfe --- /dev/null +++ b/packages/firestore/specs/NativeRNFBTurboFirestoreTransaction.ts @@ -0,0 +1,22 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + transactionBegin(appName: string, databaseId: string, transactionId: number): void; + transactionGetDocument( + appName: string, + databaseId: string, + transactionId: number, + path: string, + ): Promise; + transactionDispose(appName: string, databaseId: string, transactionId: number): void; + transactionApplyBuffer( + appName: string, + databaseId: string, + transactionId: number, + commandBuffer: Object[], + ): void; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboFirestoreTransaction'); diff --git a/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/CMakeLists.txt b/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/CMakeLists.txt index b01d2c6044..b41928d17c 100644 --- a/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/CMakeLists.txt +++ b/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/CMakeLists.txt @@ -6,18 +6,18 @@ cmake_minimum_required(VERSION 3.13) set(CMAKE_VERBOSE_MAKEFILE on) -file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/NativeRNFBTurboFunctions/*.cpp) +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBFunctionsTurboModules/*.cpp) add_library( - react_codegen_NativeRNFBTurboFunctions + react_codegen_RNFBFunctionsTurboModules OBJECT ${react_codegen_SRCS} ) -target_include_directories(react_codegen_NativeRNFBTurboFunctions PUBLIC . react/renderer/components/NativeRNFBTurboFunctions) +target_include_directories(react_codegen_RNFBFunctionsTurboModules PUBLIC . react/renderer/components/RNFBFunctionsTurboModules) target_link_libraries( - react_codegen_NativeRNFBTurboFunctions + react_codegen_RNFBFunctionsTurboModules fbjni jsi # We need to link different libraries based on whether we are building rncore or not, that's necessary @@ -26,7 +26,7 @@ target_link_libraries( ) target_compile_options( - react_codegen_NativeRNFBTurboFunctions + react_codegen_RNFBFunctionsTurboModules PRIVATE -DLOG_TAG=\"ReactNative\" -fexceptions diff --git a/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/NativeRNFBTurboFunctions-generated.cpp b/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/RNFBFunctionsTurboModules-generated.cpp similarity index 95% rename from packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/NativeRNFBTurboFunctions-generated.cpp rename to packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/RNFBFunctionsTurboModules-generated.cpp index 63263ee488..ef3e3fa42a 100644 --- a/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/NativeRNFBTurboFunctions-generated.cpp +++ b/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/RNFBFunctionsTurboModules-generated.cpp @@ -8,7 +8,7 @@ * @generated by codegen project: GenerateModuleJniCpp.js */ -#include "NativeRNFBTurboFunctions.h" +#include "RNFBFunctionsTurboModules.h" namespace facebook::react { @@ -46,7 +46,7 @@ NativeRNFBTurboFunctionsSpecJSI::NativeRNFBTurboFunctionsSpecJSI(const JavaTurbo methodMap_["removeFunctionsStreaming"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboFunctionsSpecJSI_removeFunctionsStreaming}; } -std::shared_ptr NativeRNFBTurboFunctions_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { +std::shared_ptr RNFBFunctionsTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { if (moduleName == "NativeRNFBTurboFunctions") { return std::make_shared(params); } diff --git a/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/NativeRNFBTurboFunctions.h b/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/RNFBFunctionsTurboModules.h similarity index 83% rename from packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/NativeRNFBTurboFunctions.h rename to packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/RNFBFunctionsTurboModules.h index 470e1dda05..cd7324cf30 100644 --- a/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/NativeRNFBTurboFunctions.h +++ b/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/RNFBFunctionsTurboModules.h @@ -26,6 +26,6 @@ class JSI_EXPORT NativeRNFBTurboFunctionsSpecJSI : public JavaTurboModule { JSI_EXPORT -std::shared_ptr NativeRNFBTurboFunctions_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); +std::shared_ptr RNFBFunctionsTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); } // namespace facebook::react diff --git a/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/NativeRNFBTurboFunctions/NativeRNFBTurboFunctionsJSI-generated.cpp b/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/RNFBFunctionsTurboModules/RNFBFunctionsTurboModulesJSI-generated.cpp similarity index 99% rename from packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/NativeRNFBTurboFunctions/NativeRNFBTurboFunctionsJSI-generated.cpp rename to packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/RNFBFunctionsTurboModules/RNFBFunctionsTurboModulesJSI-generated.cpp index 31cddefdf8..a7892576fb 100644 --- a/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/NativeRNFBTurboFunctions/NativeRNFBTurboFunctionsJSI-generated.cpp +++ b/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/RNFBFunctionsTurboModules/RNFBFunctionsTurboModulesJSI-generated.cpp @@ -7,7 +7,7 @@ * @generated by codegen project: GenerateModuleCpp.js */ -#include "NativeRNFBTurboFunctionsJSI.h" +#include "RNFBFunctionsTurboModulesJSI.h" namespace facebook::react { diff --git a/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/NativeRNFBTurboFunctions/NativeRNFBTurboFunctionsJSI.h b/packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/RNFBFunctionsTurboModules/RNFBFunctionsTurboModulesJSI.h similarity index 100% rename from packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/NativeRNFBTurboFunctions/NativeRNFBTurboFunctionsJSI.h rename to packages/functions/android/src/main/java/io/invertase/firebase/functions/generated/jni/react/renderer/components/RNFBFunctionsTurboModules/RNFBFunctionsTurboModulesJSI.h diff --git a/packages/functions/ios/RNFBFunctions/RNFBFunctionsModule.h b/packages/functions/ios/RNFBFunctions/RNFBFunctionsModule.h index 106fde03d8..dbbbb172e8 100644 --- a/packages/functions/ios/RNFBFunctions/RNFBFunctionsModule.h +++ b/packages/functions/ios/RNFBFunctions/RNFBFunctionsModule.h @@ -17,7 +17,7 @@ #import #import -#import "NativeRNFBTurboFunctions.h" +#import "RNFBFunctionsTurboModules.h" @interface RNFBFunctionsModule : NSObject diff --git a/packages/functions/ios/RNFBFunctions/RNFBFunctionsModule.mm b/packages/functions/ios/RNFBFunctions/RNFBFunctionsModule.mm index 3fe5fbd1ab..81fb245039 100644 --- a/packages/functions/ios/RNFBFunctions/RNFBFunctionsModule.mm +++ b/packages/functions/ios/RNFBFunctions/RNFBFunctionsModule.mm @@ -18,11 +18,11 @@ #import #import -#import "NativeRNFBTurboFunctions.h" #import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBApp/RNFBRCTEventEmitter.h" #import "RNFBApp/RNFBSharedUtils.h" #import "RNFBFunctionsModule.h" +#import "RNFBFunctionsTurboModules.h" #if __has_include() // This import will work in situations where `use_frameworks!` is in use diff --git a/packages/functions/ios/generated/RCTAppDependencyProvider.mm b/packages/functions/ios/generated/RCTAppDependencyProvider.mm index b76c468c8a..61594479cc 100644 --- a/packages/functions/ios/generated/RCTAppDependencyProvider.mm +++ b/packages/functions/ios/generated/RCTAppDependencyProvider.mm @@ -8,33 +8,48 @@ #import "RCTAppDependencyProvider.h" #import #import -#import -#import -@implementation RCTAppDependencyProvider +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} - (nonnull NSArray *)URLRequestHandlerClassNames { - return RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; } - (nonnull NSArray *)imageDataDecoderClassNames { - return RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; } - (nonnull NSArray *)imageURLLoaderClassNames { - return RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; -} + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); -- (nonnull NSArray *)unstableModulesRequiringMainQueueSetup { - return RCTUnstableModulesRequiringMainQueueSetupProvider.modules; + return _imageURLLoaderClassNames; } - (nonnull NSDictionary> *)thirdPartyFabricComponents { - return RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; -} + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); -- (nonnull NSDictionary> *)moduleProviders { - return RCTModuleProviders.moduleProviders; + return _thirdPartyFabricComponents; } @end diff --git a/packages/functions/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/functions/ios/generated/RCTModulesConformingToProtocolsProvider.mm index a5ff82810e..c640d4fdcb 100644 --- a/packages/functions/ios/generated/RCTModulesConformingToProtocolsProvider.mm +++ b/packages/functions/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -11,44 +11,23 @@ @implementation RCTModulesConformingToProtocolsProvider +(NSArray *)imageURLLoaderClassNames { - static NSArray *classNames = nil; - static dispatch_once_t onceToken; - - dispatch_once(&onceToken, ^{ - classNames = @[ - - ]; - }); - - return classNames; + return @[ + + ]; } +(NSArray *)imageDataDecoderClassNames { - static NSArray *classNames = nil; - static dispatch_once_t onceToken; - - dispatch_once(&onceToken, ^{ - classNames = @[ - - ]; - }); - - return classNames; + return @[ + + ]; } +(NSArray *)URLRequestHandlerClassNames { - static NSArray *classNames = nil; - static dispatch_once_t onceToken; - - dispatch_once(&onceToken, ^{ - classNames = @[ - - ]; - }); - - return classNames; + return @[ + + ]; } @end diff --git a/packages/functions/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/functions/ios/generated/RCTThirdPartyComponentsProvider.mm index 4e05532c39..11d230a38e 100644 --- a/packages/functions/ios/generated/RCTThirdPartyComponentsProvider.mm +++ b/packages/functions/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -15,16 +15,9 @@ @implementation RCTThirdPartyComponentsProvider + (NSDictionary> *)thirdPartyFabricComponents { - static NSDictionary> *thirdPartyComponents = nil; - static dispatch_once_t nativeComponentsToken; + return @{ - dispatch_once(&nativeComponentsToken, ^{ - thirdPartyComponents = @{ - - }; - }); - - return thirdPartyComponents; + }; } @end diff --git a/packages/functions/ios/generated/NativeRNFBTurboFunctions/NativeRNFBTurboFunctions-generated.mm b/packages/functions/ios/generated/RNFBFunctionsTurboModules/RNFBFunctionsTurboModules-generated.mm similarity index 94% rename from packages/functions/ios/generated/NativeRNFBTurboFunctions/NativeRNFBTurboFunctions-generated.mm rename to packages/functions/ios/generated/RNFBFunctionsTurboModules/RNFBFunctionsTurboModules-generated.mm index 0c11c2b9ed..014ecd01ea 100644 --- a/packages/functions/ios/generated/NativeRNFBTurboFunctions/NativeRNFBTurboFunctions-generated.mm +++ b/packages/functions/ios/generated/RNFBFunctionsTurboModules/RNFBFunctionsTurboModules-generated.mm @@ -11,7 +11,7 @@ * must have a single output. More files => more genrule()s => slower builds. */ -#import "NativeRNFBTurboFunctions.h" +#import "RNFBFunctionsTurboModules.h" @implementation NativeRNFBTurboFunctionsSpecBase @@ -53,6 +53,12 @@ + (RCTManagedPointer *)JS_NativeRNFBTurboFunctions_SpecHttpsCallableStreamData:( return facebook::react::managedPointer(json); } @end +@implementation RCTCxxConvert (NativeRNFBTurboFunctions_SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboFunctions_SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions:(id)json +{ + return facebook::react::managedPointer(json); +} +@end @implementation RCTCxxConvert (NativeRNFBTurboFunctions_SpecHttpsCallableStreamOptions) + (RCTManagedPointer *)JS_NativeRNFBTurboFunctions_SpecHttpsCallableStreamOptions:(id)json { diff --git a/packages/functions/ios/generated/NativeRNFBTurboFunctions/NativeRNFBTurboFunctions.h b/packages/functions/ios/generated/RNFBFunctionsTurboModules/RNFBFunctionsTurboModules.h similarity index 87% rename from packages/functions/ios/generated/NativeRNFBTurboFunctions/NativeRNFBTurboFunctions.h rename to packages/functions/ios/generated/RNFBFunctionsTurboModules/RNFBFunctionsTurboModules.h index bc87bcb371..0c54d334f5 100644 --- a/packages/functions/ios/generated/NativeRNFBTurboFunctions/NativeRNFBTurboFunctions.h +++ b/packages/functions/ios/generated/RNFBFunctionsTurboModules/RNFBFunctionsTurboModules.h @@ -15,9 +15,9 @@ #error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. #endif -// Avoid multiple includes of NativeRNFBTurboFunctions symbols -#ifndef NativeRNFBTurboFunctions_H -#define NativeRNFBTurboFunctions_H +// Avoid multiple includes of RNFBFunctionsTurboModules symbols +#ifndef RNFBFunctionsTurboModules_H +#define RNFBFunctionsTurboModules_H #import #import @@ -109,11 +109,28 @@ namespace JS { @interface RCTCxxConvert (NativeRNFBTurboFunctions_SpecHttpsCallableStreamData) + (RCTManagedPointer *)JS_NativeRNFBTurboFunctions_SpecHttpsCallableStreamData:(id)json; @end +namespace JS { + namespace NativeRNFBTurboFunctions { + struct SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions { + id _Nullable signal() const; + std::optional limitedUseAppCheckTokens() const; + + SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboFunctions_SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboFunctions_SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions:(id)json; +@end namespace JS { namespace NativeRNFBTurboFunctions { struct SpecHttpsCallableStreamOptions { std::optional timeout() const; std::optional limitedUseAppCheckTokens() const; + JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions httpsCallableStreamOptions() const; SpecHttpsCallableStreamOptions(NSDictionary *const v) : _v(v) {} private: @@ -268,6 +285,16 @@ inline id JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamData::d id const p = _v[@"data"]; return p; } +inline id _Nullable JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions::signal() const +{ + id const p = _v[@"signal"]; + return p; +} +inline std::optional JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions::limitedUseAppCheckTokens() const +{ + id const p = _v[@"limitedUseAppCheckTokens"]; + return RCTBridgingToOptionalBool(p); +} inline std::optional JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamOptions::timeout() const { id const p = _v[@"timeout"]; @@ -278,6 +305,11 @@ inline std::optional JS::NativeRNFBTurboFunctions::SpecHttpsCallableStream id const p = _v[@"limitedUseAppCheckTokens"]; return RCTBridgingToOptionalBool(p); } +inline JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamOptions::httpsCallableStreamOptions() const +{ + id const p = _v[@"httpsCallableStreamOptions"]; + return JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamOptionsHttpsCallableStreamOptions(p); +} inline id JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamFromUrlData::data() const { id const p = _v[@"data"]; @@ -309,4 +341,4 @@ inline JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamFromUrlOptionsHttpsC return JS::NativeRNFBTurboFunctions::SpecHttpsCallableStreamFromUrlOptionsHttpsCallableStreamOptions(p); } NS_ASSUME_NONNULL_END -#endif // NativeRNFBTurboFunctions_H +#endif // RNFBFunctionsTurboModules_H diff --git a/packages/functions/ios/generated/NativeRNFBTurboFunctionsJSI-generated.cpp b/packages/functions/ios/generated/RNFBFunctionsTurboModulesJSI-generated.cpp similarity index 99% rename from packages/functions/ios/generated/NativeRNFBTurboFunctionsJSI-generated.cpp rename to packages/functions/ios/generated/RNFBFunctionsTurboModulesJSI-generated.cpp index 31cddefdf8..a7892576fb 100644 --- a/packages/functions/ios/generated/NativeRNFBTurboFunctionsJSI-generated.cpp +++ b/packages/functions/ios/generated/RNFBFunctionsTurboModulesJSI-generated.cpp @@ -7,7 +7,7 @@ * @generated by codegen project: GenerateModuleCpp.js */ -#include "NativeRNFBTurboFunctionsJSI.h" +#include "RNFBFunctionsTurboModulesJSI.h" namespace facebook::react { diff --git a/packages/functions/ios/generated/NativeRNFBTurboFunctionsJSI.h b/packages/functions/ios/generated/RNFBFunctionsTurboModulesJSI.h similarity index 100% rename from packages/functions/ios/generated/NativeRNFBTurboFunctionsJSI.h rename to packages/functions/ios/generated/RNFBFunctionsTurboModulesJSI.h diff --git a/packages/functions/ios/generated/ReactAppDependencyProvider.podspec b/packages/functions/ios/generated/ReactAppDependencyProvider.podspec index 954a2eb6ed..2180f399b8 100644 --- a/packages/functions/ios/generated/ReactAppDependencyProvider.podspec +++ b/packages/functions/ios/generated/ReactAppDependencyProvider.podspec @@ -3,7 +3,7 @@ # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = "0.80.2" +version = "0.78.3" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. diff --git a/packages/functions/package.json b/packages/functions/package.json index 77e798e75a..c4a6b25e8d 100644 --- a/packages/functions/package.json +++ b/packages/functions/package.json @@ -6,7 +6,7 @@ "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", "codegenConfig": { - "name": "NativeRNFBTurboFunctions", + "name": "RNFBFunctionsTurboModules", "type": "modules", "jsSrcsDir": "specs", "includesGeneratedCode": true, @@ -46,7 +46,6 @@ }, "devDependencies": { "@react-native-firebase/private-tests-firebase-functions": "^0.0.1", - "react-native": "^0.80.1", "react-native-builder-bob": "^0.41.0", "typescript": "^6.0.3" }, diff --git a/packages/in-app-messaging/RNFBInAppMessaging.podspec b/packages/in-app-messaging/RNFBInAppMessaging.podspec index aa72f52e42..913a93afa0 100644 --- a/packages/in-app-messaging/RNFBInAppMessaging.podspec +++ b/packages/in-app-messaging/RNFBInAppMessaging.podspec @@ -28,15 +28,16 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.private_header_files = "ios/**/*.h" + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/in-app-messaging/__tests__/nativeModuleContract.test.ts b/packages/in-app-messaging/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..a82cd32f34 --- /dev/null +++ b/packages/in-app-messaging/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'setAutomaticDataCollectionEnabled', + 'setMessagesDisplaySuppressed', + 'triggerEvent', +] as const; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper', function () { + assertTurboContract({ + namespace: 'inAppMessaging', + nativeModuleName: 'NativeRNFBTurboFiam', + nativeEvents: false, + hasMultiAppSupport: false, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + specMethods: SPEC_METHODS, + createMock: () => jest.fn(() => Promise.resolve(null)), + constants: { + isMessagesDisplaySuppressed: false, + isAutomaticDataCollectionEnabled: true, + }, + assertExtra: wrapped => { + expect(wrapped.isMessagesDisplaySuppressed).toBe(false); + expect(wrapped.isAutomaticDataCollectionEnabled).toBe(true); + }, + }); + }); +}); diff --git a/packages/in-app-messaging/android/build.gradle b/packages/in-app-messaging/android/build.gradle index 03f5af014c..e00af98778 100644 --- a/packages/in-app-messaging/android/build.gradle +++ b/packages/in-app-messaging/android/build.gradle @@ -112,6 +112,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -131,3 +132,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/in-app-messaging") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/NativeRNFBTurboFiam.java b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/NativeRNFBTurboFiam.java new file mode 100644 index 0000000000..fe9d9cf80d --- /dev/null +++ b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/NativeRNFBTurboFiam.java @@ -0,0 +1,80 @@ +package io.invertase.firebase.fiam; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import com.facebook.fbreact.specs.NativeRNFBTurboFiamSpec; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import java.util.Map; + +public class NativeRNFBTurboFiam extends NativeRNFBTurboFiamSpec { + private static final String SERVICE_NAME = "Fiam"; + private final UniversalFirebaseFiamModule module; + + public NativeRNFBTurboFiam(ReactApplicationContext reactContext) { + super(reactContext); + module = new UniversalFirebaseFiamModule(reactContext, SERVICE_NAME); + } + + @Override + protected Map getTypedExportedConstants() { + return module.getConstants(); + } + + @Override + public void setAutomaticDataCollectionEnabled(boolean enabled, Promise promise) { + module + .setAutomaticDataCollectionEnabled(enabled) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(task.getResult()); + } else { + promise.reject(task.getException()); + } + }); + } + + @Override + public void setMessagesDisplaySuppressed(boolean enabled, Promise promise) { + module + .setMessagesDisplaySuppressed(enabled) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(task.getResult()); + } else { + promise.reject(task.getException()); + } + }); + } + + @Override + public void triggerEvent(String eventId, Promise promise) { + module + .triggerEvent(eventId) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(task.getResult()); + } else { + promise.reject(task.getException()); + } + }); + } +} diff --git a/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/ReactNativeFirebaseFiamPackage.java b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/ReactNativeFirebaseFiamPackage.java index c5ad55c239..248d5ba33a 100644 --- a/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/ReactNativeFirebaseFiamPackage.java +++ b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/ReactNativeFirebaseFiamPackage.java @@ -32,7 +32,7 @@ public class ReactNativeFirebaseFiamPackage implements ReactPackage { @Override public List createNativeModules(@Nonnull ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseFiamModule(reactContext)); + modules.add(new NativeRNFBTurboFiam(reactContext)); return modules; } diff --git a/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFiamSpec.java b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFiamSpec.java new file mode 100644 index 0000000000..7db1bf6c6d --- /dev/null +++ b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboFiamSpec.java @@ -0,0 +1,79 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboFiamSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboFiam"; + + public NativeRNFBTurboFiamSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + protected abstract Map getTypedExportedConstants(); + + @Override + @DoNotStrip + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "isAutomaticDataCollectionEnabled", + "isMessagesDisplaySuppressed" + )); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } + + @ReactMethod + @DoNotStrip + public abstract void setAutomaticDataCollectionEnabled(boolean enabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setMessagesDisplaySuppressed(boolean enabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void triggerEvent(String eventId, Promise promise); +} diff --git a/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/CMakeLists.txt b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..7218e1aa93 --- /dev/null +++ b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBInAppMessagingTurboModules/*.cpp) + +add_library( + react_codegen_RNFBInAppMessagingTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBInAppMessagingTurboModules PUBLIC . react/renderer/components/RNFBInAppMessagingTurboModules) + +target_link_libraries( + react_codegen_RNFBInAppMessagingTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBInAppMessagingTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/RNFBInAppMessagingTurboModules-generated.cpp b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/RNFBInAppMessagingTurboModules-generated.cpp new file mode 100644 index 0000000000..27956820d3 --- /dev/null +++ b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/RNFBInAppMessagingTurboModules-generated.cpp @@ -0,0 +1,50 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBInAppMessagingTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFiamSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "getConstants", "()Ljava/util/Map;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFiamSpecJSI_setAutomaticDataCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setAutomaticDataCollectionEnabled", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFiamSpecJSI_setMessagesDisplaySuppressed(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setMessagesDisplaySuppressed", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboFiamSpecJSI_triggerEvent(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "triggerEvent", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboFiamSpecJSI::NativeRNFBTurboFiamSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboFiamSpecJSI_getConstants}; + methodMap_["setAutomaticDataCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamSpecJSI_setAutomaticDataCollectionEnabled}; + methodMap_["setMessagesDisplaySuppressed"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamSpecJSI_setMessagesDisplaySuppressed}; + methodMap_["triggerEvent"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamSpecJSI_triggerEvent}; +} + +std::shared_ptr RNFBInAppMessagingTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboFiam") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/RNFBInAppMessagingTurboModules.h b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/RNFBInAppMessagingTurboModules.h new file mode 100644 index 0000000000..bce3c4e93e --- /dev/null +++ b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/RNFBInAppMessagingTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboFiam' + */ +class JSI_EXPORT NativeRNFBTurboFiamSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboFiamSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBInAppMessagingTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/react/renderer/components/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModulesJSI-generated.cpp b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/react/renderer/components/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..aaa1d537f3 --- /dev/null +++ b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/react/renderer/components/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModulesJSI-generated.cpp @@ -0,0 +1,47 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBInAppMessagingTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_setAutomaticDataCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAutomaticDataCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_setMessagesDisplaySuppressed(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setMessagesDisplaySuppressed( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_triggerEvent(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->triggerEvent( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} + +NativeRNFBTurboFiamCxxSpecJSI::NativeRNFBTurboFiamCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFiam", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_getConstants}; + methodMap_["setAutomaticDataCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_setAutomaticDataCollectionEnabled}; + methodMap_["setMessagesDisplaySuppressed"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_setMessagesDisplaySuppressed}; + methodMap_["triggerEvent"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_triggerEvent}; +} + + +} // namespace facebook::react diff --git a/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/react/renderer/components/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModulesJSI.h b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/react/renderer/components/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModulesJSI.h new file mode 100644 index 0000000000..2e35299e2b --- /dev/null +++ b/packages/in-app-messaging/android/src/reactnative/java/io/invertase/firebase/fiam/generated/jni/react/renderer/components/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModulesJSI.h @@ -0,0 +1,98 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboFiamCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFiamCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value setAutomaticDataCollectionEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value setMessagesDisplaySuppressed(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value triggerEvent(jsi::Runtime &rt, jsi::String eventId) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFiamCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFiam"; + +protected: + NativeRNFBTurboFiamCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFiamCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFiamCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFiamCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value setAutomaticDataCollectionEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setAutomaticDataCollectionEnabled) == 2, + "Expected setAutomaticDataCollectionEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setAutomaticDataCollectionEnabled, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value setMessagesDisplaySuppressed(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setMessagesDisplaySuppressed) == 2, + "Expected setMessagesDisplaySuppressed(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setMessagesDisplaySuppressed, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value triggerEvent(jsi::Runtime &rt, jsi::String eventId) override { + static_assert( + bridging::getParameterCount(&T::triggerEvent) == 2, + "Expected triggerEvent(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::triggerEvent, jsInvoker_, instance_, std::move(eventId)); + } + + private: + friend class NativeRNFBTurboFiamCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/in-app-messaging/ios/RNFBFiam.xcodeproj/project.pbxproj b/packages/in-app-messaging/ios/RNFBFiam.xcodeproj/project.pbxproj index 63d1dca8be..1e0fe2d218 100644 --- a/packages/in-app-messaging/ios/RNFBFiam.xcodeproj/project.pbxproj +++ b/packages/in-app-messaging/ios/RNFBFiam.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBFiamModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBFiamModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBFiamModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBFiamModule.mm */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -25,7 +25,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBFiam.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBFiam.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBFiamModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBFiamModule.h; path = RNFBFiam/RNFBFiamModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBFiamModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBFiamModule.m; path = RNFBFiam/RNFBFiamModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBFiamModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBFiamModule.mm; path = RNFBFiam/RNFBFiamModule.mm; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,7 +53,7 @@ 2744B9A121F48736004F8E3F /* converters */, 2744B98C21F45C64004F8E3F /* common */, 2744B98421F45429004F8E3F /* RNFBFiamModule.h */, - 2744B98521F45429004F8E3F /* RNFBFiamModule.m */, + 2744B98521F45429004F8E3F /* RNFBFiamModule.mm */, ); path = RNFBFiam; sourceTree = ""; @@ -124,7 +124,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBFiamModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBFiamModule.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.h b/packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.h index da7912b4aa..0abd306bce 100644 --- a/packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.h +++ b/packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.h @@ -16,9 +16,8 @@ */ #import +#import "RNFBInAppMessagingTurboModules.h" -#import - -@interface RNFBFiamModule : NSObject +@interface RNFBFiamModule : NSObject @end diff --git a/packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.m b/packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.mm similarity index 56% rename from packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.m rename to packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.mm index 2b860c389e..eb96b5ac7c 100644 --- a/packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.m +++ b/packages/in-app-messaging/ios/RNFBFiam/RNFBFiamModule.mm @@ -19,16 +19,17 @@ #import #import -#import "RNFBApp/RNFBSharedUtils.h" #import "RNFBFiamModule.h" @implementation RNFBFiamModule -#pragma mark - -#pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboFiam) -- (NSDictionary *)constantsToExport { ++ (BOOL)requiresMainQueueSetup { + return NO; +} + +- (NSDictionary *)fiamConstantsDictionary { NSMutableDictionary *constants = [NSMutableDictionary new]; constants[@"isMessagesDisplaySuppressed"] = @([RCTConvert BOOL:@([FIRInAppMessaging inAppMessaging].messageDisplaySuppressed)]); @@ -37,33 +38,36 @@ - (NSDictionary *)constantsToExport { return constants; } -+ (BOOL)requiresMainQueueSetup { - return NO; +- (facebook::react::ModuleConstants)constantsToExport { + return [_RCTTypedModuleConstants newWithUnsafeDictionary:[self fiamConstantsDictionary]]; +} + +- (facebook::react::ModuleConstants)getConstants { + return [self constantsToExport]; } -#pragma mark - -#pragma mark Firebase Fiam Methods +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} -RCT_EXPORT_METHOD(setAutomaticDataCollectionEnabled - : (BOOL)enabled resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setAutomaticDataCollectionEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [FIRInAppMessaging inAppMessaging].automaticDataCollectionEnabled = (BOOL)enabled; resolve([NSNull null]); } -RCT_EXPORT_METHOD(setMessagesDisplaySuppressed - : (BOOL)enabled resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setMessagesDisplaySuppressed:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [FIRInAppMessaging inAppMessaging].messageDisplaySuppressed = (BOOL)enabled; resolve([NSNull null]); } -RCT_EXPORT_METHOD(triggerEvent - : (NSString *)eventId resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)triggerEvent:(NSString *)eventId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [[FIRInAppMessaging inAppMessaging] triggerEvent:eventId]; resolve([NSNull null]); } diff --git a/packages/in-app-messaging/ios/generated/RCTAppDependencyProvider.h b/packages/in-app-messaging/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/in-app-messaging/ios/generated/RCTAppDependencyProvider.mm b/packages/in-app-messaging/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/in-app-messaging/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/in-app-messaging/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/in-app-messaging/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/in-app-messaging/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/in-app-messaging/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/in-app-messaging/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/in-app-messaging/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/in-app-messaging/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModules-generated.mm b/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModules-generated.mm new file mode 100644 index 0000000000..5dd5f027f5 --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModules-generated.mm @@ -0,0 +1,60 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBInAppMessagingTurboModules.h" + + +@implementation NativeRNFBTurboFiamSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFiamSpecJSI_setAutomaticDataCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setAutomaticDataCollectionEnabled", @selector(setAutomaticDataCollectionEnabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFiamSpecJSI_setMessagesDisplaySuppressed(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setMessagesDisplaySuppressed", @selector(setMessagesDisplaySuppressed:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFiamSpecJSI_triggerEvent(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "triggerEvent", @selector(triggerEvent:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboFiamSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + NativeRNFBTurboFiamSpecJSI::NativeRNFBTurboFiamSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["setAutomaticDataCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamSpecJSI_setAutomaticDataCollectionEnabled}; + + + methodMap_["setMessagesDisplaySuppressed"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamSpecJSI_setMessagesDisplaySuppressed}; + + + methodMap_["triggerEvent"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamSpecJSI_triggerEvent}; + + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboFiamSpecJSI_getConstants}; + + } +} // namespace facebook::react diff --git a/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModules.h b/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModules.h new file mode 100644 index 0000000000..b1d3ebbbe0 --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModules/RNFBInAppMessagingTurboModules.h @@ -0,0 +1,109 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBInAppMessagingTurboModules symbols +#ifndef RNFBInAppMessagingTurboModules_H +#define RNFBInAppMessagingTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN +namespace JS { + namespace NativeRNFBTurboFiam { + struct Constants { + + struct Builder { + struct Input { + RCTRequired isMessagesDisplaySuppressed; + RCTRequired isAutomaticDataCollectionEnabled; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeRNFBTurboFiamSpec + +- (void)setAutomaticDataCollectionEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setMessagesDisplaySuppressed:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)triggerEvent:(NSString *)eventId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end + +@interface NativeRNFBTurboFiamSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboFiam' + */ + class JSI_EXPORT NativeRNFBTurboFiamSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboFiamSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +inline JS::NativeRNFBTurboFiam::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto isMessagesDisplaySuppressed = i.isMessagesDisplaySuppressed.get(); + d[@"isMessagesDisplaySuppressed"] = @(isMessagesDisplaySuppressed); + auto isAutomaticDataCollectionEnabled = i.isAutomaticDataCollectionEnabled.get(); + d[@"isAutomaticDataCollectionEnabled"] = @(isAutomaticDataCollectionEnabled); + return d; +}) {} +inline JS::NativeRNFBTurboFiam::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +NS_ASSUME_NONNULL_END +#endif // RNFBInAppMessagingTurboModules_H diff --git a/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModulesJSI-generated.cpp b/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..aaa1d537f3 --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModulesJSI-generated.cpp @@ -0,0 +1,47 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBInAppMessagingTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_setAutomaticDataCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAutomaticDataCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_setMessagesDisplaySuppressed(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setMessagesDisplaySuppressed( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_triggerEvent(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->triggerEvent( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} + +NativeRNFBTurboFiamCxxSpecJSI::NativeRNFBTurboFiamCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboFiam", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_getConstants}; + methodMap_["setAutomaticDataCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_setAutomaticDataCollectionEnabled}; + methodMap_["setMessagesDisplaySuppressed"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_setMessagesDisplaySuppressed}; + methodMap_["triggerEvent"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboFiamCxxSpecJSI_triggerEvent}; +} + + +} // namespace facebook::react diff --git a/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModulesJSI.h b/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModulesJSI.h new file mode 100644 index 0000000000..2e35299e2b --- /dev/null +++ b/packages/in-app-messaging/ios/generated/RNFBInAppMessagingTurboModulesJSI.h @@ -0,0 +1,98 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboFiamCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboFiamCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value setAutomaticDataCollectionEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value setMessagesDisplaySuppressed(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value triggerEvent(jsi::Runtime &rt, jsi::String eventId) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboFiamCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboFiam"; + +protected: + NativeRNFBTurboFiamCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboFiamCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboFiamCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboFiamCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value setAutomaticDataCollectionEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setAutomaticDataCollectionEnabled) == 2, + "Expected setAutomaticDataCollectionEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setAutomaticDataCollectionEnabled, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value setMessagesDisplaySuppressed(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setMessagesDisplaySuppressed) == 2, + "Expected setMessagesDisplaySuppressed(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setMessagesDisplaySuppressed, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value triggerEvent(jsi::Runtime &rt, jsi::String eventId) override { + static_assert( + bridging::getParameterCount(&T::triggerEvent) == 2, + "Expected triggerEvent(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::triggerEvent, jsInvoker_, instance_, std::move(eventId)); + } + + private: + friend class NativeRNFBTurboFiamCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/in-app-messaging/ios/generated/ReactAppDependencyProvider.podspec b/packages/in-app-messaging/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/in-app-messaging/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/in-app-messaging/lib/index.ts b/packages/in-app-messaging/lib/index.ts index 067c6a8989..a4d7a6f761 100644 --- a/packages/in-app-messaging/lib/index.ts +++ b/packages/in-app-messaging/lib/index.ts @@ -28,7 +28,7 @@ import type { InAppMessaging } from './types/in-app-messaging'; import fallBackModule from './web/RNFBFiamModule'; import { version } from './version'; -const nativeModuleName = 'RNFBFiamModule'; +const nativeModuleName = 'NativeRNFBTurboFiam'; class FirebaseFiamModule extends FirebaseModule { private _isMessagesDisplaySuppressed: boolean; @@ -84,6 +84,7 @@ const config: ModuleConfig = { nativeEvents: false, hasMultiAppSupport: false, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; /** diff --git a/packages/in-app-messaging/lib/types/internal.ts b/packages/in-app-messaging/lib/types/internal.ts index 48e44ffbdb..940124031b 100644 --- a/packages/in-app-messaging/lib/types/internal.ts +++ b/packages/in-app-messaging/lib/types/internal.ts @@ -30,7 +30,7 @@ export interface RNFBFiamModule { declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBFiamModule: RNFBFiamModule; + NativeRNFBTurboFiam: RNFBFiamModule; } } diff --git a/packages/in-app-messaging/package.json b/packages/in-app-messaging/package.json index 1904922848..52751a6a7c 100644 --- a/packages/in-app-messaging/package.json +++ b/packages/in-app-messaging/package.json @@ -5,11 +5,28 @@ "description": "React Native Firebase - Firebase In-App Messaging helps you engage your app's active users by sending them targeted, contextual messages that encourage them to use key app features. React Native Firebase provides support for both native Android & iOS integration with a simple JavaScript API.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBInAppMessagingTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.fiam" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboFiam": "RNFBFiamModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "compile": "bob build", - "prepare": "yarn run build && yarn compile" + "prepare": "yarn run build && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/reactnative/java/io/invertase/firebase/fiam/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/in-app-messaging/react-native.config.js b/packages/in-app-messaging/react-native.config.js new file mode 100644 index 0000000000..ab43246054 --- /dev/null +++ b/packages/in-app-messaging/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/reactnative/java/io/invertase/firebase/fiam/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/in-app-messaging/specs/NativeRNFBTurboFiam.ts b/packages/in-app-messaging/specs/NativeRNFBTurboFiam.ts new file mode 100644 index 0000000000..581c6e073e --- /dev/null +++ b/packages/in-app-messaging/specs/NativeRNFBTurboFiam.ts @@ -0,0 +1,15 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + getConstants(): { + isMessagesDisplaySuppressed: boolean; + isAutomaticDataCollectionEnabled: boolean; + }; + + setAutomaticDataCollectionEnabled(enabled: boolean): Promise; + setMessagesDisplaySuppressed(enabled: boolean): Promise; + triggerEvent(eventId: string): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboFiam'); diff --git a/packages/installations/RNFBInstallations.podspec b/packages/installations/RNFBInstallations.podspec index c4f480878e..18b46db1a4 100644 --- a/packages/installations/RNFBInstallations.podspec +++ b/packages/installations/RNFBInstallations.podspec @@ -28,15 +28,16 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.private_header_files = "ios/**/*.h" + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/installations/__tests__/nativeModuleContract.test.ts b/packages/installations/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..b052e4264a --- /dev/null +++ b/packages/installations/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,19 @@ +import { describe, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = ['deleteInstallations', 'getId', 'getToken'] as const; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper', function () { + assertTurboContract({ + namespace: 'installations', + nativeModuleName: 'NativeRNFBTurboInstallations', + nativeEvents: false, + hasMultiAppSupport: true, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + specMethods: SPEC_METHODS, + createMock: method => jest.fn(() => Promise.resolve(method)), + }); + }); +}); diff --git a/packages/installations/android/build.gradle b/packages/installations/android/build.gradle index 457b25d51a..895dc5c885 100644 --- a/packages/installations/android/build.gradle +++ b/packages/installations/android/build.gradle @@ -81,6 +81,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -100,3 +101,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/installations") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/installations/android/src/main/java/io/invertase/firebase/installations/NativeRNFBTurboInstallations.java b/packages/installations/android/src/main/java/io/invertase/firebase/installations/NativeRNFBTurboInstallations.java new file mode 100644 index 0000000000..1707ad279c --- /dev/null +++ b/packages/installations/android/src/main/java/io/invertase/firebase/installations/NativeRNFBTurboInstallations.java @@ -0,0 +1,113 @@ +package io.invertase.firebase.installations; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import android.util.Log; +import com.facebook.fbreact.specs.NativeRNFBTurboInstallationsSpec; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.google.android.gms.tasks.Tasks; +import com.google.firebase.FirebaseApp; +import com.google.firebase.installations.FirebaseInstallations; +import io.invertase.firebase.common.TaskExecutorService; +import java.util.concurrent.ExecutorService; + +public class NativeRNFBTurboInstallations extends NativeRNFBTurboInstallationsSpec { + private static final String TAG = "Installations"; + private final TaskExecutorService executorService; + + public NativeRNFBTurboInstallations(ReactApplicationContext reactContext) { + super(reactContext); + this.executorService = new TaskExecutorService("UniversalInstallationsModule"); + } + + private ExecutorService getExecutor() { + return executorService.getExecutor(); + } + + @Override + public void getId(String appName, Promise promise) { + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); + + Tasks.call( + getExecutor(), + () -> Tasks.await(FirebaseInstallations.getInstance(firebaseApp).getId())) + .addOnCompleteListener( + getExecutor(), + task -> { + if (task.isSuccessful()) { + promise.resolve(task.getResult()); + } else { + Log.e( + TAG, + "RNFB: Unknown error while fetching Installations ID " + + task.getException().getMessage()); + promise.reject("id-error", task.getException().getMessage()); + } + }); + } + + @Override + public void getToken(String appName, boolean forceRefresh, Promise promise) { + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); + Tasks.call( + getExecutor(), + () -> + Tasks.await(FirebaseInstallations.getInstance(firebaseApp).getToken(forceRefresh))) + .addOnCompleteListener( + getExecutor(), + task -> { + if (task.isSuccessful()) { + promise.resolve(task.getResult().getToken()); + } else { + Log.e( + TAG, + "RNFB: Unknown error while fetching Installations token " + + task.getException().getMessage()); + promise.reject("token-error", task.getException().getMessage()); + } + }); + } + + @Override + public void deleteInstallations(String appName, Promise promise) { + FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); + Tasks.call( + getExecutor(), + () -> Tasks.await(FirebaseInstallations.getInstance(firebaseApp).delete())) + .addOnCompleteListener( + getExecutor(), + task -> { + if (task.isSuccessful()) { + promise.resolve(null); + } else { + Log.e( + TAG, + "RNFB: Unknown error while deleting Installations" + + task.getException().getMessage()); + promise.reject("delete-error", task.getException().getMessage()); + } + }); + } + + @Override + public void invalidate() { + super.invalidate(); + executorService.shutdown(); + } +} diff --git a/packages/installations/android/src/main/java/io/invertase/firebase/installations/ReactNativeFirebaseInstallationsPackage.java b/packages/installations/android/src/main/java/io/invertase/firebase/installations/ReactNativeFirebaseInstallationsPackage.java index a845533203..21e1321462 100644 --- a/packages/installations/android/src/main/java/io/invertase/firebase/installations/ReactNativeFirebaseInstallationsPackage.java +++ b/packages/installations/android/src/main/java/io/invertase/firebase/installations/ReactNativeFirebaseInstallationsPackage.java @@ -30,7 +30,7 @@ public class ReactNativeFirebaseInstallationsPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseInstallationsModule(reactContext)); + modules.add(new NativeRNFBTurboInstallations(reactContext)); return modules; } diff --git a/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboInstallationsSpec.java b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboInstallationsSpec.java new file mode 100644 index 0000000000..705577476d --- /dev/null +++ b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboInstallationsSpec.java @@ -0,0 +1,46 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboInstallationsSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboInstallations"; + + public NativeRNFBTurboInstallationsSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void deleteInstallations(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getId(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getToken(String appName, boolean forceRefresh, Promise promise); +} diff --git a/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/CMakeLists.txt b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..bcabc17be0 --- /dev/null +++ b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBInstallationsTurboModules/*.cpp) + +add_library( + react_codegen_RNFBInstallationsTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBInstallationsTurboModules PUBLIC . react/renderer/components/RNFBInstallationsTurboModules) + +target_link_libraries( + react_codegen_RNFBInstallationsTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBInstallationsTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/RNFBInstallationsTurboModules-generated.cpp b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/RNFBInstallationsTurboModules-generated.cpp new file mode 100644 index 0000000000..c17e285ea6 --- /dev/null +++ b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/RNFBInstallationsTurboModules-generated.cpp @@ -0,0 +1,44 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBInstallationsTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboInstallationsSpecJSI_deleteInstallations(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "deleteInstallations", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboInstallationsSpecJSI_getId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getId", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboInstallationsSpecJSI_getToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getToken", "(Ljava/lang/String;ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboInstallationsSpecJSI::NativeRNFBTurboInstallationsSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["deleteInstallations"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboInstallationsSpecJSI_deleteInstallations}; + methodMap_["getId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboInstallationsSpecJSI_getId}; + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboInstallationsSpecJSI_getToken}; +} + +std::shared_ptr RNFBInstallationsTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboInstallations") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/RNFBInstallationsTurboModules.h b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/RNFBInstallationsTurboModules.h new file mode 100644 index 0000000000..f486952eec --- /dev/null +++ b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/RNFBInstallationsTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboInstallations' + */ +class JSI_EXPORT NativeRNFBTurboInstallationsSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboInstallationsSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBInstallationsTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/react/renderer/components/RNFBInstallationsTurboModules/RNFBInstallationsTurboModulesJSI-generated.cpp b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/react/renderer/components/RNFBInstallationsTurboModules/RNFBInstallationsTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..13cbc1153e --- /dev/null +++ b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/react/renderer/components/RNFBInstallationsTurboModules/RNFBInstallationsTurboModulesJSI-generated.cpp @@ -0,0 +1,42 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBInstallationsTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_deleteInstallations(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteInstallations( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_getId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getId( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_getToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} + +NativeRNFBTurboInstallationsCxxSpecJSI::NativeRNFBTurboInstallationsCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboInstallations", jsInvoker) { + methodMap_["deleteInstallations"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_deleteInstallations}; + methodMap_["getId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_getId}; + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_getToken}; +} + + +} // namespace facebook::react diff --git a/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/react/renderer/components/RNFBInstallationsTurboModules/RNFBInstallationsTurboModulesJSI.h b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/react/renderer/components/RNFBInstallationsTurboModules/RNFBInstallationsTurboModulesJSI.h new file mode 100644 index 0000000000..fb43d1115d --- /dev/null +++ b/packages/installations/android/src/main/java/io/invertase/firebase/installations/generated/jni/react/renderer/components/RNFBInstallationsTurboModules/RNFBInstallationsTurboModulesJSI.h @@ -0,0 +1,89 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboInstallationsCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboInstallationsCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value deleteInstallations(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value getId(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboInstallationsCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboInstallations"; + +protected: + NativeRNFBTurboInstallationsCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboInstallationsCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboInstallationsCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboInstallationsCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value deleteInstallations(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::deleteInstallations) == 2, + "Expected deleteInstallations(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::deleteInstallations, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value getId(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::getId) == 2, + "Expected getId(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getId, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) override { + static_assert( + bridging::getParameterCount(&T::getToken) == 3, + "Expected getToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getToken, jsInvoker_, instance_, std::move(appName), std::move(forceRefresh)); + } + + private: + friend class NativeRNFBTurboInstallationsCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/installations/ios/RNFBInstallations.xcodeproj/project.pbxproj b/packages/installations/ios/RNFBInstallations.xcodeproj/project.pbxproj index d238d5a79d..1843e46ea3 100644 --- a/packages/installations/ios/RNFBInstallations.xcodeproj/project.pbxproj +++ b/packages/installations/ios/RNFBInstallations.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBInstallationsModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBInstallationsModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBInstallationsModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBInstallationsModule.mm */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -25,7 +25,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBInstallations.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBInstallations.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBInstallationsModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBInstallationsModule.h; path = RNFBInstallations/RNFBInstallationsModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBInstallationsModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBInstallationsModule.m; path = RNFBInstallations/RNFBInstallationsModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBInstallationsModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBInstallationsModule.mm; path = RNFBInstallations/RNFBInstallationsModule.mm; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,7 +53,7 @@ 2744B9A121F48736004F8E3F /* converters */, 2744B98C21F45C64004F8E3F /* common */, 2744B98421F45429004F8E3F /* RNFBInstallationsModule.h */, - 2744B98521F45429004F8E3F /* RNFBInstallationsModule.m */, + 2744B98521F45429004F8E3F /* RNFBInstallationsModule.mm */, ); path = RNFBInstallations; sourceTree = ""; @@ -124,7 +124,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBInstallationsModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBInstallationsModule.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.h b/packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.h index a734bb8f29..c2a7242252 100644 --- a/packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.h +++ b/packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.h @@ -16,9 +16,9 @@ */ #import +#import +#import "RNFBInstallationsTurboModules.h" -#import - -@interface RNFBInstallationsModule : NSObject +@interface RNFBInstallationsModule : NSObject @end diff --git a/packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.m b/packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.mm similarity index 80% rename from packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.m rename to packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.mm index 7b07b36a0b..b013173260 100644 --- a/packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.m +++ b/packages/installations/ios/RNFBInstallations/RNFBInstallationsModule.mm @@ -18,32 +18,35 @@ #import #import +#import "RNFBApp/RCTConvert+FIRApp.h" #import "RNFBApp/RNFBSharedUtils.h" #import "RNFBInstallationsModule.h" #import "FirebaseInstallations/FIRInstallations.h" @implementation RNFBInstallationsModule -#pragma mark - -#pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboInstallations) -- (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); ++ (BOOL)requiresMainQueueSetup { + return NO; } -#pragma mark - -#pragma mark Firebase Installations Methods +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +- (void)invalidate { +} -RCT_EXPORT_METHOD(delete - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)deleteInstallations:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRInstallations *installations = [FIRInstallations installationsWithApp:firebaseApp]; [installations deleteWithCompletion:^(NSError *_Nullable error) { if (error != nil) { - // Handle any errors if the delete failed DLog(@"Unable to delete Installations ID: %@", error); [RNFBSharedUtils rejectPromiseWithUserInfo:reject userInfo:(NSMutableDictionary *)@{ @@ -57,14 +60,13 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(getId - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getId:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRInstallations *installations = [FIRInstallations installationsWithApp:firebaseApp]; [installations installationIDWithCompletion:^(NSString *_Nullable id, NSError *_Nullable error) { if (error != nil) { - // Handle any errors if the id was not retrieved. DLog(@"Unable to retrieve Installations ID: %@", error); [RNFBSharedUtils rejectPromiseWithUserInfo:reject userInfo:(NSMutableDictionary *)@{ @@ -87,17 +89,16 @@ - (dispatch_queue_t)methodQueue { }]; } -RCT_EXPORT_METHOD(getToken - : (FIRApp *)firebaseApp - : (BOOL)forceRefresh - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getToken:(NSString *)appName + forceRefresh:(BOOL)forceRefresh + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRInstallations *installations = [FIRInstallations installationsWithApp:firebaseApp]; [installations authTokenForcingRefresh:forceRefresh completion:^(FIRInstallationsAuthTokenResult *_Nullable token, NSError *_Nullable error) { if (error != nil) { - // Handle any errors if the token was not retrieved. DLog(@"Unable to retrieve Installations auth token: %@", error); [RNFBSharedUtils rejectPromiseWithUserInfo:reject diff --git a/packages/installations/ios/generated/RCTAppDependencyProvider.h b/packages/installations/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/installations/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/installations/ios/generated/RCTAppDependencyProvider.mm b/packages/installations/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/installations/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/installations/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/installations/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/installations/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/installations/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/installations/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/installations/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/installations/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/installations/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/installations/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/installations/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/installations/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/installations/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/installations/ios/generated/RNFBInstallationsTurboModules/RNFBInstallationsTurboModules-generated.mm b/packages/installations/ios/generated/RNFBInstallationsTurboModules/RNFBInstallationsTurboModules-generated.mm new file mode 100644 index 0000000000..0d4115c274 --- /dev/null +++ b/packages/installations/ios/generated/RNFBInstallationsTurboModules/RNFBInstallationsTurboModules-generated.mm @@ -0,0 +1,53 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBInstallationsTurboModules.h" + + +@implementation NativeRNFBTurboInstallationsSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboInstallationsSpecJSI_deleteInstallations(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "deleteInstallations", @selector(deleteInstallations:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboInstallationsSpecJSI_getId(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getId", @selector(getId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboInstallationsSpecJSI_getToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getToken", @selector(getToken:forceRefresh:resolve:reject:), args, count); + } + + NativeRNFBTurboInstallationsSpecJSI::NativeRNFBTurboInstallationsSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["deleteInstallations"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboInstallationsSpecJSI_deleteInstallations}; + + + methodMap_["getId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboInstallationsSpecJSI_getId}; + + + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboInstallationsSpecJSI_getToken}; + + } +} // namespace facebook::react diff --git a/packages/installations/ios/generated/RNFBInstallationsTurboModules/RNFBInstallationsTurboModules.h b/packages/installations/ios/generated/RNFBInstallationsTurboModules/RNFBInstallationsTurboModules.h new file mode 100644 index 0000000000..4df0e4ba22 --- /dev/null +++ b/packages/installations/ios/generated/RNFBInstallationsTurboModules/RNFBInstallationsTurboModules.h @@ -0,0 +1,71 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBInstallationsTurboModules symbols +#ifndef RNFBInstallationsTurboModules_H +#define RNFBInstallationsTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@protocol NativeRNFBTurboInstallationsSpec + +- (void)deleteInstallations:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getId:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getToken:(NSString *)appName + forceRefresh:(BOOL)forceRefresh + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end + +@interface NativeRNFBTurboInstallationsSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboInstallations' + */ + class JSI_EXPORT NativeRNFBTurboInstallationsSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboInstallationsSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +NS_ASSUME_NONNULL_END +#endif // RNFBInstallationsTurboModules_H diff --git a/packages/installations/ios/generated/RNFBInstallationsTurboModulesJSI-generated.cpp b/packages/installations/ios/generated/RNFBInstallationsTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..13cbc1153e --- /dev/null +++ b/packages/installations/ios/generated/RNFBInstallationsTurboModulesJSI-generated.cpp @@ -0,0 +1,42 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBInstallationsTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_deleteInstallations(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteInstallations( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_getId(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getId( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_getToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool() + ); +} + +NativeRNFBTurboInstallationsCxxSpecJSI::NativeRNFBTurboInstallationsCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboInstallations", jsInvoker) { + methodMap_["deleteInstallations"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_deleteInstallations}; + methodMap_["getId"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_getId}; + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboInstallationsCxxSpecJSI_getToken}; +} + + +} // namespace facebook::react diff --git a/packages/installations/ios/generated/RNFBInstallationsTurboModulesJSI.h b/packages/installations/ios/generated/RNFBInstallationsTurboModulesJSI.h new file mode 100644 index 0000000000..fb43d1115d --- /dev/null +++ b/packages/installations/ios/generated/RNFBInstallationsTurboModulesJSI.h @@ -0,0 +1,89 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboInstallationsCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboInstallationsCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value deleteInstallations(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value getId(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboInstallationsCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboInstallations"; + +protected: + NativeRNFBTurboInstallationsCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboInstallationsCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboInstallationsCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboInstallationsCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value deleteInstallations(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::deleteInstallations) == 2, + "Expected deleteInstallations(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::deleteInstallations, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value getId(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::getId) == 2, + "Expected getId(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getId, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, bool forceRefresh) override { + static_assert( + bridging::getParameterCount(&T::getToken) == 3, + "Expected getToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getToken, jsInvoker_, instance_, std::move(appName), std::move(forceRefresh)); + } + + private: + friend class NativeRNFBTurboInstallationsCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/installations/ios/generated/ReactAppDependencyProvider.podspec b/packages/installations/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/installations/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/installations/lib/index.ts b/packages/installations/lib/index.ts index f71489451c..c923877193 100644 --- a/packages/installations/lib/index.ts +++ b/packages/installations/lib/index.ts @@ -31,7 +31,7 @@ import type { import type { InstallationsInternal } from './types/internal'; import { version } from './version'; -const nativeModuleName = 'RNFBInstallationsModule'; +const nativeModuleName = 'NativeRNFBTurboInstallations'; class FirebaseInstallationsModule extends FirebaseModule { getId(): Promise { @@ -47,7 +47,7 @@ class FirebaseInstallationsModule extends FirebaseModule { - return this.native.delete(); + return this.native.deleteInstallations(); } onIdChange(): () => void { @@ -66,6 +66,7 @@ const config: ModuleConfig = { nativeEvents: false, // TODO implement android id change listener: ['installations_id_changed'], hasMultiAppSupport: true, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; /** diff --git a/packages/installations/lib/types/internal.ts b/packages/installations/lib/types/internal.ts index 54979c5681..22a10bbe88 100644 --- a/packages/installations/lib/types/internal.ts +++ b/packages/installations/lib/types/internal.ts @@ -20,12 +20,12 @@ import type { Installations } from './installations'; export interface RNFBInstallationsModule { getId(): Promise; getToken(forceRefresh: boolean): Promise; - delete(): Promise; + deleteInstallations(): Promise; } declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBInstallationsModule: RNFBInstallationsModule; + NativeRNFBTurboInstallations: RNFBInstallationsModule; } } diff --git a/packages/installations/package.json b/packages/installations/package.json index cfd85f2128..85fb57660d 100644 --- a/packages/installations/package.json +++ b/packages/installations/package.json @@ -5,11 +5,28 @@ "description": "React Native Firebase - Installations", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBInstallationsTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.installations" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboInstallations": "RNFBInstallationsModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "compile": "bob build", - "prepare": "yarn run build && yarn compile" + "prepare": "yarn run build && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/main/java/io/invertase/firebase/installations/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/installations/react-native.config.js b/packages/installations/react-native.config.js new file mode 100644 index 0000000000..258c0e8802 --- /dev/null +++ b/packages/installations/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/main/java/io/invertase/firebase/installations/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/installations/specs/NativeRNFBTurboInstallations.ts b/packages/installations/specs/NativeRNFBTurboInstallations.ts new file mode 100644 index 0000000000..e7e6a8bafb --- /dev/null +++ b/packages/installations/specs/NativeRNFBTurboInstallations.ts @@ -0,0 +1,10 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule { + deleteInstallations(appName: string): Promise; + getId(appName: string): Promise; + getToken(appName: string, forceRefresh: boolean): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboInstallations'); diff --git a/packages/messaging/RNFBMessaging.podspec b/packages/messaging/RNFBMessaging.podspec index db9ae77d22..0e08df34f6 100644 --- a/packages/messaging/RNFBMessaging.podspec +++ b/packages/messaging/RNFBMessaging.podspec @@ -10,6 +10,7 @@ if coreVersionDetected != coreVersionRequired end firebase_ios_target = appPackage['sdkVersions']['ios']['iosTarget'] firebase_macos_target = appPackage['sdkVersions']['ios']['macosTarget'] +firebase_tvos_target = appPackage['sdkVersions']['ios']['tvosTarget'] Pod::Spec.new do |s| s.name = "RNFBMessaging" @@ -25,15 +26,16 @@ Pod::Spec.new do |s| s.social_media_url = 'http://twitter.com/invertaseio' s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target - s.source_files = 'ios/**/*.{h,m}' + s.tvos.deployment_target = firebase_tvos_target + s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/messaging/android/build.gradle b/packages/messaging/android/build.gradle index cd1d91f56c..f955afe1a0 100644 --- a/packages/messaging/android/build.gradle +++ b/packages/messaging/android/build.gradle @@ -130,6 +130,12 @@ android { targetCompatibility = JavaVersion.VERSION_11 } } + + sourceSets { + main { + java.excludes = ['**/generated/jni/**'] + } + } } repositories { @@ -147,3 +153,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/messaging") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingModule.java b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/NativeRNFBTurboMessaging.java similarity index 65% rename from packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingModule.java rename to packages/messaging/android/src/main/java/io/invertase/firebase/messaging/NativeRNFBTurboMessaging.java index ca7a860e69..2a7f0eb256 100644 --- a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingModule.java +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/NativeRNFBTurboMessaging.java @@ -21,10 +21,10 @@ import android.content.Intent; import android.util.Log; import androidx.core.app.NotificationManagerCompat; +import com.facebook.fbreact.specs.NativeRNFBTurboMessagingSpec; import com.facebook.react.bridge.ActivityEventListener; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableNativeMap; @@ -34,20 +34,29 @@ import com.google.firebase.messaging.RemoteMessage; import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter; import io.invertase.firebase.common.ReactNativeFirebaseModule; +import io.invertase.firebase.common.TaskExecutorService; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ExecutorService; +import javax.annotation.Nullable; -public class ReactNativeFirebaseMessagingModule extends ReactNativeFirebaseModule +public class NativeRNFBTurboMessaging extends NativeRNFBTurboMessagingSpec implements ActivityEventListener { private static final String TAG = "Messaging"; ReadableMap initialNotification = null; - private HashMap initialNotificationMap = new HashMap<>(); + private final HashMap initialNotificationMap = new HashMap<>(); + private final TaskExecutorService executorService; - ReactNativeFirebaseMessagingModule(ReactApplicationContext reactContext) { - super(reactContext, TAG); + public NativeRNFBTurboMessaging(ReactApplicationContext reactContext) { + super(reactContext); + executorService = new TaskExecutorService("NativeRNFBTurboMessaging"); reactContext.addActivityEventListener(this); } + private ExecutorService getExecutor() { + return executorService.getExecutor(); + } + private WritableMap popRemoteMessageMapFromMessagingStore(String messageId) { ReactNativeFirebaseMessagingStore messagingStore = ReactNativeFirebaseMessagingStoreHelper.getInstance().getMessagingStore(); @@ -56,54 +65,110 @@ private WritableMap popRemoteMessageMapFromMessagingStore(String messageId) { return remoteMessageMap; } - @ReactMethod + @Override + protected Map getTypedExportedConstants() { + final Map constants = new HashMap<>(); + constants.put("isAutoInitEnabled", FirebaseMessaging.getInstance().isAutoInitEnabled()); + constants.put( + "isDeliveryMetricsExportToBigQueryEnabled", + FirebaseMessaging.getInstance().deliveryMetricsExportToBigQueryEnabled()); + constants.put( + "isNotificationDelegationEnabled", + FirebaseMessaging.getInstance().isNotificationDelegationEnabled()); + return constants; + } + + @Override + public void getDidOpenSettingsForNotification(Promise promise) { + promise.resolve(false); + } + + @Override + public void signalBackgroundMessageHandlerSet() { + // iOS-only; no-op on Android + } + + @Override + public void completeNotificationProcessing() { + // iOS-only; no-op on Android + } + + @Override + public void getAPNSToken(Promise promise) { + promise.resolve(null); + } + + @Override + public void setAPNSToken(String token, @Nullable String type, Promise promise) { + promise.resolve(null); + } + + @Override + public void getIsHeadless(Promise promise) { + promise.resolve(false); + } + + @Override + public void requestPermission(ReadableMap permissions, Promise promise) { + promise.resolve(1); + } + + @Override + public void registerForRemoteNotifications(Promise promise) { + promise.resolve(null); + } + + @Override + public void unregisterForRemoteNotifications(Promise promise) { + promise.resolve(null); + } + + @Override public void getInitialNotification(Promise promise) { if (initialNotification != null) { promise.resolve(initialNotification); initialNotification = null; return; - } else { - Activity activity = getCurrentActivity(); - - if (activity != null) { - Intent intent = activity.getIntent(); - - if (intent != null && intent.getExtras() != null) { - // messageId can be either one... - String messageId = intent.getExtras().getString("google.message_id"); - if (messageId == null) messageId = intent.getExtras().getString("message_id"); - - // only handle non-consumed initial notifications - if (messageId != null && initialNotificationMap.get(messageId) == null) { - WritableMap remoteMessageMap; - RemoteMessage remoteMessage = - ReactNativeFirebaseMessagingReceiver.notifications.get(messageId); - if (remoteMessage == null) { - remoteMessageMap = popRemoteMessageMapFromMessagingStore(messageId); - } else { - remoteMessageMap = - ReactNativeFirebaseMessagingSerializer.remoteMessageToWritableMap(remoteMessage); - } - if (remoteMessageMap != null) { - promise.resolve(remoteMessageMap); - initialNotificationMap.put(messageId, true); - return; - } + } + + Activity activity = getCurrentActivity(); + + if (activity != null) { + Intent intent = activity.getIntent(); + + if (intent != null && intent.getExtras() != null) { + String messageId = intent.getExtras().getString("google.message_id"); + if (messageId == null) messageId = intent.getExtras().getString("message_id"); + + if (messageId != null && initialNotificationMap.get(messageId) == null) { + WritableMap remoteMessageMap; + RemoteMessage remoteMessage = + ReactNativeFirebaseMessagingReceiver.notifications.get(messageId); + if (remoteMessage == null) { + remoteMessageMap = popRemoteMessageMapFromMessagingStore(messageId); + } else { + remoteMessageMap = + ReactNativeFirebaseMessagingSerializer.remoteMessageToWritableMap(remoteMessage); + } + if (remoteMessageMap != null) { + promise.resolve(remoteMessageMap); + initialNotificationMap.put(messageId, true); + return; } } - } else { - Log.w( - TAG, - "Attempt to call getInitialNotification failed. The current activity is not ready, try" - + " calling the method later in the React lifecycle."); } + } else { + Log.w( + TAG, + "Attempt to call getInitialNotification failed. The current activity is not ready, try" + + " calling the method later in the React lifecycle."); } promise.resolve(null); } - @ReactMethod - public void setAutoInitEnabled(Boolean enabled, Promise promise) { + @Override + public void setAutoInitEnabled(boolean enabled, Promise promise) { Tasks.call( getExecutor(), () -> { @@ -115,31 +180,29 @@ public void setAutoInitEnabled(Boolean enabled, Promise promise) { if (task.isSuccessful()) { promise.resolve(FirebaseMessaging.getInstance().isAutoInitEnabled()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void isNotificationDelegationEnabled(Promise promise) { Tasks.call( - getExecutor(), - () -> { - FirebaseMessaging.getInstance().isNotificationDelegationEnabled(); - return null; - }) + getExecutor(), () -> FirebaseMessaging.getInstance().isNotificationDelegationEnabled()) .addOnCompleteListener( task -> { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod - public void setNotificationDelegationEnabled(Boolean enabled, Promise promise) { + @Override + public void setNotificationDelegationEnabled(boolean enabled, Promise promise) { Tasks.call( getExecutor(), () -> { @@ -151,12 +214,13 @@ public void setNotificationDelegationEnabled(Boolean enabled, Promise promise) { if (task.isSuccessful()) { promise.resolve(FirebaseMessaging.getInstance().isNotificationDelegationEnabled()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void getToken(String appName, String senderId, Promise promise) { FirebaseMessaging messagingInstance = FirebaseApp.getInstance(appName).get(FirebaseMessaging.class); @@ -166,12 +230,13 @@ public void getToken(String appName, String senderId, Promise promise) { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void deleteToken(String appName, String senderId, Promise promise) { FirebaseMessaging messagingInstance = FirebaseApp.getInstance(appName).get(FirebaseMessaging.class); @@ -186,12 +251,13 @@ public void deleteToken(String appName, String senderId, Promise promise) { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void hasPermission(Promise promise) { Tasks.call( getExecutor(), @@ -203,12 +269,13 @@ public void hasPermission(Promise promise) { if (task.isSuccessful()) { promise.resolve(task.getResult() ? 1 : 0); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void sendMessage(ReadableMap remoteMessageMap, Promise promise) { Tasks.call( getExecutor(), @@ -224,12 +291,13 @@ public void sendMessage(ReadableMap remoteMessageMap, Promise promise) { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void subscribeToTopic(String topic, Promise promise) { FirebaseMessaging.getInstance() .subscribeToTopic(topic) @@ -238,12 +306,13 @@ public void subscribeToTopic(String topic, Promise promise) { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod + @Override public void unsubscribeFromTopic(String topic, Promise promise) { FirebaseMessaging.getInstance() .unsubscribeFromTopic(topic) @@ -252,13 +321,14 @@ public void unsubscribeFromTopic(String topic, Promise promise) { if (task.isSuccessful()) { promise.resolve(task.getResult()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @ReactMethod - public void setDeliveryMetricsExportToBigQuery(Boolean enabled, Promise promise) { + @Override + public void setDeliveryMetricsExportToBigQuery(boolean enabled, Promise promise) { Tasks.call( getExecutor(), () -> { @@ -271,24 +341,12 @@ public void setDeliveryMetricsExportToBigQuery(Boolean enabled, Promise promise) promise.resolve( FirebaseMessaging.getInstance().deliveryMetricsExportToBigQueryEnabled()); } else { - rejectPromiseWithExceptionMap(promise, task.getException()); + ReactNativeFirebaseModule.rejectPromiseWithExceptionMap( + promise, task.getException()); } }); } - @Override - public Map getConstants() { - final Map constants = new HashMap<>(); - constants.put("isAutoInitEnabled", FirebaseMessaging.getInstance().isAutoInitEnabled()); - constants.put( - "isDeliveryMetricsExportToBigQueryEnabled", - FirebaseMessaging.getInstance().deliveryMetricsExportToBigQueryEnabled()); - constants.put( - "isNotificationDelegationEnabled", - FirebaseMessaging.getInstance().isNotificationDelegationEnabled()); - return constants; - } - @Override public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { // noop @@ -313,8 +371,6 @@ public void onNewIntent(Intent intent) { } if (remoteMessageMap != null) { - // WritableNativeMap not be consumed twice. But it is resolved in future and in event - // below. Make a copy - issue #5231 WritableNativeMap newInitialNotification = new WritableNativeMap(); newInitialNotification.merge(remoteMessageMap); initialNotification = newInitialNotification; @@ -329,4 +385,10 @@ public void onNewIntent(Intent intent) { } } } + + @Override + public void invalidate() { + super.invalidate(); + executorService.shutdown(); + } } diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingPackage.java b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingPackage.java index 0bf1247eb5..78ac9d0761 100644 --- a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingPackage.java +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingPackage.java @@ -30,7 +30,7 @@ public class ReactNativeFirebaseMessagingPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseMessagingModule(reactContext)); + modules.add(new NativeRNFBTurboMessaging(reactContext)); return modules; } diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboMessagingSpec.java b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboMessagingSpec.java new file mode 100644 index 0000000000..7d87dfea45 --- /dev/null +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboMessagingSpec.java @@ -0,0 +1,151 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboMessagingSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboMessaging"; + + public NativeRNFBTurboMessagingSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + protected abstract Map getTypedExportedConstants(); + + @Override + @DoNotStrip + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "isAutoInitEnabled", + "isDeliveryMetricsExportToBigQueryEnabled" + )); + Set optionalFlowConstants = new HashSet<>(Arrays.asList( + "isNotificationDelegationEnabled", + "isRegisteredForRemoteNotifications" + )); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } + + @ReactMethod + @DoNotStrip + public abstract void getInitialNotification(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getDidOpenSettingsForNotification(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setAutoInitEnabled(boolean enabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void signalBackgroundMessageHandlerSet(); + + @ReactMethod + @DoNotStrip + public abstract void completeNotificationProcessing(); + + @ReactMethod + @DoNotStrip + public abstract void getToken(String appName, String senderId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void deleteToken(String appName, String senderId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getAPNSToken(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setAPNSToken(String token, @Nullable String type, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getIsHeadless(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void requestPermission(ReadableMap permissions, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void registerForRemoteNotifications(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void unregisterForRemoteNotifications(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void hasPermission(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void sendMessage(ReadableMap remoteMessageMap, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void subscribeToTopic(String topic, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void unsubscribeFromTopic(String topic, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setDeliveryMetricsExportToBigQuery(boolean enabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setNotificationDelegationEnabled(boolean enabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void isNotificationDelegationEnabled(Promise promise); +} diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/CMakeLists.txt b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..9af00643f5 --- /dev/null +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBMessagingTurboModules/*.cpp) + +add_library( + react_codegen_RNFBMessagingTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBMessagingTurboModules PUBLIC . react/renderer/components/RNFBMessagingTurboModules) + +target_link_libraries( + react_codegen_RNFBMessagingTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBMessagingTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/RNFBMessagingTurboModules-generated.cpp b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/RNFBMessagingTurboModules-generated.cpp new file mode 100644 index 0000000000..8237370ca7 --- /dev/null +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/RNFBMessagingTurboModules-generated.cpp @@ -0,0 +1,152 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBMessagingTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "getConstants", "()Ljava/util/Map;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getInitialNotification(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getInitialNotification", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getDidOpenSettingsForNotification(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getDidOpenSettingsForNotification", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_setAutoInitEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setAutoInitEnabled", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_signalBackgroundMessageHandlerSet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "signalBackgroundMessageHandlerSet", "()V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_completeNotificationProcessing(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "completeNotificationProcessing", "()V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getToken", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_deleteToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "deleteToken", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getAPNSToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getAPNSToken", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_setAPNSToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setAPNSToken", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getIsHeadless(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getIsHeadless", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_requestPermission(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "requestPermission", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_registerForRemoteNotifications(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "registerForRemoteNotifications", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_unregisterForRemoteNotifications(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "unregisterForRemoteNotifications", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_hasPermission(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "hasPermission", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_sendMessage(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "sendMessage", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_subscribeToTopic(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "subscribeToTopic", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_unsubscribeFromTopic(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "unsubscribeFromTopic", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_setDeliveryMetricsExportToBigQuery(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setDeliveryMetricsExportToBigQuery", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_setNotificationDelegationEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setNotificationDelegationEnabled", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_isNotificationDelegationEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "isNotificationDelegationEnabled", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboMessagingSpecJSI::NativeRNFBTurboMessagingSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getConstants}; + methodMap_["getInitialNotification"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getInitialNotification}; + methodMap_["getDidOpenSettingsForNotification"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getDidOpenSettingsForNotification}; + methodMap_["setAutoInitEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_setAutoInitEnabled}; + methodMap_["signalBackgroundMessageHandlerSet"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_signalBackgroundMessageHandlerSet}; + methodMap_["completeNotificationProcessing"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_completeNotificationProcessing}; + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getToken}; + methodMap_["deleteToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingSpecJSI_deleteToken}; + methodMap_["getAPNSToken"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getAPNSToken}; + methodMap_["setAPNSToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingSpecJSI_setAPNSToken}; + methodMap_["getIsHeadless"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getIsHeadless}; + methodMap_["requestPermission"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_requestPermission}; + methodMap_["registerForRemoteNotifications"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_registerForRemoteNotifications}; + methodMap_["unregisterForRemoteNotifications"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_unregisterForRemoteNotifications}; + methodMap_["hasPermission"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_hasPermission}; + methodMap_["sendMessage"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_sendMessage}; + methodMap_["subscribeToTopic"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_subscribeToTopic}; + methodMap_["unsubscribeFromTopic"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_unsubscribeFromTopic}; + methodMap_["setDeliveryMetricsExportToBigQuery"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_setDeliveryMetricsExportToBigQuery}; + methodMap_["setNotificationDelegationEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_setNotificationDelegationEnabled}; + methodMap_["isNotificationDelegationEnabled"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_isNotificationDelegationEnabled}; +} + +std::shared_ptr RNFBMessagingTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboMessaging") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/RNFBMessagingTurboModules.h b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/RNFBMessagingTurboModules.h new file mode 100644 index 0000000000..431191abce --- /dev/null +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/RNFBMessagingTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboMessaging' + */ +class JSI_EXPORT NativeRNFBTurboMessagingSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboMessagingSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBMessagingTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/react/renderer/components/RNFBMessagingTurboModules/RNFBMessagingTurboModulesJSI-generated.cpp b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/react/renderer/components/RNFBMessagingTurboModules/RNFBMessagingTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..5c1b92935c --- /dev/null +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/react/renderer/components/RNFBMessagingTurboModules/RNFBMessagingTurboModulesJSI-generated.cpp @@ -0,0 +1,161 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBMessagingTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getInitialNotification(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getInitialNotification( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getDidOpenSettingsForNotification(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getDidOpenSettingsForNotification( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setAutoInitEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAutoInitEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_signalBackgroundMessageHandlerSet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->signalBackgroundMessageHandlerSet( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_completeNotificationProcessing(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->completeNotificationProcessing( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_deleteToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getAPNSToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getAPNSToken( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setAPNSToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAPNSToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getIsHeadless(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getIsHeadless( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_requestPermission(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->requestPermission( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_registerForRemoteNotifications(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->registerForRemoteNotifications( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_unregisterForRemoteNotifications(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->unregisterForRemoteNotifications( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_hasPermission(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->hasPermission( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_sendMessage(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->sendMessage( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_subscribeToTopic(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->subscribeToTopic( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_unsubscribeFromTopic(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->unsubscribeFromTopic( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setDeliveryMetricsExportToBigQuery(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setDeliveryMetricsExportToBigQuery( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setNotificationDelegationEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setNotificationDelegationEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_isNotificationDelegationEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->isNotificationDelegationEnabled( + rt + ); +} + +NativeRNFBTurboMessagingCxxSpecJSI::NativeRNFBTurboMessagingCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboMessaging", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getConstants}; + methodMap_["getInitialNotification"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getInitialNotification}; + methodMap_["getDidOpenSettingsForNotification"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getDidOpenSettingsForNotification}; + methodMap_["setAutoInitEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setAutoInitEnabled}; + methodMap_["signalBackgroundMessageHandlerSet"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_signalBackgroundMessageHandlerSet}; + methodMap_["completeNotificationProcessing"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_completeNotificationProcessing}; + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getToken}; + methodMap_["deleteToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_deleteToken}; + methodMap_["getAPNSToken"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getAPNSToken}; + methodMap_["setAPNSToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setAPNSToken}; + methodMap_["getIsHeadless"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getIsHeadless}; + methodMap_["requestPermission"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_requestPermission}; + methodMap_["registerForRemoteNotifications"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_registerForRemoteNotifications}; + methodMap_["unregisterForRemoteNotifications"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_unregisterForRemoteNotifications}; + methodMap_["hasPermission"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_hasPermission}; + methodMap_["sendMessage"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_sendMessage}; + methodMap_["subscribeToTopic"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_subscribeToTopic}; + methodMap_["unsubscribeFromTopic"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_unsubscribeFromTopic}; + methodMap_["setDeliveryMetricsExportToBigQuery"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setDeliveryMetricsExportToBigQuery}; + methodMap_["setNotificationDelegationEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setNotificationDelegationEnabled}; + methodMap_["isNotificationDelegationEnabled"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_isNotificationDelegationEnabled}; +} + + +} // namespace facebook::react diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/react/renderer/components/RNFBMessagingTurboModules/RNFBMessagingTurboModulesJSI.h b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/react/renderer/components/RNFBMessagingTurboModules/RNFBMessagingTurboModulesJSI.h new file mode 100644 index 0000000000..c248e7f436 --- /dev/null +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/generated/jni/react/renderer/components/RNFBMessagingTurboModules/RNFBMessagingTurboModulesJSI.h @@ -0,0 +1,356 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboMessagingIOSPermissions + +template +struct NativeRNFBTurboMessagingIOSPermissions { + P0 alert; + P1 announcement; + P2 badge; + P3 carPlay; + P4 criticalAlert; + P5 provisional; + P6 sound; + P7 providesAppNotificationSettings; + bool operator==(const NativeRNFBTurboMessagingIOSPermissions &other) const { + return alert == other.alert && announcement == other.announcement && badge == other.badge && carPlay == other.carPlay && criticalAlert == other.criticalAlert && provisional == other.provisional && sound == other.sound && providesAppNotificationSettings == other.providesAppNotificationSettings; + } +}; + +template +struct NativeRNFBTurboMessagingIOSPermissionsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "alert"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "announcement"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "badge"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "carPlay"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "criticalAlert"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "provisional"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "sound"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "providesAppNotificationSettings"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool alertToJs(jsi::Runtime &rt, decltype(types.alert) value) { + return bridging::toJs(rt, value); + } + + static bool announcementToJs(jsi::Runtime &rt, decltype(types.announcement) value) { + return bridging::toJs(rt, value); + } + + static bool badgeToJs(jsi::Runtime &rt, decltype(types.badge) value) { + return bridging::toJs(rt, value); + } + + static bool carPlayToJs(jsi::Runtime &rt, decltype(types.carPlay) value) { + return bridging::toJs(rt, value); + } + + static bool criticalAlertToJs(jsi::Runtime &rt, decltype(types.criticalAlert) value) { + return bridging::toJs(rt, value); + } + + static bool provisionalToJs(jsi::Runtime &rt, decltype(types.provisional) value) { + return bridging::toJs(rt, value); + } + + static bool soundToJs(jsi::Runtime &rt, decltype(types.sound) value) { + return bridging::toJs(rt, value); + } + + static bool providesAppNotificationSettingsToJs(jsi::Runtime &rt, decltype(types.providesAppNotificationSettings) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.alert) { + result.setProperty(rt, "alert", bridging::toJs(rt, value.alert.value(), jsInvoker)); + } + if (value.announcement) { + result.setProperty(rt, "announcement", bridging::toJs(rt, value.announcement.value(), jsInvoker)); + } + if (value.badge) { + result.setProperty(rt, "badge", bridging::toJs(rt, value.badge.value(), jsInvoker)); + } + if (value.carPlay) { + result.setProperty(rt, "carPlay", bridging::toJs(rt, value.carPlay.value(), jsInvoker)); + } + if (value.criticalAlert) { + result.setProperty(rt, "criticalAlert", bridging::toJs(rt, value.criticalAlert.value(), jsInvoker)); + } + if (value.provisional) { + result.setProperty(rt, "provisional", bridging::toJs(rt, value.provisional.value(), jsInvoker)); + } + if (value.sound) { + result.setProperty(rt, "sound", bridging::toJs(rt, value.sound.value(), jsInvoker)); + } + if (value.providesAppNotificationSettings) { + result.setProperty(rt, "providesAppNotificationSettings", bridging::toJs(rt, value.providesAppNotificationSettings.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboMessagingCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboMessagingCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value getInitialNotification(jsi::Runtime &rt) = 0; + virtual jsi::Value getDidOpenSettingsForNotification(jsi::Runtime &rt) = 0; + virtual jsi::Value setAutoInitEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual void signalBackgroundMessageHandlerSet(jsi::Runtime &rt) = 0; + virtual void completeNotificationProcessing(jsi::Runtime &rt) = 0; + virtual jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, jsi::String senderId) = 0; + virtual jsi::Value deleteToken(jsi::Runtime &rt, jsi::String appName, jsi::String senderId) = 0; + virtual jsi::Value getAPNSToken(jsi::Runtime &rt) = 0; + virtual jsi::Value setAPNSToken(jsi::Runtime &rt, jsi::String token, std::optional type) = 0; + virtual jsi::Value getIsHeadless(jsi::Runtime &rt) = 0; + virtual jsi::Value requestPermission(jsi::Runtime &rt, jsi::Object permissions) = 0; + virtual jsi::Value registerForRemoteNotifications(jsi::Runtime &rt) = 0; + virtual jsi::Value unregisterForRemoteNotifications(jsi::Runtime &rt) = 0; + virtual jsi::Value hasPermission(jsi::Runtime &rt) = 0; + virtual jsi::Value sendMessage(jsi::Runtime &rt, jsi::Object remoteMessageMap) = 0; + virtual jsi::Value subscribeToTopic(jsi::Runtime &rt, jsi::String topic) = 0; + virtual jsi::Value unsubscribeFromTopic(jsi::Runtime &rt, jsi::String topic) = 0; + virtual jsi::Value setDeliveryMetricsExportToBigQuery(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value setNotificationDelegationEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value isNotificationDelegationEnabled(jsi::Runtime &rt) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboMessagingCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboMessaging"; + +protected: + NativeRNFBTurboMessagingCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboMessagingCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboMessagingCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboMessagingCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value getInitialNotification(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getInitialNotification) == 1, + "Expected getInitialNotification(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getInitialNotification, jsInvoker_, instance_); + } + jsi::Value getDidOpenSettingsForNotification(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getDidOpenSettingsForNotification) == 1, + "Expected getDidOpenSettingsForNotification(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getDidOpenSettingsForNotification, jsInvoker_, instance_); + } + jsi::Value setAutoInitEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setAutoInitEnabled) == 2, + "Expected setAutoInitEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setAutoInitEnabled, jsInvoker_, instance_, std::move(enabled)); + } + void signalBackgroundMessageHandlerSet(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::signalBackgroundMessageHandlerSet) == 1, + "Expected signalBackgroundMessageHandlerSet(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::signalBackgroundMessageHandlerSet, jsInvoker_, instance_); + } + void completeNotificationProcessing(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::completeNotificationProcessing) == 1, + "Expected completeNotificationProcessing(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::completeNotificationProcessing, jsInvoker_, instance_); + } + jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, jsi::String senderId) override { + static_assert( + bridging::getParameterCount(&T::getToken) == 3, + "Expected getToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getToken, jsInvoker_, instance_, std::move(appName), std::move(senderId)); + } + jsi::Value deleteToken(jsi::Runtime &rt, jsi::String appName, jsi::String senderId) override { + static_assert( + bridging::getParameterCount(&T::deleteToken) == 3, + "Expected deleteToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::deleteToken, jsInvoker_, instance_, std::move(appName), std::move(senderId)); + } + jsi::Value getAPNSToken(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getAPNSToken) == 1, + "Expected getAPNSToken(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getAPNSToken, jsInvoker_, instance_); + } + jsi::Value setAPNSToken(jsi::Runtime &rt, jsi::String token, std::optional type) override { + static_assert( + bridging::getParameterCount(&T::setAPNSToken) == 3, + "Expected setAPNSToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setAPNSToken, jsInvoker_, instance_, std::move(token), std::move(type)); + } + jsi::Value getIsHeadless(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getIsHeadless) == 1, + "Expected getIsHeadless(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getIsHeadless, jsInvoker_, instance_); + } + jsi::Value requestPermission(jsi::Runtime &rt, jsi::Object permissions) override { + static_assert( + bridging::getParameterCount(&T::requestPermission) == 2, + "Expected requestPermission(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::requestPermission, jsInvoker_, instance_, std::move(permissions)); + } + jsi::Value registerForRemoteNotifications(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::registerForRemoteNotifications) == 1, + "Expected registerForRemoteNotifications(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::registerForRemoteNotifications, jsInvoker_, instance_); + } + jsi::Value unregisterForRemoteNotifications(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::unregisterForRemoteNotifications) == 1, + "Expected unregisterForRemoteNotifications(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::unregisterForRemoteNotifications, jsInvoker_, instance_); + } + jsi::Value hasPermission(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::hasPermission) == 1, + "Expected hasPermission(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::hasPermission, jsInvoker_, instance_); + } + jsi::Value sendMessage(jsi::Runtime &rt, jsi::Object remoteMessageMap) override { + static_assert( + bridging::getParameterCount(&T::sendMessage) == 2, + "Expected sendMessage(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::sendMessage, jsInvoker_, instance_, std::move(remoteMessageMap)); + } + jsi::Value subscribeToTopic(jsi::Runtime &rt, jsi::String topic) override { + static_assert( + bridging::getParameterCount(&T::subscribeToTopic) == 2, + "Expected subscribeToTopic(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::subscribeToTopic, jsInvoker_, instance_, std::move(topic)); + } + jsi::Value unsubscribeFromTopic(jsi::Runtime &rt, jsi::String topic) override { + static_assert( + bridging::getParameterCount(&T::unsubscribeFromTopic) == 2, + "Expected unsubscribeFromTopic(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::unsubscribeFromTopic, jsInvoker_, instance_, std::move(topic)); + } + jsi::Value setDeliveryMetricsExportToBigQuery(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setDeliveryMetricsExportToBigQuery) == 2, + "Expected setDeliveryMetricsExportToBigQuery(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setDeliveryMetricsExportToBigQuery, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value setNotificationDelegationEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setNotificationDelegationEnabled) == 2, + "Expected setNotificationDelegationEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setNotificationDelegationEnabled, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value isNotificationDelegationEnabled(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::isNotificationDelegationEnabled) == 1, + "Expected isNotificationDelegationEnabled(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::isNotificationDelegationEnabled, jsInvoker_, instance_); + } + + private: + friend class NativeRNFBTurboMessagingCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/messaging/e2e/messaging.e2e.js b/packages/messaging/e2e/messaging.e2e.js index c79bda95b7..b5e0063417 100644 --- a/packages/messaging/e2e/messaging.e2e.js +++ b/packages/messaging/e2e/messaging.e2e.js @@ -324,6 +324,7 @@ describe('messaging()', function () { } }); + // Phase C: re-enable only after FCM harness / payload delivery audit (see migration-work-queue § Phase C). xit('receives messages when the app is in the foreground', async function () { const { getMessaging, onMessage, registerDeviceForRemoteMessages, getToken } = messagingModular; diff --git a/packages/messaging/ios/RNFBMessaging.xcodeproj/project.pbxproj b/packages/messaging/ios/RNFBMessaging.xcodeproj/project.pbxproj index 8e3c7f8850..8f2801dbbc 100644 --- a/packages/messaging/ios/RNFBMessaging.xcodeproj/project.pbxproj +++ b/packages/messaging/ios/RNFBMessaging.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBMessagingModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBMessagingModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBMessagingModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBMessagingModule.mm */; }; 27F24640242AA29F0098906C /* RNFBMessaging+UNUserNotificationCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F2463F242AA29E0098906C /* RNFBMessaging+UNUserNotificationCenter.m */; }; 27F24643242AA2EE0098906C /* RNFBMessaging+AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F24642242AA2EE0098906C /* RNFBMessaging+AppDelegate.m */; }; 27F24646242AA30E0098906C /* RNFBMessaging+FIRMessagingDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 27F24645242AA30E0098906C /* RNFBMessaging+FIRMessagingDelegate.m */; }; @@ -31,7 +31,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBMessaging.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBMessaging.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBMessagingModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBMessagingModule.h; path = RNFBMessaging/RNFBMessagingModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBMessagingModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBMessagingModule.m; path = RNFBMessaging/RNFBMessagingModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBMessagingModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = RNFBMessagingModule.mm; path = RNFBMessaging/RNFBMessagingModule.mm; sourceTree = SOURCE_ROOT; }; 27F2463E242AA29E0098906C /* RNFBMessaging+UNUserNotificationCenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RNFBMessaging+UNUserNotificationCenter.h"; sourceTree = ""; }; 27F2463F242AA29E0098906C /* RNFBMessaging+UNUserNotificationCenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "RNFBMessaging+UNUserNotificationCenter.m"; sourceTree = ""; }; 27F24641242AA2EE0098906C /* RNFBMessaging+AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RNFBMessaging+AppDelegate.h"; sourceTree = ""; }; @@ -71,7 +71,7 @@ 37D60F7324E647BF00E44930 /* RNFBMessaging+UNNotificationServiceExtension.m */, 37D60F7124E6465300E44930 /* RNFBMessaging+UNNotificationServiceExtension.h */, 2744B98421F45429004F8E3F /* RNFBMessagingModule.h */, - 2744B98521F45429004F8E3F /* RNFBMessagingModule.m */, + 2744B98521F45429004F8E3F /* RNFBMessagingModule.mm */, DA446E5022CA485C0066A0A3 /* RNFBMessagingSerializer.h */, DA446E5122CA48690066A0A3 /* RNFBMessagingSerializer.m */, 27F2463E242AA29E0098906C /* RNFBMessaging+UNUserNotificationCenter.h */, @@ -153,7 +153,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBMessagingModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBMessagingModule.mm in Sources */, 27F24643242AA2EE0098906C /* RNFBMessaging+AppDelegate.m in Sources */, 37D60F7424E647BF00E44930 /* RNFBMessaging+UNNotificationServiceExtension.m in Sources */, 27F24640242AA29F0098906C /* RNFBMessaging+UNUserNotificationCenter.m in Sources */, diff --git a/packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.h b/packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.h index 0a1c716395..ece224d8b5 100644 --- a/packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.h +++ b/packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.h @@ -16,9 +16,9 @@ */ #import -#import +#import "RNFBMessagingTurboModules.h" -@interface RNFBMessagingModule : NSObject +@interface RNFBMessagingModule : NSObject + (NSDictionary *_Nonnull)addCustomPropsToUserProps:(NSDictionary *_Nullable)userProps withLaunchOptions:(NSDictionary *_Nullable)launchOptions; @property BOOL isDeliveryMetricsExportToBigQueryEnabled; diff --git a/packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.m b/packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.mm similarity index 58% rename from packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.m rename to packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.mm index 657ac96b30..0cfe104c9c 100644 --- a/packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.m +++ b/packages/messaging/ios/RNFBMessaging/RNFBMessagingModule.mm @@ -30,21 +30,17 @@ @implementation RNFBMessagingModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboMessaging) + ++ (BOOL)requiresMainQueueSetup { + return NO; +} - (id)init { self = [super init]; return self; } -- (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); -} - -+ (BOOL)requiresMainQueueSetup { - return YES; -} - + (NSDictionary *)addCustomPropsToUserProps:(NSDictionary *_Nullable)userProps withLaunchOptions:(NSDictionary *_Nullable)launchOptions { NSMutableDictionary *appProperties = @@ -60,16 +56,12 @@ + (NSDictionary *)addCustomPropsToUserProps:(NSDictionary *_Nullable)userProps return [NSDictionary dictionaryWithDictionary:appProperties]; } -- (NSDictionary *)constantsToExport { +- (NSDictionary *)messagingConstantsDictionary { NSMutableDictionary *constants = [NSMutableDictionary new]; constants[@"isAutoInitEnabled"] = @([RCTConvert BOOL:@([FIRMessaging messaging].autoInitEnabled)]); #if TARGET_IPHONE_SIMULATOR - // `isRegisteredForRemoteNotifications` is flaky and hangs on the simulator sometimes - // It is reasonably safe to return a "NO" to avoid the simulator hang - // Reasoning: registering multiple times is not harmful so if an app relies on this - // constant, sees a "NO" and then re-register, that is fine. - constants[@"isRegisteredForRemoteNotifications"] = NO; + constants[@"isRegisteredForRemoteNotifications"] = @NO; #else constants[@"isRegisteredForRemoteNotifications"] = @( [RCTConvert BOOL:@([[UIApplication sharedApplication] isRegisteredForRemoteNotifications])]); @@ -79,26 +71,37 @@ - (NSDictionary *)constantsToExport { return constants; } +- (facebook::react::ModuleConstants) + constantsToExport { + return [_RCTTypedModuleConstants newWithUnsafeDictionary:[self messagingConstantsDictionary]]; +} + +- (facebook::react::ModuleConstants)getConstants { + return [self constantsToExport]; +} + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + #pragma mark - #pragma mark Firebase Messaging Methods -RCT_EXPORT_METHOD(getInitialNotification - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getInitialNotification:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { resolve([[RNFBMessagingUNUserNotificationCenter sharedInstance] getInitialNotification]); } -RCT_EXPORT_METHOD(getDidOpenSettingsForNotification - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getDidOpenSettingsForNotification:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { resolve( [[RNFBMessagingUNUserNotificationCenter sharedInstance] getDidOpenSettingsForNotification]); } -RCT_EXPORT_METHOD(setAutoInitEnabled - : (BOOL)enabled - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)setAutoInitEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { [FIRMessaging messaging].autoInitEnabled = enabled; } @catch (NSException *exception) { @@ -108,7 +111,7 @@ - (NSDictionary *)constantsToExport { return resolve([NSNull null]); } -RCT_EXPORT_METHOD(signalBackgroundMessageHandlerSet) { +- (void)signalBackgroundMessageHandlerSet { DLog(@"signalBackgroundMessageHandlerSet called"); @try { [[RNFBMessagingAppDelegate sharedInstance] signalBackgroundMessageHandlerSet]; @@ -117,28 +120,29 @@ - (NSDictionary *)constantsToExport { } } -RCT_EXPORT_METHOD(getToken - : (NSString *)appName - : (NSString *)senderId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getToken:(NSString *)appName + senderId:(NSString *)senderId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { if ([UIApplication sharedApplication].isRegisteredForRemoteNotifications == NO) { - [RNFBSharedUtils - rejectPromiseWithUserInfo:reject - userInfo:(NSMutableDictionary *)@{ - @"code" : @"unregistered", - @"message" : - @"You must be registered for remote messages before calling " - @"getToken, see messaging().registerDeviceForRemoteMessages().", - }]; + [RNFBSharedUtils rejectPromiseWithUserInfo:reject + userInfo:(NSMutableDictionary *)@{ + @"code" : @"unregistered", + @"message" : @"You must be registered for remote " + @"messages before calling " + @"getToken, see " + @"messaging()." + @"registerDeviceForRemoteMessages().", + }]; return; } - // As of firebase-ios-sdk 10.4.0, an APNS token is strictly required for getToken to work NSData *apnsToken = [FIRMessaging messaging].APNSToken; if (apnsToken == nil) { - DLog(@"RNFBMessaging getToken - no APNS token is available. Firebase requires an APNS token to " - @"vend an FCM token in firebase-ios-sdk 10.4.0 and higher. See documentation on " + DLog(@"RNFBMessaging getToken - no APNS token is available. Firebase " + @"requires an APNS token to " + @"vend an FCM token in firebase-ios-sdk 10.4.0 and higher. See " + @"documentation on " @"setAPNSToken and getAPNSToken.") } @@ -153,11 +157,10 @@ - (NSDictionary *)constantsToExport { }]; } -RCT_EXPORT_METHOD(deleteToken - : (NSString *)appName - : (NSString *)senderId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)deleteToken:(NSString *)appName + senderId:(NSString *)senderId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [[FIRMessaging messaging] deleteFCMTokenForSenderID:senderId completion:^(NSError *_Nullable error) { if (error) { @@ -169,45 +172,46 @@ - (NSDictionary *)constantsToExport { }]; } -RCT_EXPORT_METHOD(getAPNSToken : (RCTPromiseResolveBlock)resolve : (RCTPromiseRejectBlock)reject) { +- (void)getAPNSToken:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { NSData *apnsToken = [FIRMessaging messaging].APNSToken; if (apnsToken) { resolve([RNFBMessagingSerializer APNSTokenFromNSData:apnsToken]); } else { #if TARGET_IPHONE_SIMULATOR #if !TARGET_CPU_ARM64 - DLog(@"RNFBMessaging getAPNSToken - Simulator without APNS support detected, with no token " - @"set. Use setAPNSToken with an arbitrary string if needed for testing.") - resolve([NSNull null]); + DLog(@"RNFBMessaging getAPNSToken - Simulator without APNS support " + @"detected, with no token " + @"set. Use setAPNSToken with an arbitrary string if needed for " + @"testing.") resolve([NSNull null]); return; #endif - DLog(@"RNFBMessaging getAPNSToken - ARM64 Simulator detected, but no APNS token available. " - @"APNS token may be possible. macOS13+ / iOS16+ / M1 mac required for assumption to be " + DLog(@"RNFBMessaging getAPNSToken - ARM64 Simulator detected, but no APNS " + @"token available. " + @"APNS token may be possible. macOS13+ / iOS16+ / M1 mac required for " + @"assumption to be " @"valid. " @"Use setAPNSToken in testing if needed."); #endif if ([UIApplication sharedApplication].isRegisteredForRemoteNotifications == NO) { - [RNFBSharedUtils - rejectPromiseWithUserInfo:reject - userInfo:(NSMutableDictionary *)@{ - @"code" : @"unregistered", - @"message" : @"You must be registered for remote messages before " - @"calling getAPNSToken, see " - @"messaging().registerDeviceForRemoteMessages().", - }]; + [RNFBSharedUtils rejectPromiseWithUserInfo:reject + userInfo:(NSMutableDictionary *)@{ + @"code" : @"unregistered", + @"message" : @"You must be registered for remote " + @"messages before " + @"calling getAPNSToken, see " + @"messaging()." + @"registerDeviceForRemoteMessages().", + }]; return; } resolve([NSNull null]); } } -RCT_EXPORT_METHOD(setAPNSToken - : (NSString *)token - : (NSString *)type - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - // Default to unknown (determined by provisioning profile) type, but user may have passed type as - // param +- (void)setAPNSToken:(NSString *)token + type:(NSString *)type + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { FIRMessagingAPNSTokenType tokenType = FIRMessagingAPNSTokenTypeUnknown; if (type != nil && [@"prod" isEqualToString:type]) { tokenType = FIRMessagingAPNSTokenTypeProd; @@ -220,15 +224,15 @@ - (NSDictionary *)constantsToExport { resolve([NSNull null]); } -RCT_EXPORT_METHOD(getIsHeadless : (RCTPromiseResolveBlock)resolve : (RCTPromiseRejectBlock)reject) { +- (void)getIsHeadless:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { RNFBMessagingNSNotificationCenter *notifCenter = [RNFBMessagingNSNotificationCenter sharedInstance]; return resolve(@([RCTConvert BOOL:@(notifCenter.isHeadless)])); } -RCT_EXPORT_METHOD(completeNotificationProcessing) { - dispatch_get_main_queue(), ^{ +- (void)completeNotificationProcessing { + dispatch_async(dispatch_get_main_queue(), ^{ RNFBMessagingAppDelegate *appDelegate = [RNFBMessagingAppDelegate sharedInstance]; if (appDelegate.completionHandler) { appDelegate.completionHandler(UIBackgroundFetchResultNewData); @@ -238,54 +242,54 @@ - (NSDictionary *)constantsToExport { [[UIApplication sharedApplication] endBackgroundTask:appDelegate.backgroundTaskId]; appDelegate.backgroundTaskId = UIBackgroundTaskInvalid; } - }; + }); } -RCT_EXPORT_METHOD(requestPermission - : (NSDictionary *)permissions - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)requestPermission:(JS::NativeRNFBTurboMessaging::IOSPermissions &)permissions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { if (RCTRunningInAppExtension()) { - [RNFBSharedUtils - rejectPromiseWithUserInfo:reject - userInfo:[@{ - @"code" : @"unavailable-in-extension", - @"message" : @"requestPermission can not be called in App Extensions" - } mutableCopy]]; + [RNFBSharedUtils rejectPromiseWithUserInfo:reject + userInfo:[@{ + @"code" : @"unavailable-in-extension", + @"message" : @"requestPermission can not be called " + @"in App Extensions" + } mutableCopy]]; return; } UNAuthorizationOptions options = UNAuthorizationOptionNone; - if ([permissions[@"alert"] isEqual:@(YES)]) { + if (permissions.alert().has_value() && permissions.alert().value()) { options |= UNAuthorizationOptionAlert; } - if ([permissions[@"badge"] isEqual:@(YES)]) { + if (permissions.announcement().has_value() && permissions.announcement().value()) { + options |= UNAuthorizationOptionAnnouncement; + } + + if (permissions.badge().has_value() && permissions.badge().value()) { options |= UNAuthorizationOptionBadge; } - if ([permissions[@"sound"] isEqual:@(YES)]) { + if (permissions.sound().has_value() && permissions.sound().value()) { options |= UNAuthorizationOptionSound; } - if ([permissions[@"criticalAlert"] isEqual:@(YES)]) { + if (permissions.criticalAlert().has_value() && permissions.criticalAlert().value()) { options |= UNAuthorizationOptionCriticalAlert; } - if ([permissions[@"provisional"] isEqual:@(YES)]) { + if (permissions.provisional().has_value() && permissions.provisional().value()) { options |= UNAuthorizationOptionProvisional; } - if ([permissions[@"announcement"] isEqual:@(YES)]) { - options |= UNAuthorizationOptionAnnouncement; - } - - if ([permissions[@"carPlay"] isEqual:@(YES)]) { + if (permissions.carPlay().has_value() && permissions.carPlay().value()) { options |= UNAuthorizationOptionCarPlay; } - if ([permissions[@"providesAppNotificationSettings"] isEqual:@(YES)]) { + if (permissions.providesAppNotificationSettings().has_value() && + permissions.providesAppNotificationSettings().value()) { options |= UNAuthorizationOptionProvidesAppNotificationSettings; } @@ -295,31 +299,24 @@ - (NSDictionary *)constantsToExport { if (error) { [RNFBSharedUtils rejectPromiseWithNSError:reject error:error]; } else { - // if we do not attempt to register immediately, registration fails - // later unknown reason why, but this was the only difference between - // using a react-native-permissions vs built-in permissions request in - // a sequence of "request permissions" --> "register for messages" you - // only want to request permission if you want to register for - // messages, so we register directly now - see #7272 dispatch_async(dispatch_get_main_queue(), ^{ [[UIApplication sharedApplication] registerForRemoteNotifications]; }); - [self hasPermission:resolve:reject]; + [self hasPermission:resolve reject:reject]; } }]; } -RCT_EXPORT_METHOD(registerForRemoteNotifications - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)registerForRemoteNotifications:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { #if TARGET_IPHONE_SIMULATOR #if !TARGET_CPU_ARM64 - // Register on this unsupported simulator, but no waiting for a token that won't arrive [[UIApplication sharedApplication] registerForRemoteNotifications]; resolve(@([RCTConvert BOOL:@(YES)])); return; #endif - DLog(@"RNFBMessaging registerForRemoteNotifications ARM64 Simulator detected, attempting real " + DLog(@"RNFBMessaging registerForRemoteNotifications ARM64 Simulator " + @"detected, attempting real " @"registration. macOS13+ / iOS16+ / M1 mac required or will timeout.") #endif if ([UIApplication sharedApplication].isRegisteredForRemoteNotifications == YES) { @@ -331,30 +328,26 @@ - (NSDictionary *)constantsToExport { [[RNFBMessagingAppDelegate sharedInstance] setPromiseResolve:resolve andPromiseReject:reject]; } - // Apple docs recommend that registerForRemoteNotifications is always called on app start - // regardless of current status dispatch_async(dispatch_get_main_queue(), ^{ - // Sometimes the registration never completes, which deserves separate attention in other - // areas. This area should protect itself against hanging forever regardless. Just in case, - // check in after a delay and cleanup if required dispatch_after( dispatch_time(DISPATCH_TIME_NOW, 10.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ if ([RNFBMessagingAppDelegate sharedInstance].registerPromiseResolver != nil) { - // if we got here and resolve/reject are still set, unset, log failure, reject - DLog(@"RNFBMessaging dispatch_after block: we appear to have timed out. Rejecting"); + DLog(@"RNFBMessaging dispatch_after block: we appear to have timed " + @"out. Rejecting"); [[RNFBMessagingAppDelegate sharedInstance] setPromiseResolve:nil andPromiseReject:nil]; - [RNFBSharedUtils - rejectPromiseWithUserInfo:reject - userInfo:[@{ - @"code" : @"unknown-error", - @"message" : - @"registerDeviceForRemoteMessages requested but " - @"system did not respond. Possibly missing permission." - } mutableCopy]]; + [RNFBSharedUtils rejectPromiseWithUserInfo:reject + userInfo:[@{ + @"code" : @"unknown-error", + @"message" : @"registerDeviceForRemoteMessag" + @"es requested but " + @"system did not respond. " + @"Possibly missing permission." + } mutableCopy]]; return; } else { - DLog(@"RNFBMessaging dispatch_after: registerDeviceForRemoteMessages handled."); + DLog(@"RNFBMessaging dispatch_after: " + @"registerDeviceForRemoteMessages handled."); return; } }); @@ -363,14 +356,13 @@ - (NSDictionary *)constantsToExport { }); } -RCT_EXPORT_METHOD(unregisterForRemoteNotifications - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)unregisterForRemoteNotifications:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [[UIApplication sharedApplication] unregisterForRemoteNotifications]; resolve(nil); } -RCT_EXPORT_METHOD(hasPermission : (RCTPromiseResolveBlock)resolve : (RCTPromiseRejectBlock)reject) { +- (void)hasPermission:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *_Nonnull settings) { NSNumber *authorizedStatus = @-1; @@ -394,10 +386,20 @@ - (NSDictionary *)constantsToExport { }]; } -RCT_EXPORT_METHOD(subscribeToTopic - : (NSString *)topic - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)sendMessage:(NSDictionary *)remoteMessageMap + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [RNFBSharedUtils rejectPromiseWithUserInfo:reject + userInfo:[@{ + @"code" : @"unimplemented", + @"message" : @"sendMessage is only supported on " + @"Android devices." + } mutableCopy]]; +} + +- (void)subscribeToTopic:(NSString *)topic + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [[FIRMessaging messaging] subscribeToTopic:topic completion:^(NSError *error) { if (error) { @@ -408,10 +410,9 @@ - (NSDictionary *)constantsToExport { }]; } -RCT_EXPORT_METHOD(unsubscribeFromTopic - : (NSString *)topic - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)unsubscribeFromTopic:(NSString *)topic + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [[FIRMessaging messaging] unsubscribeFromTopic:topic completion:^(NSError *error) { if (error) { @@ -423,10 +424,9 @@ - (NSDictionary *)constantsToExport { }]; } -RCT_EXPORT_METHOD(setDeliveryMetricsExportToBigQuery - : (BOOL)enabled - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)setDeliveryMetricsExportToBigQuery:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { @try { _isDeliveryMetricsExportToBigQueryEnabled = enabled; } @catch (NSException *exception) { @@ -436,4 +436,15 @@ - (NSDictionary *)constantsToExport { return resolve([NSNull null]); } +- (void)setNotificationDelegationEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + resolve([NSNull null]); +} + +- (void)isNotificationDelegationEnabled:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + resolve(@NO); +} + @end diff --git a/packages/messaging/ios/generated/RCTAppDependencyProvider.h b/packages/messaging/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/messaging/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/messaging/ios/generated/RCTAppDependencyProvider.mm b/packages/messaging/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/messaging/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/messaging/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/messaging/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/messaging/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/messaging/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/messaging/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/messaging/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/messaging/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/messaging/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/messaging/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/messaging/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/messaging/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/messaging/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/messaging/ios/generated/RNFBMessagingTurboModules/RNFBMessagingTurboModules-generated.mm b/packages/messaging/ios/generated/RNFBMessagingTurboModules/RNFBMessagingTurboModules-generated.mm new file mode 100644 index 0000000000..87b7704da6 --- /dev/null +++ b/packages/messaging/ios/generated/RNFBMessagingTurboModules/RNFBMessagingTurboModules-generated.mm @@ -0,0 +1,184 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBMessagingTurboModules.h" + + +@implementation NativeRNFBTurboMessagingSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + +@implementation RCTCxxConvert (NativeRNFBTurboMessaging_IOSPermissions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboMessaging_IOSPermissions:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getInitialNotification(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getInitialNotification", @selector(getInitialNotification:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getDidOpenSettingsForNotification(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getDidOpenSettingsForNotification", @selector(getDidOpenSettingsForNotification:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_setAutoInitEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setAutoInitEnabled", @selector(setAutoInitEnabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_signalBackgroundMessageHandlerSet(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "signalBackgroundMessageHandlerSet", @selector(signalBackgroundMessageHandlerSet), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_completeNotificationProcessing(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "completeNotificationProcessing", @selector(completeNotificationProcessing), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getToken", @selector(getToken:senderId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_deleteToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "deleteToken", @selector(deleteToken:senderId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getAPNSToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getAPNSToken", @selector(getAPNSToken:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_setAPNSToken(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setAPNSToken", @selector(setAPNSToken:type:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getIsHeadless(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getIsHeadless", @selector(getIsHeadless:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_requestPermission(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "requestPermission", @selector(requestPermission:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_registerForRemoteNotifications(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "registerForRemoteNotifications", @selector(registerForRemoteNotifications:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_unregisterForRemoteNotifications(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "unregisterForRemoteNotifications", @selector(unregisterForRemoteNotifications:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_hasPermission(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "hasPermission", @selector(hasPermission:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_sendMessage(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "sendMessage", @selector(sendMessage:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_subscribeToTopic(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "subscribeToTopic", @selector(subscribeToTopic:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_unsubscribeFromTopic(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "unsubscribeFromTopic", @selector(unsubscribeFromTopic:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_setDeliveryMetricsExportToBigQuery(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setDeliveryMetricsExportToBigQuery", @selector(setDeliveryMetricsExportToBigQuery:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_setNotificationDelegationEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setNotificationDelegationEnabled", @selector(setNotificationDelegationEnabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_isNotificationDelegationEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "isNotificationDelegationEnabled", @selector(isNotificationDelegationEnabled:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboMessagingSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + NativeRNFBTurboMessagingSpecJSI::NativeRNFBTurboMessagingSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["getInitialNotification"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getInitialNotification}; + + + methodMap_["getDidOpenSettingsForNotification"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getDidOpenSettingsForNotification}; + + + methodMap_["setAutoInitEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_setAutoInitEnabled}; + + + methodMap_["signalBackgroundMessageHandlerSet"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_signalBackgroundMessageHandlerSet}; + + + methodMap_["completeNotificationProcessing"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_completeNotificationProcessing}; + + + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getToken}; + + + methodMap_["deleteToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingSpecJSI_deleteToken}; + + + methodMap_["getAPNSToken"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getAPNSToken}; + + + methodMap_["setAPNSToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingSpecJSI_setAPNSToken}; + + + methodMap_["getIsHeadless"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getIsHeadless}; + + + methodMap_["requestPermission"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_requestPermission}; + setMethodArgConversionSelector(@"requestPermission", 0, @"JS_NativeRNFBTurboMessaging_IOSPermissions:"); + + methodMap_["registerForRemoteNotifications"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_registerForRemoteNotifications}; + + + methodMap_["unregisterForRemoteNotifications"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_unregisterForRemoteNotifications}; + + + methodMap_["hasPermission"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_hasPermission}; + + + methodMap_["sendMessage"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_sendMessage}; + + + methodMap_["subscribeToTopic"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_subscribeToTopic}; + + + methodMap_["unsubscribeFromTopic"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_unsubscribeFromTopic}; + + + methodMap_["setDeliveryMetricsExportToBigQuery"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_setDeliveryMetricsExportToBigQuery}; + + + methodMap_["setNotificationDelegationEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingSpecJSI_setNotificationDelegationEnabled}; + + + methodMap_["isNotificationDelegationEnabled"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_isNotificationDelegationEnabled}; + + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingSpecJSI_getConstants}; + + } +} // namespace facebook::react diff --git a/packages/messaging/ios/generated/RNFBMessagingTurboModules/RNFBMessagingTurboModules.h b/packages/messaging/ios/generated/RNFBMessagingTurboModules/RNFBMessagingTurboModules.h new file mode 100644 index 0000000000..08342b4b7c --- /dev/null +++ b/packages/messaging/ios/generated/RNFBMessagingTurboModules/RNFBMessagingTurboModules.h @@ -0,0 +1,219 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBMessagingTurboModules symbols +#ifndef RNFBMessagingTurboModules_H +#define RNFBMessagingTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN +namespace JS { + namespace NativeRNFBTurboMessaging { + struct IOSPermissions { + std::optional alert() const; + std::optional announcement() const; + std::optional badge() const; + std::optional carPlay() const; + std::optional criticalAlert() const; + std::optional provisional() const; + std::optional sound() const; + std::optional providesAppNotificationSettings() const; + + IOSPermissions(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboMessaging_IOSPermissions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboMessaging_IOSPermissions:(id)json; +@end +namespace JS { + namespace NativeRNFBTurboMessaging { + struct Constants { + + struct Builder { + struct Input { + RCTRequired isAutoInitEnabled; + RCTRequired isDeliveryMetricsExportToBigQueryEnabled; + std::optional isRegisteredForRemoteNotifications; + std::optional isNotificationDelegationEnabled; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeRNFBTurboMessagingSpec + +- (void)getInitialNotification:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getDidOpenSettingsForNotification:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setAutoInitEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)signalBackgroundMessageHandlerSet; +- (void)completeNotificationProcessing; +- (void)getToken:(NSString *)appName + senderId:(NSString *)senderId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)deleteToken:(NSString *)appName + senderId:(NSString *)senderId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getAPNSToken:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setAPNSToken:(NSString *)token + type:(NSString *)type + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getIsHeadless:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)requestPermission:(JS::NativeRNFBTurboMessaging::IOSPermissions &)permissions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)registerForRemoteNotifications:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)unregisterForRemoteNotifications:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)hasPermission:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)sendMessage:(NSDictionary *)remoteMessageMap + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)subscribeToTopic:(NSString *)topic + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)unsubscribeFromTopic:(NSString *)topic + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setDeliveryMetricsExportToBigQuery:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setNotificationDelegationEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)isNotificationDelegationEnabled:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end + +@interface NativeRNFBTurboMessagingSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboMessaging' + */ + class JSI_EXPORT NativeRNFBTurboMessagingSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboMessagingSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +inline std::optional JS::NativeRNFBTurboMessaging::IOSPermissions::alert() const +{ + id const p = _v[@"alert"]; + return RCTBridgingToOptionalBool(p); +} +inline std::optional JS::NativeRNFBTurboMessaging::IOSPermissions::announcement() const +{ + id const p = _v[@"announcement"]; + return RCTBridgingToOptionalBool(p); +} +inline std::optional JS::NativeRNFBTurboMessaging::IOSPermissions::badge() const +{ + id const p = _v[@"badge"]; + return RCTBridgingToOptionalBool(p); +} +inline std::optional JS::NativeRNFBTurboMessaging::IOSPermissions::carPlay() const +{ + id const p = _v[@"carPlay"]; + return RCTBridgingToOptionalBool(p); +} +inline std::optional JS::NativeRNFBTurboMessaging::IOSPermissions::criticalAlert() const +{ + id const p = _v[@"criticalAlert"]; + return RCTBridgingToOptionalBool(p); +} +inline std::optional JS::NativeRNFBTurboMessaging::IOSPermissions::provisional() const +{ + id const p = _v[@"provisional"]; + return RCTBridgingToOptionalBool(p); +} +inline std::optional JS::NativeRNFBTurboMessaging::IOSPermissions::sound() const +{ + id const p = _v[@"sound"]; + return RCTBridgingToOptionalBool(p); +} +inline std::optional JS::NativeRNFBTurboMessaging::IOSPermissions::providesAppNotificationSettings() const +{ + id const p = _v[@"providesAppNotificationSettings"]; + return RCTBridgingToOptionalBool(p); +} +inline JS::NativeRNFBTurboMessaging::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto isAutoInitEnabled = i.isAutoInitEnabled.get(); + d[@"isAutoInitEnabled"] = @(isAutoInitEnabled); + auto isDeliveryMetricsExportToBigQueryEnabled = i.isDeliveryMetricsExportToBigQueryEnabled.get(); + d[@"isDeliveryMetricsExportToBigQueryEnabled"] = @(isDeliveryMetricsExportToBigQueryEnabled); + auto isRegisteredForRemoteNotifications = i.isRegisteredForRemoteNotifications; + d[@"isRegisteredForRemoteNotifications"] = isRegisteredForRemoteNotifications.has_value() ? @((BOOL)isRegisteredForRemoteNotifications.value()) : nil; + auto isNotificationDelegationEnabled = i.isNotificationDelegationEnabled; + d[@"isNotificationDelegationEnabled"] = isNotificationDelegationEnabled.has_value() ? @((BOOL)isNotificationDelegationEnabled.value()) : nil; + return d; +}) {} +inline JS::NativeRNFBTurboMessaging::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +NS_ASSUME_NONNULL_END +#endif // RNFBMessagingTurboModules_H diff --git a/packages/messaging/ios/generated/RNFBMessagingTurboModulesJSI-generated.cpp b/packages/messaging/ios/generated/RNFBMessagingTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..5c1b92935c --- /dev/null +++ b/packages/messaging/ios/generated/RNFBMessagingTurboModulesJSI-generated.cpp @@ -0,0 +1,161 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBMessagingTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getInitialNotification(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getInitialNotification( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getDidOpenSettingsForNotification(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getDidOpenSettingsForNotification( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setAutoInitEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAutoInitEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_signalBackgroundMessageHandlerSet(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->signalBackgroundMessageHandlerSet( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_completeNotificationProcessing(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->completeNotificationProcessing( + rt + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_deleteToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getAPNSToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getAPNSToken( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setAPNSToken(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setAPNSToken( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 || args[1].isUndefined() ? std::nullopt : std::make_optional(args[1].asString(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getIsHeadless(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getIsHeadless( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_requestPermission(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->requestPermission( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_registerForRemoteNotifications(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->registerForRemoteNotifications( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_unregisterForRemoteNotifications(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->unregisterForRemoteNotifications( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_hasPermission(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->hasPermission( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_sendMessage(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->sendMessage( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_subscribeToTopic(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->subscribeToTopic( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_unsubscribeFromTopic(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->unsubscribeFromTopic( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setDeliveryMetricsExportToBigQuery(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setDeliveryMetricsExportToBigQuery( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setNotificationDelegationEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setNotificationDelegationEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_isNotificationDelegationEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->isNotificationDelegationEnabled( + rt + ); +} + +NativeRNFBTurboMessagingCxxSpecJSI::NativeRNFBTurboMessagingCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboMessaging", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getConstants}; + methodMap_["getInitialNotification"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getInitialNotification}; + methodMap_["getDidOpenSettingsForNotification"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getDidOpenSettingsForNotification}; + methodMap_["setAutoInitEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setAutoInitEnabled}; + methodMap_["signalBackgroundMessageHandlerSet"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_signalBackgroundMessageHandlerSet}; + methodMap_["completeNotificationProcessing"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_completeNotificationProcessing}; + methodMap_["getToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getToken}; + methodMap_["deleteToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_deleteToken}; + methodMap_["getAPNSToken"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getAPNSToken}; + methodMap_["setAPNSToken"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setAPNSToken}; + methodMap_["getIsHeadless"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_getIsHeadless}; + methodMap_["requestPermission"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_requestPermission}; + methodMap_["registerForRemoteNotifications"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_registerForRemoteNotifications}; + methodMap_["unregisterForRemoteNotifications"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_unregisterForRemoteNotifications}; + methodMap_["hasPermission"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_hasPermission}; + methodMap_["sendMessage"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_sendMessage}; + methodMap_["subscribeToTopic"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_subscribeToTopic}; + methodMap_["unsubscribeFromTopic"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_unsubscribeFromTopic}; + methodMap_["setDeliveryMetricsExportToBigQuery"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setDeliveryMetricsExportToBigQuery}; + methodMap_["setNotificationDelegationEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_setNotificationDelegationEnabled}; + methodMap_["isNotificationDelegationEnabled"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboMessagingCxxSpecJSI_isNotificationDelegationEnabled}; +} + + +} // namespace facebook::react diff --git a/packages/messaging/ios/generated/RNFBMessagingTurboModulesJSI.h b/packages/messaging/ios/generated/RNFBMessagingTurboModulesJSI.h new file mode 100644 index 0000000000..c248e7f436 --- /dev/null +++ b/packages/messaging/ios/generated/RNFBMessagingTurboModulesJSI.h @@ -0,0 +1,356 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboMessagingIOSPermissions + +template +struct NativeRNFBTurboMessagingIOSPermissions { + P0 alert; + P1 announcement; + P2 badge; + P3 carPlay; + P4 criticalAlert; + P5 provisional; + P6 sound; + P7 providesAppNotificationSettings; + bool operator==(const NativeRNFBTurboMessagingIOSPermissions &other) const { + return alert == other.alert && announcement == other.announcement && badge == other.badge && carPlay == other.carPlay && criticalAlert == other.criticalAlert && provisional == other.provisional && sound == other.sound && providesAppNotificationSettings == other.providesAppNotificationSettings; + } +}; + +template +struct NativeRNFBTurboMessagingIOSPermissionsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "alert"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "announcement"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "badge"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "carPlay"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "criticalAlert"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "provisional"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "sound"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "providesAppNotificationSettings"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool alertToJs(jsi::Runtime &rt, decltype(types.alert) value) { + return bridging::toJs(rt, value); + } + + static bool announcementToJs(jsi::Runtime &rt, decltype(types.announcement) value) { + return bridging::toJs(rt, value); + } + + static bool badgeToJs(jsi::Runtime &rt, decltype(types.badge) value) { + return bridging::toJs(rt, value); + } + + static bool carPlayToJs(jsi::Runtime &rt, decltype(types.carPlay) value) { + return bridging::toJs(rt, value); + } + + static bool criticalAlertToJs(jsi::Runtime &rt, decltype(types.criticalAlert) value) { + return bridging::toJs(rt, value); + } + + static bool provisionalToJs(jsi::Runtime &rt, decltype(types.provisional) value) { + return bridging::toJs(rt, value); + } + + static bool soundToJs(jsi::Runtime &rt, decltype(types.sound) value) { + return bridging::toJs(rt, value); + } + + static bool providesAppNotificationSettingsToJs(jsi::Runtime &rt, decltype(types.providesAppNotificationSettings) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + if (value.alert) { + result.setProperty(rt, "alert", bridging::toJs(rt, value.alert.value(), jsInvoker)); + } + if (value.announcement) { + result.setProperty(rt, "announcement", bridging::toJs(rt, value.announcement.value(), jsInvoker)); + } + if (value.badge) { + result.setProperty(rt, "badge", bridging::toJs(rt, value.badge.value(), jsInvoker)); + } + if (value.carPlay) { + result.setProperty(rt, "carPlay", bridging::toJs(rt, value.carPlay.value(), jsInvoker)); + } + if (value.criticalAlert) { + result.setProperty(rt, "criticalAlert", bridging::toJs(rt, value.criticalAlert.value(), jsInvoker)); + } + if (value.provisional) { + result.setProperty(rt, "provisional", bridging::toJs(rt, value.provisional.value(), jsInvoker)); + } + if (value.sound) { + result.setProperty(rt, "sound", bridging::toJs(rt, value.sound.value(), jsInvoker)); + } + if (value.providesAppNotificationSettings) { + result.setProperty(rt, "providesAppNotificationSettings", bridging::toJs(rt, value.providesAppNotificationSettings.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboMessagingCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboMessagingCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value getInitialNotification(jsi::Runtime &rt) = 0; + virtual jsi::Value getDidOpenSettingsForNotification(jsi::Runtime &rt) = 0; + virtual jsi::Value setAutoInitEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual void signalBackgroundMessageHandlerSet(jsi::Runtime &rt) = 0; + virtual void completeNotificationProcessing(jsi::Runtime &rt) = 0; + virtual jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, jsi::String senderId) = 0; + virtual jsi::Value deleteToken(jsi::Runtime &rt, jsi::String appName, jsi::String senderId) = 0; + virtual jsi::Value getAPNSToken(jsi::Runtime &rt) = 0; + virtual jsi::Value setAPNSToken(jsi::Runtime &rt, jsi::String token, std::optional type) = 0; + virtual jsi::Value getIsHeadless(jsi::Runtime &rt) = 0; + virtual jsi::Value requestPermission(jsi::Runtime &rt, jsi::Object permissions) = 0; + virtual jsi::Value registerForRemoteNotifications(jsi::Runtime &rt) = 0; + virtual jsi::Value unregisterForRemoteNotifications(jsi::Runtime &rt) = 0; + virtual jsi::Value hasPermission(jsi::Runtime &rt) = 0; + virtual jsi::Value sendMessage(jsi::Runtime &rt, jsi::Object remoteMessageMap) = 0; + virtual jsi::Value subscribeToTopic(jsi::Runtime &rt, jsi::String topic) = 0; + virtual jsi::Value unsubscribeFromTopic(jsi::Runtime &rt, jsi::String topic) = 0; + virtual jsi::Value setDeliveryMetricsExportToBigQuery(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value setNotificationDelegationEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value isNotificationDelegationEnabled(jsi::Runtime &rt) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboMessagingCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboMessaging"; + +protected: + NativeRNFBTurboMessagingCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboMessagingCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboMessagingCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboMessagingCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value getInitialNotification(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getInitialNotification) == 1, + "Expected getInitialNotification(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getInitialNotification, jsInvoker_, instance_); + } + jsi::Value getDidOpenSettingsForNotification(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getDidOpenSettingsForNotification) == 1, + "Expected getDidOpenSettingsForNotification(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getDidOpenSettingsForNotification, jsInvoker_, instance_); + } + jsi::Value setAutoInitEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setAutoInitEnabled) == 2, + "Expected setAutoInitEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setAutoInitEnabled, jsInvoker_, instance_, std::move(enabled)); + } + void signalBackgroundMessageHandlerSet(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::signalBackgroundMessageHandlerSet) == 1, + "Expected signalBackgroundMessageHandlerSet(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::signalBackgroundMessageHandlerSet, jsInvoker_, instance_); + } + void completeNotificationProcessing(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::completeNotificationProcessing) == 1, + "Expected completeNotificationProcessing(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::completeNotificationProcessing, jsInvoker_, instance_); + } + jsi::Value getToken(jsi::Runtime &rt, jsi::String appName, jsi::String senderId) override { + static_assert( + bridging::getParameterCount(&T::getToken) == 3, + "Expected getToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getToken, jsInvoker_, instance_, std::move(appName), std::move(senderId)); + } + jsi::Value deleteToken(jsi::Runtime &rt, jsi::String appName, jsi::String senderId) override { + static_assert( + bridging::getParameterCount(&T::deleteToken) == 3, + "Expected deleteToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::deleteToken, jsInvoker_, instance_, std::move(appName), std::move(senderId)); + } + jsi::Value getAPNSToken(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getAPNSToken) == 1, + "Expected getAPNSToken(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getAPNSToken, jsInvoker_, instance_); + } + jsi::Value setAPNSToken(jsi::Runtime &rt, jsi::String token, std::optional type) override { + static_assert( + bridging::getParameterCount(&T::setAPNSToken) == 3, + "Expected setAPNSToken(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setAPNSToken, jsInvoker_, instance_, std::move(token), std::move(type)); + } + jsi::Value getIsHeadless(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getIsHeadless) == 1, + "Expected getIsHeadless(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getIsHeadless, jsInvoker_, instance_); + } + jsi::Value requestPermission(jsi::Runtime &rt, jsi::Object permissions) override { + static_assert( + bridging::getParameterCount(&T::requestPermission) == 2, + "Expected requestPermission(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::requestPermission, jsInvoker_, instance_, std::move(permissions)); + } + jsi::Value registerForRemoteNotifications(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::registerForRemoteNotifications) == 1, + "Expected registerForRemoteNotifications(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::registerForRemoteNotifications, jsInvoker_, instance_); + } + jsi::Value unregisterForRemoteNotifications(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::unregisterForRemoteNotifications) == 1, + "Expected unregisterForRemoteNotifications(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::unregisterForRemoteNotifications, jsInvoker_, instance_); + } + jsi::Value hasPermission(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::hasPermission) == 1, + "Expected hasPermission(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::hasPermission, jsInvoker_, instance_); + } + jsi::Value sendMessage(jsi::Runtime &rt, jsi::Object remoteMessageMap) override { + static_assert( + bridging::getParameterCount(&T::sendMessage) == 2, + "Expected sendMessage(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::sendMessage, jsInvoker_, instance_, std::move(remoteMessageMap)); + } + jsi::Value subscribeToTopic(jsi::Runtime &rt, jsi::String topic) override { + static_assert( + bridging::getParameterCount(&T::subscribeToTopic) == 2, + "Expected subscribeToTopic(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::subscribeToTopic, jsInvoker_, instance_, std::move(topic)); + } + jsi::Value unsubscribeFromTopic(jsi::Runtime &rt, jsi::String topic) override { + static_assert( + bridging::getParameterCount(&T::unsubscribeFromTopic) == 2, + "Expected unsubscribeFromTopic(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::unsubscribeFromTopic, jsInvoker_, instance_, std::move(topic)); + } + jsi::Value setDeliveryMetricsExportToBigQuery(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setDeliveryMetricsExportToBigQuery) == 2, + "Expected setDeliveryMetricsExportToBigQuery(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setDeliveryMetricsExportToBigQuery, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value setNotificationDelegationEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setNotificationDelegationEnabled) == 2, + "Expected setNotificationDelegationEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setNotificationDelegationEnabled, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value isNotificationDelegationEnabled(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::isNotificationDelegationEnabled) == 1, + "Expected isNotificationDelegationEnabled(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::isNotificationDelegationEnabled, jsInvoker_, instance_); + } + + private: + friend class NativeRNFBTurboMessagingCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/messaging/ios/generated/ReactAppDependencyProvider.podspec b/packages/messaging/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/messaging/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/messaging/lib/index.ts b/packages/messaging/lib/index.ts index ac113e884b..0e2753263a 100644 --- a/packages/messaging/lib/index.ts +++ b/packages/messaging/lib/index.ts @@ -31,6 +31,7 @@ import { } from '@react-native-firebase/app/dist/module/internal'; import type { ModuleConfig } from '@react-native-firebase/app/dist/module/internal'; import { getReactNativeModule } from '@react-native-firebase/app/dist/module/internal/nativeModule'; +import { UTILS_NATIVE_MODULE } from '@react-native-firebase/app/dist/module/internal/constants'; import './types/internal'; import type { FirebaseApp } from '@react-native-firebase/app'; import type { ReactNativeFirebase } from '@react-native-firebase/app'; @@ -52,7 +53,7 @@ import type { } from './types/messaging'; import { version } from './version'; -const nativeModuleName = 'RNFBMessagingModule'; +const nativeModuleName = 'NativeRNFBTurboMessaging'; let backgroundMessageHandler: ((remoteMessage: RemoteMessage) => Promise) | undefined; let openSettingsForNotificationHandler: ((remoteMessage: RemoteMessage) => any) | undefined; @@ -80,9 +81,7 @@ class FirebaseMessagingModule extends FirebaseModule im ? this.native.isRegisteredForRemoteNotifications : true; this._isNotificationDelegationEnabled = - this.native.isNotificationDelegationEnabled != null - ? this.native.isNotificationDelegationEnabled - : false; + this.native.getConstants?.()?.isNotificationDelegationEnabled ?? false; AppRegistry.registerHeadlessTask('ReactNativeFirebaseMessagingHeadlessTask', () => { if (!backgroundMessageHandler) { @@ -495,13 +494,18 @@ class FirebaseMessagingModule extends FirebaseModule im async isSupported(): Promise { if (isAndroid) { - const utilsNativeModule = getReactNativeModule('RNFBUtilsModule'); + // NewArch-AD-18 E6: cross-package Play Services availability via utils host. + const utilsNativeModule = getReactNativeModule(UTILS_NATIVE_MODULE); if (!utilsNativeModule) { return false; } - const playServicesAvailability = utilsNativeModule.androidPlayServices as - | { isAvailable?: boolean } + const androidGetPlayServicesStatus = utilsNativeModule.androidGetPlayServicesStatus as + | (() => Promise<{ isAvailable?: boolean }>) | undefined; + if (typeof androidGetPlayServicesStatus !== 'function') { + return false; + } + const playServicesAvailability = await androidGetPlayServicesStatus(); return playServicesAvailability?.isAvailable ?? false; } return true; @@ -524,6 +528,7 @@ const config: ModuleConfig = { ], hasMultiAppSupport: false, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; export const SDK_VERSION = version; @@ -561,7 +566,10 @@ export function getToken( } /** - * When any FCM payload is received, the listener callback is called with a `RemoteMessage`. + * Subscribes to foreground FCM messages. + * + * @remarks Event delivery uses the legacy native event proxy shared across RN Firebase modules + * (not yet migrated to Codegen TurboModule events). Behavior matches pre-v26 releases. */ export function onMessage( messaging: Messaging, @@ -573,6 +581,9 @@ export function onMessage( /** * When the user presses a notification displayed via FCM, this listener will be called if the app * has opened from a background state. + * + * @remarks Event delivery uses the legacy native event proxy shared across RN Firebase modules + * (not yet migrated to Codegen TurboModule events). Behavior matches pre-v26 releases. */ export function onNotificationOpenedApp( messaging: Messaging, @@ -583,6 +594,9 @@ export function onNotificationOpenedApp( /** * Called when a new registration token is generated for the device. + * + * @remarks Event delivery uses the legacy native event proxy shared across RN Firebase modules + * (not yet migrated to Codegen TurboModule events). Behavior matches pre-v26 releases. */ export function onTokenRefresh(messaging: Messaging, listener: (token: string) => any): () => void { return messaging.onTokenRefresh(listener); @@ -665,14 +679,19 @@ export function unregisterDeviceForRemoteMessages(messaging: Messaging): Promise } /** - * On iOS, it is possible to get the users APNs token. + * Returns the APNs device token on iOS. + * + * @remarks **iOS only.** Returns `null` when no token is available. There is no firebase-js-sdk + * modular equivalent — web push uses a different token lifecycle. */ export function getAPNSToken(messaging: Messaging): Promise { return messaging.getAPNSToken(); } /** - * On iOS, sets the APNs Token received by the application delegate. + * Sets the APNs device token received by the application delegate. + * + * @remarks **iOS only.** `type` must be `'prod'`, `'sandbox'`, or `'unknown'`. */ export function setAPNSToken(messaging: Messaging, token: string, type?: string): Promise { return messaging.setAPNSToken(token, type); @@ -692,6 +711,9 @@ export function hasPermission(messaging: Messaging): Promise void): () => void { return messaging.onDeletedMessages(listener); @@ -710,6 +732,9 @@ export function onMessageSent( /** * When sending a `RemoteMessage`, this listener is called when an error is thrown and the * message could not be sent. + * + * @remarks Event delivery uses the legacy native event proxy shared across RN Firebase modules + * (not yet migrated to Codegen TurboModule events). Behavior matches pre-v26 releases. */ export function onSendError( messaging: Messaging, @@ -720,6 +745,9 @@ export function onSendError( /** * Set a message handler function which is called when the app is in the background or terminated. + * + * @remarks Event delivery uses the legacy native event proxy shared across RN Firebase modules + * (not yet migrated to Codegen TurboModule events). Behavior matches pre-v26 releases. */ export function setBackgroundMessageHandler( messaging: Messaging, diff --git a/packages/messaging/lib/types/internal.ts b/packages/messaging/lib/types/internal.ts index 02a32bb31f..2e97665ea7 100644 --- a/packages/messaging/lib/types/internal.ts +++ b/packages/messaging/lib/types/internal.ts @@ -18,13 +18,18 @@ import type { IOSPermissions, RemoteMessage } from './messaging'; /** - * Wrapped native module contract for `RNFBMessagingModule`. + * Wrapped native module contract for `NativeRNFBTurboMessaging`. */ -export interface RNFBMessagingModule { +export interface NativeRNFBTurboMessaging { + getConstants?(): { + isAutoInitEnabled?: boolean; + isDeliveryMetricsExportToBigQueryEnabled?: boolean; + isRegisteredForRemoteNotifications?: boolean; + isNotificationDelegationEnabled?: boolean; + }; isAutoInitEnabled?: boolean; isDeliveryMetricsExportToBigQueryEnabled?: boolean; isRegisteredForRemoteNotifications?: boolean; - isNotificationDelegationEnabled?: boolean; setAutoInitEnabled(enabled: boolean): Promise; getInitialNotification(): Promise; getDidOpenSettingsForNotification(): Promise; @@ -43,11 +48,12 @@ export interface RNFBMessagingModule { subscribeToTopic(topic: string): Promise; unsubscribeFromTopic(topic: string): Promise; setDeliveryMetricsExportToBigQuery(enabled: boolean): Promise; + isNotificationDelegationEnabled(): Promise; setNotificationDelegationEnabled(enabled: boolean): Promise; } declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBMessagingModule: RNFBMessagingModule; + NativeRNFBTurboMessaging: NativeRNFBTurboMessaging; } } diff --git a/packages/messaging/package.json b/packages/messaging/package.json index 5db09cae94..f3c678ac5c 100644 --- a/packages/messaging/package.json +++ b/packages/messaging/package.json @@ -5,13 +5,30 @@ "description": "React Native Firebase - React Native Firebase provides native integration of Firebase Cloud Messaging (FCM) for both Android & iOS. FCM is a cost free service, allowing for server-device and device-device communication. The React Native Firebase Messaging module provides a simple JavaScript API to interact with FCM.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBMessagingTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.messaging" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboMessaging": "RNFBMessagingModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "build:plugin": "rimraf plugin/build && tsc --build plugin", "lint:plugin": "eslint plugin/src/*", "compile": "bob build", - "prepare": "yarn run build && yarn compile && yarn run build:plugin" + "prepare": "yarn run build && yarn compile && yarn run build:plugin", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/main/java/io/invertase/firebase/messaging/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/messaging/react-native.config.js b/packages/messaging/react-native.config.js new file mode 100644 index 0000000000..159aafc244 --- /dev/null +++ b/packages/messaging/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/main/java/io/invertase/firebase/messaging/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/messaging/specs/NativeRNFBTurboMessaging.ts b/packages/messaging/specs/NativeRNFBTurboMessaging.ts new file mode 100644 index 0000000000..1c12a40cf0 --- /dev/null +++ b/packages/messaging/specs/NativeRNFBTurboMessaging.ts @@ -0,0 +1,46 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface IOSPermissions { + alert?: boolean; + announcement?: boolean; + badge?: boolean; + carPlay?: boolean; + criticalAlert?: boolean; + provisional?: boolean; + sound?: boolean; + providesAppNotificationSettings?: boolean; +} + +export interface Spec extends TurboModule { + getConstants(): { + isAutoInitEnabled: boolean; + isDeliveryMetricsExportToBigQueryEnabled: boolean; + isRegisteredForRemoteNotifications?: boolean; + isNotificationDelegationEnabled?: boolean; + }; + + getInitialNotification(): Promise; + getDidOpenSettingsForNotification(): Promise; + setAutoInitEnabled(enabled: boolean): Promise; + signalBackgroundMessageHandlerSet(): void; + completeNotificationProcessing(): void; + getToken(appName: string, senderId: string): Promise; + deleteToken(appName: string, senderId: string): Promise; + getAPNSToken(): Promise; + setAPNSToken(token: string, type?: string): Promise; + getIsHeadless(): Promise; + requestPermission(permissions: IOSPermissions): Promise; + registerForRemoteNotifications(): Promise; + unregisterForRemoteNotifications(): Promise; + hasPermission(): Promise; + sendMessage(remoteMessageMap: Object): Promise; + subscribeToTopic(topic: string): Promise; + unsubscribeFromTopic(topic: string): Promise; + setDeliveryMetricsExportToBigQuery(enabled: boolean): Promise; + setNotificationDelegationEnabled(enabled: boolean): Promise; + isNotificationDelegationEnabled(): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboMessaging'); diff --git a/packages/messaging/type-test.ts b/packages/messaging/type-test.ts index d111e32af0..303ad167bd 100644 --- a/packages/messaging/type-test.ts +++ b/packages/messaging/type-test.ts @@ -147,22 +147,16 @@ const modularUnsubscribeOnMessageSent = onMessageSent(modularMessaging1, (messag }); modularUnsubscribeOnMessageSent(); -const modularUnsubscribeOnSendError = onSendError( - modularMessaging1, - (evt: SendErrorEvent) => { - console.log(evt.messageId); - console.log(evt.error); - }, -); +const modularUnsubscribeOnSendError = onSendError(modularMessaging1, (evt: SendErrorEvent) => { + console.log(evt.messageId); + console.log(evt.error); +}); modularUnsubscribeOnSendError(); -setBackgroundMessageHandler( - modularMessaging1, - async (message: RemoteMessage) => { - console.log(message.data); - return Promise.resolve(); - }, -); +setBackgroundMessageHandler(modularMessaging1, async (message: RemoteMessage) => { + console.log(message.data); + return Promise.resolve(); +}); setOpenSettingsForNotificationsHandler(modularMessaging1, (message: RemoteMessage) => { console.log(message.data); diff --git a/packages/ml/RNFBML.podspec b/packages/ml/RNFBML.podspec index 4ab7f0a7df..44b2eefd11 100644 --- a/packages/ml/RNFBML.podspec +++ b/packages/ml/RNFBML.podspec @@ -29,15 +29,16 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.private_header_files = "ios/**/*.h" + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/ml/__tests__/nativeModuleContract.test.ts b/packages/ml/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..1291c82cf1 --- /dev/null +++ b/packages/ml/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { TurboModuleRegistry } from 'react-native'; +import type { ModuleConfig } from '@react-native-firebase/app/dist/module/internal'; +import FirebaseModule from '@react-native-firebase/app/dist/module/internal/FirebaseModule'; +import { getNativeModule } from '@react-native-firebase/app/dist/module/internal/registry/nativeModule'; +import type { WrappedNativeModule } from '@react-native-firebase/app/dist/module/internal/NativeModules'; +import { createTurboModuleFixture } from '../../app/__tests__/turboModuleContractHelper'; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('resolves an empty stub turbo module through the real wrapper', function () { + const raw = createTurboModuleFixture(); + jest.mocked(TurboModuleRegistry.get).mockReturnValueOnce(raw); + + const config: ModuleConfig = { + namespace: 'ml', + nativeModuleName: 'NativeRNFBTurboML', + nativeEvents: false, + hasMultiAppSupport: true, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + }; + + class ContractModule extends FirebaseModule { + constructor() { + super({ name: '[DEFAULT]' } as any, config); + } + } + + const wrapped = getNativeModule(new ContractModule()) as WrappedNativeModule; + expect(wrapped).toBeDefined(); + expect(Object.keys(wrapped)).toEqual([]); + }); +}); diff --git a/packages/ml/android/build.gradle b/packages/ml/android/build.gradle index b05bb6fa43..6ceadccd99 100644 --- a/packages/ml/android/build.gradle +++ b/packages/ml/android/build.gradle @@ -81,6 +81,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -100,3 +101,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/ml") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/NativeRNFBTurboML.java b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/NativeRNFBTurboML.java new file mode 100644 index 0000000000..5c08189f16 --- /dev/null +++ b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/NativeRNFBTurboML.java @@ -0,0 +1,27 @@ +package io.invertase.firebase.ml; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import com.facebook.fbreact.specs.NativeRNFBTurboMLSpec; +import com.facebook.react.bridge.ReactApplicationContext; + +public class NativeRNFBTurboML extends NativeRNFBTurboMLSpec { + public NativeRNFBTurboML(ReactApplicationContext reactContext) { + super(reactContext); + } +} diff --git a/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/ReactNativeFirebaseMLPackage.java b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/ReactNativeFirebaseMLPackage.java index ffb7c9c8a9..1481f89bad 100644 --- a/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/ReactNativeFirebaseMLPackage.java +++ b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/ReactNativeFirebaseMLPackage.java @@ -32,6 +32,7 @@ public class ReactNativeFirebaseMLPackage implements ReactPackage { @Override public List createNativeModules(@Nonnull ReactApplicationContext reactContext) { List modules = new ArrayList<>(); + modules.add(new NativeRNFBTurboML(reactContext)); return modules; } diff --git a/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboMLSpec.java b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboMLSpec.java new file mode 100644 index 0000000000..3e476a2556 --- /dev/null +++ b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboMLSpec.java @@ -0,0 +1,35 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboMLSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboML"; + + public NativeRNFBTurboMLSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + +} diff --git a/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/CMakeLists.txt b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..669b36f63a --- /dev/null +++ b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBMLTurboModules/*.cpp) + +add_library( + react_codegen_RNFBMLTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBMLTurboModules PUBLIC . react/renderer/components/RNFBMLTurboModules) + +target_link_libraries( + react_codegen_RNFBMLTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBMLTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/RNFBMLTurboModules-generated.cpp b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/RNFBMLTurboModules-generated.cpp new file mode 100644 index 0000000000..8b735ce82a --- /dev/null +++ b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/RNFBMLTurboModules-generated.cpp @@ -0,0 +1,29 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBMLTurboModules.h" + +namespace facebook::react { + + + +NativeRNFBTurboMLSpecJSI::NativeRNFBTurboMLSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + +} + +std::shared_ptr RNFBMLTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboML") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/RNFBMLTurboModules.h b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/RNFBMLTurboModules.h new file mode 100644 index 0000000000..1c62f64436 --- /dev/null +++ b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/RNFBMLTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboML' + */ +class JSI_EXPORT NativeRNFBTurboMLSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboMLSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBMLTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/react/renderer/components/RNFBMLTurboModules/RNFBMLTurboModulesJSI-generated.cpp b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/react/renderer/components/RNFBMLTurboModules/RNFBMLTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..50e4c17953 --- /dev/null +++ b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/react/renderer/components/RNFBMLTurboModules/RNFBMLTurboModulesJSI-generated.cpp @@ -0,0 +1,22 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBMLTurboModulesJSI.h" + +namespace facebook::react { + + + +NativeRNFBTurboMLCxxSpecJSI::NativeRNFBTurboMLCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboML", jsInvoker) { + +} + + +} // namespace facebook::react diff --git a/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/react/renderer/components/RNFBMLTurboModules/RNFBMLTurboModulesJSI.h b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/react/renderer/components/RNFBMLTurboModules/RNFBMLTurboModulesJSI.h new file mode 100644 index 0000000000..0de07923d0 --- /dev/null +++ b/packages/ml/android/src/reactnative/java/io/invertase/firebase/ml/generated/jni/react/renderer/components/RNFBMLTurboModules/RNFBMLTurboModulesJSI.h @@ -0,0 +1,64 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboMLCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboMLCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + + +}; + +template +class JSI_EXPORT NativeRNFBTurboMLCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboML"; + +protected: + NativeRNFBTurboMLCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboMLCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboMLCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboMLCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + + + private: + friend class NativeRNFBTurboMLCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/ml/ios/RNFBML/RNFBMLModule.h b/packages/ml/ios/RNFBML/RNFBMLModule.h new file mode 100644 index 0000000000..c81ffc730d --- /dev/null +++ b/packages/ml/ios/RNFBML/RNFBMLModule.h @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import +#import "RNFBMLTurboModules.h" + +@interface RNFBMLModule : NSObject + +@end diff --git a/packages/ml/ios/RNFBML/RNFBMLModule.mm b/packages/ml/ios/RNFBML/RNFBMLModule.mm new file mode 100644 index 0000000000..e59ab53ac9 --- /dev/null +++ b/packages/ml/ios/RNFBML/RNFBMLModule.mm @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import "RNFBMLModule.h" + +@implementation RNFBMLModule + +RCT_EXPORT_MODULE(NativeRNFBTurboML) + ++ (BOOL)requiresMainQueueSetup { + return NO; +} + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +@end diff --git a/packages/ml/ios/generated/RCTAppDependencyProvider.h b/packages/ml/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/ml/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/ml/ios/generated/RCTAppDependencyProvider.mm b/packages/ml/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/ml/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/ml/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/ml/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/ml/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/ml/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/ml/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/ml/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/ml/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/ml/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/ml/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/ml/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/ml/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/ml/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/ml/ios/generated/RNFBMLTurboModules/RNFBMLTurboModules-generated.mm b/packages/ml/ios/generated/RNFBMLTurboModules/RNFBMLTurboModules-generated.mm new file mode 100644 index 0000000000..0ab9a97287 --- /dev/null +++ b/packages/ml/ios/generated/RNFBMLTurboModules/RNFBMLTurboModules-generated.mm @@ -0,0 +1,34 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBMLTurboModules.h" + + +@implementation NativeRNFBTurboMLSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + + NativeRNFBTurboMLSpecJSI::NativeRNFBTurboMLSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + } +} // namespace facebook::react diff --git a/packages/ml/ios/generated/RNFBMLTurboModules/RNFBMLTurboModules.h b/packages/ml/ios/generated/RNFBMLTurboModules/RNFBMLTurboModules.h new file mode 100644 index 0000000000..136e63c33b --- /dev/null +++ b/packages/ml/ios/generated/RNFBMLTurboModules/RNFBMLTurboModules.h @@ -0,0 +1,62 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBMLTurboModules symbols +#ifndef RNFBMLTurboModules_H +#define RNFBMLTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@protocol NativeRNFBTurboMLSpec + + + +@end + +@interface NativeRNFBTurboMLSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboML' + */ + class JSI_EXPORT NativeRNFBTurboMLSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboMLSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +NS_ASSUME_NONNULL_END +#endif // RNFBMLTurboModules_H diff --git a/packages/ml/ios/generated/RNFBMLTurboModulesJSI-generated.cpp b/packages/ml/ios/generated/RNFBMLTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..50e4c17953 --- /dev/null +++ b/packages/ml/ios/generated/RNFBMLTurboModulesJSI-generated.cpp @@ -0,0 +1,22 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBMLTurboModulesJSI.h" + +namespace facebook::react { + + + +NativeRNFBTurboMLCxxSpecJSI::NativeRNFBTurboMLCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboML", jsInvoker) { + +} + + +} // namespace facebook::react diff --git a/packages/ml/ios/generated/RNFBMLTurboModulesJSI.h b/packages/ml/ios/generated/RNFBMLTurboModulesJSI.h new file mode 100644 index 0000000000..0de07923d0 --- /dev/null +++ b/packages/ml/ios/generated/RNFBMLTurboModulesJSI.h @@ -0,0 +1,64 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + class JSI_EXPORT NativeRNFBTurboMLCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboMLCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + + +}; + +template +class JSI_EXPORT NativeRNFBTurboMLCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboML"; + +protected: + NativeRNFBTurboMLCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboMLCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboMLCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboMLCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + + + private: + friend class NativeRNFBTurboMLCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/ml/ios/generated/ReactAppDependencyProvider.podspec b/packages/ml/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/ml/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/ml/lib/index.ts b/packages/ml/lib/index.ts index ccf1a77877..ba50275116 100644 --- a/packages/ml/lib/index.ts +++ b/packages/ml/lib/index.ts @@ -24,7 +24,7 @@ import './types/internal'; import type { FirebaseApp, FirebaseML } from './types/ml'; import { version } from './version'; -const nativeModuleName = 'RNFBMLModule'; +const nativeModuleName = 'NativeRNFBTurboML'; class FirebaseMLModule extends FirebaseModule {} @@ -34,6 +34,7 @@ const config: ModuleConfig = { nativeEvents: false, hasMultiAppSupport: true, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; /** diff --git a/packages/ml/lib/types/internal.ts b/packages/ml/lib/types/internal.ts index a8e2529eed..916e497cfe 100644 --- a/packages/ml/lib/types/internal.ts +++ b/packages/ml/lib/types/internal.ts @@ -24,6 +24,6 @@ export interface RNFBMLModule {} declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBMLModule: RNFBMLModule; + NativeRNFBTurboML: RNFBMLModule; } } diff --git a/packages/ml/package.json b/packages/ml/package.json index 079c999b48..6f66bdd941 100644 --- a/packages/ml/package.json +++ b/packages/ml/package.json @@ -5,11 +5,28 @@ "description": "React Native Firebase - Firebase ML brings the power of machine learning vision to your React Native application, supporting both Android & iOS.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBMLTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.ml" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboML": "RNFBMLModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "compile": "bob build", - "prepare": "yarn run build && yarn compile" + "prepare": "yarn run build && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/reactnative/java/io/invertase/firebase/ml/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/ml/react-native.config.js b/packages/ml/react-native.config.js new file mode 100644 index 0000000000..e164429c53 --- /dev/null +++ b/packages/ml/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/reactnative/java/io/invertase/firebase/ml/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/ml/specs/NativeRNFBTurboML.ts b/packages/ml/specs/NativeRNFBTurboML.ts new file mode 100644 index 0000000000..63fcbf6a04 --- /dev/null +++ b/packages/ml/specs/NativeRNFBTurboML.ts @@ -0,0 +1,6 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface Spec extends TurboModule {} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboML'); diff --git a/packages/perf/RNFBPerf.podspec b/packages/perf/RNFBPerf.podspec index 8456941ddb..4902987ec5 100644 --- a/packages/perf/RNFBPerf.podspec +++ b/packages/perf/RNFBPerf.podspec @@ -28,15 +28,16 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp,swift}' + s.private_header_files = "ios/**/*.h" + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/perf/__tests__/nativeModuleContract.test.ts b/packages/perf/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..5bf288b1b5 --- /dev/null +++ b/packages/perf/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,85 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'setPerformanceCollectionEnabled', + 'instrumentationEnabled', + 'startTrace', + 'stopTrace', + 'startScreenTrace', + 'stopScreenTrace', + 'startHttpMetric', + 'stopHttpMetric', +] as const; + +const SYNC_METHODS = [ + 'startTrace', + 'stopTrace', + 'startScreenTrace', + 'stopScreenTrace', + 'startHttpMetric', + 'stopHttpMetric', +] as const; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper, with sync start/stop', function () { + assertTurboContract( + { + namespace: 'perf', + nativeModuleName: 'NativeRNFBTurboPerf', + nativeEvents: false, + hasMultiAppSupport: false, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + specMethods: SPEC_METHODS, + createMock: method => + jest.fn(() => { + if (SYNC_METHODS.includes(method as (typeof SYNC_METHODS)[number])) { + return undefined; + } + return Promise.resolve(null); + }), + constants: { + isPerformanceCollectionEnabled: true, + isInstrumentationEnabled: true, + }, + assertExtra: wrapped => { + expect(wrapped.isPerformanceCollectionEnabled).toBe(true); + expect(wrapped.isInstrumentationEnabled).toBe(true); + }, + }, + { + startTrace: wrapped => { + const result = wrapped.startTrace(0, 'trace'); + expect(result).toBeUndefined(); + expect(result).not.toBeInstanceOf(Promise); + }, + stopTrace: wrapped => { + const result = wrapped.stopTrace(0, { metrics: {}, attributes: {} }); + expect(result).toBeUndefined(); + expect(result).not.toBeInstanceOf(Promise); + }, + startScreenTrace: wrapped => { + const result = wrapped.startScreenTrace(0, 'screen'); + expect(result).toBeUndefined(); + expect(result).not.toBeInstanceOf(Promise); + }, + stopScreenTrace: wrapped => { + const result = wrapped.stopScreenTrace(0); + expect(result).toBeUndefined(); + expect(result).not.toBeInstanceOf(Promise); + }, + startHttpMetric: wrapped => { + const result = wrapped.startHttpMetric(0, 'https://example.com', 'GET'); + expect(result).toBeUndefined(); + expect(result).not.toBeInstanceOf(Promise); + }, + stopHttpMetric: wrapped => { + const result = wrapped.stopHttpMetric(0, { attributes: {} }); + expect(result).toBeUndefined(); + expect(result).not.toBeInstanceOf(Promise); + }, + }, + ); + }); +}); diff --git a/packages/perf/__tests__/perf.test.ts b/packages/perf/__tests__/perf.test.ts index 4f5501b946..0dbbcbef50 100644 --- a/packages/perf/__tests__/perf.test.ts +++ b/packages/perf/__tests__/perf.test.ts @@ -35,4 +35,47 @@ describe('Performance Monitoring', function () { expect(startScreenTrace).toBeDefined(); }); }); + + describe('synchronous start/stop parity', function () { + it('`Trace.start()` and `Trace.stop()` return synchronously (not Promises)', function () { + const perf = getPerformance(); + const traceInstance = trace(perf, 'sync-trace'); + + const startResult = traceInstance.start(); + expect(startResult).toBeUndefined(); + expect(startResult).not.toBeInstanceOf(Promise); + // @ts-expect-error internal flag for test assertion only + expect(traceInstance._started).toBe(true); + + const stopResult = traceInstance.stop(); + expect(stopResult).toBeUndefined(); + expect(stopResult).not.toBeInstanceOf(Promise); + // @ts-expect-error internal flag for test assertion only + expect(traceInstance._stopped).toBe(true); + }); + + it('`HttpMetric.start()` and `HttpMetric.stop()` return synchronously (not Promises)', function () { + const perf = getPerformance(); + const metric = httpMetric(perf, 'https://example.com', 'GET'); + metric.setHttpResponseCode(200); + + const startResult = metric.start(); + expect(startResult).toBeUndefined(); + expect(startResult).not.toBeInstanceOf(Promise); + + const stopResult = metric.stop(); + expect(stopResult).toBeUndefined(); + expect(stopResult).not.toBeInstanceOf(Promise); + }); + + it('`startTrace()` returns a started Trace synchronously (not a Promise)', function () { + const perf = getPerformance(); + const traceInstance = (perf as unknown as { startTrace(name: string): unknown }).startTrace( + 'sync-start-trace', + ); + + expect(traceInstance).not.toBeInstanceOf(Promise); + expect((traceInstance as { _started: boolean })._started).toBe(true); + }); + }); }); diff --git a/packages/perf/android/build.gradle b/packages/perf/android/build.gradle index e3d276e755..918244d92b 100644 --- a/packages/perf/android/build.gradle +++ b/packages/perf/android/build.gradle @@ -121,6 +121,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -140,3 +141,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/perf") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/perf/android/src/main/java/io/invertase/firebase/perf/UniversalFirebasePerfModule.java b/packages/perf/android/src/main/java/io/invertase/firebase/perf/UniversalFirebasePerfModule.java index 5333b73cdf..83df5d3ca0 100644 --- a/packages/perf/android/src/main/java/io/invertase/firebase/perf/UniversalFirebasePerfModule.java +++ b/packages/perf/android/src/main/java/io/invertase/firebase/perf/UniversalFirebasePerfModule.java @@ -184,4 +184,92 @@ Task stopHttpMetric(int id, Bundle httpMetricConfig, Bundle attributes) { return null; }); } + + // --- Synchronous variants for the TurboModule (all work is in-memory, no network/disk) --- + + void startTraceSync(int id, String identifier) { + Trace trace = FirebasePerformance.getInstance().newTrace(identifier); + trace.start(); + traces.put(id, trace); + } + + void stopTraceSync(int id, Bundle metrics, Bundle attributes) { + Trace trace = traces.get(id); + // Traces can be cleared during module teardown before JS stops them. + if (trace == null) { + return; + } + + Set metricKeys = metrics.keySet(); + Set attributeKeys = attributes.keySet(); + + for (String metricKey : metricKeys) { + Double value = ((double) metrics.get(metricKey)); + trace.putMetric(metricKey, value.intValue()); + } + + for (String attributeKey : attributeKeys) { + trace.putAttribute( + attributeKey, (String) Objects.requireNonNull(attributes.get(attributeKey))); + } + + trace.stop(); + traces.remove(id); + } + + void startScreenTraceSync(Activity activity, int id, String identifier) { + ScreenTrace screenTrace = new ScreenTrace(activity, identifier); + screenTrace.recordScreenTrace(); + screenTraces.put(id, screenTrace); + } + + void stopScreenTraceSync(int id) { + ScreenTrace trace = screenTraces.get(id); + // Screen traces can be cleared during module teardown before JS stops them. + if (trace == null) { + return; + } + trace.sendScreenTrace(); + screenTraces.remove(id); + } + + void startHttpMetricSync(int id, String url, String httpMethod) { + HttpMetric httpMetric = FirebasePerformance.getInstance().newHttpMetric(url, httpMethod); + httpMetric.start(); + httpMetrics.put(id, httpMetric); + } + + void stopHttpMetricSync(int id, Bundle httpMetricConfig, Bundle attributes) { + HttpMetric httpMetric = httpMetrics.get(id); + // HTTP metrics can be cleared during module teardown before JS stops them. + if (httpMetric == null) { + return; + } + + if (httpMetricConfig.containsKey("httpResponseCode")) { + httpMetric.setHttpResponseCode((int) httpMetricConfig.getDouble("httpResponseCode")); + } + + if (httpMetricConfig.containsKey("requestPayloadSize")) { + httpMetric.setRequestPayloadSize((int) httpMetricConfig.getDouble("requestPayloadSize")); + } + + if (httpMetricConfig.containsKey("responsePayloadSize")) { + httpMetric.setResponsePayloadSize((int) httpMetricConfig.getDouble("responsePayloadSize")); + } + + if (httpMetricConfig.containsKey("responseContentType")) { + httpMetric.setResponseContentType(httpMetricConfig.getString("responseContentType")); + } + + Set attributeKeys = attributes.keySet(); + + for (String attributeKey : attributeKeys) { + httpMetric.putAttribute( + attributeKey, Objects.requireNonNull(attributes.getString(attributeKey))); + } + + httpMetric.stop(); + httpMetrics.remove(id); + } } diff --git a/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/NativeRNFBTurboPerf.java b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/NativeRNFBTurboPerf.java new file mode 100644 index 0000000000..1aadba046f --- /dev/null +++ b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/NativeRNFBTurboPerf.java @@ -0,0 +1,108 @@ +package io.invertase.firebase.perf; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import android.app.Activity; +import com.facebook.fbreact.specs.NativeRNFBTurboPerfSpec; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableMap; +import java.util.Map; + +public class NativeRNFBTurboPerf extends NativeRNFBTurboPerfSpec { + private static final String SERVICE_NAME = "Perf"; + private final UniversalFirebasePerfModule module; + + public NativeRNFBTurboPerf(ReactApplicationContext reactContext) { + super(reactContext); + this.module = new UniversalFirebasePerfModule(reactContext, SERVICE_NAME); + } + + @Override + public void invalidate() { + super.invalidate(); + module.onTearDown(); + } + + @Override + protected Map getTypedExportedConstants() { + return module.getConstants(); + } + + @Override + public void setPerformanceCollectionEnabled(boolean enabled, Promise promise) { + module + .setPerformanceCollectionEnabled(enabled) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(task.getResult()); + } else { + promise.reject(task.getException()); + } + }); + } + + @Override + public void instrumentationEnabled(boolean enabled, Promise promise) { + promise.resolve(null); + } + + @Override + public void startTrace(double id, String identifier) { + module.startTraceSync((int) id, identifier); + } + + @Override + public void stopTrace(double id, ReadableMap traceData) { + module.stopTraceSync( + (int) id, + Arguments.toBundle(traceData.getMap("metrics")), + Arguments.toBundle(traceData.getMap("attributes"))); + } + + @Override + public void startScreenTrace(double id, String identifier) { + Activity currentActivity = getCurrentActivity(); + + if (currentActivity == null) { + return; + } + + module.startScreenTraceSync(currentActivity, (int) id, identifier); + } + + @Override + public void stopScreenTrace(double id) { + module.stopScreenTraceSync((int) id); + } + + @Override + public void startHttpMetric(double id, String url, String httpMethod) { + module.startHttpMetricSync((int) id, url, httpMethod); + } + + @Override + public void stopHttpMetric(double id, ReadableMap metricData) { + module.stopHttpMetricSync( + (int) id, + Arguments.toBundle(metricData), + Arguments.toBundle(metricData.getMap("attributes"))); + } +} diff --git a/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/ReactNativeFirebasePerfPackage.java b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/ReactNativeFirebasePerfPackage.java index bc72b5f43c..ca39f53fc5 100644 --- a/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/ReactNativeFirebasePerfPackage.java +++ b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/ReactNativeFirebasePerfPackage.java @@ -32,7 +32,7 @@ public class ReactNativeFirebasePerfPackage implements ReactPackage { @Override public List createNativeModules(@Nonnull ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebasePerfModule(reactContext)); + modules.add(new NativeRNFBTurboPerf(reactContext)); return modules; } diff --git a/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboPerfSpec.java b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboPerfSpec.java new file mode 100644 index 0000000000..b0ec97cafc --- /dev/null +++ b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboPerfSpec.java @@ -0,0 +1,100 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboPerfSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboPerf"; + + public NativeRNFBTurboPerfSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + protected abstract Map getTypedExportedConstants(); + + @Override + @DoNotStrip + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "isInstrumentationEnabled", + "isPerformanceCollectionEnabled" + )); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } + + @ReactMethod + @DoNotStrip + public abstract void setPerformanceCollectionEnabled(boolean enabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void instrumentationEnabled(boolean enabled, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void startTrace(double id, String identifier); + + @ReactMethod + @DoNotStrip + public abstract void stopTrace(double id, ReadableMap traceData); + + @ReactMethod + @DoNotStrip + public abstract void startScreenTrace(double id, String identifier); + + @ReactMethod + @DoNotStrip + public abstract void stopScreenTrace(double id); + + @ReactMethod + @DoNotStrip + public abstract void startHttpMetric(double id, String url, String httpMethod); + + @ReactMethod + @DoNotStrip + public abstract void stopHttpMetric(double id, ReadableMap metricData); +} diff --git a/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/CMakeLists.txt b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..9b1c3cd9d6 --- /dev/null +++ b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBPerfTurboModules/*.cpp) + +add_library( + react_codegen_RNFBPerfTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBPerfTurboModules PUBLIC . react/renderer/components/RNFBPerfTurboModules) + +target_link_libraries( + react_codegen_RNFBPerfTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBPerfTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/RNFBPerfTurboModules-generated.cpp b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/RNFBPerfTurboModules-generated.cpp new file mode 100644 index 0000000000..68fd2d8142 --- /dev/null +++ b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/RNFBPerfTurboModules-generated.cpp @@ -0,0 +1,80 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBPerfTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "getConstants", "()Ljava/util/Map;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_setPerformanceCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setPerformanceCollectionEnabled", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_instrumentationEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "instrumentationEnabled", "(ZLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_startTrace(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "startTrace", "(DLjava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_stopTrace(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "stopTrace", "(DLcom/facebook/react/bridge/ReadableMap;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_startScreenTrace(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "startScreenTrace", "(DLjava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_stopScreenTrace(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "stopScreenTrace", "(D)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_startHttpMetric(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "startHttpMetric", "(DLjava/lang/String;Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_stopHttpMetric(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "stopHttpMetric", "(DLcom/facebook/react/bridge/ReadableMap;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboPerfSpecJSI::NativeRNFBTurboPerfSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPerfSpecJSI_getConstants}; + methodMap_["setPerformanceCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfSpecJSI_setPerformanceCollectionEnabled}; + methodMap_["instrumentationEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfSpecJSI_instrumentationEnabled}; + methodMap_["startTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfSpecJSI_startTrace}; + methodMap_["stopTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfSpecJSI_stopTrace}; + methodMap_["startScreenTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfSpecJSI_startScreenTrace}; + methodMap_["stopScreenTrace"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfSpecJSI_stopScreenTrace}; + methodMap_["startHttpMetric"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboPerfSpecJSI_startHttpMetric}; + methodMap_["stopHttpMetric"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfSpecJSI_stopHttpMetric}; +} + +std::shared_ptr RNFBPerfTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboPerf") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/RNFBPerfTurboModules.h b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/RNFBPerfTurboModules.h new file mode 100644 index 0000000000..216709d700 --- /dev/null +++ b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/RNFBPerfTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboPerf' + */ +class JSI_EXPORT NativeRNFBTurboPerfSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboPerfSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBPerfTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/react/renderer/components/RNFBPerfTurboModules/RNFBPerfTurboModulesJSI-generated.cpp b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/react/renderer/components/RNFBPerfTurboModules/RNFBPerfTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..f04240e2af --- /dev/null +++ b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/react/renderer/components/RNFBPerfTurboModules/RNFBPerfTurboModulesJSI-generated.cpp @@ -0,0 +1,94 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBPerfTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_setPerformanceCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setPerformanceCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_instrumentationEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->instrumentationEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startTrace(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->startTrace( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopTrace(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->stopTrace( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startScreenTrace(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->startScreenTrace( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopScreenTrace(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->stopScreenTrace( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startHttpMetric(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->startHttpMetric( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopHttpMetric(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->stopHttpMetric( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboPerfCxxSpecJSI::NativeRNFBTurboPerfCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboPerf", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_getConstants}; + methodMap_["setPerformanceCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_setPerformanceCollectionEnabled}; + methodMap_["instrumentationEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_instrumentationEnabled}; + methodMap_["startTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startTrace}; + methodMap_["stopTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopTrace}; + methodMap_["startScreenTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startScreenTrace}; + methodMap_["stopScreenTrace"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopScreenTrace}; + methodMap_["startHttpMetric"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startHttpMetric}; + methodMap_["stopHttpMetric"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopHttpMetric}; +} + + +} // namespace facebook::react diff --git a/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/react/renderer/components/RNFBPerfTurboModules/RNFBPerfTurboModulesJSI.h b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/react/renderer/components/RNFBPerfTurboModules/RNFBPerfTurboModulesJSI.h new file mode 100644 index 0000000000..0adbdf1ad1 --- /dev/null +++ b/packages/perf/android/src/reactnative/java/io/invertase/firebase/perf/generated/jni/react/renderer/components/RNFBPerfTurboModules/RNFBPerfTurboModulesJSI.h @@ -0,0 +1,267 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboPerfHttpMetricData + +template +struct NativeRNFBTurboPerfHttpMetricData { + P0 attributes; + P1 httpResponseCode; + P2 requestPayloadSize; + P3 responsePayloadSize; + P4 responseContentType; + bool operator==(const NativeRNFBTurboPerfHttpMetricData &other) const { + return attributes == other.attributes && httpResponseCode == other.httpResponseCode && requestPayloadSize == other.requestPayloadSize && responsePayloadSize == other.responsePayloadSize && responseContentType == other.responseContentType; + } +}; + +template +struct NativeRNFBTurboPerfHttpMetricDataBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "attributes"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "httpResponseCode"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "requestPayloadSize"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "responsePayloadSize"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "responseContentType"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object attributesToJs(jsi::Runtime &rt, decltype(types.attributes) value) { + return bridging::toJs(rt, value); + } + + static double httpResponseCodeToJs(jsi::Runtime &rt, decltype(types.httpResponseCode) value) { + return bridging::toJs(rt, value); + } + + static double requestPayloadSizeToJs(jsi::Runtime &rt, decltype(types.requestPayloadSize) value) { + return bridging::toJs(rt, value); + } + + static double responsePayloadSizeToJs(jsi::Runtime &rt, decltype(types.responsePayloadSize) value) { + return bridging::toJs(rt, value); + } + + static jsi::String responseContentTypeToJs(jsi::Runtime &rt, decltype(types.responseContentType) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "attributes", bridging::toJs(rt, value.attributes, jsInvoker)); + if (value.httpResponseCode) { + result.setProperty(rt, "httpResponseCode", bridging::toJs(rt, value.httpResponseCode.value(), jsInvoker)); + } + if (value.requestPayloadSize) { + result.setProperty(rt, "requestPayloadSize", bridging::toJs(rt, value.requestPayloadSize.value(), jsInvoker)); + } + if (value.responsePayloadSize) { + result.setProperty(rt, "responsePayloadSize", bridging::toJs(rt, value.responsePayloadSize.value(), jsInvoker)); + } + if (value.responseContentType) { + result.setProperty(rt, "responseContentType", bridging::toJs(rt, value.responseContentType.value(), jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboPerfTraceData + +template +struct NativeRNFBTurboPerfTraceData { + P0 metrics; + P1 attributes; + bool operator==(const NativeRNFBTurboPerfTraceData &other) const { + return metrics == other.metrics && attributes == other.attributes; + } +}; + +template +struct NativeRNFBTurboPerfTraceDataBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "metrics"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "attributes"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object metricsToJs(jsi::Runtime &rt, decltype(types.metrics) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object attributesToJs(jsi::Runtime &rt, decltype(types.attributes) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "metrics", bridging::toJs(rt, value.metrics, jsInvoker)); + result.setProperty(rt, "attributes", bridging::toJs(rt, value.attributes, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboPerfCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboPerfCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value setPerformanceCollectionEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value instrumentationEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual void startTrace(jsi::Runtime &rt, double id, jsi::String identifier) = 0; + virtual void stopTrace(jsi::Runtime &rt, double id, jsi::Object traceData) = 0; + virtual void startScreenTrace(jsi::Runtime &rt, double id, jsi::String identifier) = 0; + virtual void stopScreenTrace(jsi::Runtime &rt, double id) = 0; + virtual void startHttpMetric(jsi::Runtime &rt, double id, jsi::String url, jsi::String httpMethod) = 0; + virtual void stopHttpMetric(jsi::Runtime &rt, double id, jsi::Object metricData) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboPerfCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboPerf"; + +protected: + NativeRNFBTurboPerfCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboPerfCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboPerfCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboPerfCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value setPerformanceCollectionEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setPerformanceCollectionEnabled) == 2, + "Expected setPerformanceCollectionEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setPerformanceCollectionEnabled, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value instrumentationEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::instrumentationEnabled) == 2, + "Expected instrumentationEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::instrumentationEnabled, jsInvoker_, instance_, std::move(enabled)); + } + void startTrace(jsi::Runtime &rt, double id, jsi::String identifier) override { + static_assert( + bridging::getParameterCount(&T::startTrace) == 3, + "Expected startTrace(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::startTrace, jsInvoker_, instance_, std::move(id), std::move(identifier)); + } + void stopTrace(jsi::Runtime &rt, double id, jsi::Object traceData) override { + static_assert( + bridging::getParameterCount(&T::stopTrace) == 3, + "Expected stopTrace(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::stopTrace, jsInvoker_, instance_, std::move(id), std::move(traceData)); + } + void startScreenTrace(jsi::Runtime &rt, double id, jsi::String identifier) override { + static_assert( + bridging::getParameterCount(&T::startScreenTrace) == 3, + "Expected startScreenTrace(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::startScreenTrace, jsInvoker_, instance_, std::move(id), std::move(identifier)); + } + void stopScreenTrace(jsi::Runtime &rt, double id) override { + static_assert( + bridging::getParameterCount(&T::stopScreenTrace) == 2, + "Expected stopScreenTrace(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::stopScreenTrace, jsInvoker_, instance_, std::move(id)); + } + void startHttpMetric(jsi::Runtime &rt, double id, jsi::String url, jsi::String httpMethod) override { + static_assert( + bridging::getParameterCount(&T::startHttpMetric) == 4, + "Expected startHttpMetric(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::startHttpMetric, jsInvoker_, instance_, std::move(id), std::move(url), std::move(httpMethod)); + } + void stopHttpMetric(jsi::Runtime &rt, double id, jsi::Object metricData) override { + static_assert( + bridging::getParameterCount(&T::stopHttpMetric) == 3, + "Expected stopHttpMetric(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::stopHttpMetric, jsInvoker_, instance_, std::move(id), std::move(metricData)); + } + + private: + friend class NativeRNFBTurboPerfCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/perf/e2e/HttpMetric.e2e.js b/packages/perf/e2e/HttpMetric.e2e.js index 5c44256699..f84973cf87 100644 --- a/packages/perf/e2e/HttpMetric.e2e.js +++ b/packages/perf/e2e/HttpMetric.e2e.js @@ -24,24 +24,24 @@ describe('HttpMetric modular', function () { const { getPerformance, httpMetric } = perfModular; const perf = getPerformance(); const httpMetricRequest = httpMetric(perf, aCoolUrl, 'GET'); - await httpMetricRequest.start(); + httpMetricRequest.start(); httpMetricRequest.setHttpResponseCode(200); should.equal(httpMetricRequest._started, true); await Utils.sleep(75); - await httpMetricRequest.stop(); + httpMetricRequest.stop(); }); - it('resolves null if already started', async function () { + it('returns undefined if already started', async function () { const { getPerformance, httpMetric } = perfModular; const perf = getPerformance(); const httpMetricRequest = httpMetric(perf, aCoolUrl, 'POST'); - await httpMetricRequest.start(); + httpMetricRequest.start(); should.equal(httpMetricRequest._started, true); httpMetricRequest.setHttpResponseCode(200); - should.equal(await httpMetricRequest.start(), null); + should.equal(httpMetricRequest.start(), undefined); await Utils.sleep(75); - await httpMetricRequest.stop(); + httpMetricRequest.stop(); }); }); @@ -50,7 +50,7 @@ describe('HttpMetric modular', function () { const { getPerformance, httpMetric } = perfModular; const perf = getPerformance(); const httpMetricRequest = httpMetric(perf, aCoolUrl, 'GET'); - await httpMetricRequest.start(); + httpMetricRequest.start(); httpMetricRequest.setHttpResponseCode(500); httpMetricRequest.setRequestPayloadSize(1337); httpMetricRequest.setResponseContentType('application/invertase'); @@ -58,25 +58,25 @@ describe('HttpMetric modular', function () { httpMetricRequest.putAttribute('foo', 'bar'); httpMetricRequest.putAttribute('bar', 'foo'); await Utils.sleep(100); - await httpMetricRequest.stop(); + httpMetricRequest.stop(); should.equal(httpMetricRequest._stopped, true); }); - it('resolves null if already stopped', async function () { + it('returns undefined if already stopped', async function () { const { getPerformance, httpMetric } = perfModular; const perf = getPerformance(); const httpMetricRequest = httpMetric(perf, aCoolUrl, 'POST'); - await httpMetricRequest.start(); + httpMetricRequest.start(); await Utils.sleep(100); - await httpMetricRequest.stop(); - should.equal(await httpMetricRequest.stop(), null); + httpMetricRequest.stop(); + should.equal(httpMetricRequest.stop(), undefined); }); it('handles floating point numbers', async function () { const { getPerformance, httpMetric } = perfModular; const perf = getPerformance(); const httpMetricRequest = httpMetric(perf, aCoolUrl, 'POST'); - await httpMetricRequest.start(); + httpMetricRequest.start(); const floatingPoint = 500.447553; httpMetricRequest.setHttpResponseCode(floatingPoint); @@ -84,7 +84,7 @@ describe('HttpMetric modular', function () { httpMetricRequest.setRequestPayloadSize(floatingPoint); await Utils.sleep(100); - await httpMetricRequest.stop(); + httpMetricRequest.stop(); }); }); diff --git a/packages/perf/e2e/Trace.e2e.js b/packages/perf/e2e/Trace.e2e.js index 1fe1154547..9bb44a0a26 100644 --- a/packages/perf/e2e/Trace.e2e.js +++ b/packages/perf/e2e/Trace.e2e.js @@ -22,23 +22,23 @@ describe('Trace modular', function () { const { getPerformance, trace } = perfModular; const perf = getPerformance(); const traceInvertase = trace(perf, 'invertase'); - await traceInvertase.start(); + traceInvertase.start(); should.equal(traceInvertase._started, true); traceInvertase.putAttribute('foo', 'bar'); traceInvertase.putMetric('stars', 9001); await Utils.sleep(125); - await traceInvertase.stop(); + traceInvertase.stop(); }); - it('resolves null if already started', async function () { + it('returns undefined if already started', async function () { const { getPerformance, trace } = perfModular; const perf = getPerformance(); const traceInvertase = trace(perf, 'invertase'); - await traceInvertase.start(); + traceInvertase.start(); should.equal(traceInvertase._started, true); - should.equal(await traceInvertase.start(), null); + should.equal(traceInvertase.start(), undefined); await Utils.sleep(125); - await traceInvertase.stop(); + traceInvertase.stop(); }); }); @@ -47,24 +47,24 @@ describe('Trace modular', function () { const { getPerformance, trace } = perfModular; const perf = getPerformance(); const traceInvertase = trace(perf, 'invertase'); - await traceInvertase.start(); + traceInvertase.start(); traceInvertase.putAttribute('foo', 'bar'); traceInvertase.putAttribute('bar', 'foo'); traceInvertase.putMetric('leet', 1337); traceInvertase.putMetric('chickens', 12); await Utils.sleep(100); - await traceInvertase.stop(); + traceInvertase.stop(); should.equal(traceInvertase._stopped, true); }); - it('resolves null if already stopped', async function () { + it('returns undefined if already stopped', async function () { const { getPerformance, trace } = perfModular; const perf = getPerformance(); const traceInvertase = trace(perf, 'invertase'); - await traceInvertase.start(); + traceInvertase.start(); await Utils.sleep(100); - await traceInvertase.stop(); - should.equal(await traceInvertase.stop(), null); + traceInvertase.stop(); + should.equal(traceInvertase.stop(), undefined); }); }); // describe('removeAttribute()', function () { diff --git a/packages/perf/e2e/perf.e2e.js b/packages/perf/e2e/perf.e2e.js index cbe678e2da..45d6b41ba5 100644 --- a/packages/perf/e2e/perf.e2e.js +++ b/packages/perf/e2e/perf.e2e.js @@ -120,26 +120,26 @@ describe('perf() modular', function () { }); describe('startTrace()', function () { - it('resolves a started instance of Trace', async function () { + it('returns a started instance of Trace', async function () { const { getPerformance, trace } = perfModular; const perf = getPerformance(); const traceInvertase = trace(perf, 'invertase'); - await traceInvertase.start(); + traceInvertase.start(); traceInvertase.constructor.name.should.be.equal('Trace'); traceInvertase._identifier.should.equal('invertase'); traceInvertase._started.should.equal(true); - await traceInvertase.stop(); + traceInvertase.stop(); }); }); describe('startScreenTrace()', function () { - it('resolves a started instance of a ScreenTrace', async function () { + it('returns a started instance of a ScreenTrace', async function () { if (Platform.android) { const { getPerformance, startScreenTrace } = perfModular; - const screenTrace = await startScreenTrace(getPerformance(), 'FooScreen'); + const screenTrace = startScreenTrace(getPerformance(), 'FooScreen'); screenTrace.constructor.name.should.be.equal('ScreenTrace'); screenTrace._identifier.should.equal('FooScreen'); - await screenTrace.stop(); + screenTrace.stop(); screenTrace._stopped.should.equal(true); } }); diff --git a/packages/perf/ios/RNFBPerf.xcodeproj/project.pbxproj b/packages/perf/ios/RNFBPerf.xcodeproj/project.pbxproj index 1c89d66708..ae5944ddf5 100644 --- a/packages/perf/ios/RNFBPerf.xcodeproj/project.pbxproj +++ b/packages/perf/ios/RNFBPerf.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBPerfModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBPerfModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBPerfModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBPerfModule.mm */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -25,7 +25,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBPerf.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBPerf.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBPerfModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBPerfModule.h; path = RNFBPerf/RNFBPerfModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBPerfModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBPerfModule.m; path = RNFBPerf/RNFBPerfModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBPerfModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBPerfModule.mm; path = RNFBPerf/RNFBPerfModule.mm; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,7 +53,7 @@ 2744B9A121F48736004F8E3F /* converters */, 2744B98C21F45C64004F8E3F /* common */, 2744B98421F45429004F8E3F /* RNFBPerfModule.h */, - 2744B98521F45429004F8E3F /* RNFBPerfModule.m */, + 2744B98521F45429004F8E3F /* RNFBPerfModule.mm */, ); path = RNFBPerf; sourceTree = ""; @@ -124,7 +124,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBPerfModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBPerfModule.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/packages/perf/ios/RNFBPerf/RNFBPerfModule.h b/packages/perf/ios/RNFBPerf/RNFBPerfModule.h index bf74772747..2306743947 100644 --- a/packages/perf/ios/RNFBPerf/RNFBPerfModule.h +++ b/packages/perf/ios/RNFBPerf/RNFBPerfModule.h @@ -16,8 +16,9 @@ */ #import +#import +#import "RNFBPerfTurboModules.h" -#import +@interface RNFBPerfModule : NSObject -@interface RNFBPerfModule : NSObject @end diff --git a/packages/perf/ios/RNFBPerf/RNFBPerfModule.m b/packages/perf/ios/RNFBPerf/RNFBPerfModule.mm similarity index 58% rename from packages/perf/ios/RNFBPerf/RNFBPerfModule.m rename to packages/perf/ios/RNFBPerf/RNFBPerfModule.mm index 96570231a3..a4f729727a 100644 --- a/packages/perf/ios/RNFBPerf/RNFBPerfModule.m +++ b/packages/perf/ios/RNFBPerf/RNFBPerfModule.mm @@ -25,10 +25,12 @@ static __strong NSMutableDictionary *httpMetrics; @implementation RNFBPerfModule -#pragma mark - -#pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboPerf) + ++ (BOOL)requiresMainQueueSetup { + return NO; +} - (instancetype)init { self = [super init]; @@ -42,7 +44,7 @@ - (instancetype)init { return self; } -- (void)dealloc { +- (void)invalidate { @synchronized([self class]) { for (NSString *key in [traces allKeys]) { [traces removeObjectForKey:key]; @@ -54,7 +56,7 @@ - (void)dealloc { } } -- (NSDictionary *)constantsToExport { +- (NSDictionary *)perfConstantsDictionary { NSMutableDictionary *constants = [NSMutableDictionary new]; constants[@"isPerformanceCollectionEnabled"] = @([RCTConvert BOOL:@([FIRPerformance sharedInstance].dataCollectionEnabled)]); @@ -63,48 +65,50 @@ - (NSDictionary *)constantsToExport { return constants; } -+ (BOOL)requiresMainQueueSetup { - return NO; +- (facebook::react::ModuleConstants)constantsToExport { + return [_RCTTypedModuleConstants newWithUnsafeDictionary:[self perfConstantsDictionary]]; +} + +- (facebook::react::ModuleConstants)getConstants { + return [self constantsToExport]; } -#pragma mark - -#pragma mark Firebase Perf Methods +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} -RCT_EXPORT_METHOD(setPerformanceCollectionEnabled - : (BOOL)enabled resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)setPerformanceCollectionEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { [FIRPerformance sharedInstance].dataCollectionEnabled = (BOOL)enabled; resolve([NSNull null]); } -RCT_EXPORT_METHOD(startTrace - : (nonnull NSNumber *)id identifier - : (NSString *)identifier resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)instrumentationEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + [FIRPerformance sharedInstance].instrumentationEnabled = (BOOL)enabled; + resolve([NSNull null]); +} + +- (void)startTrace:(double)id identifier:(NSString *)identifier { FIRTrace *trace = [[FIRPerformance sharedInstance] traceWithName:identifier]; [trace start]; @synchronized([self class]) { - traces[id] = trace; + traces[@((int)id)] = trace; } - - resolve([NSNull null]); } -RCT_EXPORT_METHOD(stopTrace - : (nonnull NSNumber *)id traceData - : (NSDictionary *)traceData resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)stopTrace:(double)id traceData:(JS::NativeRNFBTurboPerf::TraceData &)traceData { FIRTrace *trace; @synchronized([self class]) { - trace = traces[id]; + trace = traces[@((int)id)]; } - NSDictionary *metrics = traceData[@"metrics"]; - NSDictionary *attributes = traceData[@"attributes"]; + NSDictionary *metrics = (NSDictionary *)traceData.metrics(); + NSDictionary *attributes = (NSDictionary *)traceData.attributes(); [metrics enumerateKeysAndObjectsUsingBlock:^(NSString *metricName, NSNumber *value, BOOL *stop) { [trace setIntValue:[value longLongValue] forMetric:metricName]; @@ -118,24 +122,25 @@ + (BOOL)requiresMainQueueSetup { [trace stop]; @synchronized([self class]) { - [traces removeObjectForKey:id]; + [traces removeObjectForKey:@((int)id)]; } +} - resolve([NSNull null]); +- (void)startScreenTrace:(double)id identifier:(NSString *)identifier { + // Custom screen traces are not supported on iOS. } -RCT_EXPORT_METHOD(startHttpMetric - : (nonnull NSNumber *)id url - : (NSString *)url httpMethod - : (NSString *)httpMethod resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)stopScreenTrace:(double)id { + // Custom screen traces are not supported on iOS. +} + +- (void)startHttpMetric:(double)id url:(NSString *)url httpMethod:(NSString *)httpMethod { FIRHTTPMethod method = FIRHTTPMethodGET; NSURL *toNSURL = [NSURL URLWithString:url]; if ([httpMethod compare:@"put" options:NSCaseInsensitiveSearch] == NSOrderedSame) method = FIRHTTPMethodPUT; if ([httpMethod compare:@"post" options:NSCaseInsensitiveSearch] == NSOrderedSame) - method = FIRHTTPMethodPUT; + method = FIRHTTPMethodPOST; if ([httpMethod compare:@"head" options:NSCaseInsensitiveSearch] == NSOrderedSame) method = FIRHTTPMethodHEAD; if ([httpMethod compare:@"trace" options:NSCaseInsensitiveSearch] == NSOrderedSame) @@ -153,63 +158,43 @@ + (BOOL)requiresMainQueueSetup { [httpMetric start]; @synchronized([self class]) { - httpMetrics[id] = httpMetric; + httpMetrics[@((int)id)] = httpMetric; } - - resolve([NSNull null]); } -RCT_EXPORT_METHOD(stopHttpMetric - : (nonnull NSNumber *)id metricData - : (NSDictionary *)metricData resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { +- (void)stopHttpMetric:(double)id metricData:(JS::NativeRNFBTurboPerf::HttpMetricData &)metricData { FIRHTTPMetric *httpMetric; @synchronized([self class]) { - httpMetric = httpMetrics[id]; + httpMetric = httpMetrics[@((int)id)]; } - NSDictionary *attributes = metricData[@"attributes"]; + NSDictionary *attributes = (NSDictionary *)metricData.attributes(); [attributes enumerateKeysAndObjectsUsingBlock:^(NSString *attributeName, NSString *value, BOOL *stop) { [httpMetric setValue:value forAttribute:attributeName]; }]; - if (metricData[@"httpResponseCode"]) { - NSNumber *responseCode = (NSNumber *)metricData[@"httpResponseCode"]; - [httpMetric setResponseCode:[responseCode integerValue]]; + if (metricData.httpResponseCode().has_value()) { + [httpMetric setResponseCode:(NSInteger)metricData.httpResponseCode().value()]; } - if (metricData[@"requestPayloadSize"]) { - NSNumber *requestPayloadSize = (NSNumber *)metricData[@"requestPayloadSize"]; - [httpMetric setRequestPayloadSize:[requestPayloadSize longValue]]; + if (metricData.requestPayloadSize().has_value()) { + [httpMetric setRequestPayloadSize:(NSInteger)metricData.requestPayloadSize().value()]; } - if (metricData[@"responsePayloadSize"]) { - NSNumber *responsePayloadSize = (NSNumber *)metricData[@"responsePayloadSize"]; - [httpMetric setResponsePayloadSize:[responsePayloadSize longValue]]; + if (metricData.responsePayloadSize().has_value()) { + [httpMetric setResponsePayloadSize:(NSInteger)metricData.responsePayloadSize().value()]; } - if (metricData[@"responseContentType"]) { - NSString *responseContentType = (NSString *)metricData[@"responseContentType"]; - [httpMetric setResponseContentType:responseContentType]; + if (metricData.responseContentType() != nil) { + [httpMetric setResponseContentType:metricData.responseContentType()]; } [httpMetric stop]; @synchronized([self class]) { - [httpMetrics removeObjectForKey:id]; + [httpMetrics removeObjectForKey:@((int)id)]; } - - resolve([NSNull null]); -} - -RCT_EXPORT_METHOD(instrumentationEnabled - : (BOOL)enabled resolver - : (RCTPromiseResolveBlock)resolve rejecter - : (RCTPromiseRejectBlock)reject) { - [FIRPerformance sharedInstance].instrumentationEnabled = (BOOL)enabled; - resolve([NSNull null]); } @end diff --git a/packages/perf/ios/generated/RCTAppDependencyProvider.h b/packages/perf/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/perf/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/perf/ios/generated/RCTAppDependencyProvider.mm b/packages/perf/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/perf/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/perf/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/perf/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/perf/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/perf/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/perf/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/perf/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/perf/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/perf/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/perf/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/perf/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/perf/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/perf/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/perf/ios/generated/RNFBPerfTurboModules/RNFBPerfTurboModules-generated.mm b/packages/perf/ios/generated/RNFBPerfTurboModules/RNFBPerfTurboModules-generated.mm new file mode 100644 index 0000000000..2a2aec2304 --- /dev/null +++ b/packages/perf/ios/generated/RNFBPerfTurboModules/RNFBPerfTurboModules-generated.mm @@ -0,0 +1,106 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBPerfTurboModules.h" + + +@implementation NativeRNFBTurboPerfSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + +@implementation RCTCxxConvert (NativeRNFBTurboPerf_TraceData) ++ (RCTManagedPointer *)JS_NativeRNFBTurboPerf_TraceData:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +@implementation RCTCxxConvert (NativeRNFBTurboPerf_HttpMetricData) ++ (RCTManagedPointer *)JS_NativeRNFBTurboPerf_HttpMetricData:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_setPerformanceCollectionEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setPerformanceCollectionEnabled", @selector(setPerformanceCollectionEnabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_instrumentationEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "instrumentationEnabled", @selector(instrumentationEnabled:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_startTrace(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "startTrace", @selector(startTrace:identifier:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_stopTrace(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "stopTrace", @selector(stopTrace:traceData:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_startScreenTrace(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "startScreenTrace", @selector(startScreenTrace:identifier:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_stopScreenTrace(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "stopScreenTrace", @selector(stopScreenTrace:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_startHttpMetric(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "startHttpMetric", @selector(startHttpMetric:url:httpMethod:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_stopHttpMetric(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "stopHttpMetric", @selector(stopHttpMetric:metricData:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPerfSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + NativeRNFBTurboPerfSpecJSI::NativeRNFBTurboPerfSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["setPerformanceCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfSpecJSI_setPerformanceCollectionEnabled}; + + + methodMap_["instrumentationEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfSpecJSI_instrumentationEnabled}; + + + methodMap_["startTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfSpecJSI_startTrace}; + + + methodMap_["stopTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfSpecJSI_stopTrace}; + setMethodArgConversionSelector(@"stopTrace", 1, @"JS_NativeRNFBTurboPerf_TraceData:"); + + methodMap_["startScreenTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfSpecJSI_startScreenTrace}; + + + methodMap_["stopScreenTrace"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfSpecJSI_stopScreenTrace}; + + + methodMap_["startHttpMetric"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboPerfSpecJSI_startHttpMetric}; + + + methodMap_["stopHttpMetric"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfSpecJSI_stopHttpMetric}; + setMethodArgConversionSelector(@"stopHttpMetric", 1, @"JS_NativeRNFBTurboPerf_HttpMetricData:"); + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPerfSpecJSI_getConstants}; + + } +} // namespace facebook::react diff --git a/packages/perf/ios/generated/RNFBPerfTurboModules/RNFBPerfTurboModules.h b/packages/perf/ios/generated/RNFBPerfTurboModules/RNFBPerfTurboModules.h new file mode 100644 index 0000000000..cab084cd13 --- /dev/null +++ b/packages/perf/ios/generated/RNFBPerfTurboModules/RNFBPerfTurboModules.h @@ -0,0 +1,188 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBPerfTurboModules symbols +#ifndef RNFBPerfTurboModules_H +#define RNFBPerfTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN +namespace JS { + namespace NativeRNFBTurboPerf { + struct TraceData { + id metrics() const; + id attributes() const; + + TraceData(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboPerf_TraceData) ++ (RCTManagedPointer *)JS_NativeRNFBTurboPerf_TraceData:(id)json; +@end +namespace JS { + namespace NativeRNFBTurboPerf { + struct HttpMetricData { + id attributes() const; + std::optional httpResponseCode() const; + std::optional requestPayloadSize() const; + std::optional responsePayloadSize() const; + NSString *responseContentType() const; + + HttpMetricData(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboPerf_HttpMetricData) ++ (RCTManagedPointer *)JS_NativeRNFBTurboPerf_HttpMetricData:(id)json; +@end +namespace JS { + namespace NativeRNFBTurboPerf { + struct Constants { + + struct Builder { + struct Input { + RCTRequired isPerformanceCollectionEnabled; + RCTRequired isInstrumentationEnabled; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeRNFBTurboPerfSpec + +- (void)setPerformanceCollectionEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)instrumentationEnabled:(BOOL)enabled + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)startTrace:(double)id + identifier:(NSString *)identifier; +- (void)stopTrace:(double)id + traceData:(JS::NativeRNFBTurboPerf::TraceData &)traceData; +- (void)startScreenTrace:(double)id + identifier:(NSString *)identifier; +- (void)stopScreenTrace:(double)id; +- (void)startHttpMetric:(double)id + url:(NSString *)url + httpMethod:(NSString *)httpMethod; +- (void)stopHttpMetric:(double)id + metricData:(JS::NativeRNFBTurboPerf::HttpMetricData &)metricData; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end + +@interface NativeRNFBTurboPerfSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboPerf' + */ + class JSI_EXPORT NativeRNFBTurboPerfSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboPerfSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +inline id JS::NativeRNFBTurboPerf::TraceData::metrics() const +{ + id const p = _v[@"metrics"]; + return p; +} +inline id JS::NativeRNFBTurboPerf::TraceData::attributes() const +{ + id const p = _v[@"attributes"]; + return p; +} +inline id JS::NativeRNFBTurboPerf::HttpMetricData::attributes() const +{ + id const p = _v[@"attributes"]; + return p; +} +inline std::optional JS::NativeRNFBTurboPerf::HttpMetricData::httpResponseCode() const +{ + id const p = _v[@"httpResponseCode"]; + return RCTBridgingToOptionalDouble(p); +} +inline std::optional JS::NativeRNFBTurboPerf::HttpMetricData::requestPayloadSize() const +{ + id const p = _v[@"requestPayloadSize"]; + return RCTBridgingToOptionalDouble(p); +} +inline std::optional JS::NativeRNFBTurboPerf::HttpMetricData::responsePayloadSize() const +{ + id const p = _v[@"responsePayloadSize"]; + return RCTBridgingToOptionalDouble(p); +} +inline NSString *JS::NativeRNFBTurboPerf::HttpMetricData::responseContentType() const +{ + id const p = _v[@"responseContentType"]; + return RCTBridgingToOptionalString(p); +} +inline JS::NativeRNFBTurboPerf::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto isPerformanceCollectionEnabled = i.isPerformanceCollectionEnabled.get(); + d[@"isPerformanceCollectionEnabled"] = @(isPerformanceCollectionEnabled); + auto isInstrumentationEnabled = i.isInstrumentationEnabled.get(); + d[@"isInstrumentationEnabled"] = @(isInstrumentationEnabled); + return d; +}) {} +inline JS::NativeRNFBTurboPerf::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +NS_ASSUME_NONNULL_END +#endif // RNFBPerfTurboModules_H diff --git a/packages/perf/ios/generated/RNFBPerfTurboModulesJSI-generated.cpp b/packages/perf/ios/generated/RNFBPerfTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..f04240e2af --- /dev/null +++ b/packages/perf/ios/generated/RNFBPerfTurboModulesJSI-generated.cpp @@ -0,0 +1,94 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBPerfTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_setPerformanceCollectionEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setPerformanceCollectionEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_instrumentationEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->instrumentationEnabled( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asBool() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startTrace(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->startTrace( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopTrace(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->stopTrace( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startScreenTrace(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->startScreenTrace( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopScreenTrace(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->stopScreenTrace( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber() + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startHttpMetric(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->startHttpMetric( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopHttpMetric(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->stopHttpMetric( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); + return jsi::Value::undefined(); +} + +NativeRNFBTurboPerfCxxSpecJSI::NativeRNFBTurboPerfCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboPerf", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_getConstants}; + methodMap_["setPerformanceCollectionEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_setPerformanceCollectionEnabled}; + methodMap_["instrumentationEnabled"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_instrumentationEnabled}; + methodMap_["startTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startTrace}; + methodMap_["stopTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopTrace}; + methodMap_["startScreenTrace"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startScreenTrace}; + methodMap_["stopScreenTrace"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopScreenTrace}; + methodMap_["startHttpMetric"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_startHttpMetric}; + methodMap_["stopHttpMetric"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboPerfCxxSpecJSI_stopHttpMetric}; +} + + +} // namespace facebook::react diff --git a/packages/perf/ios/generated/RNFBPerfTurboModulesJSI.h b/packages/perf/ios/generated/RNFBPerfTurboModulesJSI.h new file mode 100644 index 0000000000..0adbdf1ad1 --- /dev/null +++ b/packages/perf/ios/generated/RNFBPerfTurboModulesJSI.h @@ -0,0 +1,267 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboPerfHttpMetricData + +template +struct NativeRNFBTurboPerfHttpMetricData { + P0 attributes; + P1 httpResponseCode; + P2 requestPayloadSize; + P3 responsePayloadSize; + P4 responseContentType; + bool operator==(const NativeRNFBTurboPerfHttpMetricData &other) const { + return attributes == other.attributes && httpResponseCode == other.httpResponseCode && requestPayloadSize == other.requestPayloadSize && responsePayloadSize == other.responsePayloadSize && responseContentType == other.responseContentType; + } +}; + +template +struct NativeRNFBTurboPerfHttpMetricDataBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "attributes"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "httpResponseCode"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "requestPayloadSize"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "responsePayloadSize"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "responseContentType"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object attributesToJs(jsi::Runtime &rt, decltype(types.attributes) value) { + return bridging::toJs(rt, value); + } + + static double httpResponseCodeToJs(jsi::Runtime &rt, decltype(types.httpResponseCode) value) { + return bridging::toJs(rt, value); + } + + static double requestPayloadSizeToJs(jsi::Runtime &rt, decltype(types.requestPayloadSize) value) { + return bridging::toJs(rt, value); + } + + static double responsePayloadSizeToJs(jsi::Runtime &rt, decltype(types.responsePayloadSize) value) { + return bridging::toJs(rt, value); + } + + static jsi::String responseContentTypeToJs(jsi::Runtime &rt, decltype(types.responseContentType) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "attributes", bridging::toJs(rt, value.attributes, jsInvoker)); + if (value.httpResponseCode) { + result.setProperty(rt, "httpResponseCode", bridging::toJs(rt, value.httpResponseCode.value(), jsInvoker)); + } + if (value.requestPayloadSize) { + result.setProperty(rt, "requestPayloadSize", bridging::toJs(rt, value.requestPayloadSize.value(), jsInvoker)); + } + if (value.responsePayloadSize) { + result.setProperty(rt, "responsePayloadSize", bridging::toJs(rt, value.responsePayloadSize.value(), jsInvoker)); + } + if (value.responseContentType) { + result.setProperty(rt, "responseContentType", bridging::toJs(rt, value.responseContentType.value(), jsInvoker)); + } + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboPerfTraceData + +template +struct NativeRNFBTurboPerfTraceData { + P0 metrics; + P1 attributes; + bool operator==(const NativeRNFBTurboPerfTraceData &other) const { + return metrics == other.metrics && attributes == other.attributes; + } +}; + +template +struct NativeRNFBTurboPerfTraceDataBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "metrics"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "attributes"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object metricsToJs(jsi::Runtime &rt, decltype(types.metrics) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object attributesToJs(jsi::Runtime &rt, decltype(types.attributes) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "metrics", bridging::toJs(rt, value.metrics, jsInvoker)); + result.setProperty(rt, "attributes", bridging::toJs(rt, value.attributes, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboPerfCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboPerfCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value setPerformanceCollectionEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual jsi::Value instrumentationEnabled(jsi::Runtime &rt, bool enabled) = 0; + virtual void startTrace(jsi::Runtime &rt, double id, jsi::String identifier) = 0; + virtual void stopTrace(jsi::Runtime &rt, double id, jsi::Object traceData) = 0; + virtual void startScreenTrace(jsi::Runtime &rt, double id, jsi::String identifier) = 0; + virtual void stopScreenTrace(jsi::Runtime &rt, double id) = 0; + virtual void startHttpMetric(jsi::Runtime &rt, double id, jsi::String url, jsi::String httpMethod) = 0; + virtual void stopHttpMetric(jsi::Runtime &rt, double id, jsi::Object metricData) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboPerfCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboPerf"; + +protected: + NativeRNFBTurboPerfCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboPerfCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboPerfCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboPerfCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value setPerformanceCollectionEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::setPerformanceCollectionEnabled) == 2, + "Expected setPerformanceCollectionEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::setPerformanceCollectionEnabled, jsInvoker_, instance_, std::move(enabled)); + } + jsi::Value instrumentationEnabled(jsi::Runtime &rt, bool enabled) override { + static_assert( + bridging::getParameterCount(&T::instrumentationEnabled) == 2, + "Expected instrumentationEnabled(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::instrumentationEnabled, jsInvoker_, instance_, std::move(enabled)); + } + void startTrace(jsi::Runtime &rt, double id, jsi::String identifier) override { + static_assert( + bridging::getParameterCount(&T::startTrace) == 3, + "Expected startTrace(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::startTrace, jsInvoker_, instance_, std::move(id), std::move(identifier)); + } + void stopTrace(jsi::Runtime &rt, double id, jsi::Object traceData) override { + static_assert( + bridging::getParameterCount(&T::stopTrace) == 3, + "Expected stopTrace(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::stopTrace, jsInvoker_, instance_, std::move(id), std::move(traceData)); + } + void startScreenTrace(jsi::Runtime &rt, double id, jsi::String identifier) override { + static_assert( + bridging::getParameterCount(&T::startScreenTrace) == 3, + "Expected startScreenTrace(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::startScreenTrace, jsInvoker_, instance_, std::move(id), std::move(identifier)); + } + void stopScreenTrace(jsi::Runtime &rt, double id) override { + static_assert( + bridging::getParameterCount(&T::stopScreenTrace) == 2, + "Expected stopScreenTrace(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::stopScreenTrace, jsInvoker_, instance_, std::move(id)); + } + void startHttpMetric(jsi::Runtime &rt, double id, jsi::String url, jsi::String httpMethod) override { + static_assert( + bridging::getParameterCount(&T::startHttpMetric) == 4, + "Expected startHttpMetric(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::startHttpMetric, jsInvoker_, instance_, std::move(id), std::move(url), std::move(httpMethod)); + } + void stopHttpMetric(jsi::Runtime &rt, double id, jsi::Object metricData) override { + static_assert( + bridging::getParameterCount(&T::stopHttpMetric) == 3, + "Expected stopHttpMetric(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::stopHttpMetric, jsInvoker_, instance_, std::move(id), std::move(metricData)); + } + + private: + friend class NativeRNFBTurboPerfCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/perf/ios/generated/ReactAppDependencyProvider.podspec b/packages/perf/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/perf/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/perf/lib/HttpMetric.ts b/packages/perf/lib/HttpMetric.ts index 19912cfe31..c66f41078f 100644 --- a/packages/perf/lib/HttpMetric.ts +++ b/packages/perf/lib/HttpMetric.ts @@ -87,18 +87,18 @@ export default class HttpMetric extends MetricWithAttributes { this._responseContentType = contentType; } - start(): Promise { + start(): void { if (this._started) { - return Promise.resolve(null); + return; } this._started = true; - return this.native.startHttpMetric(this._id, this._url, this._httpMethod); + this.native.startHttpMetric(this._id, this._url, this._httpMethod); } - stop(): Promise { + stop(): void { if (this._stopped) { - return Promise.resolve(null); + return; } this._stopped = true; @@ -125,6 +125,6 @@ export default class HttpMetric extends MetricWithAttributes { metricData.responseContentType = this._responseContentType; } - return this.native.stopHttpMetric(this._id, metricData); + this.native.stopHttpMetric(this._id, metricData); } } diff --git a/packages/perf/lib/ScreenTrace.ts b/packages/perf/lib/ScreenTrace.ts index af46df07ad..59d4779878 100644 --- a/packages/perf/lib/ScreenTrace.ts +++ b/packages/perf/lib/ScreenTrace.ts @@ -36,24 +36,24 @@ export default class ScreenTrace { this._stopped = false; } - start(): Promise { + start(): void { if (isIOS) { - return Promise.reject(new Error('Custom screentraces are currently not supported on iOS.')); + throw new Error('Custom screentraces are currently not supported on iOS.'); } if (this._started) { - return Promise.resolve(null); + return; } this._started = true; - return this.native.startScreenTrace(this._id, this._identifier); + this.native.startScreenTrace(this._id, this._identifier); } - stop(): Promise { + stop(): void { if (!this._started || this._stopped) { - return Promise.resolve(null); + return; } this._stopped = true; - return this.native.stopScreenTrace(this._id); + this.native.stopScreenTrace(this._id); } } diff --git a/packages/perf/lib/Trace.ts b/packages/perf/lib/Trace.ts index f973afc79c..f1a75667ca 100644 --- a/packages/perf/lib/Trace.ts +++ b/packages/perf/lib/Trace.ts @@ -87,18 +87,18 @@ export default class Trace extends MetricWithAttributes { delete this._metrics[metric]; } - start(): Promise { + start(): void { if (this._started) { - return Promise.resolve(null); + return; } this._started = true; - return this.native.startTrace(this._id, this._identifier); + this.native.startTrace(this._id, this._identifier); } - stop(): Promise { + stop(): void { if (this._stopped) { - return Promise.resolve(null); + return; } this._stopped = true; @@ -107,6 +107,6 @@ export default class Trace extends MetricWithAttributes { attributes: Object.assign({}, this._attributes), }; - return this.native.stopTrace(this._id, traceData); + this.native.stopTrace(this._id, traceData); } } diff --git a/packages/perf/lib/index.ts b/packages/perf/lib/index.ts index c6b300ef6d..2c39c5027d 100644 --- a/packages/perf/lib/index.ts +++ b/packages/perf/lib/index.ts @@ -41,7 +41,7 @@ import type { } from './types/perf'; import type { PerfInternal } from './types/internal'; -const nativeModuleName = 'RNFBPerfModule' as const; +const nativeModuleName = 'NativeRNFBTurboPerf' as const; const VALID_HTTP_METHODS: HttpMethod[] = [ 'CONNECT', @@ -131,9 +131,10 @@ class FirebasePerfModule extends FirebaseModule { return new TraceImpl(this.native, identifier); } - startTrace(identifier: string): Promise { + startTrace(identifier: string): TraceImpl { const traceInstance = this.newTrace(identifier); - return traceInstance.start().then(() => traceInstance); + traceInstance.start(); + return traceInstance; } newScreenTrace(identifier: string): ScreenTraceImpl { @@ -146,9 +147,10 @@ class FirebasePerfModule extends FirebaseModule { return new ScreenTraceImpl(this.native, identifier); } - startScreenTrace(identifier: string): Promise { + startScreenTrace(identifier: string): ScreenTraceImpl { const screenTrace = this.newScreenTrace(identifier); - return screenTrace.start().then(() => screenTrace); + screenTrace.start(); + return screenTrace; } newHttpMetric(url: string, httpMethod: HttpMethod): HttpMetricImpl { @@ -174,6 +176,7 @@ const config: ModuleConfig = { nativeEvents: false, hasMultiAppSupport: false, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; export const SDK_VERSION = version; @@ -190,6 +193,12 @@ export function getPerformance(app?: FirebaseApp): FirebasePerformance { ) as unknown as FirebasePerformance; } +/** + * Creates a Performance Monitoring instance and applies optional settings. + * + * @remarks Returns **synchronously** on React Native Firebase (unlike some async firebase-js-sdk + * initialization paths). Settings are applied to the native Performance SDK instance. + */ export function initializePerformance( app: FirebaseApp, settings?: PerformanceSettings, @@ -206,6 +215,13 @@ export function initializePerformance( return perf; } +/** + * Creates a custom performance trace. + * + * @remarks On React Native Firebase, {@link PerformanceTrace.start} and + * {@link PerformanceTrace.stop} are **synchronous** (in-memory native calls via TurboModules), + * matching the firebase-js-sdk web `PerformanceTrace`. + */ export function trace(performance: FirebasePerformance, name: string): PerformanceTrace { return perfInternal(performance).newTrace(name) as unknown as PerformanceTrace; } @@ -225,8 +241,8 @@ export function newScreenTrace(performance: FirebasePerformance, screenName: str export function startScreenTrace( performance: FirebasePerformance, screenName: string, -): Promise { - return perfInternal(performance).startScreenTrace(screenName) as unknown as Promise; +): ScreenTrace { + return perfInternal(performance).startScreenTrace(screenName) as unknown as ScreenTrace; } export type * from './types/perf'; diff --git a/packages/perf/lib/types/internal.ts b/packages/perf/lib/types/internal.ts index 31e074c472..7f7ab7bb94 100644 --- a/packages/perf/lib/types/internal.ts +++ b/packages/perf/lib/types/internal.ts @@ -29,9 +29,9 @@ export interface PerfInternal extends FirebasePerformance { */ setPerformanceCollectionEnabled(enabled: boolean): Promise; newTrace(name: string): PerformanceTrace; - startTrace(name: string): Promise; + startTrace(name: string): PerformanceTrace; newScreenTrace(screenName: string): ScreenTrace; - startScreenTrace(screenName: string): Promise; + startScreenTrace(screenName: string): ScreenTrace; newHttpMetric(url: string, httpMethod: HttpMethod): HttpMetric; } @@ -53,16 +53,16 @@ export interface RNFBPerfNativeModule { isInstrumentationEnabled: boolean; setPerformanceCollectionEnabled(enabled: boolean): Promise; instrumentationEnabled(enabled: boolean): Promise; - startTrace(id: number, identifier: string): Promise; - stopTrace(id: number, traceData: RNFBPerfTraceData): Promise; - startHttpMetric(id: number, url: string, httpMethod: HttpMethod): Promise; - stopHttpMetric(id: number, metricData: RNFBPerfHttpMetricData): Promise; - startScreenTrace(id: number, identifier: string): Promise; - stopScreenTrace(id: number): Promise; + startTrace(id: number, identifier: string): void; + stopTrace(id: number, traceData: RNFBPerfTraceData): void; + startHttpMetric(id: number, url: string, httpMethod: HttpMethod): void; + stopHttpMetric(id: number, metricData: RNFBPerfHttpMetricData): void; + startScreenTrace(id: number, identifier: string): void; + stopScreenTrace(id: number): void; } declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBPerfModule: RNFBPerfNativeModule; + NativeRNFBTurboPerf: RNFBPerfNativeModule; } } diff --git a/packages/perf/lib/types/perf.ts b/packages/perf/lib/types/perf.ts index 247132ab43..d86b7ee0c7 100644 --- a/packages/perf/lib/types/perf.ts +++ b/packages/perf/lib/types/perf.ts @@ -44,7 +44,7 @@ export type HttpMethod = /** * A performance trace (aligned with {@link https://firebase.google.com/docs/reference/js/performance.performancetrace | PerformanceTrace} in the Firebase JS SDK). * - * @remarks React Native uses async `start`/`stop` (native bridge). The web SDK uses synchronous `start`/`stop`. React Native also exposes `getMetrics` and `removeMetric`, which are not on the web `PerformanceTrace` type. + * @remarks React Native uses synchronous `start`/`stop` (in-memory native calls via TurboModules), matching the firebase-js-sdk web `PerformanceTrace`. React Native also exposes `getMetrics` and `removeMetric`, which are not on the web `PerformanceTrace` type. */ export interface PerformanceTrace { getAttribute(attr: string): string | undefined; @@ -54,16 +54,16 @@ export interface PerformanceTrace { putMetric(metricName: string, num: number): void; incrementMetric(metricName: string, num?: number): void; removeMetric(metricName: string): void; - start(): Promise; - stop(): Promise; + start(): void; + stop(): void; } /** * Screen trace for slow/frozen frames (React Native). */ export interface ScreenTrace { - start(): Promise; - stop(): Promise; + start(): void; + stop(): void; } /** @@ -78,8 +78,8 @@ export interface HttpMetric { setRequestPayloadSize(bytes: number | null): void; setResponsePayloadSize(bytes: number | null): void; setResponseContentType(contentType: string | null): void; - start(): Promise; - stop(): Promise; + start(): void; + stop(): void; } /** diff --git a/packages/perf/package.json b/packages/perf/package.json index 48d32cdb84..9d3d85c6e7 100644 --- a/packages/perf/package.json +++ b/packages/perf/package.json @@ -5,13 +5,30 @@ "description": "React Native Firebase - React Native Firebase provides native integration with Performance Monitoring to gain insight into key performance characteristics within your React Native application.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBPerfTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.perf" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboPerf": "RNFBPerfModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "build:plugin": "rimraf plugin/build && tsc --build plugin", "compile": "bob build", "lint:plugin": "eslint plugin/src/*", - "prepare": "yarn run build && yarn compile && yarn run build:plugin" + "prepare": "yarn run build && yarn compile && yarn run build:plugin", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/reactnative/java/io/invertase/firebase/perf/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/perf/react-native.config.js b/packages/perf/react-native.config.js new file mode 100644 index 0000000000..cfaf853f3d --- /dev/null +++ b/packages/perf/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/reactnative/java/io/invertase/firebase/perf/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/perf/specs/NativeRNFBTurboPerf.ts b/packages/perf/specs/NativeRNFBTurboPerf.ts new file mode 100644 index 0000000000..c268f20cf3 --- /dev/null +++ b/packages/perf/specs/NativeRNFBTurboPerf.ts @@ -0,0 +1,44 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export type HttpMethod = + | 'CONNECT' + | 'DELETE' + | 'GET' + | 'HEAD' + | 'OPTIONS' + | 'PATCH' + | 'POST' + | 'PUT' + | 'TRACE'; + +export interface TraceData { + metrics: { [key: string]: number }; + attributes: { [key: string]: string }; +} + +export interface HttpMetricData { + attributes: { [key: string]: string }; + httpResponseCode?: number; + requestPayloadSize?: number; + responsePayloadSize?: number; + responseContentType?: string; +} + +export interface Spec extends TurboModule { + getConstants(): { + isPerformanceCollectionEnabled: boolean; + isInstrumentationEnabled: boolean; + }; + + setPerformanceCollectionEnabled(enabled: boolean): Promise; + instrumentationEnabled(enabled: boolean): Promise; + startTrace(id: number, identifier: string): void; + stopTrace(id: number, traceData: TraceData): void; + startScreenTrace(id: number, identifier: string): void; + stopScreenTrace(id: number): void; + startHttpMetric(id: number, url: string, httpMethod: HttpMethod): void; + stopHttpMetric(id: number, metricData: HttpMetricData): void; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboPerf'); diff --git a/packages/perf/type-test.ts b/packages/perf/type-test.ts index adf94c6e17..7b0cd90c7f 100644 --- a/packages/perf/type-test.ts +++ b/packages/perf/type-test.ts @@ -8,8 +8,10 @@ import { startScreenTrace, SDK_VERSION, type FirebasePerformance, + type HttpMetric, type HttpMethod, type PerformanceTrace, + type ScreenTrace, } from '.'; const perf = getPerformance(); @@ -22,7 +24,7 @@ initializePerformance(getApp(), { dataCollectionEnabled: true }); trace(perf, 'test-trace'); httpMetric(perf, 'https://example.com', 'GET' as HttpMethod); newScreenTrace(perf, 'HomeScreen'); -startScreenTrace(perf, 'HomeScreen'); +const startedScreenTrace: ScreenTrace = startScreenTrace(perf, 'HomeScreen'); const typedPerf: FirebasePerformance = perf; console.log(typedPerf.app.name); @@ -30,4 +32,21 @@ console.log(typedPerf.app.name); const perfTrace: PerformanceTrace = trace(perf, 'typed'); console.log(perfTrace); +// Trace/HttpMetric/ScreenTrace start()/stop() are synchronous (void), matching firebase-js-sdk. +const traceStartResult: void = perfTrace.start(); +const traceStopResult: void = perfTrace.stop(); +const perfHttpMetric: HttpMetric = httpMetric(perf, 'https://example.com', 'POST' as HttpMethod); +const httpStartResult: void = perfHttpMetric.start(); +const httpStopResult: void = perfHttpMetric.stop(); +const screenStartResult: void = startedScreenTrace.start(); +const screenStopResult: void = startedScreenTrace.stop(); +console.log( + traceStartResult, + traceStopResult, + httpStartResult, + httpStopResult, + screenStartResult, + screenStopResult, +); + console.log(SDK_VERSION); diff --git a/packages/phone-number-verification/__tests__/nativeModuleContract.test.ts b/packages/phone-number-verification/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..6257bef1b7 --- /dev/null +++ b/packages/phone-number-verification/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,53 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { createTurboModuleFixture } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'enableTestSession', + 'getVerificationSupportInfo', + 'getVerificationSupportInfoForSimSlot', + 'getVerifiedPhoneNumber', + 'getDigitalCredentialPayload', + 'exchangeCredentialResponseForPhoneNumber', +] as const; + +describe('TurboModule direct resolver contract (NewArch-AD-17.1 / NewArch-AD-18 E10)', function () { + it('resolves every spec method through the direct turbo resolver', async function () { + const mocks = Object.fromEntries( + SPEC_METHODS.map(method => [ + method, + jest.fn(() => + method === 'enableTestSession' + ? Promise.resolve() + : method === 'getDigitalCredentialPayload' + ? Promise.resolve('payload') + : method === 'getVerificationSupportInfo' || + method === 'getVerificationSupportInfoForSimSlot' + ? Promise.resolve([]) + : Promise.resolve({ + phoneNumber: '+15555550100', + token: 'jwt', + expirationTimestamp: 0, + issuedAtTimestamp: 0, + nonce: null, + claims: null, + }), + ), + ]), + ) as Record; + + const raw = createTurboModuleFixture(mocks); + + jest.resetModules(); + const { setReactNativeModule } = + await import('@react-native-firebase/app/dist/module/internal/nativeModule'); + setReactNativeModule('NativeRNFBTurboPnv', raw); + const { getVerificationSupportInfo } = await import('../lib/index'); + + await getVerificationSupportInfo(); + + expect(mocks.getVerificationSupportInfo).toHaveBeenCalledTimes(1); + for (const method of SPEC_METHODS) { + expect(typeof raw[method]).toBe('function'); + } + }); +}); diff --git a/packages/phone-number-verification/android/build.gradle b/packages/phone-number-verification/android/build.gradle index 1811fa2b5e..11f7843e70 100644 --- a/packages/phone-number-verification/android/build.gradle +++ b/packages/phone-number-verification/android/build.gradle @@ -80,6 +80,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -99,3 +100,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency('api') + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/phone-number-verification") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/phone-number-verification/android/src/main/java/io/invertase/firebase/pnv/ReactNativeFirebasePnvPackage.java b/packages/phone-number-verification/android/src/main/java/io/invertase/firebase/pnv/ReactNativeFirebasePnvPackage.java index 8f5a83604a..4a0ea83d2f 100644 --- a/packages/phone-number-verification/android/src/main/java/io/invertase/firebase/pnv/ReactNativeFirebasePnvPackage.java +++ b/packages/phone-number-verification/android/src/main/java/io/invertase/firebase/pnv/ReactNativeFirebasePnvPackage.java @@ -30,7 +30,7 @@ public class ReactNativeFirebasePnvPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebasePnvModule(reactContext)); + modules.add(new NativeRNFBTurboPnv(reactContext)); return modules; } diff --git a/packages/phone-number-verification/android/src/main/java/io/invertase/firebase/pnv/ReactNativeFirebasePnvModule.java b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/NativeRNFBTurboPnv.java similarity index 89% rename from packages/phone-number-verification/android/src/main/java/io/invertase/firebase/pnv/ReactNativeFirebasePnvModule.java rename to packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/NativeRNFBTurboPnv.java index 6db1da5044..3119711fc5 100644 --- a/packages/phone-number-verification/android/src/main/java/io/invertase/firebase/pnv/ReactNativeFirebasePnvModule.java +++ b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/NativeRNFBTurboPnv.java @@ -17,29 +17,44 @@ * */ +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage; + import android.app.Activity; +import com.facebook.fbreact.specs.NativeRNFBTurboPnvSpec; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.google.firebase.pnv.FirebasePhoneNumberVerification; import com.google.firebase.pnv.FirebasePhoneNumberVerificationException; import com.google.firebase.pnv.VerificationSupportResult; import com.google.firebase.pnv.VerifiedPhoneNumberTokenResult; -import io.invertase.firebase.common.ReactNativeFirebaseModule; +import io.invertase.firebase.common.TaskExecutorService; import java.util.List; import java.util.Map; +import java.util.concurrent.Executor; -public class ReactNativeFirebasePnvModule extends ReactNativeFirebaseModule { +public class NativeRNFBTurboPnv extends NativeRNFBTurboPnvSpec { private static final String TAG = "Pnv"; private final FirebasePhoneNumberVerification fpnv; + private final TaskExecutorService executorService; - ReactNativeFirebasePnvModule(ReactApplicationContext reactContext) { - super(reactContext, TAG); + public NativeRNFBTurboPnv(ReactApplicationContext reactContext) { + super(reactContext); fpnv = FirebasePhoneNumberVerification.getInstance(); + executorService = new TaskExecutorService(TAG); + } + + @Override + public void invalidate() { + super.invalidate(); + executorService.shutdown(); + } + + private Executor getExecutor() { + return executorService.getExecutor(); } private static String reasonToString(int reason) { @@ -150,7 +165,7 @@ private static WritableMap claimsToWritableMap(Map claims) { return map; } - @ReactMethod + @Override public void enableTestSession(String token, Promise promise) { try { fpnv.enableTestSession(token); @@ -160,7 +175,7 @@ public void enableTestSession(String token, Promise promise) { } } - @ReactMethod + @Override public void getVerificationSupportInfo(Promise promise) { fpnv.getVerificationSupportInfo() .addOnSuccessListener( @@ -175,9 +190,9 @@ public void getVerificationSupportInfo(Promise promise) { }); } - @ReactMethod - public void getVerificationSupportInfoForSimSlot(int simSlot, Promise promise) { - fpnv.getVerificationSupportInfo(simSlot) + @Override + public void getVerificationSupportInfoForSimSlot(double simSlot, Promise promise) { + fpnv.getVerificationSupportInfo((int) simSlot) .addOnSuccessListener( getExecutor(), results -> { @@ -190,7 +205,7 @@ public void getVerificationSupportInfoForSimSlot(int simSlot, Promise promise) { }); } - @ReactMethod + @Override public void getVerifiedPhoneNumber(Promise promise) { Activity activity = getCurrentActivity(); if (activity == null) { @@ -211,7 +226,7 @@ public void getVerifiedPhoneNumber(Promise promise) { }); } - @ReactMethod + @Override public void getDigitalCredentialPayload(String nonce, Promise promise) { fpnv.getDigitalCredentialPayload(nonce) .addOnSuccessListener( @@ -226,7 +241,7 @@ public void getDigitalCredentialPayload(String nonce, Promise promise) { }); } - @ReactMethod + @Override public void exchangeCredentialResponseForPhoneNumber(String dcApiResponse, Promise promise) { fpnv.exchangeCredentialResponseForPhoneNumber(dcApiResponse) .addOnSuccessListener( diff --git a/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboPnvSpec.java b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboPnvSpec.java new file mode 100644 index 0000000000..999d56ea7e --- /dev/null +++ b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboPnvSpec.java @@ -0,0 +1,58 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeRNFBTurboPnvSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboPnv"; + + public NativeRNFBTurboPnvSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod + @DoNotStrip + public abstract void enableTestSession(String token, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getVerificationSupportInfo(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getVerificationSupportInfoForSimSlot(double simSlot, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getVerifiedPhoneNumber(Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getDigitalCredentialPayload(String nonce, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void exchangeCredentialResponseForPhoneNumber(String dcApiResponse, Promise promise); +} diff --git a/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/CMakeLists.txt b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..d3f4cdf15b --- /dev/null +++ b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBPnvTurboModules/*.cpp) + +add_library( + react_codegen_RNFBPnvTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBPnvTurboModules PUBLIC . react/renderer/components/RNFBPnvTurboModules) + +target_link_libraries( + react_codegen_RNFBPnvTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBPnvTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/RNFBPnvTurboModules-generated.cpp b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/RNFBPnvTurboModules-generated.cpp new file mode 100644 index 0000000000..4ed4e01a72 --- /dev/null +++ b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/RNFBPnvTurboModules-generated.cpp @@ -0,0 +1,62 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBPnvTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_enableTestSession(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "enableTestSession", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerificationSupportInfo(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getVerificationSupportInfo", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerificationSupportInfoForSimSlot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getVerificationSupportInfoForSimSlot", "(DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerifiedPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getVerifiedPhoneNumber", "(Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_getDigitalCredentialPayload(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getDigitalCredentialPayload", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_exchangeCredentialResponseForPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "exchangeCredentialResponseForPhoneNumber", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboPnvSpecJSI::NativeRNFBTurboPnvSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["enableTestSession"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvSpecJSI_enableTestSession}; + methodMap_["getVerificationSupportInfo"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerificationSupportInfo}; + methodMap_["getVerificationSupportInfoForSimSlot"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerificationSupportInfoForSimSlot}; + methodMap_["getVerifiedPhoneNumber"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerifiedPhoneNumber}; + methodMap_["getDigitalCredentialPayload"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvSpecJSI_getDigitalCredentialPayload}; + methodMap_["exchangeCredentialResponseForPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvSpecJSI_exchangeCredentialResponseForPhoneNumber}; +} + +std::shared_ptr RNFBPnvTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboPnv") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/RNFBPnvTurboModules.h b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/RNFBPnvTurboModules.h new file mode 100644 index 0000000000..06d5dc8a91 --- /dev/null +++ b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/RNFBPnvTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboPnv' + */ +class JSI_EXPORT NativeRNFBTurboPnvSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboPnvSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBPnvTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/react/renderer/components/RNFBPnvTurboModules/RNFBPnvTurboModulesJSI-generated.cpp b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/react/renderer/components/RNFBPnvTurboModules/RNFBPnvTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..f8dd545d98 --- /dev/null +++ b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/react/renderer/components/RNFBPnvTurboModules/RNFBPnvTurboModulesJSI-generated.cpp @@ -0,0 +1,60 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBPnvTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_enableTestSession(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->enableTestSession( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerificationSupportInfo(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getVerificationSupportInfo( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerificationSupportInfoForSimSlot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getVerificationSupportInfoForSimSlot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerifiedPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getVerifiedPhoneNumber( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getDigitalCredentialPayload(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getDigitalCredentialPayload( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_exchangeCredentialResponseForPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->exchangeCredentialResponseForPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} + +NativeRNFBTurboPnvCxxSpecJSI::NativeRNFBTurboPnvCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboPnv", jsInvoker) { + methodMap_["enableTestSession"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_enableTestSession}; + methodMap_["getVerificationSupportInfo"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerificationSupportInfo}; + methodMap_["getVerificationSupportInfoForSimSlot"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerificationSupportInfoForSimSlot}; + methodMap_["getVerifiedPhoneNumber"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerifiedPhoneNumber}; + methodMap_["getDigitalCredentialPayload"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getDigitalCredentialPayload}; + methodMap_["exchangeCredentialResponseForPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_exchangeCredentialResponseForPhoneNumber}; +} + + +} // namespace facebook::react diff --git a/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/react/renderer/components/RNFBPnvTurboModules/RNFBPnvTurboModulesJSI.h b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/react/renderer/components/RNFBPnvTurboModules/RNFBPnvTurboModulesJSI.h new file mode 100644 index 0000000000..5d0cc7a939 --- /dev/null +++ b/packages/phone-number-verification/android/src/reactnative/java/io/invertase/firebase/pnv/generated/jni/react/renderer/components/RNFBPnvTurboModules/RNFBPnvTurboModulesJSI.h @@ -0,0 +1,253 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboPnvVerificationSupportResult + +template +struct NativeRNFBTurboPnvVerificationSupportResult { + P0 isSupported; + P1 simSlot; + P2 carrierId; + P3 reason; + bool operator==(const NativeRNFBTurboPnvVerificationSupportResult &other) const { + return isSupported == other.isSupported && simSlot == other.simSlot && carrierId == other.carrierId && reason == other.reason; + } +}; + +template +struct NativeRNFBTurboPnvVerificationSupportResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "isSupported"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "simSlot"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "carrierId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "reason"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool isSupportedToJs(jsi::Runtime &rt, decltype(types.isSupported) value) { + return bridging::toJs(rt, value); + } + + static double simSlotToJs(jsi::Runtime &rt, decltype(types.simSlot) value) { + return bridging::toJs(rt, value); + } + + static jsi::String carrierIdToJs(jsi::Runtime &rt, decltype(types.carrierId) value) { + return bridging::toJs(rt, value); + } + + static jsi::String reasonToJs(jsi::Runtime &rt, decltype(types.reason) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "isSupported", bridging::toJs(rt, value.isSupported, jsInvoker)); + result.setProperty(rt, "simSlot", bridging::toJs(rt, value.simSlot, jsInvoker)); + result.setProperty(rt, "carrierId", bridging::toJs(rt, value.carrierId, jsInvoker)); + result.setProperty(rt, "reason", bridging::toJs(rt, value.reason, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboPnvVerifiedPhoneNumberTokenResult + +template +struct NativeRNFBTurboPnvVerifiedPhoneNumberTokenResult { + P0 phoneNumber; + P1 token; + P2 expirationTimestamp; + P3 issuedAtTimestamp; + P4 nonce; + P5 claims; + bool operator==(const NativeRNFBTurboPnvVerifiedPhoneNumberTokenResult &other) const { + return phoneNumber == other.phoneNumber && token == other.token && expirationTimestamp == other.expirationTimestamp && issuedAtTimestamp == other.issuedAtTimestamp && nonce == other.nonce && claims == other.claims; + } +}; + +template +struct NativeRNFBTurboPnvVerifiedPhoneNumberTokenResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "phoneNumber"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "token"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "expirationTimestamp"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "issuedAtTimestamp"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "nonce"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "claims"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String phoneNumberToJs(jsi::Runtime &rt, decltype(types.phoneNumber) value) { + return bridging::toJs(rt, value); + } + + static jsi::String tokenToJs(jsi::Runtime &rt, decltype(types.token) value) { + return bridging::toJs(rt, value); + } + + static double expirationTimestampToJs(jsi::Runtime &rt, decltype(types.expirationTimestamp) value) { + return bridging::toJs(rt, value); + } + + static double issuedAtTimestampToJs(jsi::Runtime &rt, decltype(types.issuedAtTimestamp) value) { + return bridging::toJs(rt, value); + } + + static std::optional nonceToJs(jsi::Runtime &rt, decltype(types.nonce) value) { + return bridging::toJs(rt, value); + } + + static std::optional claimsToJs(jsi::Runtime &rt, decltype(types.claims) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "phoneNumber", bridging::toJs(rt, value.phoneNumber, jsInvoker)); + result.setProperty(rt, "token", bridging::toJs(rt, value.token, jsInvoker)); + result.setProperty(rt, "expirationTimestamp", bridging::toJs(rt, value.expirationTimestamp, jsInvoker)); + result.setProperty(rt, "issuedAtTimestamp", bridging::toJs(rt, value.issuedAtTimestamp, jsInvoker)); + result.setProperty(rt, "nonce", bridging::toJs(rt, value.nonce, jsInvoker)); + result.setProperty(rt, "claims", bridging::toJs(rt, value.claims, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboPnvCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboPnvCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value enableTestSession(jsi::Runtime &rt, jsi::String token) = 0; + virtual jsi::Value getVerificationSupportInfo(jsi::Runtime &rt) = 0; + virtual jsi::Value getVerificationSupportInfoForSimSlot(jsi::Runtime &rt, double simSlot) = 0; + virtual jsi::Value getVerifiedPhoneNumber(jsi::Runtime &rt) = 0; + virtual jsi::Value getDigitalCredentialPayload(jsi::Runtime &rt, jsi::String nonce) = 0; + virtual jsi::Value exchangeCredentialResponseForPhoneNumber(jsi::Runtime &rt, jsi::String dcApiResponse) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboPnvCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboPnv"; + +protected: + NativeRNFBTurboPnvCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboPnvCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboPnvCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboPnvCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value enableTestSession(jsi::Runtime &rt, jsi::String token) override { + static_assert( + bridging::getParameterCount(&T::enableTestSession) == 2, + "Expected enableTestSession(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::enableTestSession, jsInvoker_, instance_, std::move(token)); + } + jsi::Value getVerificationSupportInfo(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getVerificationSupportInfo) == 1, + "Expected getVerificationSupportInfo(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getVerificationSupportInfo, jsInvoker_, instance_); + } + jsi::Value getVerificationSupportInfoForSimSlot(jsi::Runtime &rt, double simSlot) override { + static_assert( + bridging::getParameterCount(&T::getVerificationSupportInfoForSimSlot) == 2, + "Expected getVerificationSupportInfoForSimSlot(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getVerificationSupportInfoForSimSlot, jsInvoker_, instance_, std::move(simSlot)); + } + jsi::Value getVerifiedPhoneNumber(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getVerifiedPhoneNumber) == 1, + "Expected getVerifiedPhoneNumber(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getVerifiedPhoneNumber, jsInvoker_, instance_); + } + jsi::Value getDigitalCredentialPayload(jsi::Runtime &rt, jsi::String nonce) override { + static_assert( + bridging::getParameterCount(&T::getDigitalCredentialPayload) == 2, + "Expected getDigitalCredentialPayload(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getDigitalCredentialPayload, jsInvoker_, instance_, std::move(nonce)); + } + jsi::Value exchangeCredentialResponseForPhoneNumber(jsi::Runtime &rt, jsi::String dcApiResponse) override { + static_assert( + bridging::getParameterCount(&T::exchangeCredentialResponseForPhoneNumber) == 2, + "Expected exchangeCredentialResponseForPhoneNumber(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::exchangeCredentialResponseForPhoneNumber, jsInvoker_, instance_, std::move(dcApiResponse)); + } + + private: + friend class NativeRNFBTurboPnvCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/phone-number-verification/ios/generated/RCTAppDependencyProvider.h b/packages/phone-number-verification/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/phone-number-verification/ios/generated/RCTAppDependencyProvider.mm b/packages/phone-number-verification/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/phone-number-verification/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/phone-number-verification/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/phone-number-verification/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/phone-number-verification/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/phone-number-verification/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/phone-number-verification/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/phone-number-verification/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/phone-number-verification/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/phone-number-verification/ios/generated/RNFBPnvTurboModules/RNFBPnvTurboModules-generated.mm b/packages/phone-number-verification/ios/generated/RNFBPnvTurboModules/RNFBPnvTurboModules-generated.mm new file mode 100644 index 0000000000..758c0b9a75 --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RNFBPnvTurboModules/RNFBPnvTurboModules-generated.mm @@ -0,0 +1,74 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBPnvTurboModules.h" + + +@implementation NativeRNFBTurboPnvSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_enableTestSession(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "enableTestSession", @selector(enableTestSession:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerificationSupportInfo(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getVerificationSupportInfo", @selector(getVerificationSupportInfo:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerificationSupportInfoForSimSlot(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getVerificationSupportInfoForSimSlot", @selector(getVerificationSupportInfoForSimSlot:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerifiedPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getVerifiedPhoneNumber", @selector(getVerifiedPhoneNumber:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_getDigitalCredentialPayload(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getDigitalCredentialPayload", @selector(getDigitalCredentialPayload:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboPnvSpecJSI_exchangeCredentialResponseForPhoneNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "exchangeCredentialResponseForPhoneNumber", @selector(exchangeCredentialResponseForPhoneNumber:resolve:reject:), args, count); + } + + NativeRNFBTurboPnvSpecJSI::NativeRNFBTurboPnvSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["enableTestSession"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvSpecJSI_enableTestSession}; + + + methodMap_["getVerificationSupportInfo"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerificationSupportInfo}; + + + methodMap_["getVerificationSupportInfoForSimSlot"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerificationSupportInfoForSimSlot}; + + + methodMap_["getVerifiedPhoneNumber"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPnvSpecJSI_getVerifiedPhoneNumber}; + + + methodMap_["getDigitalCredentialPayload"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvSpecJSI_getDigitalCredentialPayload}; + + + methodMap_["exchangeCredentialResponseForPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvSpecJSI_exchangeCredentialResponseForPhoneNumber}; + + } +} // namespace facebook::react diff --git a/packages/phone-number-verification/ios/generated/RNFBPnvTurboModules/RNFBPnvTurboModules.h b/packages/phone-number-verification/ios/generated/RNFBPnvTurboModules/RNFBPnvTurboModules.h new file mode 100644 index 0000000000..6d64e8e077 --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RNFBPnvTurboModules/RNFBPnvTurboModules.h @@ -0,0 +1,77 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBPnvTurboModules symbols +#ifndef RNFBPnvTurboModules_H +#define RNFBPnvTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@protocol NativeRNFBTurboPnvSpec + +- (void)enableTestSession:(NSString *)token + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getVerificationSupportInfo:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getVerificationSupportInfoForSimSlot:(double)simSlot + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getVerifiedPhoneNumber:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getDigitalCredentialPayload:(NSString *)nonce + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)exchangeCredentialResponseForPhoneNumber:(NSString *)dcApiResponse + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end + +@interface NativeRNFBTurboPnvSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboPnv' + */ + class JSI_EXPORT NativeRNFBTurboPnvSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboPnvSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +NS_ASSUME_NONNULL_END +#endif // RNFBPnvTurboModules_H diff --git a/packages/phone-number-verification/ios/generated/RNFBPnvTurboModulesJSI-generated.cpp b/packages/phone-number-verification/ios/generated/RNFBPnvTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..f8dd545d98 --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RNFBPnvTurboModulesJSI-generated.cpp @@ -0,0 +1,60 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBPnvTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_enableTestSession(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->enableTestSession( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerificationSupportInfo(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getVerificationSupportInfo( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerificationSupportInfoForSimSlot(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getVerificationSupportInfoForSimSlot( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerifiedPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getVerifiedPhoneNumber( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getDigitalCredentialPayload(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getDigitalCredentialPayload( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_exchangeCredentialResponseForPhoneNumber(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->exchangeCredentialResponseForPhoneNumber( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} + +NativeRNFBTurboPnvCxxSpecJSI::NativeRNFBTurboPnvCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboPnv", jsInvoker) { + methodMap_["enableTestSession"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_enableTestSession}; + methodMap_["getVerificationSupportInfo"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerificationSupportInfo}; + methodMap_["getVerificationSupportInfoForSimSlot"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerificationSupportInfoForSimSlot}; + methodMap_["getVerifiedPhoneNumber"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getVerifiedPhoneNumber}; + methodMap_["getDigitalCredentialPayload"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_getDigitalCredentialPayload}; + methodMap_["exchangeCredentialResponseForPhoneNumber"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboPnvCxxSpecJSI_exchangeCredentialResponseForPhoneNumber}; +} + + +} // namespace facebook::react diff --git a/packages/phone-number-verification/ios/generated/RNFBPnvTurboModulesJSI.h b/packages/phone-number-verification/ios/generated/RNFBPnvTurboModulesJSI.h new file mode 100644 index 0000000000..5d0cc7a939 --- /dev/null +++ b/packages/phone-number-verification/ios/generated/RNFBPnvTurboModulesJSI.h @@ -0,0 +1,253 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboPnvVerificationSupportResult + +template +struct NativeRNFBTurboPnvVerificationSupportResult { + P0 isSupported; + P1 simSlot; + P2 carrierId; + P3 reason; + bool operator==(const NativeRNFBTurboPnvVerificationSupportResult &other) const { + return isSupported == other.isSupported && simSlot == other.simSlot && carrierId == other.carrierId && reason == other.reason; + } +}; + +template +struct NativeRNFBTurboPnvVerificationSupportResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "isSupported"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "simSlot"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "carrierId"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "reason"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool isSupportedToJs(jsi::Runtime &rt, decltype(types.isSupported) value) { + return bridging::toJs(rt, value); + } + + static double simSlotToJs(jsi::Runtime &rt, decltype(types.simSlot) value) { + return bridging::toJs(rt, value); + } + + static jsi::String carrierIdToJs(jsi::Runtime &rt, decltype(types.carrierId) value) { + return bridging::toJs(rt, value); + } + + static jsi::String reasonToJs(jsi::Runtime &rt, decltype(types.reason) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "isSupported", bridging::toJs(rt, value.isSupported, jsInvoker)); + result.setProperty(rt, "simSlot", bridging::toJs(rt, value.simSlot, jsInvoker)); + result.setProperty(rt, "carrierId", bridging::toJs(rt, value.carrierId, jsInvoker)); + result.setProperty(rt, "reason", bridging::toJs(rt, value.reason, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboPnvVerifiedPhoneNumberTokenResult + +template +struct NativeRNFBTurboPnvVerifiedPhoneNumberTokenResult { + P0 phoneNumber; + P1 token; + P2 expirationTimestamp; + P3 issuedAtTimestamp; + P4 nonce; + P5 claims; + bool operator==(const NativeRNFBTurboPnvVerifiedPhoneNumberTokenResult &other) const { + return phoneNumber == other.phoneNumber && token == other.token && expirationTimestamp == other.expirationTimestamp && issuedAtTimestamp == other.issuedAtTimestamp && nonce == other.nonce && claims == other.claims; + } +}; + +template +struct NativeRNFBTurboPnvVerifiedPhoneNumberTokenResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "phoneNumber"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "token"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "expirationTimestamp"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "issuedAtTimestamp"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "nonce"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "claims"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::String phoneNumberToJs(jsi::Runtime &rt, decltype(types.phoneNumber) value) { + return bridging::toJs(rt, value); + } + + static jsi::String tokenToJs(jsi::Runtime &rt, decltype(types.token) value) { + return bridging::toJs(rt, value); + } + + static double expirationTimestampToJs(jsi::Runtime &rt, decltype(types.expirationTimestamp) value) { + return bridging::toJs(rt, value); + } + + static double issuedAtTimestampToJs(jsi::Runtime &rt, decltype(types.issuedAtTimestamp) value) { + return bridging::toJs(rt, value); + } + + static std::optional nonceToJs(jsi::Runtime &rt, decltype(types.nonce) value) { + return bridging::toJs(rt, value); + } + + static std::optional claimsToJs(jsi::Runtime &rt, decltype(types.claims) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "phoneNumber", bridging::toJs(rt, value.phoneNumber, jsInvoker)); + result.setProperty(rt, "token", bridging::toJs(rt, value.token, jsInvoker)); + result.setProperty(rt, "expirationTimestamp", bridging::toJs(rt, value.expirationTimestamp, jsInvoker)); + result.setProperty(rt, "issuedAtTimestamp", bridging::toJs(rt, value.issuedAtTimestamp, jsInvoker)); + result.setProperty(rt, "nonce", bridging::toJs(rt, value.nonce, jsInvoker)); + result.setProperty(rt, "claims", bridging::toJs(rt, value.claims, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboPnvCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboPnvCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Value enableTestSession(jsi::Runtime &rt, jsi::String token) = 0; + virtual jsi::Value getVerificationSupportInfo(jsi::Runtime &rt) = 0; + virtual jsi::Value getVerificationSupportInfoForSimSlot(jsi::Runtime &rt, double simSlot) = 0; + virtual jsi::Value getVerifiedPhoneNumber(jsi::Runtime &rt) = 0; + virtual jsi::Value getDigitalCredentialPayload(jsi::Runtime &rt, jsi::String nonce) = 0; + virtual jsi::Value exchangeCredentialResponseForPhoneNumber(jsi::Runtime &rt, jsi::String dcApiResponse) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboPnvCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboPnv"; + +protected: + NativeRNFBTurboPnvCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboPnvCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboPnvCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboPnvCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Value enableTestSession(jsi::Runtime &rt, jsi::String token) override { + static_assert( + bridging::getParameterCount(&T::enableTestSession) == 2, + "Expected enableTestSession(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::enableTestSession, jsInvoker_, instance_, std::move(token)); + } + jsi::Value getVerificationSupportInfo(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getVerificationSupportInfo) == 1, + "Expected getVerificationSupportInfo(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getVerificationSupportInfo, jsInvoker_, instance_); + } + jsi::Value getVerificationSupportInfoForSimSlot(jsi::Runtime &rt, double simSlot) override { + static_assert( + bridging::getParameterCount(&T::getVerificationSupportInfoForSimSlot) == 2, + "Expected getVerificationSupportInfoForSimSlot(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getVerificationSupportInfoForSimSlot, jsInvoker_, instance_, std::move(simSlot)); + } + jsi::Value getVerifiedPhoneNumber(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getVerifiedPhoneNumber) == 1, + "Expected getVerifiedPhoneNumber(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getVerifiedPhoneNumber, jsInvoker_, instance_); + } + jsi::Value getDigitalCredentialPayload(jsi::Runtime &rt, jsi::String nonce) override { + static_assert( + bridging::getParameterCount(&T::getDigitalCredentialPayload) == 2, + "Expected getDigitalCredentialPayload(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::getDigitalCredentialPayload, jsInvoker_, instance_, std::move(nonce)); + } + jsi::Value exchangeCredentialResponseForPhoneNumber(jsi::Runtime &rt, jsi::String dcApiResponse) override { + static_assert( + bridging::getParameterCount(&T::exchangeCredentialResponseForPhoneNumber) == 2, + "Expected exchangeCredentialResponseForPhoneNumber(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::exchangeCredentialResponseForPhoneNumber, jsInvoker_, instance_, std::move(dcApiResponse)); + } + + private: + friend class NativeRNFBTurboPnvCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/phone-number-verification/ios/generated/ReactAppDependencyProvider.podspec b/packages/phone-number-verification/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/phone-number-verification/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/phone-number-verification/lib/index.ts b/packages/phone-number-verification/lib/index.ts index 49e8e43cca..d5127ea7f6 100644 --- a/packages/phone-number-verification/lib/index.ts +++ b/packages/phone-number-verification/lib/index.ts @@ -15,6 +15,12 @@ * */ +/** + * @module @react-native-firebase/phone-number-verification + * + * @remarks **Android only.** The Firebase Phone Number Verification SDK does not support iOS or + * Web. Every exported function throws when `Platform.OS !== 'android'`. + */ import { Platform } from 'react-native'; import { getReactNativeModule } from '@react-native-firebase/app/dist/module/internal/nativeModule'; @@ -25,7 +31,8 @@ export type * from './types/pnv'; const UNSUPPORTED_MSG = 'Firebase Phone Number Verification is only supported on Android.'; -const NATIVE_MODULE_NAME = 'RNFBPnvModule'; +// NewArch-AD-18 E10: package bypasses createModuleNamespace by design. +const NATIVE_MODULE_NAME = 'NativeRNFBTurboPnv'; interface NativePnvModule { enableTestSession(token: string): Promise; @@ -38,17 +45,23 @@ interface NativePnvModule { ): Promise; } +let memoizedNativeModule: NativePnvModule | null = null; + function getNativeModule(): NativePnvModule { if (Platform.OS !== 'android') { throw new Error(UNSUPPORTED_MSG); } + if (memoizedNativeModule) { + return memoizedNativeModule; + } const mod = getReactNativeModule(NATIVE_MODULE_NAME); if (!mod) { throw new Error( `Could not find native module '${NATIVE_MODULE_NAME}'. Ensure @react-native-firebase/phone-number-verification is linked.`, ); } - return mod as unknown as NativePnvModule; + memoizedNativeModule = mod as unknown as NativePnvModule; + return memoizedNativeModule; } /** diff --git a/packages/phone-number-verification/package.json b/packages/phone-number-verification/package.json index 71b32bd01e..ca2071e64f 100644 --- a/packages/phone-number-verification/package.json +++ b/packages/phone-number-verification/package.json @@ -5,11 +5,23 @@ "description": "React Native Firebase - Phone Number Verification", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBPnvTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.pnv" + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build", "compile": "bob build", - "prepare": "yarn run build && yarn compile" + "prepare": "yarn run build && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/reactnative/java/io/invertase/firebase/pnv/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/phone-number-verification/react-native.config.js b/packages/phone-number-verification/react-native.config.js index 043066d879..fb4f152d0f 100644 --- a/packages/phone-number-verification/react-native.config.js +++ b/packages/phone-number-verification/react-native.config.js @@ -2,6 +2,10 @@ module.exports = { dependency: { platforms: { ios: null, + android: { + cmakeListsPath: + './src/reactnative/java/io/invertase/firebase/pnv/generated/jni/CMakeLists.txt', + }, }, }, }; diff --git a/packages/phone-number-verification/specs/NativeRNFBTurboPnv.ts b/packages/phone-number-verification/specs/NativeRNFBTurboPnv.ts new file mode 100644 index 0000000000..8988fe0510 --- /dev/null +++ b/packages/phone-number-verification/specs/NativeRNFBTurboPnv.ts @@ -0,0 +1,39 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export type VerificationSupportStatus = + | 'CAPABILITY_STATUS_UNSPECIFIED' + | 'CAPABLE' + | 'INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED' + | 'INCAPABLE_DUE_TO_ANDROID_VERSION' + | 'INCAPABLE_DUE_TO_SIM_STATE'; + +export interface VerificationSupportResult { + isSupported: boolean; + simSlot: number; + carrierId: string; + reason: VerificationSupportStatus; +} + +export interface VerifiedPhoneNumberTokenResult { + phoneNumber: string; + token: string; + expirationTimestamp: number; + issuedAtTimestamp: number; + nonce: string | null; + claims: Object | null; +} + +export interface Spec extends TurboModule { + enableTestSession(token: string): Promise; + getVerificationSupportInfo(): Promise>; + getVerificationSupportInfoForSimSlot(simSlot: number): Promise>; + getVerifiedPhoneNumber(): Promise; + getDigitalCredentialPayload(nonce: string): Promise; + exchangeCredentialResponseForPhoneNumber( + dcApiResponse: string, + ): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboPnv'); diff --git a/packages/remote-config/RNFBRemoteConfig.podspec b/packages/remote-config/RNFBRemoteConfig.podspec index 68661bf39c..e5c326ff6c 100644 --- a/packages/remote-config/RNFBRemoteConfig.podspec +++ b/packages/remote-config/RNFBRemoteConfig.podspec @@ -28,15 +28,16 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp}' + s.private_header_files = "ios/**/*.h" + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) diff --git a/packages/remote-config/__tests__/nativeModuleContract.test.ts b/packages/remote-config/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..28ed166762 --- /dev/null +++ b/packages/remote-config/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,44 @@ +import { describe, expect, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'activate', + 'setConfigSettings', + 'fetch', + 'fetchAndActivate', + 'ensureInitialized', + 'setDefaults', + 'setDefaultsFromResource', + 'reset', + 'onConfigUpdated', + 'removeConfigUpdateRegistration', + 'setCustomSignals', +] as const; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper', function () { + assertTurboContract({ + namespace: 'remoteConfig', + nativeModuleName: 'NativeRNFBTurboConfig', + nativeEvents: ['on_config_updated'], + hasMultiAppSupport: true, + hasCustomUrlOrRegionSupport: false, + turboModule: true, + specMethods: SPEC_METHODS, + createMock: () => jest.fn(() => Promise.resolve(null)), + constants: { + lastFetchTime: Date.now(), + lastFetchStatus: 'success', + fetchTimeout: 60, + minimumFetchInterval: 43200, + values: {}, + }, + assertExtra: wrapped => { + expect(wrapped.lastFetchStatus).toBe('success'); + expect(wrapped.fetchTimeout).toBe(60); + expect(wrapped.minimumFetchInterval).toBe(43200); + expect(wrapped.values).toEqual({}); + }, + }); + }); +}); diff --git a/packages/remote-config/android/build.gradle b/packages/remote-config/android/build.gradle index 9a34339c09..6021c4850f 100644 --- a/packages/remote-config/android/build.gradle +++ b/packages/remote-config/android/build.gradle @@ -79,6 +79,7 @@ android { sourceSets { main { java.srcDirs = ['src/main/java', 'src/reactnative/java'] + java.excludes = ['**/generated/jni/**'] } } } @@ -98,3 +99,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/remote-config") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/NativeRNFBTurboConfig.java b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/NativeRNFBTurboConfig.java new file mode 100644 index 0000000000..9d9e933fa3 --- /dev/null +++ b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/NativeRNFBTurboConfig.java @@ -0,0 +1,326 @@ +package io.invertase.firebase.config; + +/* + * Copyright (c) 2016-present Invertase Limited & Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this library except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage; +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithExceptionMap; + +import com.facebook.fbreact.specs.NativeRNFBTurboConfigSpec; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableMap; +import com.google.firebase.FirebaseApp; +import com.google.firebase.remoteconfig.ConfigUpdate; +import com.google.firebase.remoteconfig.ConfigUpdateListener; +import com.google.firebase.remoteconfig.ConfigUpdateListenerRegistration; +import com.google.firebase.remoteconfig.FirebaseRemoteConfig; +import com.google.firebase.remoteconfig.FirebaseRemoteConfigException; +import com.google.firebase.remoteconfig.FirebaseRemoteConfigFetchThrottledException; +import io.invertase.firebase.common.ReactNativeFirebaseEvent; +import io.invertase.firebase.common.ReactNativeFirebaseEventEmitter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nullable; +import org.jetbrains.annotations.NotNull; + +public class NativeRNFBTurboConfig extends NativeRNFBTurboConfigSpec { + private static final String SERVICE_NAME = "Config"; + private final UniversalFirebaseConfigModule module; + + private static final HashMap + mConfigUpdateRegistrations = new HashMap<>(); + + public NativeRNFBTurboConfig(ReactApplicationContext reactContext) { + super(reactContext); + module = new UniversalFirebaseConfigModule(reactContext, SERVICE_NAME); + } + + @Override + public void invalidate() { + super.invalidate(); + + Iterator> configRegistrationsIterator = + mConfigUpdateRegistrations.entrySet().iterator(); + + while (configRegistrationsIterator.hasNext()) { + Map.Entry pair = configRegistrationsIterator.next(); + ConfigUpdateListenerRegistration mConfigRegistration = pair.getValue(); + mConfigRegistration.remove(); + configRegistrationsIterator.remove(); + } + + module.onTearDown(); + } + + @Override + protected Map getTypedExportedConstants() { + return module.getConstantsForApp(FirebaseApp.DEFAULT_APP_NAME); + } + + @Override + public void activate(String appName, Promise promise) { + module + .activate(appName) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(resultWithConstants(task.getResult(), appName)); + } else { + rejectPromiseWithExceptionMap(promise, task.getException()); + } + }); + } + + @Override + public void fetch(String appName, double expirationDurationSeconds, Promise promise) { + module + .fetch(appName, (long) expirationDurationSeconds) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(resultWithVoidConstants(appName)); + } else { + rejectPromiseWithConfigException(promise, task.getException()); + } + }); + } + + @Override + public void fetchAndActivate(String appName, Promise promise) { + module + .fetchAndActivate(appName) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(resultWithConstants(task.getResult(), appName)); + } else { + rejectPromiseWithConfigException(promise, task.getException()); + } + }); + } + + @Override + public void reset(String appName, Promise promise) { + module + .reset(appName) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(resultWithVoidConstants(appName)); + } else { + rejectPromiseWithConfigException(promise, task.getException()); + } + }); + } + + @Override + public void setConfigSettings(String appName, ReadableMap configSettings, Promise promise) { + module + .setConfigSettings(appName, Arguments.toBundle(configSettings)) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(resultWithVoidConstants(appName)); + } else { + rejectPromiseWithExceptionMap(promise, task.getException()); + } + }); + } + + @Override + public void setDefaults(String appName, ReadableMap defaults, Promise promise) { + module + .setDefaults(appName, defaults.toHashMap()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(resultWithConstants(task.getResult(), appName)); + } else { + rejectPromiseWithExceptionMap(promise, task.getException()); + } + }); + } + + @Override + public void setDefaultsFromResource(String appName, String resourceName, Promise promise) { + module + .setDefaultsFromResource(appName, resourceName) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(resultWithConstants(task.getResult(), appName)); + } else { + Exception exception = task.getException(); + if (exception != null && exception.getMessage().equals("resource_not_found")) { + rejectPromiseWithCodeAndMessage( + promise, "resource_not_found", "The specified resource name was not found."); + return; + } + rejectPromiseWithExceptionMap(promise, task.getException()); + } + }); + } + + @Override + public void ensureInitialized(String appName, Promise promise) { + module + .ensureInitialized(appName) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(resultWithVoidConstants(appName)); + } else { + rejectPromiseWithExceptionMap(promise, task.getException()); + } + }); + } + + @Override + public void onConfigUpdated(String appName) { + if (mConfigUpdateRegistrations.get(appName) == null) { + ConfigUpdateListenerRegistration registration = + FirebaseRemoteConfig.getInstance(FirebaseApp.getInstance(appName)) + .addOnConfigUpdateListener( + new ConfigUpdateListener() { + @Override + public void onUpdate(@NotNull ConfigUpdate configUpdate) { + ReactNativeFirebaseEventEmitter emitter = + ReactNativeFirebaseEventEmitter.getSharedInstance(); + + Set updatedKeys = configUpdate.getUpdatedKeys(); + List updatedKeysList = new ArrayList<>(updatedKeys); + + Map results = new HashMap<>(); + results.put("appName", appName); + results.put("resultType", "success"); + results.put("updatedKeys", updatedKeysList); + ReactNativeFirebaseEvent event = + new ReactNativeFirebaseEvent( + "on_config_updated", Arguments.makeNativeMap(results), appName); + emitter.sendEvent(event); + } + + @Override + public void onError(@NotNull FirebaseRemoteConfigException error) { + ReactNativeFirebaseEventEmitter emitter = + ReactNativeFirebaseEventEmitter.getSharedInstance(); + + WritableMap userInfoMap = Arguments.createMap(); + userInfoMap.putString("resultType", "error"); + userInfoMap.putString("appName", appName); + + FirebaseRemoteConfigException.Code code = error.getCode(); + switch (code) { + case CONFIG_UPDATE_STREAM_ERROR: + userInfoMap.putString("code", "config_update_stream_error"); + break; + case CONFIG_UPDATE_MESSAGE_INVALID: + userInfoMap.putString("code", "config_update_message_invalid"); + break; + case CONFIG_UPDATE_NOT_FETCHED: + userInfoMap.putString("code", "config_update_not_fetched"); + break; + case CONFIG_UPDATE_UNAVAILABLE: + userInfoMap.putString("code", "config_update_unavailable"); + break; + case UNKNOWN: + userInfoMap.putString("code", "unknown"); + break; + default: + userInfoMap.putString("code", "internal"); + } + + userInfoMap.putString("message", error.getMessage()); + userInfoMap.putString("nativeErrorMessage", error.getMessage()); + ReactNativeFirebaseEvent event = + new ReactNativeFirebaseEvent("on_config_updated", userInfoMap, appName); + emitter.sendEvent(event); + } + }); + + mConfigUpdateRegistrations.put(appName, registration); + } + } + + @Override + public void removeConfigUpdateRegistration(String appName) { + ConfigUpdateListenerRegistration mConfigRegistration = mConfigUpdateRegistrations.get(appName); + + if (mConfigRegistration != null) { + mConfigRegistration.remove(); + mConfigUpdateRegistrations.remove(appName); + } + } + + @Override + public void setCustomSignals(String appName, ReadableMap customSignals, Promise promise) { + module + .setCustomSignals(appName, customSignals.toHashMap()) + .addOnCompleteListener( + task -> { + if (task.isSuccessful()) { + promise.resolve(resultWithVoidConstants(appName)); + } else { + rejectPromiseWithExceptionMap(promise, task.getException()); + } + }); + } + + private WritableMap resultWithConstants(Object result, String appName) { + Map responseMap = new HashMap<>(2); + responseMap.put("result", result); + responseMap.put("constants", module.getConstantsForApp(appName)); + return Arguments.makeNativeMap(responseMap); + } + + private WritableMap resultWithVoidConstants(String appName) { + Map responseMap = new HashMap<>(1); + responseMap.put("constants", module.getConstantsForApp(appName)); + return Arguments.makeNativeMap(responseMap); + } + + private void rejectPromiseWithConfigException(Promise promise, @Nullable Exception exception) { + if (exception == null) { + rejectPromiseWithCodeAndMessage( + promise, + "unknown", + "Operation cannot be completed successfully, due to an unknown error."); + return; + } + + if (exception.getCause() instanceof FirebaseRemoteConfigFetchThrottledException) { + rejectPromiseWithCodeAndMessage( + promise, + "throttled", + "fetch() operation cannot be completed successfully, due to throttling.", + exception.getMessage()); + } else { + rejectPromiseWithCodeAndMessage( + promise, + "failure", + "fetch() operation cannot be completed successfully.", + exception.getMessage()); + } + } +} diff --git a/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/ReactNativeFirebaseConfigPackage.java b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/ReactNativeFirebaseConfigPackage.java index 0b97f605a5..d562ac2e00 100644 --- a/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/ReactNativeFirebaseConfigPackage.java +++ b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/ReactNativeFirebaseConfigPackage.java @@ -32,7 +32,7 @@ public class ReactNativeFirebaseConfigPackage implements ReactPackage { @Override public List createNativeModules(@Nonnull ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseConfigModule(reactContext)); + modules.add(new NativeRNFBTurboConfig(reactContext)); return modules; } diff --git a/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboConfigSpec.java b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboConfigSpec.java new file mode 100644 index 0000000000..9bf51284b3 --- /dev/null +++ b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboConfigSpec.java @@ -0,0 +1,115 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboConfigSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboConfig"; + + public NativeRNFBTurboConfigSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + protected abstract Map getTypedExportedConstants(); + + @Override + @DoNotStrip + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "fetchTimeout", + "lastFetchStatus", + "lastFetchTime", + "minimumFetchInterval", + "values" + )); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } + + @ReactMethod + @DoNotStrip + public abstract void activate(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setConfigSettings(String appName, ReadableMap settings, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void fetch(String appName, double expirationDurationSeconds, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void fetchAndActivate(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void ensureInitialized(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setDefaults(String appName, ReadableMap defaults, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setDefaultsFromResource(String appName, String resourceName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void reset(String appName, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void onConfigUpdated(String appName); + + @ReactMethod + @DoNotStrip + public abstract void removeConfigUpdateRegistration(String appName); + + @ReactMethod + @DoNotStrip + public abstract void setCustomSignals(String appName, ReadableMap customSignals, Promise promise); +} diff --git a/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/CMakeLists.txt b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..683b218579 --- /dev/null +++ b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBRemoteConfigTurboModules/*.cpp) + +add_library( + react_codegen_RNFBRemoteConfigTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBRemoteConfigTurboModules PUBLIC . react/renderer/components/RNFBRemoteConfigTurboModules) + +target_link_libraries( + react_codegen_RNFBRemoteConfigTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBRemoteConfigTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/RNFBRemoteConfigTurboModules-generated.cpp b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/RNFBRemoteConfigTurboModules-generated.cpp new file mode 100644 index 0000000000..1c6515c2a7 --- /dev/null +++ b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/RNFBRemoteConfigTurboModules-generated.cpp @@ -0,0 +1,98 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBRemoteConfigTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "getConstants", "()Ljava/util/Map;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_activate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "activate", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_setConfigSettings(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setConfigSettings", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_fetch(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "fetch", "(Ljava/lang/String;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_fetchAndActivate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "fetchAndActivate", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_ensureInitialized(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "ensureInitialized", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_setDefaults(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setDefaults", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_setDefaultsFromResource(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setDefaultsFromResource", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_reset(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "reset", "(Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_onConfigUpdated(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "onConfigUpdated", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_removeConfigUpdateRegistration(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeConfigUpdateRegistration", "(Ljava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_setCustomSignals(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setCustomSignals", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboConfigSpecJSI::NativeRNFBTurboConfigSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboConfigSpecJSI_getConstants}; + methodMap_["activate"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_activate}; + methodMap_["setConfigSettings"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_setConfigSettings}; + methodMap_["fetch"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_fetch}; + methodMap_["fetchAndActivate"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_fetchAndActivate}; + methodMap_["ensureInitialized"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_ensureInitialized}; + methodMap_["setDefaults"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_setDefaults}; + methodMap_["setDefaultsFromResource"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_setDefaultsFromResource}; + methodMap_["reset"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_reset}; + methodMap_["onConfigUpdated"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_onConfigUpdated}; + methodMap_["removeConfigUpdateRegistration"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_removeConfigUpdateRegistration}; + methodMap_["setCustomSignals"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_setCustomSignals}; +} + +std::shared_ptr RNFBRemoteConfigTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboConfig") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/RNFBRemoteConfigTurboModules.h b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/RNFBRemoteConfigTurboModules.h new file mode 100644 index 0000000000..0f59d28f45 --- /dev/null +++ b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/RNFBRemoteConfigTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboConfig' + */ +class JSI_EXPORT NativeRNFBTurboConfigSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboConfigSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBRemoteConfigTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/react/renderer/components/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModulesJSI-generated.cpp b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/react/renderer/components/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..84156ba97b --- /dev/null +++ b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/react/renderer/components/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModulesJSI-generated.cpp @@ -0,0 +1,110 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBRemoteConfigTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_activate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->activate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setConfigSettings(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setConfigSettings( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_fetch(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->fetch( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_fetchAndActivate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->fetchAndActivate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_ensureInitialized(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->ensureInitialized( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setDefaults(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setDefaults( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setDefaultsFromResource(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setDefaultsFromResource( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_reset(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->reset( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_onConfigUpdated(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->onConfigUpdated( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_removeConfigUpdateRegistration(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeConfigUpdateRegistration( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setCustomSignals(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setCustomSignals( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} + +NativeRNFBTurboConfigCxxSpecJSI::NativeRNFBTurboConfigCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboConfig", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_getConstants}; + methodMap_["activate"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_activate}; + methodMap_["setConfigSettings"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setConfigSettings}; + methodMap_["fetch"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_fetch}; + methodMap_["fetchAndActivate"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_fetchAndActivate}; + methodMap_["ensureInitialized"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_ensureInitialized}; + methodMap_["setDefaults"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setDefaults}; + methodMap_["setDefaultsFromResource"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setDefaultsFromResource}; + methodMap_["reset"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_reset}; + methodMap_["onConfigUpdated"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_onConfigUpdated}; + methodMap_["removeConfigUpdateRegistration"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_removeConfigUpdateRegistration}; + methodMap_["setCustomSignals"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setCustomSignals}; +} + + +} // namespace facebook::react diff --git a/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/react/renderer/components/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModulesJSI.h b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/react/renderer/components/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModulesJSI.h new file mode 100644 index 0000000000..640fd618de --- /dev/null +++ b/packages/remote-config/android/src/reactnative/java/io/invertase/firebase/config/generated/jni/react/renderer/components/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModulesJSI.h @@ -0,0 +1,471 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboConfigBooleanRemoteConfigResult + +template +struct NativeRNFBTurboConfigBooleanRemoteConfigResult { + P0 result; + P1 constants; + bool operator==(const NativeRNFBTurboConfigBooleanRemoteConfigResult &other) const { + return result == other.result && constants == other.constants; + } +}; + +template +struct NativeRNFBTurboConfigBooleanRemoteConfigResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "result"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "constants"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool resultToJs(jsi::Runtime &rt, decltype(types.result) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object constantsToJs(jsi::Runtime &rt, decltype(types.constants) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "result", bridging::toJs(rt, value.result, jsInvoker)); + result.setProperty(rt, "constants", bridging::toJs(rt, value.constants, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigConfigSettings + +template +struct NativeRNFBTurboConfigConfigSettings { + P0 fetchTimeout; + P1 minimumFetchInterval; + bool operator==(const NativeRNFBTurboConfigConfigSettings &other) const { + return fetchTimeout == other.fetchTimeout && minimumFetchInterval == other.minimumFetchInterval; + } +}; + +template +struct NativeRNFBTurboConfigConfigSettingsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "fetchTimeout"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "minimumFetchInterval"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double fetchTimeoutToJs(jsi::Runtime &rt, decltype(types.fetchTimeout) value) { + return bridging::toJs(rt, value); + } + + static double minimumFetchIntervalToJs(jsi::Runtime &rt, decltype(types.minimumFetchInterval) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "fetchTimeout", bridging::toJs(rt, value.fetchTimeout, jsInvoker)); + result.setProperty(rt, "minimumFetchInterval", bridging::toJs(rt, value.minimumFetchInterval, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigNullRemoteConfigResult + +template +struct NativeRNFBTurboConfigNullRemoteConfigResult { + P0 result; + P1 constants; + bool operator==(const NativeRNFBTurboConfigNullRemoteConfigResult &other) const { + return result == other.result && constants == other.constants; + } +}; + +template +struct NativeRNFBTurboConfigNullRemoteConfigResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "result"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "constants"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static std::optional resultToJs(jsi::Runtime &rt, decltype(types.result) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object constantsToJs(jsi::Runtime &rt, decltype(types.constants) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "result", bridging::toJs(rt, value.result, jsInvoker)); + result.setProperty(rt, "constants", bridging::toJs(rt, value.constants, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigRemoteConfigConstants + +template +struct NativeRNFBTurboConfigRemoteConfigConstants { + P0 fetchTimeout; + P1 minimumFetchInterval; + P2 lastFetchTime; + P3 lastFetchStatus; + P4 values; + bool operator==(const NativeRNFBTurboConfigRemoteConfigConstants &other) const { + return fetchTimeout == other.fetchTimeout && minimumFetchInterval == other.minimumFetchInterval && lastFetchTime == other.lastFetchTime && lastFetchStatus == other.lastFetchStatus && values == other.values; + } +}; + +template +struct NativeRNFBTurboConfigRemoteConfigConstantsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "fetchTimeout"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "minimumFetchInterval"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "lastFetchTime"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "lastFetchStatus"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "values"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double fetchTimeoutToJs(jsi::Runtime &rt, decltype(types.fetchTimeout) value) { + return bridging::toJs(rt, value); + } + + static double minimumFetchIntervalToJs(jsi::Runtime &rt, decltype(types.minimumFetchInterval) value) { + return bridging::toJs(rt, value); + } + + static double lastFetchTimeToJs(jsi::Runtime &rt, decltype(types.lastFetchTime) value) { + return bridging::toJs(rt, value); + } + + static jsi::String lastFetchStatusToJs(jsi::Runtime &rt, decltype(types.lastFetchStatus) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object valuesToJs(jsi::Runtime &rt, decltype(types.values) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "fetchTimeout", bridging::toJs(rt, value.fetchTimeout, jsInvoker)); + result.setProperty(rt, "minimumFetchInterval", bridging::toJs(rt, value.minimumFetchInterval, jsInvoker)); + result.setProperty(rt, "lastFetchTime", bridging::toJs(rt, value.lastFetchTime, jsInvoker)); + result.setProperty(rt, "lastFetchStatus", bridging::toJs(rt, value.lastFetchStatus, jsInvoker)); + result.setProperty(rt, "values", bridging::toJs(rt, value.values, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigStoredConfigValue + +template +struct NativeRNFBTurboConfigStoredConfigValue { + P0 value; + P1 source; + bool operator==(const NativeRNFBTurboConfigStoredConfigValue &other) const { + return value == other.value && source == other.source; + } +}; + +template +struct NativeRNFBTurboConfigStoredConfigValueBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "value"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "source"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object valueToJs(jsi::Runtime &rt, decltype(types.value) value) { + return bridging::toJs(rt, value); + } + + static jsi::String sourceToJs(jsi::Runtime &rt, decltype(types.source) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "value", bridging::toJs(rt, value.value, jsInvoker)); + result.setProperty(rt, "source", bridging::toJs(rt, value.source, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigVoidRemoteConfigResult + +template +struct NativeRNFBTurboConfigVoidRemoteConfigResult { + P0 constants; + bool operator==(const NativeRNFBTurboConfigVoidRemoteConfigResult &other) const { + return constants == other.constants; + } +}; + +template +struct NativeRNFBTurboConfigVoidRemoteConfigResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "constants"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object constantsToJs(jsi::Runtime &rt, decltype(types.constants) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "constants", bridging::toJs(rt, value.constants, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboConfigCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboConfigCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value activate(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value setConfigSettings(jsi::Runtime &rt, jsi::String appName, jsi::Object settings) = 0; + virtual jsi::Value fetch(jsi::Runtime &rt, jsi::String appName, double expirationDurationSeconds) = 0; + virtual jsi::Value fetchAndActivate(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value ensureInitialized(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value setDefaults(jsi::Runtime &rt, jsi::String appName, jsi::Object defaults) = 0; + virtual jsi::Value setDefaultsFromResource(jsi::Runtime &rt, jsi::String appName, jsi::String resourceName) = 0; + virtual jsi::Value reset(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void onConfigUpdated(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void removeConfigUpdateRegistration(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value setCustomSignals(jsi::Runtime &rt, jsi::String appName, jsi::Object customSignals) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboConfigCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboConfig"; + +protected: + NativeRNFBTurboConfigCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboConfigCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboConfigCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboConfigCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value activate(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::activate) == 2, + "Expected activate(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::activate, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value setConfigSettings(jsi::Runtime &rt, jsi::String appName, jsi::Object settings) override { + static_assert( + bridging::getParameterCount(&T::setConfigSettings) == 3, + "Expected setConfigSettings(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setConfigSettings, jsInvoker_, instance_, std::move(appName), std::move(settings)); + } + jsi::Value fetch(jsi::Runtime &rt, jsi::String appName, double expirationDurationSeconds) override { + static_assert( + bridging::getParameterCount(&T::fetch) == 3, + "Expected fetch(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::fetch, jsInvoker_, instance_, std::move(appName), std::move(expirationDurationSeconds)); + } + jsi::Value fetchAndActivate(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::fetchAndActivate) == 2, + "Expected fetchAndActivate(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::fetchAndActivate, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value ensureInitialized(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::ensureInitialized) == 2, + "Expected ensureInitialized(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::ensureInitialized, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value setDefaults(jsi::Runtime &rt, jsi::String appName, jsi::Object defaults) override { + static_assert( + bridging::getParameterCount(&T::setDefaults) == 3, + "Expected setDefaults(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setDefaults, jsInvoker_, instance_, std::move(appName), std::move(defaults)); + } + jsi::Value setDefaultsFromResource(jsi::Runtime &rt, jsi::String appName, jsi::String resourceName) override { + static_assert( + bridging::getParameterCount(&T::setDefaultsFromResource) == 3, + "Expected setDefaultsFromResource(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setDefaultsFromResource, jsInvoker_, instance_, std::move(appName), std::move(resourceName)); + } + jsi::Value reset(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::reset) == 2, + "Expected reset(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::reset, jsInvoker_, instance_, std::move(appName)); + } + void onConfigUpdated(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::onConfigUpdated) == 2, + "Expected onConfigUpdated(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::onConfigUpdated, jsInvoker_, instance_, std::move(appName)); + } + void removeConfigUpdateRegistration(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::removeConfigUpdateRegistration) == 2, + "Expected removeConfigUpdateRegistration(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeConfigUpdateRegistration, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value setCustomSignals(jsi::Runtime &rt, jsi::String appName, jsi::Object customSignals) override { + static_assert( + bridging::getParameterCount(&T::setCustomSignals) == 3, + "Expected setCustomSignals(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setCustomSignals, jsInvoker_, instance_, std::move(appName), std::move(customSignals)); + } + + private: + friend class NativeRNFBTurboConfigCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/remote-config/ios/RNFBConfig.xcodeproj/project.pbxproj b/packages/remote-config/ios/RNFBConfig.xcodeproj/project.pbxproj index 3fa6c4a311..6622f6dd4c 100644 --- a/packages/remote-config/ios/RNFBConfig.xcodeproj/project.pbxproj +++ b/packages/remote-config/ios/RNFBConfig.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBConfigModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBConfigModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBConfigModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBConfigModule.mm */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -25,7 +25,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBConfig.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBConfig.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBConfigModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBConfigModule.h; path = RNFBConfig/RNFBConfigModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBConfigModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBConfigModule.m; path = RNFBConfig/RNFBConfigModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBConfigModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBConfigModule.mm; path = RNFBConfig/RNFBConfigModule.mm; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,7 +53,7 @@ 2744B9A121F48736004F8E3F /* converters */, 2744B98C21F45C64004F8E3F /* common */, 2744B98421F45429004F8E3F /* RNFBConfigModule.h */, - 2744B98521F45429004F8E3F /* RNFBConfigModule.m */, + 2744B98521F45429004F8E3F /* RNFBConfigModule.mm */, ); path = RNFBConfig; sourceTree = ""; @@ -124,7 +124,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2744B98621F45429004F8E3F /* RNFBConfigModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBConfigModule.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/packages/remote-config/ios/RNFBConfig/RNFBConfigModule.h b/packages/remote-config/ios/RNFBConfig/RNFBConfigModule.h index b3d6e3cc28..c2785a80f0 100644 --- a/packages/remote-config/ios/RNFBConfig/RNFBConfigModule.h +++ b/packages/remote-config/ios/RNFBConfig/RNFBConfigModule.h @@ -17,8 +17,9 @@ #import -#import +#import +#import "RNFBRemoteConfigTurboModules.h" -@interface RNFBConfigModule : NSObject +@interface RNFBConfigModule : NSObject @end diff --git a/packages/remote-config/ios/RNFBConfig/RNFBConfigModule.m b/packages/remote-config/ios/RNFBConfig/RNFBConfigModule.mm similarity index 72% rename from packages/remote-config/ios/RNFBConfig/RNFBConfigModule.m rename to packages/remote-config/ios/RNFBConfig/RNFBConfigModule.mm index a383eb8a1c..dfbaffec67 100644 --- a/packages/remote-config/ios/RNFBConfig/RNFBConfigModule.m +++ b/packages/remote-config/ios/RNFBConfig/RNFBConfigModule.mm @@ -17,10 +17,10 @@ #import #import -#import +#import "RNFBApp/RCTConvert+FIRApp.h" +#import "RNFBApp/RNFBSharedUtils.h" #import "RNFBConfigModule.h" -#import "RNFBSharedUtils.h" static NSString *const ON_CONFIG_UPDATED_EVENT = @"on_config_updated"; @@ -90,34 +90,32 @@ @implementation RNFBConfigModule }; } +static FIRApp *firebaseAppForName(NSString *appName) { + return [RCTConvert firAppFromString:appName]; +} + #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); - -- (dispatch_queue_t)methodQueue { - return dispatch_get_main_queue(); -} +RCT_EXPORT_MODULE(NativeRNFBTurboConfig) + (BOOL)requiresMainQueueSetup { - return YES; + return NO; } -- (id)init { +- (instancetype)init { self = [super init]; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - configUpdateHandlers = [[NSMutableDictionary alloc] init]; - }); + if (self) { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + configUpdateHandlers = [[NSMutableDictionary alloc] init]; + }); + } return self; } -- (void)dealloc { - [self invalidate]; -} - - (void)invalidate { - for (NSString *key in configUpdateHandlers) { + for (NSString *key in [configUpdateHandlers allKeys]) { FIRConfigUpdateListenerRegistration *registration = [configUpdateHandlers objectForKey:key]; [registration remove]; } @@ -125,13 +123,29 @@ - (void)invalidate { [configUpdateHandlers removeAllObjects]; } +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); +} + +- (facebook::react::ModuleConstants) + constantsToExport { + return [_RCTTypedModuleConstants + newWithUnsafeDictionary:[self + getConstantsForApp:firebaseAppForName(DEFAULT_APP_DISPLAY_NAME)]]; +} + +- (facebook::react::ModuleConstants)getConstants { + return [self constantsToExport]; +} + #pragma mark - #pragma mark Firebase Config Methods -RCT_EXPORT_METHOD(ensureInitialized - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)ensureInitialized:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = firebaseAppForName(appName); FIRRemoteConfigInitializationCompletion completionHandler = ^(NSError *__nullable error) { if (error) { [RNFBSharedUtils rejectPromiseWithNSError:reject error:error]; @@ -144,11 +158,11 @@ - (void)invalidate { ensureInitializedWithCompletionHandler:completionHandler]; } -RCT_EXPORT_METHOD(fetch - : (FIRApp *)firebaseApp - : (nonnull NSNumber *)expirationDuration - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)fetch:(NSString *)appName + expirationDurationSeconds:(double)expirationDurationSeconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = firebaseAppForName(appName); FIRRemoteConfigFetchCompletion completionHandler = ^(FIRRemoteConfigFetchStatus status, NSError *__nullable error) { if (error) { @@ -164,20 +178,20 @@ - (void)invalidate { } }; - if (expirationDuration.integerValue == -1) { + if (expirationDurationSeconds == -1) { [[FIRRemoteConfig remoteConfigWithApp:firebaseApp] fetchWithCompletionHandler:completionHandler]; } else { [[FIRRemoteConfig remoteConfigWithApp:firebaseApp] - fetchWithExpirationDuration:expirationDuration.doubleValue + fetchWithExpirationDuration:expirationDurationSeconds completionHandler:completionHandler]; } } -RCT_EXPORT_METHOD(fetchAndActivate - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)fetchAndActivate:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = firebaseAppForName(appName); FIRRemoteConfigFetchAndActivateCompletion completionHandler = ^(FIRRemoteConfigFetchAndActivateStatus status, NSError *__nullable error) { if (error) { @@ -192,18 +206,18 @@ - (void)invalidate { resolve([self resultWithConstants:@([RCTConvert BOOL:@(YES)]) firebaseApp:firebaseApp]); return; } - // if no data fetched remotely, return false resolve([self resultWithConstants:@([RCTConvert BOOL:@(NO)]) firebaseApp:firebaseApp]); } }; - [[FIRRemoteConfig remoteConfig] fetchAndActivateWithCompletionHandler:completionHandler]; + [[FIRRemoteConfig remoteConfigWithApp:firebaseApp] + fetchAndActivateWithCompletionHandler:completionHandler]; } -RCT_EXPORT_METHOD(activate - : (FIRApp *)firebaseApp - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)activate:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = firebaseAppForName(appName); [[FIRRemoteConfig remoteConfigWithApp:firebaseApp] activateWithCompletion:^( BOOL changed, NSError *_Nullable error) { if (error) { @@ -219,41 +233,35 @@ - (void)invalidate { }]; } -RCT_EXPORT_METHOD(setConfigSettings - : (FIRApp *)firebaseApp - : (NSDictionary *)configSettings - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)setConfigSettings:(NSString *)appName + settings:(JS::NativeRNFBTurboConfig::ConfigSettings &)configSettings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = firebaseAppForName(appName); FIRRemoteConfigSettings *remoteConfigSettings = [[FIRRemoteConfigSettings alloc] init]; - - if ([configSettings objectForKey:@"minimumFetchInterval"]) { - remoteConfigSettings.minimumFetchInterval = - [configSettings[@"minimumFetchInterval"] doubleValue]; - } - - if ([configSettings objectForKey:@"fetchTimeout"]) { - remoteConfigSettings.fetchTimeout = [configSettings[@"fetchTimeout"] doubleValue]; - } + remoteConfigSettings.minimumFetchInterval = configSettings.minimumFetchInterval(); + remoteConfigSettings.fetchTimeout = configSettings.fetchTimeout(); [FIRRemoteConfig remoteConfigWithApp:firebaseApp].configSettings = remoteConfigSettings; resolve([self resultWithVoidConstantsForApp:firebaseApp]); } -RCT_EXPORT_METHOD(setDefaults - : (FIRApp *)firebaseApp - : (NSDictionary *)defaults - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)setDefaults:(NSString *)appName + defaults:(NSDictionary *)defaults + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = firebaseAppForName(appName); [[FIRRemoteConfig remoteConfigWithApp:firebaseApp] setDefaults:defaults]; resolve([self resultWithConstants:[NSNull null] firebaseApp:firebaseApp]); } -RCT_EXPORT_METHOD(setDefaultsFromResource - : (FIRApp *)firebaseApp - : (NSString *)fileName - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - if ([[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"] != nil) { - [[FIRRemoteConfig remoteConfigWithApp:firebaseApp] setDefaultsFromPlistFileName:fileName]; + +- (void)setDefaultsFromResource:(NSString *)appName + resourceName:(NSString *)resourceName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = firebaseAppForName(appName); + if ([[NSBundle mainBundle] pathForResource:resourceName ofType:@"plist"] != nil) { + [[FIRRemoteConfig remoteConfigWithApp:firebaseApp] setDefaultsFromPlistFileName:resourceName]; resolve([self resultWithConstants:[NSNull null] firebaseApp:firebaseApp]); } else { [RNFBSharedUtils rejectPromiseWithUserInfo:reject @@ -264,7 +272,15 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(onConfigUpdated : (FIRApp *)firebaseApp) { +- (void)reset:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = firebaseAppForName(appName); + resolve([self resultWithVoidConstantsForApp:firebaseApp]); +} + +- (void)onConfigUpdated:(NSString *)appName { + FIRApp *firebaseApp = firebaseAppForName(appName); if (![configUpdateHandlers valueForKey:firebaseApp.name]) { FIRConfigUpdateListenerRegistration *newRegistration = [[FIRRemoteConfig remoteConfigWithApp:firebaseApp] @@ -274,7 +290,8 @@ - (void)invalidate { NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; [userInfo setValue:@"error" forKey:@"resultType"]; - [userInfo setValue:convertFIRRemoteConfigUpdateErrorToNSString(error.code) + [userInfo setValue:convertFIRRemoteConfigUpdateErrorToNSString( + (FIRRemoteConfigUpdateError)error.code) forKey:@"code"]; [userInfo setValue:error.localizedDescription forKey:@"message"]; [userInfo setValue:error.localizedDescription forKey:@"nativeErrorMessage"]; @@ -298,20 +315,22 @@ - (void)invalidate { } } -RCT_EXPORT_METHOD(removeConfigUpdateRegistration : (FIRApp *)firebaseApp) { +- (void)removeConfigUpdateRegistration:(NSString *)appName { + FIRApp *firebaseApp = firebaseAppForName(appName); if ([configUpdateHandlers valueForKey:firebaseApp.name]) { [[configUpdateHandlers objectForKey:firebaseApp.name] remove]; [configUpdateHandlers removeObjectForKey:firebaseApp.name]; } } -RCT_EXPORT_METHOD(setCustomSignals - : (FIRApp *)firebaseApp - : (NSDictionary *)customSignals - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)setCustomSignals:(NSString *)appName + customSignals:(NSDictionary *)customSignals + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = firebaseAppForName(appName); + NSDictionary *decodedCustomSignals = [RNFBSharedUtils decodeNullSentinels:customSignals]; [[FIRRemoteConfig remoteConfigWithApp:firebaseApp] - setCustomSignals:customSignals + setCustomSignals:decodedCustomSignals withCompletion:^(NSError *_Nullable error) { if (error != nil) { [RNFBSharedUtils rejectPromiseWithNSError:reject error:error]; diff --git a/packages/remote-config/ios/generated/RCTAppDependencyProvider.h b/packages/remote-config/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/remote-config/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/remote-config/ios/generated/RCTAppDependencyProvider.mm b/packages/remote-config/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/remote-config/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/remote-config/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/remote-config/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/remote-config/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/remote-config/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/remote-config/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/remote-config/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/remote-config/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/remote-config/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/remote-config/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/remote-config/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/remote-config/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/remote-config/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModules-generated.mm b/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModules-generated.mm new file mode 100644 index 0000000000..b0b91e35cc --- /dev/null +++ b/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModules-generated.mm @@ -0,0 +1,121 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBRemoteConfigTurboModules.h" + + +@implementation NativeRNFBTurboConfigSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + +@implementation RCTCxxConvert (NativeRNFBTurboConfig_ConfigSettings) ++ (RCTManagedPointer *)JS_NativeRNFBTurboConfig_ConfigSettings:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_activate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "activate", @selector(activate:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_setConfigSettings(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setConfigSettings", @selector(setConfigSettings:settings:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_fetch(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "fetch", @selector(fetch:expirationDurationSeconds:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_fetchAndActivate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "fetchAndActivate", @selector(fetchAndActivate:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_ensureInitialized(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "ensureInitialized", @selector(ensureInitialized:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_setDefaults(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setDefaults", @selector(setDefaults:defaults:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_setDefaultsFromResource(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setDefaultsFromResource", @selector(setDefaultsFromResource:resourceName:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_reset(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "reset", @selector(reset:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_onConfigUpdated(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "onConfigUpdated", @selector(onConfigUpdated:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_removeConfigUpdateRegistration(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "removeConfigUpdateRegistration", @selector(removeConfigUpdateRegistration:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_setCustomSignals(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setCustomSignals", @selector(setCustomSignals:customSignals:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboConfigSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + NativeRNFBTurboConfigSpecJSI::NativeRNFBTurboConfigSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["activate"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_activate}; + + + methodMap_["setConfigSettings"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_setConfigSettings}; + setMethodArgConversionSelector(@"setConfigSettings", 1, @"JS_NativeRNFBTurboConfig_ConfigSettings:"); + + methodMap_["fetch"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_fetch}; + + + methodMap_["fetchAndActivate"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_fetchAndActivate}; + + + methodMap_["ensureInitialized"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_ensureInitialized}; + + + methodMap_["setDefaults"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_setDefaults}; + + + methodMap_["setDefaultsFromResource"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_setDefaultsFromResource}; + + + methodMap_["reset"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_reset}; + + + methodMap_["onConfigUpdated"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_onConfigUpdated}; + + + methodMap_["removeConfigUpdateRegistration"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigSpecJSI_removeConfigUpdateRegistration}; + + + methodMap_["setCustomSignals"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigSpecJSI_setCustomSignals}; + + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboConfigSpecJSI_getConstants}; + + } +} // namespace facebook::react diff --git a/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModules.h b/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModules.h new file mode 100644 index 0000000000..9eb1664e64 --- /dev/null +++ b/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModules/RNFBRemoteConfigTurboModules.h @@ -0,0 +1,169 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBRemoteConfigTurboModules symbols +#ifndef RNFBRemoteConfigTurboModules_H +#define RNFBRemoteConfigTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN +namespace JS { + namespace NativeRNFBTurboConfig { + struct ConfigSettings { + double fetchTimeout() const; + double minimumFetchInterval() const; + + ConfigSettings(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboConfig_ConfigSettings) ++ (RCTManagedPointer *)JS_NativeRNFBTurboConfig_ConfigSettings:(id)json; +@end +namespace JS { + namespace NativeRNFBTurboConfig { + struct Constants { + + struct Builder { + struct Input { + RCTRequired fetchTimeout; + RCTRequired minimumFetchInterval; + RCTRequired lastFetchTime; + RCTRequired lastFetchStatus; + RCTRequired> values; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeRNFBTurboConfigSpec + +- (void)activate:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setConfigSettings:(NSString *)appName + settings:(JS::NativeRNFBTurboConfig::ConfigSettings &)settings + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)fetch:(NSString *)appName +expirationDurationSeconds:(double)expirationDurationSeconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)fetchAndActivate:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)ensureInitialized:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setDefaults:(NSString *)appName + defaults:(NSDictionary *)defaults + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setDefaultsFromResource:(NSString *)appName + resourceName:(NSString *)resourceName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)reset:(NSString *)appName + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)onConfigUpdated:(NSString *)appName; +- (void)removeConfigUpdateRegistration:(NSString *)appName; +- (void)setCustomSignals:(NSString *)appName + customSignals:(NSDictionary *)customSignals + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end + +@interface NativeRNFBTurboConfigSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboConfig' + */ + class JSI_EXPORT NativeRNFBTurboConfigSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboConfigSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +inline double JS::NativeRNFBTurboConfig::ConfigSettings::fetchTimeout() const +{ + id const p = _v[@"fetchTimeout"]; + return RCTBridgingToDouble(p); +} +inline double JS::NativeRNFBTurboConfig::ConfigSettings::minimumFetchInterval() const +{ + id const p = _v[@"minimumFetchInterval"]; + return RCTBridgingToDouble(p); +} +inline JS::NativeRNFBTurboConfig::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto fetchTimeout = i.fetchTimeout.get(); + d[@"fetchTimeout"] = @(fetchTimeout); + auto minimumFetchInterval = i.minimumFetchInterval.get(); + d[@"minimumFetchInterval"] = @(minimumFetchInterval); + auto lastFetchTime = i.lastFetchTime.get(); + d[@"lastFetchTime"] = @(lastFetchTime); + auto lastFetchStatus = i.lastFetchStatus.get(); + d[@"lastFetchStatus"] = lastFetchStatus; + auto values = i.values.get(); + d[@"values"] = values; + return d; +}) {} +inline JS::NativeRNFBTurboConfig::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +NS_ASSUME_NONNULL_END +#endif // RNFBRemoteConfigTurboModules_H diff --git a/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModulesJSI-generated.cpp b/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..84156ba97b --- /dev/null +++ b/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModulesJSI-generated.cpp @@ -0,0 +1,110 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBRemoteConfigTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_activate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->activate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setConfigSettings(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setConfigSettings( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_fetch(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->fetch( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_fetchAndActivate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->fetchAndActivate( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_ensureInitialized(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->ensureInitialized( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setDefaults(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setDefaults( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setDefaultsFromResource(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setDefaultsFromResource( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_reset(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->reset( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_onConfigUpdated(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->onConfigUpdated( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_removeConfigUpdateRegistration(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->removeConfigUpdateRegistration( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setCustomSignals(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setCustomSignals( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt) + ); +} + +NativeRNFBTurboConfigCxxSpecJSI::NativeRNFBTurboConfigCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboConfig", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_getConstants}; + methodMap_["activate"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_activate}; + methodMap_["setConfigSettings"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setConfigSettings}; + methodMap_["fetch"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_fetch}; + methodMap_["fetchAndActivate"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_fetchAndActivate}; + methodMap_["ensureInitialized"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_ensureInitialized}; + methodMap_["setDefaults"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setDefaults}; + methodMap_["setDefaultsFromResource"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setDefaultsFromResource}; + methodMap_["reset"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_reset}; + methodMap_["onConfigUpdated"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_onConfigUpdated}; + methodMap_["removeConfigUpdateRegistration"] = MethodMetadata {1, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_removeConfigUpdateRegistration}; + methodMap_["setCustomSignals"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboConfigCxxSpecJSI_setCustomSignals}; +} + + +} // namespace facebook::react diff --git a/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModulesJSI.h b/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModulesJSI.h new file mode 100644 index 0000000000..640fd618de --- /dev/null +++ b/packages/remote-config/ios/generated/RNFBRemoteConfigTurboModulesJSI.h @@ -0,0 +1,471 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboConfigBooleanRemoteConfigResult + +template +struct NativeRNFBTurboConfigBooleanRemoteConfigResult { + P0 result; + P1 constants; + bool operator==(const NativeRNFBTurboConfigBooleanRemoteConfigResult &other) const { + return result == other.result && constants == other.constants; + } +}; + +template +struct NativeRNFBTurboConfigBooleanRemoteConfigResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "result"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "constants"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static bool resultToJs(jsi::Runtime &rt, decltype(types.result) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object constantsToJs(jsi::Runtime &rt, decltype(types.constants) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "result", bridging::toJs(rt, value.result, jsInvoker)); + result.setProperty(rt, "constants", bridging::toJs(rt, value.constants, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigConfigSettings + +template +struct NativeRNFBTurboConfigConfigSettings { + P0 fetchTimeout; + P1 minimumFetchInterval; + bool operator==(const NativeRNFBTurboConfigConfigSettings &other) const { + return fetchTimeout == other.fetchTimeout && minimumFetchInterval == other.minimumFetchInterval; + } +}; + +template +struct NativeRNFBTurboConfigConfigSettingsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "fetchTimeout"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "minimumFetchInterval"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double fetchTimeoutToJs(jsi::Runtime &rt, decltype(types.fetchTimeout) value) { + return bridging::toJs(rt, value); + } + + static double minimumFetchIntervalToJs(jsi::Runtime &rt, decltype(types.minimumFetchInterval) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "fetchTimeout", bridging::toJs(rt, value.fetchTimeout, jsInvoker)); + result.setProperty(rt, "minimumFetchInterval", bridging::toJs(rt, value.minimumFetchInterval, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigNullRemoteConfigResult + +template +struct NativeRNFBTurboConfigNullRemoteConfigResult { + P0 result; + P1 constants; + bool operator==(const NativeRNFBTurboConfigNullRemoteConfigResult &other) const { + return result == other.result && constants == other.constants; + } +}; + +template +struct NativeRNFBTurboConfigNullRemoteConfigResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "result"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "constants"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static std::optional resultToJs(jsi::Runtime &rt, decltype(types.result) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object constantsToJs(jsi::Runtime &rt, decltype(types.constants) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "result", bridging::toJs(rt, value.result, jsInvoker)); + result.setProperty(rt, "constants", bridging::toJs(rt, value.constants, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigRemoteConfigConstants + +template +struct NativeRNFBTurboConfigRemoteConfigConstants { + P0 fetchTimeout; + P1 minimumFetchInterval; + P2 lastFetchTime; + P3 lastFetchStatus; + P4 values; + bool operator==(const NativeRNFBTurboConfigRemoteConfigConstants &other) const { + return fetchTimeout == other.fetchTimeout && minimumFetchInterval == other.minimumFetchInterval && lastFetchTime == other.lastFetchTime && lastFetchStatus == other.lastFetchStatus && values == other.values; + } +}; + +template +struct NativeRNFBTurboConfigRemoteConfigConstantsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "fetchTimeout"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "minimumFetchInterval"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "lastFetchTime"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "lastFetchStatus"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "values"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double fetchTimeoutToJs(jsi::Runtime &rt, decltype(types.fetchTimeout) value) { + return bridging::toJs(rt, value); + } + + static double minimumFetchIntervalToJs(jsi::Runtime &rt, decltype(types.minimumFetchInterval) value) { + return bridging::toJs(rt, value); + } + + static double lastFetchTimeToJs(jsi::Runtime &rt, decltype(types.lastFetchTime) value) { + return bridging::toJs(rt, value); + } + + static jsi::String lastFetchStatusToJs(jsi::Runtime &rt, decltype(types.lastFetchStatus) value) { + return bridging::toJs(rt, value); + } + + static jsi::Object valuesToJs(jsi::Runtime &rt, decltype(types.values) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "fetchTimeout", bridging::toJs(rt, value.fetchTimeout, jsInvoker)); + result.setProperty(rt, "minimumFetchInterval", bridging::toJs(rt, value.minimumFetchInterval, jsInvoker)); + result.setProperty(rt, "lastFetchTime", bridging::toJs(rt, value.lastFetchTime, jsInvoker)); + result.setProperty(rt, "lastFetchStatus", bridging::toJs(rt, value.lastFetchStatus, jsInvoker)); + result.setProperty(rt, "values", bridging::toJs(rt, value.values, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigStoredConfigValue + +template +struct NativeRNFBTurboConfigStoredConfigValue { + P0 value; + P1 source; + bool operator==(const NativeRNFBTurboConfigStoredConfigValue &other) const { + return value == other.value && source == other.source; + } +}; + +template +struct NativeRNFBTurboConfigStoredConfigValueBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "value"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "source"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object valueToJs(jsi::Runtime &rt, decltype(types.value) value) { + return bridging::toJs(rt, value); + } + + static jsi::String sourceToJs(jsi::Runtime &rt, decltype(types.source) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "value", bridging::toJs(rt, value.value, jsInvoker)); + result.setProperty(rt, "source", bridging::toJs(rt, value.source, jsInvoker)); + return result; + } +}; + + + +#pragma mark - NativeRNFBTurboConfigVoidRemoteConfigResult + +template +struct NativeRNFBTurboConfigVoidRemoteConfigResult { + P0 constants; + bool operator==(const NativeRNFBTurboConfigVoidRemoteConfigResult &other) const { + return constants == other.constants; + } +}; + +template +struct NativeRNFBTurboConfigVoidRemoteConfigResultBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "constants"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static jsi::Object constantsToJs(jsi::Runtime &rt, decltype(types.constants) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "constants", bridging::toJs(rt, value.constants, jsInvoker)); + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboConfigCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboConfigCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value activate(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value setConfigSettings(jsi::Runtime &rt, jsi::String appName, jsi::Object settings) = 0; + virtual jsi::Value fetch(jsi::Runtime &rt, jsi::String appName, double expirationDurationSeconds) = 0; + virtual jsi::Value fetchAndActivate(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value ensureInitialized(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value setDefaults(jsi::Runtime &rt, jsi::String appName, jsi::Object defaults) = 0; + virtual jsi::Value setDefaultsFromResource(jsi::Runtime &rt, jsi::String appName, jsi::String resourceName) = 0; + virtual jsi::Value reset(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void onConfigUpdated(jsi::Runtime &rt, jsi::String appName) = 0; + virtual void removeConfigUpdateRegistration(jsi::Runtime &rt, jsi::String appName) = 0; + virtual jsi::Value setCustomSignals(jsi::Runtime &rt, jsi::String appName, jsi::Object customSignals) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboConfigCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboConfig"; + +protected: + NativeRNFBTurboConfigCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboConfigCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboConfigCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboConfigCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value activate(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::activate) == 2, + "Expected activate(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::activate, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value setConfigSettings(jsi::Runtime &rt, jsi::String appName, jsi::Object settings) override { + static_assert( + bridging::getParameterCount(&T::setConfigSettings) == 3, + "Expected setConfigSettings(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setConfigSettings, jsInvoker_, instance_, std::move(appName), std::move(settings)); + } + jsi::Value fetch(jsi::Runtime &rt, jsi::String appName, double expirationDurationSeconds) override { + static_assert( + bridging::getParameterCount(&T::fetch) == 3, + "Expected fetch(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::fetch, jsInvoker_, instance_, std::move(appName), std::move(expirationDurationSeconds)); + } + jsi::Value fetchAndActivate(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::fetchAndActivate) == 2, + "Expected fetchAndActivate(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::fetchAndActivate, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value ensureInitialized(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::ensureInitialized) == 2, + "Expected ensureInitialized(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::ensureInitialized, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value setDefaults(jsi::Runtime &rt, jsi::String appName, jsi::Object defaults) override { + static_assert( + bridging::getParameterCount(&T::setDefaults) == 3, + "Expected setDefaults(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setDefaults, jsInvoker_, instance_, std::move(appName), std::move(defaults)); + } + jsi::Value setDefaultsFromResource(jsi::Runtime &rt, jsi::String appName, jsi::String resourceName) override { + static_assert( + bridging::getParameterCount(&T::setDefaultsFromResource) == 3, + "Expected setDefaultsFromResource(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setDefaultsFromResource, jsInvoker_, instance_, std::move(appName), std::move(resourceName)); + } + jsi::Value reset(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::reset) == 2, + "Expected reset(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::reset, jsInvoker_, instance_, std::move(appName)); + } + void onConfigUpdated(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::onConfigUpdated) == 2, + "Expected onConfigUpdated(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::onConfigUpdated, jsInvoker_, instance_, std::move(appName)); + } + void removeConfigUpdateRegistration(jsi::Runtime &rt, jsi::String appName) override { + static_assert( + bridging::getParameterCount(&T::removeConfigUpdateRegistration) == 2, + "Expected removeConfigUpdateRegistration(...) to have 2 parameters"); + + return bridging::callFromJs( + rt, &T::removeConfigUpdateRegistration, jsInvoker_, instance_, std::move(appName)); + } + jsi::Value setCustomSignals(jsi::Runtime &rt, jsi::String appName, jsi::Object customSignals) override { + static_assert( + bridging::getParameterCount(&T::setCustomSignals) == 3, + "Expected setCustomSignals(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setCustomSignals, jsInvoker_, instance_, std::move(appName), std::move(customSignals)); + } + + private: + friend class NativeRNFBTurboConfigCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/remote-config/ios/generated/ReactAppDependencyProvider.podspec b/packages/remote-config/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/remote-config/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/remote-config/lib/index.ts b/packages/remote-config/lib/index.ts index 9d1a496cd7..54eb45129a 100644 --- a/packages/remote-config/lib/index.ts +++ b/packages/remote-config/lib/index.ts @@ -72,7 +72,7 @@ type ConfigSettings = { type ConfigValues = Record; const namespace = 'remoteConfig'; -const nativeModuleName = 'RNFBConfigModule' as const; +const nativeModuleName = 'NativeRNFBTurboConfig' as const; function isSuccessEvent( event: RemoteConfigUpdateSuccessEventInternal | RemoteConfigUpdateErrorEventInternal, @@ -526,6 +526,7 @@ const config: ModuleConfig = { nativeEvents: ['on_config_updated'], hasMultiAppSupport: true, hasCustomUrlOrRegionSupport: false, + turboModule: true, }; export { LastFetchStatus, ValueSource }; @@ -626,14 +627,18 @@ export function isSupported(): Promise { /** * Deletes all activated, fetched and defaults configs and * resets all Firebase Remote Config settings. - * Android only. iOS does not reset anything. + * + * @remarks **Android only.** iOS does not clear activated, fetched, or default configs. */ export function reset(remoteConfig: RemoteConfig): Promise { return rc(remoteConfig).reset(); } /** - * Sets defaults based on a native resource. + * Sets defaults based on a native resource file. + * + * @remarks Loads defaults from a platform resource — iOS `.plist` or Android XML — identified + * by `resourceName`. No firebase-js-sdk modular equivalent. */ export function setDefaultsFromResource( remoteConfig: RemoteConfig, diff --git a/packages/remote-config/lib/types/internal.ts b/packages/remote-config/lib/types/internal.ts index 0c6cb54184..d74b15a348 100644 --- a/packages/remote-config/lib/types/internal.ts +++ b/packages/remote-config/lib/types/internal.ts @@ -75,6 +75,7 @@ export interface RemoteConfigUpdateErrorEventInternal extends RemoteConfigUpdate } export interface RNFBConfigModule { + getConstants(): NativeRemoteConfigConstants; activate(): Promise>; setConfigSettings(settings: { fetchTimeout: number; @@ -140,6 +141,6 @@ export interface RemoteConfigInternal extends RemoteConfig { declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBConfigModule: RNFBConfigModule; + NativeRNFBTurboConfig: RNFBConfigModule; } } diff --git a/packages/remote-config/package.json b/packages/remote-config/package.json index 65350cb206..3b7dc0332a 100644 --- a/packages/remote-config/package.json +++ b/packages/remote-config/package.json @@ -5,11 +5,28 @@ "description": "React Native Firebase - React Native Firebase provides native integration with Remote Config, allowing you to change the appearance and/or functionality of your app without requiring an app update.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBRemoteConfigTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.config" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboConfig": "RNFBConfigModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "compile": "bob build", - "prepare": "yarn run build && yarn compile" + "prepare": "yarn run build && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/reactnative/java/io/invertase/firebase/config/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/remote-config/react-native.config.js b/packages/remote-config/react-native.config.js new file mode 100644 index 0000000000..fc243e0272 --- /dev/null +++ b/packages/remote-config/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/reactnative/java/io/invertase/firebase/config/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/remote-config/specs/NativeRNFBTurboConfig.ts b/packages/remote-config/specs/NativeRNFBTurboConfig.ts new file mode 100644 index 0000000000..f43f753fcc --- /dev/null +++ b/packages/remote-config/specs/NativeRNFBTurboConfig.ts @@ -0,0 +1,60 @@ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export type LastFetchStatus = 'success' | 'failure' | 'no_fetch_yet' | 'throttled' | 'unknown'; + +export interface StoredConfigValue { + value: string | number | boolean; + source: 'default' | 'remote' | 'static' | 'unknown'; +} + +export interface RemoteConfigConstants { + fetchTimeout: number; + minimumFetchInterval: number; + lastFetchTime: number; + lastFetchStatus: LastFetchStatus; + values: { [key: string]: StoredConfigValue }; +} + +export interface BooleanRemoteConfigResult { + result: boolean; + constants: RemoteConfigConstants; +} + +export interface NullRemoteConfigResult { + result: string | null; + constants: RemoteConfigConstants; +} + +export interface VoidRemoteConfigResult { + constants: RemoteConfigConstants; +} + +export interface ConfigSettings { + fetchTimeout: number; + minimumFetchInterval: number; +} + +export interface Spec extends TurboModule { + getConstants(): RemoteConfigConstants; + + activate(appName: string): Promise; + setConfigSettings(appName: string, settings: ConfigSettings): Promise; + fetch(appName: string, expirationDurationSeconds: number): Promise; + fetchAndActivate(appName: string): Promise; + ensureInitialized(appName: string): Promise; + setDefaults( + appName: string, + defaults: { [key: string]: string | number | boolean }, + ): Promise; + setDefaultsFromResource(appName: string, resourceName: string): Promise; + reset(appName: string): Promise; + onConfigUpdated(appName: string): void; + removeConfigUpdateRegistration(appName: string): void; + setCustomSignals( + appName: string, + customSignals: { [key: string]: string | number | null }, + ): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboConfig'); diff --git a/packages/storage/RNFBStorage.podspec b/packages/storage/RNFBStorage.podspec index 01d5952835..384ba9d7d7 100644 --- a/packages/storage/RNFBStorage.podspec +++ b/packages/storage/RNFBStorage.podspec @@ -27,15 +27,15 @@ Pod::Spec.new do |s| s.ios.deployment_target = firebase_ios_target s.macos.deployment_target = firebase_macos_target s.tvos.deployment_target = firebase_tvos_target - s.source_files = 'ios/**/*.{h,m}' + s.source_files = 'ios/**/*.{h,m,mm,cpp}' + s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*' s.dependency 'RNFBApp' - # React Native dependencies - if defined?(install_modules_dependencies()) != nil - install_modules_dependencies(s); - else - s.dependency "React-Core" + install_modules_dependencies(s); + + if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0') + raise "#{s.name} requires New Architecture. Enable New Architecture to use this module" end if defined?($FirebaseSDKVersion) @@ -46,6 +46,10 @@ Pod::Spec.new do |s| # Firebase dependencies s.dependency 'Firebase/Storage', firebase_sdk_version + s.pod_target_xcconfig = { + 'HEADER_SEARCH_PATHS' => '"$(PODS_TARGET_SRCROOT)/ios/generated/RNFBStorageTurboModules" "$(PODS_TARGET_SRCROOT)/ios/generated"' + } + if defined?($RNFirebaseAsStaticFramework) Pod::UI.puts "#{s.name}: Using overridden static_framework value of '#{$RNFirebaseAsStaticFramework}'" s.static_framework = $RNFirebaseAsStaticFramework diff --git a/packages/storage/__tests__/nativeModuleContract.test.ts b/packages/storage/__tests__/nativeModuleContract.test.ts new file mode 100644 index 0000000000..85d706974d --- /dev/null +++ b/packages/storage/__tests__/nativeModuleContract.test.ts @@ -0,0 +1,115 @@ +import { describe, it, jest } from '@jest/globals'; +import { assertTurboContract } from '../../app/__tests__/turboModuleContractHelper'; + +const SPEC_METHODS = [ + 'deleteObject', + 'getDownloadURL', + 'getMetadata', + 'updateMetadata', + 'list', + 'listAll', + 'setMaxDownloadRetryTime', + 'setMaxOperationRetryTime', + 'setMaxUploadRetryTime', + 'useEmulator', + 'writeToFile', + 'putFile', + 'putString', + 'setTaskStatus', +] as const; + +describe('TurboModule wrapper contract (NewArch-AD-17.1)', function () { + it('exposes every spec method callable through the real wrapper', function () { + assertTurboContract( + { + namespace: 'storage', + nativeModuleName: 'NativeRNFBTurboStorage', + nativeEvents: ['storage_event'], + hasMultiAppSupport: true, + hasCustomUrlOrRegionSupport: true, + disablePrependCustomUrlOrRegion: true, + turboModule: true, + specMethods: SPEC_METHODS, + customUrlOrRegion: 'gs://test-bucket', + createMock: method => + jest.fn(() => + method === 'useEmulator' || method === 'setTaskStatus' + ? method === 'setTaskStatus' + ? Promise.resolve(true) + : undefined + : Promise.resolve(), + ), + customizeRaw: raw => { + Object.defineProperty(raw, 'getConstants', { + value: jest.fn(() => ({ + maxUploadRetryTime: 0, + maxDownloadRetryTime: 0, + maxOperationRetryTime: 0, + })), + enumerable: true, + configurable: true, + }); + Object.defineProperty(raw, 'maxUploadRetryTime', { + value: 0, + enumerable: true, + configurable: true, + }); + Object.defineProperty(raw, 'maxDownloadRetryTime', { + value: 0, + enumerable: true, + configurable: true, + }); + Object.defineProperty(raw, 'maxOperationRetryTime', { + value: 0, + enumerable: true, + configurable: true, + }); + }, + }, + { + useEmulator: wrapped => { + wrapped.useEmulator('localhost', 9199, 'gs://test-bucket'); + }, + list: wrapped => { + void wrapped.list('gs://test-bucket/path', { maxResults: 10, pageToken: null }); + }, + updateMetadata: wrapped => { + void wrapped.updateMetadata('gs://test-bucket/path', { contentType: 'text/plain' }); + }, + putFile: wrapped => { + void wrapped.putFile('gs://test-bucket/path', '/tmp/file', {}, 1); + }, + putString: wrapped => { + void wrapped.putString('gs://test-bucket/path', 'data', 'raw', {}, 1); + }, + writeToFile: wrapped => { + void wrapped.writeToFile('gs://test-bucket/path', '/tmp/file', 1); + }, + setTaskStatus: wrapped => { + void wrapped.setTaskStatus(1, 0); + }, + setMaxDownloadRetryTime: wrapped => { + void wrapped.setMaxDownloadRetryTime(60000); + }, + setMaxOperationRetryTime: wrapped => { + void wrapped.setMaxOperationRetryTime(60000); + }, + setMaxUploadRetryTime: wrapped => { + void wrapped.setMaxUploadRetryTime(60000); + }, + getDownloadURL: wrapped => { + void wrapped.getDownloadURL('gs://test-bucket/path'); + }, + getMetadata: wrapped => { + void wrapped.getMetadata('gs://test-bucket/path'); + }, + listAll: wrapped => { + void wrapped.listAll('gs://test-bucket/path'); + }, + deleteObject: wrapped => { + void wrapped.deleteObject('gs://test-bucket/path'); + }, + }, + ); + }); +}); diff --git a/packages/storage/android/build.gradle b/packages/storage/android/build.gradle index b5f3ce7474..815dfe06b9 100644 --- a/packages/storage/android/build.gradle +++ b/packages/storage/android/build.gradle @@ -77,6 +77,11 @@ android { targetCompatibility = JavaVersion.VERSION_11 } } + sourceSets { + main { + java.excludes = ['**/generated/jni/**'] + } + } } repositories { @@ -94,3 +99,21 @@ ReactNative.shared.applyPackageVersion() ReactNative.shared.applyDefaultExcludes() ReactNative.module.applyAndroidVersions() ReactNative.module.applyReactNativeDependency("api") + +def isNewArchitectureDisabled() { + return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true" +} + +if (isNewArchitectureDisabled()) { + def ANSI_RED = "\u001B[31m"; + def ANSI_RESET = "\u001B[0m"; + + println("\n\n\n") + println(ANSI_RED + "**************************************************************************************************************") + println("\n\n\n") + println("New Architecture support is required for @react-native-firebase/storage") + println("\n\n\n") + println("**************************************************************************************************************" + ANSI_RESET) + println("\n\n\n") + System.exit(1) +} diff --git a/packages/storage/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStorageModule.java b/packages/storage/android/src/main/java/io/invertase/firebase/storage/NativeRNFBTurboStorage.java similarity index 71% rename from packages/storage/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStorageModule.java rename to packages/storage/android/src/main/java/io/invertase/firebase/storage/NativeRNFBTurboStorage.java index 7bd81c2152..63a5bf8a95 100644 --- a/packages/storage/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStorageModule.java +++ b/packages/storage/android/src/main/java/io/invertase/firebase/storage/NativeRNFBTurboStorage.java @@ -17,6 +17,7 @@ * */ +import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage; import static io.invertase.firebase.storage.ReactNativeFirebaseStorageCommon.buildMetadataFromMap; import static io.invertase.firebase.storage.ReactNativeFirebaseStorageCommon.getListResultAsMap; import static io.invertase.firebase.storage.ReactNativeFirebaseStorageCommon.getMetadataAsMap; @@ -25,9 +26,9 @@ import android.content.Context; import android.net.Uri; +import com.facebook.fbreact.specs.NativeRNFBTurboStorageSpec; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.google.android.gms.tasks.Task; import com.google.firebase.FirebaseApp; @@ -35,19 +36,22 @@ import com.google.firebase.storage.ListResult; import com.google.firebase.storage.StorageMetadata; import com.google.firebase.storage.StorageReference; -import io.invertase.firebase.common.ReactNativeFirebaseModule; +import io.invertase.firebase.common.TaskExecutorService; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.ExecutorService; +import javax.annotation.Nullable; -public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule { - private static final String TAG = "Storage"; - +public class NativeRNFBTurboStorage extends NativeRNFBTurboStorageSpec { private static HashMap emulatorConfigs = new HashMap<>(); - ReactNativeFirebaseStorageModule(ReactApplicationContext reactContext) { - super(reactContext, TAG); + private final TaskExecutorService executorService; + + public NativeRNFBTurboStorage(ReactApplicationContext reactContext) { + super(reactContext); + executorService = new TaskExecutorService("RNFBStorageModule"); } @Override @@ -56,11 +60,27 @@ public void invalidate() { super.invalidate(); } - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#delete - */ - @ReactMethod - public void delete(String appName, String url, final Promise promise) { + @Override + protected Map getTypedExportedConstants() { + Map constants = new HashMap<>(); + Context context = getReactApplicationContext(); + List apps = FirebaseApp.getApps(context); + if (apps.size() > 0) { + FirebaseStorage defaultStorageInstance = FirebaseStorage.getInstance(); + constants.put("maxDownloadRetryTime", defaultStorageInstance.getMaxDownloadRetryTimeMillis()); + constants.put( + "maxOperationRetryTime", defaultStorageInstance.getMaxOperationRetryTimeMillis()); + constants.put("maxUploadRetryTime", defaultStorageInstance.getMaxUploadRetryTimeMillis()); + } else { + constants.put("maxDownloadRetryTime", 0); + constants.put("maxOperationRetryTime", 0); + constants.put("maxUploadRetryTime", 0); + } + return constants; + } + + @Override + public void deleteObject(String appName, String url, final Promise promise) { try { StorageReference reference = getReferenceFromUrl(url, appName); reference @@ -79,10 +99,7 @@ public void delete(String appName, String url, final Promise promise) { } } - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getDownloadURL - */ - @ReactMethod + @Override public void getDownloadURL(String appName, final String url, final Promise promise) { try { StorageReference reference = getReferenceFromUrl(url, appName); @@ -101,10 +118,7 @@ public void getDownloadURL(String appName, final String url, final Promise promi } } - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getMetadata - */ - @ReactMethod + @Override public void getMetadata(String appName, String url, Promise promise) { try { StorageReference reference = getReferenceFromUrl(url, appName); @@ -124,10 +138,7 @@ public void getMetadata(String appName, String url, Promise promise) { } } - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#list - */ - @ReactMethod + @Override public void list(String appName, String url, ReadableMap listOptions, Promise promise) { try { StorageReference reference = getReferenceFromUrl(url, appName); @@ -135,7 +146,7 @@ public void list(String appName, String url, ReadableMap listOptions, Promise pr int maxResults = listOptions.getInt("maxResults"); - if (listOptions.hasKey("pageToken")) { + if (listOptions.hasKey("pageToken") && !listOptions.isNull("pageToken")) { String pageToken = listOptions.getString("pageToken"); list = reference.list(maxResults, Objects.requireNonNull(pageToken)); } else { @@ -156,10 +167,7 @@ public void list(String appName, String url, ReadableMap listOptions, Promise pr } } - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#listAll - */ - @ReactMethod + @Override public void listAll(String appName, String url, Promise promise) { try { StorageReference reference = getReferenceFromUrl(url, appName); @@ -179,30 +187,9 @@ public void listAll(String appName, String url, Promise promise) { } } - // Useful for development / debugging - private void dumpMetadata(StorageMetadata metadata) { - System.err.println("STORAGE dumping metadata contents"); - System.err.println("STORAGE - cacheControl " + metadata.getCacheControl()); - System.err.println("STORAGE - contentDisposition " + metadata.getContentDisposition()); - System.err.println("STORAGE - contentEncoding " + metadata.getContentEncoding()); - System.err.println("STORAGE - contentLanguage " + metadata.getContentLanguage()); - System.err.println("STORAGE - contentType " + metadata.getContentType()); - for (String customKey : metadata.getCustomMetadataKeys()) { - System.err.println( - "STORAGE - customMetadata: '" - + customKey - + "' / '" - + metadata.getCustomMetadata(customKey) - + "'"); - } - } - - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#updateMetadata - */ - @ReactMethod + @Override public void updateMetadata( - String appName, String url, ReadableMap metadataMap, final Promise promise) { + String appName, String url, @Nullable ReadableMap metadataMap, final Promise promise) { try { StorageReference reference = getReferenceFromUrl(url, appName); @@ -212,11 +199,8 @@ public void updateMetadata( getExecutor(), getTask -> { if (getTask.isSuccessful()) { - - // dumpMetadata(getTask.getResult()); StorageMetadata metadata = buildMetadataFromMap(metadataMap, null, getTask.getResult()); - // dumpMetadata(metadata); reference .updateMetadata(metadata) @@ -224,10 +208,8 @@ public void updateMetadata( getExecutor(), updateTask -> { if (updateTask.isSuccessful()) { - // dumpMetadata(updateTask.getResult()); promise.resolve(getMetadataAsMap(updateTask.getResult())); } else { - updateTask.getException().printStackTrace(); promiseRejectStorageException(promise, updateTask.getException()); } }); @@ -241,11 +223,7 @@ public void updateMetadata( } } - /** - * @link - * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxDownloadRetryTime - */ - @ReactMethod + @Override public void setMaxDownloadRetryTime(String appName, double milliseconds, Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(firebaseApp); @@ -253,11 +231,7 @@ public void setMaxDownloadRetryTime(String appName, double milliseconds, Promise promise.resolve(null); } - /** - * @link - * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxOperationRetryTime - */ - @ReactMethod + @Override public void setMaxOperationRetryTime(String appName, double milliseconds, Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(firebaseApp); @@ -265,11 +239,7 @@ public void setMaxOperationRetryTime(String appName, double milliseconds, Promis promise.resolve(null); } - /** - * @link - * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxUploadRetryTime - */ - @ReactMethod + @Override public void setMaxUploadRetryTime(String appName, double milliseconds, Promise promise) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(firebaseApp); @@ -277,33 +247,22 @@ public void setMaxUploadRetryTime(String appName, double milliseconds, Promise p promise.resolve(null); } - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Storage#useEmulator - */ - @ReactMethod - public void useEmulator( - String appName, String host, int port, String bucketUrl, Promise promise) { + @Override + public void useEmulator(String appName, String host, double port, String bucketUrl) { FirebaseApp firebaseApp = FirebaseApp.getInstance(appName); - FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(firebaseApp, bucketUrl); String emulatorKey = appName + ":" + bucketUrl; if (emulatorConfigs.get(emulatorKey) == null) { - firebaseStorage.useEmulator(host, port); + firebaseStorage.useEmulator(host, (int) port); emulatorConfigs.put(emulatorKey, "true"); } - promise.resolve(null); } - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#writeToFile - */ - @ReactMethod + @Override public void writeToFile( - String appName, String url, String localFilePath, int taskId, Promise promise) { - // TODO(salakar) only need to check this if using external storage? + String appName, String url, String localFilePath, double taskId, Promise promise) { if (!isExternalStorageWritable()) { - // TODO(salakar) send failure event rejectPromiseWithCodeAndMessage( promise, "invalid-device-file-path", @@ -313,7 +272,7 @@ public void writeToFile( try { StorageReference reference = getReferenceFromUrl(url, appName); ReactNativeFirebaseStorageDownloadTask storageTask = - new ReactNativeFirebaseStorageDownloadTask(taskId, reference, appName); + new ReactNativeFirebaseStorageDownloadTask((int) taskId, reference, appName); storageTask.begin(getTransactionalExecutor(), localFilePath); storageTask.addOnCompleteListener(getTransactionalExecutor(), promise); } catch (Exception e) { @@ -321,22 +280,19 @@ public void writeToFile( } } - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#putString - */ - @ReactMethod + @Override public void putString( String appName, String url, String string, String format, - ReadableMap metadataMap, - int taskId, + @Nullable ReadableMap metadataMap, + double taskId, Promise promise) { try { StorageReference reference = getReferenceFromUrl(url, appName); ReactNativeFirebaseStorageUploadTask storageTask = - new ReactNativeFirebaseStorageUploadTask(taskId, reference, appName); + new ReactNativeFirebaseStorageUploadTask((int) taskId, reference, appName); storageTask.begin(getTransactionalExecutor(), string, format, metadataMap); storageTask.addOnCompleteListener(getTransactionalExecutor(), promise); } catch (Exception e) { @@ -344,21 +300,18 @@ public void putString( } } - /** - * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#putFile - */ - @ReactMethod + @Override public void putFile( String appName, String url, String localFilePath, - ReadableMap metadata, - int taskId, + @Nullable ReadableMap metadata, + double taskId, Promise promise) { try { StorageReference reference = getReferenceFromUrl(url, appName); ReactNativeFirebaseStorageUploadTask storageTask = - new ReactNativeFirebaseStorageUploadTask(taskId, reference, appName); + new ReactNativeFirebaseStorageUploadTask((int) taskId, reference, appName); storageTask.begin(getTransactionalExecutor(), localFilePath, metadata); storageTask.addOnCompleteListener(getTransactionalExecutor(), promise); } catch (Exception e) { @@ -366,21 +319,32 @@ public void putFile( } } - @ReactMethod - public void setTaskStatus(String appName, int taskId, int status, Promise promise) { - switch (status) { + @Override + public void setTaskStatus(String appName, double taskId, double status, Promise promise) { + switch ((int) status) { case 0: - promise.resolve(ReactNativeFirebaseStorageTask.pauseTaskById(taskId)); + promise.resolve(ReactNativeFirebaseStorageTask.pauseTaskById((int) taskId)); break; case 1: - promise.resolve(ReactNativeFirebaseStorageTask.resumeTaskById(taskId)); + promise.resolve(ReactNativeFirebaseStorageTask.resumeTaskById((int) taskId)); break; case 2: - promise.resolve(ReactNativeFirebaseStorageTask.cancelTaskById(taskId)); + promise.resolve(ReactNativeFirebaseStorageTask.cancelTaskById((int) taskId)); + break; + default: + promise.resolve(false); break; } } + private ExecutorService getExecutor() { + return executorService.getExecutor(); + } + + private ExecutorService getTransactionalExecutor() { + return executorService.getTransactionalExecutor(); + } + private String getBucketFromUrl(String url) { String pathWithBucketName = url.substring(5); return url.substring(0, pathWithBucketName.indexOf("/") + 5); @@ -393,23 +357,4 @@ private StorageReference getReferenceFromUrl(String url, String appName) FirebaseStorage.getInstance(firebaseApp, getBucketFromUrl(url)); return firebaseStorage.getReferenceFromUrl(url); } - - @Override - public Map getConstants() { - Map constants = new HashMap<>(); - - Context context = getReactApplicationContext(); - - // a 'safe' way of checking if any apps have been initialized - List apps = FirebaseApp.getApps(context); - if (apps.size() > 0) { - FirebaseStorage defaultStorageInstance = FirebaseStorage.getInstance(); - constants.put("maxDownloadRetryTime", defaultStorageInstance.getMaxDownloadRetryTimeMillis()); - constants.put( - "maxOperationRetryTime", defaultStorageInstance.getMaxOperationRetryTimeMillis()); - constants.put("maxUploadRetryTime", defaultStorageInstance.getMaxUploadRetryTimeMillis()); - } - - return constants; - } } diff --git a/packages/storage/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStoragePackage.java b/packages/storage/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStoragePackage.java index 28abfa39bf..db13521c05 100644 --- a/packages/storage/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStoragePackage.java +++ b/packages/storage/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStoragePackage.java @@ -32,7 +32,7 @@ public class ReactNativeFirebaseStoragePackage implements ReactPackage { @Override public List createNativeModules(@Nonnull ReactApplicationContext reactContext) { List modules = new ArrayList<>(); - modules.add(new ReactNativeFirebaseStorageModule(reactContext)); + modules.add(new NativeRNFBTurboStorage(reactContext)); return modules; } diff --git a/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboStorageSpec.java b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboStorageSpec.java new file mode 100644 index 0000000000..9005d05606 --- /dev/null +++ b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboStorageSpec.java @@ -0,0 +1,125 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.facebook.fbreact.specs; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.common.build.ReactBuildConfig; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public abstract class NativeRNFBTurboStorageSpec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "NativeRNFBTurboStorage"; + + public NativeRNFBTurboStorageSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + protected abstract Map getTypedExportedConstants(); + + @Override + @DoNotStrip + public final @Nullable Map getConstants() { + Map constants = getTypedExportedConstants(); + if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) { + Set obligatoryFlowConstants = new HashSet<>(Arrays.asList( + "maxDownloadRetryTime", + "maxOperationRetryTime", + "maxUploadRetryTime" + )); + Set optionalFlowConstants = new HashSet<>(); + Set undeclaredConstants = new HashSet<>(constants.keySet()); + undeclaredConstants.removeAll(obligatoryFlowConstants); + undeclaredConstants.removeAll(optionalFlowConstants); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants)); + } + undeclaredConstants = obligatoryFlowConstants; + undeclaredConstants.removeAll(constants.keySet()); + if (!undeclaredConstants.isEmpty()) { + throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants)); + } + } + return constants; + } + + @ReactMethod + @DoNotStrip + public abstract void deleteObject(String appName, String url, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getDownloadURL(String appName, String url, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void getMetadata(String appName, String url, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void updateMetadata(String appName, String url, @Nullable ReadableMap metadata, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void list(String appName, String url, ReadableMap listOptions, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void listAll(String appName, String url, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setMaxDownloadRetryTime(String appName, double milliseconds, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setMaxOperationRetryTime(String appName, double milliseconds, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setMaxUploadRetryTime(String appName, double milliseconds, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void useEmulator(String appName, String host, double port, String bucketUrl); + + @ReactMethod + @DoNotStrip + public abstract void writeToFile(String appName, String url, String localFilePath, double taskId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void putFile(String appName, String url, String localFilePath, @Nullable ReadableMap metadata, double taskId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void putString(String appName, String url, String string, String format, @Nullable ReadableMap metadata, double taskId, Promise promise); + + @ReactMethod + @DoNotStrip + public abstract void setTaskStatus(String appName, double taskId, double status, Promise promise); +} diff --git a/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/CMakeLists.txt b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/CMakeLists.txt new file mode 100644 index 0000000000..f89ac012c2 --- /dev/null +++ b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBStorageTurboModules/*.cpp) + +add_library( + react_codegen_RNFBStorageTurboModules + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_RNFBStorageTurboModules PUBLIC . react/renderer/components/RNFBStorageTurboModules) + +target_link_libraries( + react_codegen_RNFBStorageTurboModules + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_options( + react_codegen_RNFBStorageTurboModules + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++20 + -Wall +) diff --git a/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules-generated.cpp b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules-generated.cpp new file mode 100644 index 0000000000..e4ba380618 --- /dev/null +++ b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules-generated.cpp @@ -0,0 +1,116 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "RNFBStorageTurboModules.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "getConstants", "()Ljava/util/Map;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_deleteObject(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "deleteObject", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_getDownloadURL(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getDownloadURL", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_getMetadata(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "getMetadata", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_updateMetadata(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "updateMetadata", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_list(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "list", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_listAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "listAll", "(Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxDownloadRetryTime(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setMaxDownloadRetryTime", "(Ljava/lang/String;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxOperationRetryTime(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setMaxOperationRetryTime", "(Ljava/lang/String;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxUploadRetryTime(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setMaxUploadRetryTime", "(Ljava/lang/String;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_useEmulator(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "useEmulator", "(Ljava/lang/String;Ljava/lang/String;DLjava/lang/String;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_writeToFile(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "writeToFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_putFile(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "putFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_putString(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "putString", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_setTaskStatus(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, PromiseKind, "setTaskStatus", "(Ljava/lang/String;DDLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId); +} + +NativeRNFBTurboStorageSpecJSI::NativeRNFBTurboStorageSpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboStorageSpecJSI_getConstants}; + methodMap_["deleteObject"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_deleteObject}; + methodMap_["getDownloadURL"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_getDownloadURL}; + methodMap_["getMetadata"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_getMetadata}; + methodMap_["updateMetadata"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageSpecJSI_updateMetadata}; + methodMap_["list"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageSpecJSI_list}; + methodMap_["listAll"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_listAll}; + methodMap_["setMaxDownloadRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxDownloadRetryTime}; + methodMap_["setMaxOperationRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxOperationRetryTime}; + methodMap_["setMaxUploadRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxUploadRetryTime}; + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboStorageSpecJSI_useEmulator}; + methodMap_["writeToFile"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboStorageSpecJSI_writeToFile}; + methodMap_["putFile"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboStorageSpecJSI_putFile}; + methodMap_["putString"] = MethodMetadata {6, __hostFunction_NativeRNFBTurboStorageSpecJSI_putString}; + methodMap_["setTaskStatus"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageSpecJSI_setTaskStatus}; +} + +std::shared_ptr RNFBStorageTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "NativeRNFBTurboStorage") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules.h b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules.h new file mode 100644 index 0000000000..21cc082e0d --- /dev/null +++ b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeRNFBTurboStorage' + */ +class JSI_EXPORT NativeRNFBTurboStorageSpecJSI : public JavaTurboModule { +public: + NativeRNFBTurboStorageSpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr RNFBStorageTurboModules_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI-generated.cpp b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..27bd900ec8 --- /dev/null +++ b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI-generated.cpp @@ -0,0 +1,153 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBStorageTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_deleteObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteObject( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getDownloadURL(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getDownloadURL( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getMetadata(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getMetadata( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_updateMetadata(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updateMetadata( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 || args[2].isNull() || args[2].isUndefined() ? std::nullopt : std::make_optional(args[2].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_list(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->list( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_listAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->listAll( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxDownloadRetryTime(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setMaxDownloadRetryTime( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxOperationRetryTime(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setMaxOperationRetryTime( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxUploadRetryTime(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setMaxUploadRetryTime( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_useEmulator(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useEmulator( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_writeToFile(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->writeToFile( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_putFile(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->putFile( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 || args[3].isNull() || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asObject(rt)), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_putString(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->putString( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 || args[4].isNull() || args[4].isUndefined() ? std::nullopt : std::make_optional(args[4].asObject(rt)), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setTaskStatus(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setTaskStatus( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber(), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); +} + +NativeRNFBTurboStorageCxxSpecJSI::NativeRNFBTurboStorageCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboStorage", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getConstants}; + methodMap_["deleteObject"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_deleteObject}; + methodMap_["getDownloadURL"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getDownloadURL}; + methodMap_["getMetadata"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getMetadata}; + methodMap_["updateMetadata"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_updateMetadata}; + methodMap_["list"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_list}; + methodMap_["listAll"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_listAll}; + methodMap_["setMaxDownloadRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxDownloadRetryTime}; + methodMap_["setMaxOperationRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxOperationRetryTime}; + methodMap_["setMaxUploadRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxUploadRetryTime}; + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_useEmulator}; + methodMap_["writeToFile"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_writeToFile}; + methodMap_["putFile"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_putFile}; + methodMap_["putString"] = MethodMetadata {6, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_putString}; + methodMap_["setTaskStatus"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setTaskStatus}; +} + + +} // namespace facebook::react diff --git a/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI.h b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI.h new file mode 100644 index 0000000000..5f20d4467e --- /dev/null +++ b/packages/storage/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI.h @@ -0,0 +1,246 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboStorageStorageListOptions + +template +struct NativeRNFBTurboStorageStorageListOptions { + P0 maxResults; + P1 pageToken; + bool operator==(const NativeRNFBTurboStorageStorageListOptions &other) const { + return maxResults == other.maxResults && pageToken == other.pageToken; + } +}; + +template +struct NativeRNFBTurboStorageStorageListOptionsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "maxResults"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "pageToken"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double maxResultsToJs(jsi::Runtime &rt, decltype(types.maxResults) value) { + return bridging::toJs(rt, value); + } + + static std::optional pageTokenToJs(jsi::Runtime &rt, decltype(types.pageToken) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "maxResults", bridging::toJs(rt, value.maxResults, jsInvoker)); + if (value.pageToken) { + result.setProperty(rt, "pageToken", bridging::toJs(rt, value.pageToken.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboStorageCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboStorageCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value deleteObject(jsi::Runtime &rt, jsi::String appName, jsi::String url) = 0; + virtual jsi::Value getDownloadURL(jsi::Runtime &rt, jsi::String appName, jsi::String url) = 0; + virtual jsi::Value getMetadata(jsi::Runtime &rt, jsi::String appName, jsi::String url) = 0; + virtual jsi::Value updateMetadata(jsi::Runtime &rt, jsi::String appName, jsi::String url, std::optional metadata) = 0; + virtual jsi::Value list(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::Object listOptions) = 0; + virtual jsi::Value listAll(jsi::Runtime &rt, jsi::String appName, jsi::String url) = 0; + virtual jsi::Value setMaxDownloadRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) = 0; + virtual jsi::Value setMaxOperationRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) = 0; + virtual jsi::Value setMaxUploadRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) = 0; + virtual void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String host, double port, jsi::String bucketUrl) = 0; + virtual jsi::Value writeToFile(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String localFilePath, double taskId) = 0; + virtual jsi::Value putFile(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String localFilePath, std::optional metadata, double taskId) = 0; + virtual jsi::Value putString(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String string, jsi::String format, std::optional metadata, double taskId) = 0; + virtual jsi::Value setTaskStatus(jsi::Runtime &rt, jsi::String appName, double taskId, double status) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboStorageCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboStorage"; + +protected: + NativeRNFBTurboStorageCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboStorageCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboStorageCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboStorageCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value deleteObject(jsi::Runtime &rt, jsi::String appName, jsi::String url) override { + static_assert( + bridging::getParameterCount(&T::deleteObject) == 3, + "Expected deleteObject(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::deleteObject, jsInvoker_, instance_, std::move(appName), std::move(url)); + } + jsi::Value getDownloadURL(jsi::Runtime &rt, jsi::String appName, jsi::String url) override { + static_assert( + bridging::getParameterCount(&T::getDownloadURL) == 3, + "Expected getDownloadURL(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getDownloadURL, jsInvoker_, instance_, std::move(appName), std::move(url)); + } + jsi::Value getMetadata(jsi::Runtime &rt, jsi::String appName, jsi::String url) override { + static_assert( + bridging::getParameterCount(&T::getMetadata) == 3, + "Expected getMetadata(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getMetadata, jsInvoker_, instance_, std::move(appName), std::move(url)); + } + jsi::Value updateMetadata(jsi::Runtime &rt, jsi::String appName, jsi::String url, std::optional metadata) override { + static_assert( + bridging::getParameterCount(&T::updateMetadata) == 4, + "Expected updateMetadata(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::updateMetadata, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(metadata)); + } + jsi::Value list(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::Object listOptions) override { + static_assert( + bridging::getParameterCount(&T::list) == 4, + "Expected list(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::list, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(listOptions)); + } + jsi::Value listAll(jsi::Runtime &rt, jsi::String appName, jsi::String url) override { + static_assert( + bridging::getParameterCount(&T::listAll) == 3, + "Expected listAll(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::listAll, jsInvoker_, instance_, std::move(appName), std::move(url)); + } + jsi::Value setMaxDownloadRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) override { + static_assert( + bridging::getParameterCount(&T::setMaxDownloadRetryTime) == 3, + "Expected setMaxDownloadRetryTime(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setMaxDownloadRetryTime, jsInvoker_, instance_, std::move(appName), std::move(milliseconds)); + } + jsi::Value setMaxOperationRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) override { + static_assert( + bridging::getParameterCount(&T::setMaxOperationRetryTime) == 3, + "Expected setMaxOperationRetryTime(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setMaxOperationRetryTime, jsInvoker_, instance_, std::move(appName), std::move(milliseconds)); + } + jsi::Value setMaxUploadRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) override { + static_assert( + bridging::getParameterCount(&T::setMaxUploadRetryTime) == 3, + "Expected setMaxUploadRetryTime(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setMaxUploadRetryTime, jsInvoker_, instance_, std::move(appName), std::move(milliseconds)); + } + void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String host, double port, jsi::String bucketUrl) override { + static_assert( + bridging::getParameterCount(&T::useEmulator) == 5, + "Expected useEmulator(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::useEmulator, jsInvoker_, instance_, std::move(appName), std::move(host), std::move(port), std::move(bucketUrl)); + } + jsi::Value writeToFile(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String localFilePath, double taskId) override { + static_assert( + bridging::getParameterCount(&T::writeToFile) == 5, + "Expected writeToFile(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::writeToFile, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(localFilePath), std::move(taskId)); + } + jsi::Value putFile(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String localFilePath, std::optional metadata, double taskId) override { + static_assert( + bridging::getParameterCount(&T::putFile) == 6, + "Expected putFile(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::putFile, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(localFilePath), std::move(metadata), std::move(taskId)); + } + jsi::Value putString(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String string, jsi::String format, std::optional metadata, double taskId) override { + static_assert( + bridging::getParameterCount(&T::putString) == 7, + "Expected putString(...) to have 7 parameters"); + + return bridging::callFromJs( + rt, &T::putString, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(string), std::move(format), std::move(metadata), std::move(taskId)); + } + jsi::Value setTaskStatus(jsi::Runtime &rt, jsi::String appName, double taskId, double status) override { + static_assert( + bridging::getParameterCount(&T::setTaskStatus) == 4, + "Expected setTaskStatus(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setTaskStatus, jsInvoker_, instance_, std::move(appName), std::move(taskId), std::move(status)); + } + + private: + friend class NativeRNFBTurboStorageCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/storage/ios/RNFBStorage.xcodeproj/project.pbxproj b/packages/storage/ios/RNFBStorage.xcodeproj/project.pbxproj index 582784b0fd..f447122636 100644 --- a/packages/storage/ios/RNFBStorage.xcodeproj/project.pbxproj +++ b/packages/storage/ios/RNFBStorage.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 2744B98621F45429004F8E3F /* RNFBStorageModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBStorageModule.m */; }; + 2744B98621F45429004F8E3F /* RNFBStorageModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2744B98521F45429004F8E3F /* RNFBStorageModule.mm */; }; 27A35B622268E0AB005BE5A8 /* RNFBStorageTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A35B612268E0AB005BE5A8 /* RNFBStorageTask.m */; }; 27A35B652268E118005BE5A8 /* RNFBStorageDownloadTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A35B642268E118005BE5A8 /* RNFBStorageDownloadTask.m */; }; 27A35B682268E138005BE5A8 /* RNFBStorageUploadTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 27A35B672268E138005BE5A8 /* RNFBStorageUploadTask.m */; }; @@ -29,7 +29,7 @@ /* Begin PBXFileReference section */ 2744B98221F45429004F8E3F /* libRNFBStorage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNFBStorage.a; sourceTree = BUILT_PRODUCTS_DIR; }; 2744B98421F45429004F8E3F /* RNFBStorageModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = RNFBStorageModule.h; path = RNFBStorage/RNFBStorageModule.h; sourceTree = SOURCE_ROOT; }; - 2744B98521F45429004F8E3F /* RNFBStorageModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RNFBStorageModule.m; path = RNFBStorage/RNFBStorageModule.m; sourceTree = SOURCE_ROOT; }; + 2744B98521F45429004F8E3F /* RNFBStorageModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = RNFBStorageModule.mm; path = RNFBStorage/RNFBStorageModule.mm; sourceTree = SOURCE_ROOT; }; 27A35B612268E0AB005BE5A8 /* RNFBStorageTask.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBStorageTask.m; sourceTree = ""; }; 27A35B632268E0CD005BE5A8 /* RNFBStorageTask.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNFBStorageTask.h; sourceTree = ""; }; 27A35B642268E118005BE5A8 /* RNFBStorageDownloadTask.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNFBStorageDownloadTask.m; sourceTree = ""; }; @@ -63,7 +63,7 @@ isa = PBXGroup; children = ( 2744B98421F45429004F8E3F /* RNFBStorageModule.h */, - 2744B98521F45429004F8E3F /* RNFBStorageModule.m */, + 2744B98521F45429004F8E3F /* RNFBStorageModule.mm */, 27A35B612268E0AB005BE5A8 /* RNFBStorageTask.m */, 27A35B632268E0CD005BE5A8 /* RNFBStorageTask.h */, 27A35B642268E118005BE5A8 /* RNFBStorageDownloadTask.m */, @@ -144,7 +144,7 @@ files = ( 27A35B622268E0AB005BE5A8 /* RNFBStorageTask.m in Sources */, 27A35B6B2268E1BE005BE5A8 /* RNFBStorageCommon.m in Sources */, - 2744B98621F45429004F8E3F /* RNFBStorageModule.m in Sources */, + 2744B98621F45429004F8E3F /* RNFBStorageModule.mm in Sources */, 27A35B652268E118005BE5A8 /* RNFBStorageDownloadTask.m in Sources */, 27A35B682268E138005BE5A8 /* RNFBStorageUploadTask.m in Sources */, ); diff --git a/packages/storage/ios/RNFBStorage/RNFBStorageModule.h b/packages/storage/ios/RNFBStorage/RNFBStorageModule.h index e260846ffd..9c2ebe21ea 100644 --- a/packages/storage/ios/RNFBStorage/RNFBStorageModule.h +++ b/packages/storage/ios/RNFBStorage/RNFBStorageModule.h @@ -16,8 +16,8 @@ */ #import +#import "RNFBStorageTurboModules.h" -#import +@interface RNFBStorageModule : NSObject -@interface RNFBStorageModule : NSObject @end diff --git a/packages/storage/ios/RNFBStorage/RNFBStorageModule.m b/packages/storage/ios/RNFBStorage/RNFBStorageModule.mm similarity index 79% rename from packages/storage/ios/RNFBStorage/RNFBStorageModule.m rename to packages/storage/ios/RNFBStorage/RNFBStorageModule.mm index a3695b6ecf..8ba40cc48f 100644 --- a/packages/storage/ios/RNFBStorage/RNFBStorageModule.m +++ b/packages/storage/ios/RNFBStorage/RNFBStorageModule.mm @@ -18,10 +18,12 @@ #import #import +#import "RNFBApp/RCTConvert+FIRApp.h" +#import "RNFBApp/RNFBSharedUtils.h" #import "RNFBRCTEventEmitter.h" -#import "RNFBSharedUtils.h" #import "RNFBStorageCommon.h" #import "RNFBStorageModule.h" +#import "RNFBStorageTurboModules.h" static NSString *const RNFB_STORAGE_EVENT = @"storage_event"; static NSString *const RNFB_STORAGE_STATE_CHANGED = @"state_changed"; @@ -44,10 +46,15 @@ @implementation RNFBStorageModule #pragma mark - #pragma mark Module Setup -RCT_EXPORT_MODULE(); +RCT_EXPORT_MODULE(NativeRNFBTurboStorage); + (BOOL)requiresMainQueueSetup { - return YES; + return NO; +} + +- (std::shared_ptr)getTurboModule: + (const facebook::react::ObjCTurboModule::InitParams &)params { + return std::make_shared(params); } - (id)init { @@ -80,11 +87,11 @@ - (void)invalidate { /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#delete */ -RCT_EXPORT_METHOD(delete - : (FIRApp *)firebaseApp - : (NSString *)url - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)deleteObject:(NSString *)appName + url:(NSString *)url + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; [storageReference deleteWithCompletion:^(NSError *_Nullable error) { @@ -99,11 +106,11 @@ - (void)invalidate { /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getDownloadURL */ -RCT_EXPORT_METHOD(getDownloadURL - : (FIRApp *)firebaseApp - : (NSString *)url - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getDownloadURL:(NSString *)appName + url:(NSString *)url + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; [storageReference downloadURLWithCompletion:^(NSURL *_Nullable URL, NSError *_Nullable error) { @@ -125,11 +132,11 @@ - (void)invalidate { /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getMetadata */ -RCT_EXPORT_METHOD(getMetadata - : (FIRApp *)firebaseApp - : (NSString *)url - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)getMetadata:(NSString *)appName + url:(NSString *)url + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; [storageReference @@ -145,13 +152,22 @@ - (void)invalidate { /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#updateMetadata */ -RCT_EXPORT_METHOD(updateMetadata - : (FIRApp *)firebaseApp - : (NSString *)url - : (NSDictionary *)metadata - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (NSDictionary *)decodedMetadataMap:(NSDictionary *_Nullable)metadata { + if (metadata == nil) { + return @{}; + } + + return [RNFBSharedUtils decodeNullSentinels:metadata]; +} + +- (void)updateMetadata:(NSString *)appName + url:(NSString *)url + metadata:(NSDictionary *_Nullable)metadata + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; + NSDictionary *metadataMap = [self decodedMetadataMap:metadata]; [storageReference metadataWithCompletion:^(FIRStorageMetadata *_Nullable fetchedMetadata, NSError *_Nullable error) { @@ -159,7 +175,7 @@ - (void)invalidate { [self promiseRejectStorageException:reject error:error]; } else { FIRStorageMetadata *storageMetadata = - [RNFBStorageCommon buildMetadataFromMap:metadata + [RNFBStorageCommon buildMetadataFromMap:metadataMap existingMetadata:fetchedMetadata path:[storageReference fullPath]]; @@ -179,14 +195,14 @@ - (void)invalidate { /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#list */ -RCT_EXPORT_METHOD(list - : (FIRApp *)firebaseApp - : (NSString *)url - : (NSDictionary *)listOptions - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)list:(NSString *)appName + url:(NSString *)url + listOptions:(JS::NativeRNFBTurboStorage::StorageListOptions &)listOptions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; - long maxResults = [listOptions[@"maxResults"] longValue]; + long maxResults = (long)listOptions.maxResults(); id completionBlock = ^(FIRStorageListResult *result, NSError *error) { if (error != nil) { @@ -197,8 +213,8 @@ - (void)invalidate { } }; - if (listOptions[@"pageToken"]) { - NSString *pageToken = listOptions[@"pageToken"]; + NSString *pageToken = listOptions.pageToken(); + if (pageToken != nil) { [storageReference listWithMaxResults:(int64_t)maxResults pageToken:pageToken completion:completionBlock]; @@ -210,11 +226,11 @@ - (void)invalidate { /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#listAll */ -RCT_EXPORT_METHOD(listAll - : (FIRApp *)firebaseApp - : (NSString *)url - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)listAll:(NSString *)appName + url:(NSString *)url + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; __block bool alreadyCompleted = false; @@ -241,14 +257,13 @@ - (void)invalidate { * @url * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxDownloadRetryTime */ -RCT_EXPORT_METHOD(setMaxDownloadRetryTime - : (FIRApp *)firebaseApp - : (nonnull NSNumber *)milliseconds - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - maxDownloadRetryTime = [milliseconds doubleValue] / 1000; - [[FIRStorage storageForApp:firebaseApp] - setMaxDownloadRetryTime:[milliseconds doubleValue] / 1000]; +- (void)setMaxDownloadRetryTime:(NSString *)appName + milliseconds:(double)milliseconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + maxDownloadRetryTime = milliseconds / 1000; + [[FIRStorage storageForApp:firebaseApp] setMaxDownloadRetryTime:milliseconds / 1000]; resolve([NSNull null]); } @@ -256,40 +271,40 @@ - (void)invalidate { * @url * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxOperationRetryTime */ -RCT_EXPORT_METHOD(setMaxOperationRetryTime - : (FIRApp *)firebaseApp - : (nonnull NSNumber *)milliseconds - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - maxOperationRetryTime = [milliseconds doubleValue] / 1000; - [[FIRStorage storageForApp:firebaseApp] - setMaxOperationRetryTime:[milliseconds doubleValue] / 1000]; +- (void)setMaxOperationRetryTime:(NSString *)appName + milliseconds:(double)milliseconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + maxOperationRetryTime = milliseconds / 1000; + [[FIRStorage storageForApp:firebaseApp] setMaxOperationRetryTime:milliseconds / 1000]; resolve([NSNull null]); } /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxUploadRetryTime */ -RCT_EXPORT_METHOD(setMaxUploadRetryTime - : (FIRApp *)firebaseApp - : (nonnull NSNumber *)milliseconds - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - maxUploadRetryTime = [milliseconds doubleValue] / 1000; - [[FIRStorage storageForApp:firebaseApp] setMaxUploadRetryTime:[milliseconds doubleValue] / 1000]; +- (void)setMaxUploadRetryTime:(NSString *)appName + milliseconds:(double)milliseconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + maxUploadRetryTime = milliseconds / 1000; + [[FIRStorage storageForApp:firebaseApp] setMaxUploadRetryTime:milliseconds / 1000]; resolve([NSNull null]); } /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#downloadFile */ -RCT_EXPORT_METHOD(writeToFile - : (FIRApp *)firebaseApp - : (NSString *)url - : (NSString *)localFilePath - : (nonnull NSNumber *)taskId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)writeToFile:(NSString *)appName + url:(NSString *)url + localFilePath:(NSString *)localFilePath + taskId:(double)taskId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSNumber *taskIdNumber = @(taskId); FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; NSURL *localFile = [NSURL fileURLWithPath:localFilePath]; @@ -298,7 +313,7 @@ - (void)invalidate { downloadTask = [storageReference writeToFile:localFile]; }); - PENDING_TASKS[taskId] = downloadTask; + PENDING_TASKS[taskIdNumber] = downloadTask; // download started or resumed [downloadTask @@ -309,7 +324,7 @@ - (void)invalidate { [RNFBStorageCommon getStorageEventDictionary:eventBody internalEventName:RNFB_STORAGE_STATE_CHANGED appName:firebaseApp.name - taskId:taskId]; + taskId:taskIdNumber]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event]; }]; @@ -322,7 +337,7 @@ - (void)invalidate { [RNFBStorageCommon getStorageEventDictionary:eventBody internalEventName:RNFB_STORAGE_STATE_CHANGED appName:firebaseApp.name - taskId:taskId]; + taskId:taskIdNumber]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event]; }]; @@ -335,7 +350,7 @@ - (void)invalidate { [RNFBStorageCommon getStorageEventDictionary:eventBody internalEventName:RNFB_STORAGE_STATE_CHANGED appName:firebaseApp.name - taskId:taskId]; + taskId:taskIdNumber]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event]; }]; @@ -343,7 +358,7 @@ - (void)invalidate { [downloadTask observeStatus:FIRStorageTaskStatusSuccess handler:^(FIRStorageTaskSnapshot *snapshot) { - [PENDING_TASKS removeObjectForKey:taskId]; + [PENDING_TASKS removeObjectForKey:taskIdNumber]; // state_changed NSDictionary *stateChangedEventBody = @@ -352,7 +367,7 @@ - (void)invalidate { [RNFBStorageCommon getStorageEventDictionary:stateChangedEventBody internalEventName:RNFB_STORAGE_STATE_CHANGED appName:firebaseApp.name - taskId:taskId]; + taskId:taskIdNumber]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:stateChangedEvent]; @@ -362,7 +377,7 @@ - (void)invalidate { [RNFBStorageCommon getStorageEventDictionary:eventBody internalEventName:RNFB_STORAGE_DOWNLOAD_SUCCESS appName:firebaseApp.name - taskId:taskId]; + taskId:taskIdNumber]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event]; resolve(eventBody); }]; @@ -371,7 +386,7 @@ - (void)invalidate { [downloadTask observeStatus:FIRStorageTaskStatusFailure handler:^(FIRStorageTaskSnapshot *snapshot) { - [PENDING_TASKS removeObjectForKey:taskId]; + [PENDING_TASKS removeObjectForKey:taskIdNumber]; // state_changed NSDictionary *stateChangedEventBody = @@ -380,7 +395,7 @@ - (void)invalidate { [RNFBStorageCommon getStorageEventDictionary:stateChangedEventBody internalEventName:RNFB_STORAGE_STATE_CHANGED appName:firebaseApp.name - taskId:taskId]; + taskId:taskIdNumber]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:stateChangedEvent]; @@ -393,7 +408,7 @@ - (void)invalidate { [RNFBStorageCommon getStorageEventDictionary:eventBody internalEventName:RNFB_STORAGE_DOWNLOAD_FAILURE appName:firebaseApp.name - taskId:taskId]; + taskId:taskIdNumber]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event]; [self promiseRejectStorageException:reject error:snapshot.error]; @@ -403,17 +418,19 @@ - (void)invalidate { /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#putFile */ -RCT_EXPORT_METHOD(putFile - : (FIRApp *)firebaseApp - : (NSString *)url - : (NSString *)localFilePath - : (NSDictionary *)metadata - : (nonnull NSNumber *)taskId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)putFile:(NSString *)appName + url:(NSString *)url + localFilePath:(NSString *)localFilePath + metadata:(NSDictionary *_Nullable)metadata + taskId:(double)taskId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSNumber *taskIdNumber = @(taskId); FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; + NSDictionary *metadataMap = [self decodedMetadataMap:metadata]; FIRStorageMetadata *storageMetadata = - [RNFBStorageCommon buildMetadataFromMap:metadata + [RNFBStorageCommon buildMetadataFromMap:metadataMap existingMetadata:nil path:[storageReference fullPath]]; @@ -432,7 +449,7 @@ - (void)invalidate { getStorageEventDictionary:eventBody internalEventName:RNFB_STORAGE_STATE_CHANGED appName:[[[storageReference storage] app] name] - taskId:taskId]; + taskId:taskIdNumber]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:stateChangedEvent]; @@ -441,7 +458,7 @@ - (void)invalidate { getStorageEventDictionary:eventBody internalEventName:RNFB_STORAGE_UPLOAD_FAILURE appName:[[[storageReference storage] app] name] - taskId:taskId]; + taskId:taskIdNumber]; [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event]; [RNFBSharedUtils rejectPromiseWithUserInfo:reject @@ -467,7 +484,7 @@ - (void)invalidate { [self addUploadTaskObservers:uploadTask appDisplayName:[[[storageReference storage] app] name] - taskId:taskId + taskId:taskIdNumber resolver:resolve rejecter:reject]; }]; @@ -476,18 +493,20 @@ - (void)invalidate { /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#putFile */ -RCT_EXPORT_METHOD(putString - : (FIRApp *)firebaseApp - : (NSString *)url - : (NSString *)string - : (NSString *)format - : (NSDictionary *)metadata - : (nonnull NSNumber *)taskId - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { +- (void)putString:(NSString *)appName + url:(NSString *)url + string:(NSString *)string + format:(NSString *)format + metadata:(NSDictionary *_Nullable)metadata + taskId:(double)taskId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; + NSNumber *taskIdNumber = @(taskId); FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; + NSDictionary *metadataMap = [self decodedMetadataMap:metadata]; FIRStorageMetadata *storageMetadata = - [RNFBStorageCommon buildMetadataFromMap:metadata + [RNFBStorageCommon buildMetadataFromMap:metadataMap existingMetadata:nil path:[storageReference fullPath]]; @@ -500,7 +519,7 @@ - (void)invalidate { [self addUploadTaskObservers:uploadTask appDisplayName:[[[storageReference storage] app] name] - taskId:taskId + taskId:taskIdNumber resolver:resolve rejecter:reject]; } @@ -508,17 +527,18 @@ - (void)invalidate { /** * @url https://firebase.google.com/docs/reference/js/firebase.storage.Storage#useEmulator */ -RCT_EXPORT_METHOD(useEmulator - : (FIRApp *)firebaseApp - : (nonnull NSString *)host - : (NSInteger)port - : (NSString *)bucketUrl) { +- (void)useEmulator:(NSString *)appName + host:(NSString *)host + port:(double)port + bucketUrl:(NSString *)bucketUrl { + FIRApp *firebaseApp = [RCTConvert firAppFromString:appName]; emulatorHost = host; - emulatorPort = port; + emulatorPort = (NSInteger)port; NSString *key = [self createEmulatorKey:bucketUrl appName:firebaseApp.name]; if (!emulatorConfigs[key]) { - [[FIRStorage storageForApp:firebaseApp URL:bucketUrl] useEmulatorWithHost:host port:port]; + [[FIRStorage storageForApp:firebaseApp URL:bucketUrl] useEmulatorWithHost:host + port:(NSInteger)port]; emulatorConfigs[key] = @YES; } } @@ -526,19 +546,19 @@ - (void)invalidate { /** * @url N/A - RNFB Specific */ -RCT_EXPORT_METHOD(setTaskStatus - : (FIRApp *)firebaseApp - : (nonnull NSNumber *)taskId - : (nonnull NSNumber *)status - : (RCTPromiseResolveBlock)resolve - : (RCTPromiseRejectBlock)reject) { - id task = PENDING_TASKS[taskId]; +- (void)setTaskStatus:(NSString *)appName + taskId:(double)taskId + status:(double)status + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject { + NSNumber *taskIdNumber = @(taskId); + id task = PENDING_TASKS[taskIdNumber]; if (task == nil) { resolve(@(NO)); return; } - switch ([status integerValue]) { + switch ((NSInteger)status) { case 0: [task pause]; break; @@ -705,7 +725,7 @@ - (void)promiseRejectStorageException:(RCTPromiseRejectBlock)reject error:(NSErr }]; } -- (NSDictionary *)constantsToExport { +- (NSDictionary *)storageConstantsDictionary { NSMutableDictionary *constants = [@{} mutableCopy]; if ([[[FIRApp allApps] allKeys] count] > 0) { @@ -715,9 +735,22 @@ - (NSDictionary *)constantsToExport { constants[@"maxOperationRetryTime"] = @((NSInteger)[storageInstance maxOperationRetryTime] * 1000); constants[@"maxUploadRetryTime"] = @((NSInteger)[storageInstance maxUploadRetryTime] * 1000); + } else { + constants[@"maxDownloadRetryTime"] = @0; + constants[@"maxOperationRetryTime"] = @0; + constants[@"maxUploadRetryTime"] = @0; } return constants; } +- (facebook::react::ModuleConstants) + constantsToExport { + return [_RCTTypedModuleConstants newWithUnsafeDictionary:[self storageConstantsDictionary]]; +} + +- (facebook::react::ModuleConstants)getConstants { + return [self constantsToExport]; +} + @end diff --git a/packages/storage/ios/generated/RCTAppDependencyProvider.h b/packages/storage/ios/generated/RCTAppDependencyProvider.h new file mode 100644 index 0000000000..5a1502d16f --- /dev/null +++ b/packages/storage/ios/generated/RCTAppDependencyProvider.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#if __has_include() +#import +#elif __has_include() +#import +#else +#import "RCTDependencyProvider.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAppDependencyProvider : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/storage/ios/generated/RCTAppDependencyProvider.mm b/packages/storage/ios/generated/RCTAppDependencyProvider.mm new file mode 100644 index 0000000000..61594479cc --- /dev/null +++ b/packages/storage/ios/generated/RCTAppDependencyProvider.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAppDependencyProvider.h" +#import +#import + +@implementation RCTAppDependencyProvider { + NSArray * _URLRequestHandlerClassNames; + NSArray * _imageDataDecoderClassNames; + NSArray * _imageURLLoaderClassNames; + NSDictionary> * _thirdPartyFabricComponents; +} + +- (nonnull NSArray *)URLRequestHandlerClassNames { + static dispatch_once_t requestUrlToken; + dispatch_once(&requestUrlToken, ^{ + self->_URLRequestHandlerClassNames = RCTModulesConformingToProtocolsProvider.URLRequestHandlerClassNames; + }); + + return _URLRequestHandlerClassNames; +} + +- (nonnull NSArray *)imageDataDecoderClassNames { + static dispatch_once_t dataDecoderToken; + dispatch_once(&dataDecoderToken, ^{ + _imageDataDecoderClassNames = RCTModulesConformingToProtocolsProvider.imageDataDecoderClassNames; + }); + + return _imageDataDecoderClassNames; +} + +- (nonnull NSArray *)imageURLLoaderClassNames { + static dispatch_once_t urlLoaderToken; + dispatch_once(&urlLoaderToken, ^{ + _imageURLLoaderClassNames = RCTModulesConformingToProtocolsProvider.imageURLLoaderClassNames; + }); + + return _imageURLLoaderClassNames; +} + +- (nonnull NSDictionary> *)thirdPartyFabricComponents { + static dispatch_once_t nativeComponentsToken; + dispatch_once(&nativeComponentsToken, ^{ + _thirdPartyFabricComponents = RCTThirdPartyComponentsProvider.thirdPartyFabricComponents; + }); + + return _thirdPartyFabricComponents; +} + +@end diff --git a/packages/storage/ios/generated/RCTModulesConformingToProtocolsProvider.h b/packages/storage/ios/generated/RCTModulesConformingToProtocolsProvider.h new file mode 100644 index 0000000000..10eb848917 --- /dev/null +++ b/packages/storage/ios/generated/RCTModulesConformingToProtocolsProvider.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RCTModulesConformingToProtocolsProvider: NSObject + ++(NSArray *)imageURLLoaderClassNames; + ++(NSArray *)imageDataDecoderClassNames; + ++(NSArray *)URLRequestHandlerClassNames; + +@end diff --git a/packages/storage/ios/generated/RCTModulesConformingToProtocolsProvider.mm b/packages/storage/ios/generated/RCTModulesConformingToProtocolsProvider.mm new file mode 100644 index 0000000000..c640d4fdcb --- /dev/null +++ b/packages/storage/ios/generated/RCTModulesConformingToProtocolsProvider.mm @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTModulesConformingToProtocolsProvider.h" + +@implementation RCTModulesConformingToProtocolsProvider + ++(NSArray *)imageURLLoaderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)imageDataDecoderClassNames +{ + return @[ + + ]; +} + ++(NSArray *)URLRequestHandlerClassNames +{ + return @[ + + ]; +} + +@end diff --git a/packages/storage/ios/generated/RCTThirdPartyComponentsProvider.h b/packages/storage/ios/generated/RCTThirdPartyComponentsProvider.h new file mode 100644 index 0000000000..ab1a249de3 --- /dev/null +++ b/packages/storage/ios/generated/RCTThirdPartyComponentsProvider.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@protocol RCTComponentViewProtocol; + +@interface RCTThirdPartyComponentsProvider: NSObject + ++ (NSDictionary> *)thirdPartyFabricComponents; + +@end diff --git a/packages/storage/ios/generated/RCTThirdPartyComponentsProvider.mm b/packages/storage/ios/generated/RCTThirdPartyComponentsProvider.mm new file mode 100644 index 0000000000..11d230a38e --- /dev/null +++ b/packages/storage/ios/generated/RCTThirdPartyComponentsProvider.mm @@ -0,0 +1,23 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + +#import + +#import "RCTThirdPartyComponentsProvider.h" +#import + +@implementation RCTThirdPartyComponentsProvider + ++ (NSDictionary> *)thirdPartyFabricComponents +{ + return @{ + + }; +} + +@end diff --git a/packages/storage/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules-generated.mm b/packages/storage/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules-generated.mm new file mode 100644 index 0000000000..4b626eea2d --- /dev/null +++ b/packages/storage/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules-generated.mm @@ -0,0 +1,142 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "RNFBStorageTurboModules.h" + + +@implementation NativeRNFBTurboStorageSpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + +@implementation RCTCxxConvert (NativeRNFBTurboStorage_StorageListOptions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboStorage_StorageListOptions:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_deleteObject(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "deleteObject", @selector(deleteObject:url:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_getDownloadURL(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getDownloadURL", @selector(getDownloadURL:url:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_getMetadata(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getMetadata", @selector(getMetadata:url:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_updateMetadata(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "updateMetadata", @selector(updateMetadata:url:metadata:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_list(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "list", @selector(list:url:listOptions:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_listAll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "listAll", @selector(listAll:url:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxDownloadRetryTime(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setMaxDownloadRetryTime", @selector(setMaxDownloadRetryTime:milliseconds:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxOperationRetryTime(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setMaxOperationRetryTime", @selector(setMaxOperationRetryTime:milliseconds:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxUploadRetryTime(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setMaxUploadRetryTime", @selector(setMaxUploadRetryTime:milliseconds:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_useEmulator(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "useEmulator", @selector(useEmulator:host:port:bucketUrl:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_writeToFile(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "writeToFile", @selector(writeToFile:url:localFilePath:taskId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_putFile(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "putFile", @selector(putFile:url:localFilePath:metadata:taskId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_putString(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "putString", @selector(putString:url:string:format:metadata:taskId:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_setTaskStatus(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "setTaskStatus", @selector(setTaskStatus:taskId:status:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeRNFBTurboStorageSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); + } + + NativeRNFBTurboStorageSpecJSI::NativeRNFBTurboStorageSpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["deleteObject"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_deleteObject}; + + + methodMap_["getDownloadURL"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_getDownloadURL}; + + + methodMap_["getMetadata"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_getMetadata}; + + + methodMap_["updateMetadata"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageSpecJSI_updateMetadata}; + + + methodMap_["list"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageSpecJSI_list}; + setMethodArgConversionSelector(@"list", 2, @"JS_NativeRNFBTurboStorage_StorageListOptions:"); + + methodMap_["listAll"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_listAll}; + + + methodMap_["setMaxDownloadRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxDownloadRetryTime}; + + + methodMap_["setMaxOperationRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxOperationRetryTime}; + + + methodMap_["setMaxUploadRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageSpecJSI_setMaxUploadRetryTime}; + + + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboStorageSpecJSI_useEmulator}; + + + methodMap_["writeToFile"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboStorageSpecJSI_writeToFile}; + + + methodMap_["putFile"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboStorageSpecJSI_putFile}; + + + methodMap_["putString"] = MethodMetadata {6, __hostFunction_NativeRNFBTurboStorageSpecJSI_putString}; + + + methodMap_["setTaskStatus"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageSpecJSI_setTaskStatus}; + + + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboStorageSpecJSI_getConstants}; + + } +} // namespace facebook::react diff --git a/packages/storage/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules.h b/packages/storage/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules.h new file mode 100644 index 0000000000..1ecf4b1e37 --- /dev/null +++ b/packages/storage/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules.h @@ -0,0 +1,197 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of RNFBStorageTurboModules symbols +#ifndef RNFBStorageTurboModules_H +#define RNFBStorageTurboModules_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN +namespace JS { + namespace NativeRNFBTurboStorage { + struct StorageListOptions { + double maxResults() const; + NSString *pageToken() const; + + StorageListOptions(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeRNFBTurboStorage_StorageListOptions) ++ (RCTManagedPointer *)JS_NativeRNFBTurboStorage_StorageListOptions:(id)json; +@end +namespace JS { + namespace NativeRNFBTurboStorage { + struct Constants { + + struct Builder { + struct Input { + RCTRequired maxDownloadRetryTime; + RCTRequired maxOperationRetryTime; + RCTRequired maxUploadRetryTime; + }; + + /** Initialize with a set of values */ + Builder(const Input i); + /** Initialize with an existing Constants */ + Builder(Constants i); + /** Builds the object. Generally used only by the infrastructure. */ + NSDictionary *buildUnsafeRawValue() const { return _factory(); }; + private: + NSDictionary *(^_factory)(void); + }; + + static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; } + NSDictionary *unsafeRawValue() const { return _v; } + private: + Constants(NSDictionary *const v) : _v(v) {} + NSDictionary *_v; + }; + } +} +@protocol NativeRNFBTurboStorageSpec + +- (void)deleteObject:(NSString *)appName + url:(NSString *)url + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getDownloadURL:(NSString *)appName + url:(NSString *)url + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)getMetadata:(NSString *)appName + url:(NSString *)url + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)updateMetadata:(NSString *)appName + url:(NSString *)url + metadata:(NSDictionary * _Nullable)metadata + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)list:(NSString *)appName + url:(NSString *)url + listOptions:(JS::NativeRNFBTurboStorage::StorageListOptions &)listOptions + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)listAll:(NSString *)appName + url:(NSString *)url + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setMaxDownloadRetryTime:(NSString *)appName + milliseconds:(double)milliseconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setMaxOperationRetryTime:(NSString *)appName + milliseconds:(double)milliseconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setMaxUploadRetryTime:(NSString *)appName + milliseconds:(double)milliseconds + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)useEmulator:(NSString *)appName + host:(NSString *)host + port:(double)port + bucketUrl:(NSString *)bucketUrl; +- (void)writeToFile:(NSString *)appName + url:(NSString *)url + localFilePath:(NSString *)localFilePath + taskId:(double)taskId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)putFile:(NSString *)appName + url:(NSString *)url + localFilePath:(NSString *)localFilePath + metadata:(NSDictionary * _Nullable)metadata + taskId:(double)taskId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)putString:(NSString *)appName + url:(NSString *)url + string:(NSString *)string + format:(NSString *)format + metadata:(NSDictionary * _Nullable)metadata + taskId:(double)taskId + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)setTaskStatus:(NSString *)appName + taskId:(double)taskId + status:(double)status + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (facebook::react::ModuleConstants)constantsToExport; +- (facebook::react::ModuleConstants)getConstants; + +@end + +@interface NativeRNFBTurboStorageSpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeRNFBTurboStorage' + */ + class JSI_EXPORT NativeRNFBTurboStorageSpecJSI : public ObjCTurboModule { + public: + NativeRNFBTurboStorageSpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react +inline double JS::NativeRNFBTurboStorage::StorageListOptions::maxResults() const +{ + id const p = _v[@"maxResults"]; + return RCTBridgingToDouble(p); +} +inline NSString *JS::NativeRNFBTurboStorage::StorageListOptions::pageToken() const +{ + id const p = _v[@"pageToken"]; + return RCTBridgingToOptionalString(p); +} +inline JS::NativeRNFBTurboStorage::Constants::Builder::Builder(const Input i) : _factory(^{ + NSMutableDictionary *d = [NSMutableDictionary new]; + auto maxDownloadRetryTime = i.maxDownloadRetryTime.get(); + d[@"maxDownloadRetryTime"] = @(maxDownloadRetryTime); + auto maxOperationRetryTime = i.maxOperationRetryTime.get(); + d[@"maxOperationRetryTime"] = @(maxOperationRetryTime); + auto maxUploadRetryTime = i.maxUploadRetryTime.get(); + d[@"maxUploadRetryTime"] = @(maxUploadRetryTime); + return d; +}) {} +inline JS::NativeRNFBTurboStorage::Constants::Builder::Builder(Constants i) : _factory(^{ + return i.unsafeRawValue(); +}) {} +NS_ASSUME_NONNULL_END +#endif // RNFBStorageTurboModules_H diff --git a/packages/storage/ios/generated/RNFBStorageTurboModulesJSI-generated.cpp b/packages/storage/ios/generated/RNFBStorageTurboModulesJSI-generated.cpp new file mode 100644 index 0000000000..27bd900ec8 --- /dev/null +++ b/packages/storage/ios/generated/RNFBStorageTurboModulesJSI-generated.cpp @@ -0,0 +1,153 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleCpp.js + */ + +#include "RNFBStorageTurboModulesJSI.h" + +namespace facebook::react { + +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getConstants(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getConstants( + rt + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_deleteObject(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->deleteObject( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getDownloadURL(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getDownloadURL( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getMetadata(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->getMetadata( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_updateMetadata(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->updateMetadata( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 || args[2].isNull() || args[2].isUndefined() ? std::nullopt : std::make_optional(args[2].asObject(rt)) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_list(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->list( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asObject(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_listAll(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->listAll( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt) + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxDownloadRetryTime(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setMaxDownloadRetryTime( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxOperationRetryTime(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setMaxOperationRetryTime( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxUploadRetryTime(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setMaxUploadRetryTime( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_useEmulator(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_cast(&turboModule)->useEmulator( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt) + ); + return jsi::Value::undefined(); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_writeToFile(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->writeToFile( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_putFile(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->putFile( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 || args[3].isNull() || args[3].isUndefined() ? std::nullopt : std::make_optional(args[3].asObject(rt)), + count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_putString(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->putString( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asString(rt), + count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asString(rt), + count <= 4 || args[4].isNull() || args[4].isUndefined() ? std::nullopt : std::make_optional(args[4].asObject(rt)), + count <= 5 ? throw jsi::JSError(rt, "Expected argument in position 5 to be passed") : args[5].asNumber() + ); +} +static jsi::Value __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setTaskStatus(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + return static_cast(&turboModule)->setTaskStatus( + rt, + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber(), + count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber() + ); +} + +NativeRNFBTurboStorageCxxSpecJSI::NativeRNFBTurboStorageCxxSpecJSI(std::shared_ptr jsInvoker) + : TurboModule("NativeRNFBTurboStorage", jsInvoker) { + methodMap_["getConstants"] = MethodMetadata {0, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getConstants}; + methodMap_["deleteObject"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_deleteObject}; + methodMap_["getDownloadURL"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getDownloadURL}; + methodMap_["getMetadata"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_getMetadata}; + methodMap_["updateMetadata"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_updateMetadata}; + methodMap_["list"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_list}; + methodMap_["listAll"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_listAll}; + methodMap_["setMaxDownloadRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxDownloadRetryTime}; + methodMap_["setMaxOperationRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxOperationRetryTime}; + methodMap_["setMaxUploadRetryTime"] = MethodMetadata {2, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setMaxUploadRetryTime}; + methodMap_["useEmulator"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_useEmulator}; + methodMap_["writeToFile"] = MethodMetadata {4, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_writeToFile}; + methodMap_["putFile"] = MethodMetadata {5, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_putFile}; + methodMap_["putString"] = MethodMetadata {6, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_putString}; + methodMap_["setTaskStatus"] = MethodMetadata {3, __hostFunction_NativeRNFBTurboStorageCxxSpecJSI_setTaskStatus}; +} + + +} // namespace facebook::react diff --git a/packages/storage/ios/generated/RNFBStorageTurboModulesJSI.h b/packages/storage/ios/generated/RNFBStorageTurboModulesJSI.h new file mode 100644 index 0000000000..5f20d4467e --- /dev/null +++ b/packages/storage/ios/generated/RNFBStorageTurboModulesJSI.h @@ -0,0 +1,246 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + + +#pragma mark - NativeRNFBTurboStorageStorageListOptions + +template +struct NativeRNFBTurboStorageStorageListOptions { + P0 maxResults; + P1 pageToken; + bool operator==(const NativeRNFBTurboStorageStorageListOptions &other) const { + return maxResults == other.maxResults && pageToken == other.pageToken; + } +}; + +template +struct NativeRNFBTurboStorageStorageListOptionsBridging { + static T types; + + static T fromJs( + jsi::Runtime &rt, + const jsi::Object &value, + const std::shared_ptr &jsInvoker) { + T result{ + bridging::fromJs(rt, value.getProperty(rt, "maxResults"), jsInvoker), + bridging::fromJs(rt, value.getProperty(rt, "pageToken"), jsInvoker)}; + return result; + } + +#ifdef DEBUG + static double maxResultsToJs(jsi::Runtime &rt, decltype(types.maxResults) value) { + return bridging::toJs(rt, value); + } + + static std::optional pageTokenToJs(jsi::Runtime &rt, decltype(types.pageToken) value) { + return bridging::toJs(rt, value); + } +#endif + + static jsi::Object toJs( + jsi::Runtime &rt, + const T &value, + const std::shared_ptr &jsInvoker) { + auto result = facebook::jsi::Object(rt); + result.setProperty(rt, "maxResults", bridging::toJs(rt, value.maxResults, jsInvoker)); + if (value.pageToken) { + result.setProperty(rt, "pageToken", bridging::toJs(rt, value.pageToken.value(), jsInvoker)); + } + return result; + } +}; + +class JSI_EXPORT NativeRNFBTurboStorageCxxSpecJSI : public TurboModule { +protected: + NativeRNFBTurboStorageCxxSpecJSI(std::shared_ptr jsInvoker); + +public: + virtual jsi::Object getConstants(jsi::Runtime &rt) = 0; + virtual jsi::Value deleteObject(jsi::Runtime &rt, jsi::String appName, jsi::String url) = 0; + virtual jsi::Value getDownloadURL(jsi::Runtime &rt, jsi::String appName, jsi::String url) = 0; + virtual jsi::Value getMetadata(jsi::Runtime &rt, jsi::String appName, jsi::String url) = 0; + virtual jsi::Value updateMetadata(jsi::Runtime &rt, jsi::String appName, jsi::String url, std::optional metadata) = 0; + virtual jsi::Value list(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::Object listOptions) = 0; + virtual jsi::Value listAll(jsi::Runtime &rt, jsi::String appName, jsi::String url) = 0; + virtual jsi::Value setMaxDownloadRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) = 0; + virtual jsi::Value setMaxOperationRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) = 0; + virtual jsi::Value setMaxUploadRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) = 0; + virtual void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String host, double port, jsi::String bucketUrl) = 0; + virtual jsi::Value writeToFile(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String localFilePath, double taskId) = 0; + virtual jsi::Value putFile(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String localFilePath, std::optional metadata, double taskId) = 0; + virtual jsi::Value putString(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String string, jsi::String format, std::optional metadata, double taskId) = 0; + virtual jsi::Value setTaskStatus(jsi::Runtime &rt, jsi::String appName, double taskId, double status) = 0; + +}; + +template +class JSI_EXPORT NativeRNFBTurboStorageCxxSpec : public TurboModule { +public: + jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override { + return delegate_.create(rt, propName); + } + + std::vector getPropertyNames(jsi::Runtime& runtime) override { + return delegate_.getPropertyNames(runtime); + } + + static constexpr std::string_view kModuleName = "NativeRNFBTurboStorage"; + +protected: + NativeRNFBTurboStorageCxxSpec(std::shared_ptr jsInvoker) + : TurboModule(std::string{NativeRNFBTurboStorageCxxSpec::kModuleName}, jsInvoker), + delegate_(reinterpret_cast(this), jsInvoker) {} + + +private: + class Delegate : public NativeRNFBTurboStorageCxxSpecJSI { + public: + Delegate(T *instance, std::shared_ptr jsInvoker) : + NativeRNFBTurboStorageCxxSpecJSI(std::move(jsInvoker)), instance_(instance) { + + } + + jsi::Object getConstants(jsi::Runtime &rt) override { + static_assert( + bridging::getParameterCount(&T::getConstants) == 1, + "Expected getConstants(...) to have 1 parameters"); + + return bridging::callFromJs( + rt, &T::getConstants, jsInvoker_, instance_); + } + jsi::Value deleteObject(jsi::Runtime &rt, jsi::String appName, jsi::String url) override { + static_assert( + bridging::getParameterCount(&T::deleteObject) == 3, + "Expected deleteObject(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::deleteObject, jsInvoker_, instance_, std::move(appName), std::move(url)); + } + jsi::Value getDownloadURL(jsi::Runtime &rt, jsi::String appName, jsi::String url) override { + static_assert( + bridging::getParameterCount(&T::getDownloadURL) == 3, + "Expected getDownloadURL(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getDownloadURL, jsInvoker_, instance_, std::move(appName), std::move(url)); + } + jsi::Value getMetadata(jsi::Runtime &rt, jsi::String appName, jsi::String url) override { + static_assert( + bridging::getParameterCount(&T::getMetadata) == 3, + "Expected getMetadata(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::getMetadata, jsInvoker_, instance_, std::move(appName), std::move(url)); + } + jsi::Value updateMetadata(jsi::Runtime &rt, jsi::String appName, jsi::String url, std::optional metadata) override { + static_assert( + bridging::getParameterCount(&T::updateMetadata) == 4, + "Expected updateMetadata(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::updateMetadata, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(metadata)); + } + jsi::Value list(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::Object listOptions) override { + static_assert( + bridging::getParameterCount(&T::list) == 4, + "Expected list(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::list, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(listOptions)); + } + jsi::Value listAll(jsi::Runtime &rt, jsi::String appName, jsi::String url) override { + static_assert( + bridging::getParameterCount(&T::listAll) == 3, + "Expected listAll(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::listAll, jsInvoker_, instance_, std::move(appName), std::move(url)); + } + jsi::Value setMaxDownloadRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) override { + static_assert( + bridging::getParameterCount(&T::setMaxDownloadRetryTime) == 3, + "Expected setMaxDownloadRetryTime(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setMaxDownloadRetryTime, jsInvoker_, instance_, std::move(appName), std::move(milliseconds)); + } + jsi::Value setMaxOperationRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) override { + static_assert( + bridging::getParameterCount(&T::setMaxOperationRetryTime) == 3, + "Expected setMaxOperationRetryTime(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setMaxOperationRetryTime, jsInvoker_, instance_, std::move(appName), std::move(milliseconds)); + } + jsi::Value setMaxUploadRetryTime(jsi::Runtime &rt, jsi::String appName, double milliseconds) override { + static_assert( + bridging::getParameterCount(&T::setMaxUploadRetryTime) == 3, + "Expected setMaxUploadRetryTime(...) to have 3 parameters"); + + return bridging::callFromJs( + rt, &T::setMaxUploadRetryTime, jsInvoker_, instance_, std::move(appName), std::move(milliseconds)); + } + void useEmulator(jsi::Runtime &rt, jsi::String appName, jsi::String host, double port, jsi::String bucketUrl) override { + static_assert( + bridging::getParameterCount(&T::useEmulator) == 5, + "Expected useEmulator(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::useEmulator, jsInvoker_, instance_, std::move(appName), std::move(host), std::move(port), std::move(bucketUrl)); + } + jsi::Value writeToFile(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String localFilePath, double taskId) override { + static_assert( + bridging::getParameterCount(&T::writeToFile) == 5, + "Expected writeToFile(...) to have 5 parameters"); + + return bridging::callFromJs( + rt, &T::writeToFile, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(localFilePath), std::move(taskId)); + } + jsi::Value putFile(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String localFilePath, std::optional metadata, double taskId) override { + static_assert( + bridging::getParameterCount(&T::putFile) == 6, + "Expected putFile(...) to have 6 parameters"); + + return bridging::callFromJs( + rt, &T::putFile, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(localFilePath), std::move(metadata), std::move(taskId)); + } + jsi::Value putString(jsi::Runtime &rt, jsi::String appName, jsi::String url, jsi::String string, jsi::String format, std::optional metadata, double taskId) override { + static_assert( + bridging::getParameterCount(&T::putString) == 7, + "Expected putString(...) to have 7 parameters"); + + return bridging::callFromJs( + rt, &T::putString, jsInvoker_, instance_, std::move(appName), std::move(url), std::move(string), std::move(format), std::move(metadata), std::move(taskId)); + } + jsi::Value setTaskStatus(jsi::Runtime &rt, jsi::String appName, double taskId, double status) override { + static_assert( + bridging::getParameterCount(&T::setTaskStatus) == 4, + "Expected setTaskStatus(...) to have 4 parameters"); + + return bridging::callFromJs( + rt, &T::setTaskStatus, jsInvoker_, instance_, std::move(appName), std::move(taskId), std::move(status)); + } + + private: + friend class NativeRNFBTurboStorageCxxSpec; + T *instance_; + }; + + Delegate delegate_; +}; + +} // namespace facebook::react diff --git a/packages/storage/ios/generated/ReactAppDependencyProvider.podspec b/packages/storage/ios/generated/ReactAppDependencyProvider.podspec new file mode 100644 index 0000000000..2180f399b8 --- /dev/null +++ b/packages/storage/ios/generated/ReactAppDependencyProvider.podspec @@ -0,0 +1,34 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +version = "0.78.3" +source = { :git => 'https://github.com/facebook/react-native.git' } +if version == '1000.0.0' + # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. + source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1") +else + source[:tag] = "v#{version}" +end + +Pod::Spec.new do |s| + s.name = "ReactAppDependencyProvider" + s.version = version + s.summary = "The third party dependency provider for the app" + s.homepage = "https://reactnative.dev/" + s.documentation_url = "https://reactnative.dev/" + s.license = "MIT" + s.author = "Meta Platforms, Inc. and its affiliates" + s.platforms = min_supported_versions + s.source = source + s.source_files = "**/RCTAppDependencyProvider.{h,mm}" + + # This guard prevent to install the dependencies when we run `pod install` in the old architecture. + s.pod_target_xcconfig = { + "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), + "DEFINES_MODULE" => "YES" + } + + s.dependency "ReactCodegen" +end diff --git a/packages/storage/lib/StorageReference.ts b/packages/storage/lib/StorageReference.ts index ba1400f941..e3f904eb2c 100644 --- a/packages/storage/lib/StorageReference.ts +++ b/packages/storage/lib/StorageReference.ts @@ -112,7 +112,7 @@ export default class Reference extends ReferenceBase implements StorageReference * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#delete */ delete(): Promise { - return this._storage.native.delete(this.toString()); + return this._storage.native.deleteObject(this.toString()); } /** diff --git a/packages/storage/lib/index.ts b/packages/storage/lib/index.ts index 4ae26dc0a0..d1703c21f2 100644 --- a/packages/storage/lib/index.ts +++ b/packages/storage/lib/index.ts @@ -44,7 +44,7 @@ import type { import type { StorageInternal, StorageReferenceInternal } from './types/internal'; const nativeEvents = ['storage_event']; -const nativeModuleName = 'RNFBStorageModule'; +const nativeModuleName = 'NativeRNFBTurboStorage'; const config: ModuleConfig = { namespace: 'storage', @@ -53,6 +53,7 @@ const config: ModuleConfig = { hasMultiAppSupport: true, hasCustomUrlOrRegionSupport: true, disablePrependCustomUrlOrRegion: true, + turboModule: true, }; class FirebaseStorageModule extends FirebaseModule { @@ -461,31 +462,31 @@ export function uploadString( // Methods not on the Firebase JS SDK below /** - * Sets the maximum time in milliseconds to retry a download if a failure occurs.. android & iOS only. - * @param storage - Storage instance. - * @param time - The new maximum operation retry time in milliseconds. - * @returns {Promise} + * Sets the maximum time in milliseconds to retry non-upload/download operations. + * + * @remarks React Native Firebase-specific modular helper. The firebase-js-sdk exposes this as a + * writable property on the `FirebaseStorage` instance. **Android and iOS only.** */ export function setMaxOperationRetryTime(storage: FirebaseStorage, time: number): Promise { return (storage as StorageInternal).setMaxOperationRetryTime(time); } /** - * Sets the maximum time in milliseconds to retry an upload if a failure occurs. android & iOS only. - * @param storage - Storage instance. - * @param time - The new maximum operation retry time in milliseconds. - * @returns {Promise} + * Sets the maximum time in milliseconds to retry an upload if a failure occurs. + * + * @remarks React Native Firebase-specific modular helper. The firebase-js-sdk exposes this as a + * writable property on the `FirebaseStorage` instance. **Android and iOS only.** */ export function setMaxUploadRetryTime(storage: FirebaseStorage, time: number): Promise { return (storage as StorageInternal).setMaxUploadRetryTime(time); } /** - * Puts a file from local disk onto the storage bucket. - * @param storageRef - Storage Reference instance. - * @param filePath The local file path to upload to the bucket at the reference location. - * @param metadata Any additional `UploadMetadata` for this task. - * @returns {Task} + * Uploads a file from a local device path to Cloud Storage. + * + * @remarks React Native Firebase-specific API with **no firebase-js-sdk equivalent**. Use + * `FilePath` from `@react-native-firebase/app` for portable device paths. **Native only** + * — throws on Web interop. */ export function putFile( storageRef: StorageReference, @@ -496,10 +497,11 @@ export function putFile( } /** - * Downloads a file to the specified local file path on the device. - * @param storageRef - Storage Reference instance. - * @param filePath The local file path to upload to on the device. - * @returns {Task} + * Downloads a Cloud Storage object to a local device file path. + * + * @remarks React Native Firebase-specific API with **no firebase-js-sdk equivalent**. Use + * `FilePath` from `@react-native-firebase/app` for portable device paths. **Native only** + * — throws on Web interop. */ export function writeToFile(storageRef: StorageReference, filePath: string): Task { return (storageRef as StorageReferenceInternal).writeToFile(filePath); @@ -507,9 +509,9 @@ export function writeToFile(storageRef: StorageReference, filePath: string): Tas /** * Sets the maximum time in milliseconds to retry a download if a failure occurs. - * @param storage - Storage instance. - * @param time - The new maximum download retry time in milliseconds. - * @returns {Promise} + * + * @remarks React Native Firebase-specific modular helper with no direct firebase-js-sdk equivalent. + * **Android and iOS only.** */ export function setMaxDownloadRetryTime(storage: FirebaseStorage, time: number): Promise { return (storage as StorageInternal).setMaxDownloadRetryTime(time); diff --git a/packages/storage/lib/types/internal.ts b/packages/storage/lib/types/internal.ts index 196ab98e1b..f21564246d 100644 --- a/packages/storage/lib/types/internal.ts +++ b/packages/storage/lib/types/internal.ts @@ -35,7 +35,7 @@ import type EventEmitter from 'react-native/Libraries/vendor/emitter/EventEmitte * Used internally by StorageReference and other internal classes. */ export type StorageInternal = FirebaseStorage & { - native: RNFBStorageModule; + native: NativeRNFBTurboStorage; _customUrlOrRegion: string | null; emitter: EventEmitter; eventNameForApp: (...args: Array) => string; @@ -127,7 +127,7 @@ export type ListResultInternal = { * when `hasMultiAppSupport` is enabled. This interface represents the *wrapped* module shape * that is exposed as `this.native` within FirebaseModule subclasses. */ -export interface RNFBStorageModule { +export interface NativeRNFBTurboStorage { /** * Native constants exposed on the module. * These are read during module construction to seed the JS-side values. @@ -140,7 +140,7 @@ export interface RNFBStorageModule { setMaxUploadRetryTime(time: number): Promise; setMaxDownloadRetryTime(time: number): Promise; - delete(url: string): Promise; + deleteObject(url: string): Promise; getDownloadURL(url: string): Promise; getMetadata(url: string): Promise; updateMetadata(url: string, metadata: SettableMetadata): Promise; @@ -184,6 +184,6 @@ export interface RNFBStorageModule { declare module '@react-native-firebase/app/dist/module/internal/NativeModules' { interface ReactNativeFirebaseNativeModules { - RNFBStorageModule: RNFBStorageModule; + NativeRNFBTurboStorage: NativeRNFBTurboStorage; } } diff --git a/packages/storage/lib/web/RNFBStorageModule.ts b/packages/storage/lib/web/RNFBStorageModule.ts index 62d1486f97..abec934786 100644 --- a/packages/storage/lib/web/RNFBStorageModule.ts +++ b/packages/storage/lib/web/RNFBStorageModule.ts @@ -247,7 +247,7 @@ export default { * @param url - The path to the object. * @return {Promise} */ - delete(appName: string, url: string): Promise { + deleteObject(appName: string, url: string): Promise { return guard(async () => { const ref = getReferenceFromUrl(appName, url); await deleteObject(ref); diff --git a/packages/storage/package.json b/packages/storage/package.json index 5aef1ae65d..cd93bd7afc 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -5,11 +5,28 @@ "description": "React Native Firebase - React Native Firebase provides native integration with Cloud Storage, providing support to upload and download files directly from your device and from your Firebase Cloud Storage bucket.", "main": "./dist/module/index.js", "types": "./dist/typescript/lib/index.d.ts", + "codegenConfig": { + "name": "RNFBStorageTurboModules", + "type": "modules", + "jsSrcsDir": "specs", + "includesGeneratedCode": true, + "android": { + "javaPackageName": "io.invertase.firebase.storage" + }, + "ios": { + "modulesProvider": { + "NativeRNFBTurboStorage": "RNFBStorageModule" + } + } + }, "scripts": { "build": "genversion --esm --semi lib/version.ts", "build:clean": "rimraf android/build && rimraf ios/build", "compile": "bob build", - "prepare": "yarn run build && yarn compile" + "prepare": "yarn run build && yarn compile", + "codegen": "yarn android:codegen && yarn ios:codegen", + "android:codegen": "npx @react-native-community/cli codegen --platform android --outputPath=./android/src/main/java/io/invertase/firebase/storage/generated", + "ios:codegen": "npx @react-native-community/cli codegen --platform ios --outputPath=./ios/generated" }, "repository": { "type": "git", diff --git a/packages/storage/react-native.config.js b/packages/storage/react-native.config.js new file mode 100644 index 0000000000..dcac3c593c --- /dev/null +++ b/packages/storage/react-native.config.js @@ -0,0 +1,10 @@ +module.exports = { + dependency: { + platforms: { + android: { + cmakeListsPath: + './src/main/java/io/invertase/firebase/storage/generated/jni/CMakeLists.txt', + }, + }, + }, +}; diff --git a/packages/storage/specs/NativeRNFBTurboStorage.ts b/packages/storage/specs/NativeRNFBTurboStorage.ts new file mode 100644 index 0000000000..3460e404b2 --- /dev/null +++ b/packages/storage/specs/NativeRNFBTurboStorage.ts @@ -0,0 +1,46 @@ +/* eslint-disable @typescript-eslint/no-wrapper-object-types */ +import type { TurboModule } from 'react-native'; +import { TurboModuleRegistry } from 'react-native'; + +export interface StorageListOptions { + maxResults: number; + pageToken?: string | null; +} + +export interface Spec extends TurboModule { + getConstants(): { + maxDownloadRetryTime: number; + maxOperationRetryTime: number; + maxUploadRetryTime: number; + }; + + deleteObject(appName: string, url: string): Promise; + getDownloadURL(appName: string, url: string): Promise; + getMetadata(appName: string, url: string): Promise; + updateMetadata(appName: string, url: string, metadata: Object | null): Promise; + list(appName: string, url: string, listOptions: StorageListOptions): Promise; + listAll(appName: string, url: string): Promise; + setMaxDownloadRetryTime(appName: string, milliseconds: number): Promise; + setMaxOperationRetryTime(appName: string, milliseconds: number): Promise; + setMaxUploadRetryTime(appName: string, milliseconds: number): Promise; + useEmulator(appName: string, host: string, port: number, bucketUrl: string): void; + writeToFile(appName: string, url: string, localFilePath: string, taskId: number): Promise; + putFile( + appName: string, + url: string, + localFilePath: string, + metadata: Object | null, + taskId: number, + ): Promise; + putString( + appName: string, + url: string, + string: string, + format: string, + metadata: Object | null, + taskId: number, + ): Promise; + setTaskStatus(appName: string, taskId: number, status: number): Promise; +} + +export default TurboModuleRegistry.getEnforcing('NativeRNFBTurboStorage'); diff --git a/scripts/codegen-verify.mjs b/scripts/codegen-verify.mjs new file mode 100644 index 0000000000..c44c4e13e4 --- /dev/null +++ b/scripts/codegen-verify.mjs @@ -0,0 +1,73 @@ +#!/usr/bin/env node +import fs from 'fs'; +import path from 'path'; +import { execSync } from 'child_process'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const REPO_ROOT = path.resolve(__dirname, '..'); +const CLI_CONTEXT_DIR = path.join(REPO_ROOT, 'packages/app'); +const RN_CLI = 'npx @react-native-community/cli'; + +const MIGRATED_PACKAGES = [ + 'app', + 'firestore', + 'installations', + 'perf', + 'in-app-messaging', + 'messaging', + 'app-distribution', + 'ml', + 'app-check', + 'remote-config', + 'analytics', + 'crashlytics', + 'storage', + 'functions', + 'database', + 'auth', + 'phone-number-verification', +]; + +function parseCodegenCommand(script) { + const match = script.match(/codegen (--platform \S+ --outputPath=\S+)/); + if (!match) { + throw new Error(`Cannot parse codegen command: ${script}`); + } + return match[1]; +} + +function toCliContextRelative(packageDir, outputPath) { + const normalizedOutput = outputPath.replace(/^\.\//, ''); + const absoluteOutput = path.join(packageDir, normalizedOutput); + return path.relative(CLI_CONTEXT_DIR, absoluteOutput); +} + +for (const packageName of MIGRATED_PACKAGES) { + const packageDir = path.join(REPO_ROOT, 'packages', packageName); + const packageJson = JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json'), 'utf8')); + const packagePathFromApp = path.relative(CLI_CONTEXT_DIR, packageDir) || '.'; + + for (const scriptName of ['android:codegen', 'ios:codegen']) { + const script = packageJson.scripts?.[scriptName]; + if (!script) { + throw new Error(`${packageName} is missing scripts.${scriptName}`); + } + + const args = parseCodegenCommand(script); + const outputMatch = args.match(/--outputPath=(\S+)/); + if (!outputMatch) { + throw new Error(`${packageName} ${scriptName} is missing --outputPath`); + } + + const outputPathFromApp = toCliContextRelative(packageDir, outputMatch[1]); + const rewrittenArgs = args.replace( + /--outputPath=\S+/, + `--outputPath=${outputPathFromApp}`, + ); + const command = `${RN_CLI} codegen --path ${packagePathFromApp} ${rewrittenArgs}`; + + console.log(`[codegen:verify] ${packageName} (${scriptName})`); + execSync(command, { stdio: 'inherit', cwd: CLI_CONTEXT_DIR }); + } +} diff --git a/tests/.detoxrc.js b/tests/.detoxrc.js index ecb1fabb4e..235263035c 100644 --- a/tests/.detoxrc.js +++ b/tests/.detoxrc.js @@ -63,7 +63,8 @@ module.exports = { avdName: 'TestingAVD', }, // Cold boot: do not load/save AVD snapshots (warm quickboot is unreliable locally). - bootArgs: '-no-snapshot-load -no-snapshot-save', + bootArgs: + process.env.RNFB_ANDROID_EMULATOR_BOOT_ARGS || '-no-snapshot-load -no-snapshot-save', readonly: true, }, }, diff --git a/tests/README.md b/tests/README.md index 78483666ed..3120b35fce 100644 --- a/tests/README.md +++ b/tests/README.md @@ -105,6 +105,7 @@ This action will launch a new simulator (if not already open) and run the tests > Or you can change this name in the `package.json` of the tests project (don't commit the change though please). > **DO NOT** rename an existing AVD to this name - it will not work, rename does not change the file path currently so Detox will > fail to find the AVD in the correct directory. Create a new one with Google Play Services. +> Detox cold-boots `TestingAVD` on every run (`-no-snapshot-load`) to avoid Quick Boot gray-screen failures — see [running e2e § Android gray screen](../okf-bundle/testing/running-e2e.md#android-emulator-gray-screen--quick-boot-blocking). #### Android diff --git a/tests/app.js b/tests/app.js index e8ddd20217..bace128e32 100644 --- a/tests/app.js +++ b/tests/app.js @@ -23,6 +23,13 @@ import { JetProvider, ConnectionText, StatusEmoji, StatusText } from 'jet'; import { TestComponents } from './local-tests'; +let harnessOverrides = {}; +try { + harnessOverrides = require('./harness.overrides.js'); +} catch (e) { + // Optional local overrides — see harness.overrides.example.js +} + const platformSupportedModules = []; if (Platform.other) { @@ -59,6 +66,11 @@ if (!Platform.other) { platformSupportedModules.push('phoneNumberVerification'); platformSupportedModules.push('ai'); } +if (Array.isArray(harnessOverrides.modules) && harnessOverrides.modules.length) { + const allowed = new Set(harnessOverrides.modules); + const filtered = platformSupportedModules.filter(module => allowed.has(module)); + platformSupportedModules.splice(0, platformSupportedModules.length, ...filtered); +} // Registering an error handler that always throw unhandled exceptions // This is to enable Jet to exit on uncaught errors const originalHandler = ErrorUtils.getGlobalHandler(); diff --git a/tests/e2e/firebase.test.js b/tests/e2e/firebase.test.js index 4005ea5069..c90ef72fa3 100644 --- a/tests/e2e/firebase.test.js +++ b/tests/e2e/firebase.test.js @@ -67,6 +67,10 @@ const ANDROID_PACKAGE_HANDLER_TIMEOUT_MS = parseInt( 10, ); const ANDROID_BOOT_SETTLE_MS = parseInt(process.env.RNFB_ANDROID_BOOT_SETTLE_MS || '30000', 10); +const ANDROID_AVD_NAME = process.env.RNFB_ANDROID_AVD_NAME || 'TestingAVD'; +const ANDROID_EMULATOR_COLD_BOOT_ARGS = ( + process.env.RNFB_ANDROID_EMULATOR_BOOT_ARGS || '-no-snapshot-load -no-snapshot-save' +).trim(); const DRAIN_ORCHESTRATE_TIMEOUT_MS = parseInt( process.env.RNFB_DRAIN_ORCHESTRATE_TIMEOUT_MS || '30000', 10, @@ -98,6 +102,10 @@ let lastJetAttemptContext; const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); +function isCI() { + return process.env.CI === 'true' || process.env.CI === true; +} + function resolveDetoxConfigurationName() { if (process.env.DETOX_CONFIGURATION) { return process.env.DETOX_CONFIGURATION; @@ -176,38 +184,67 @@ function resolveIosSimulatorUdid() { } function logLaunchInstallState(label) { - const udid = resolveIosSimulatorUdid(); - if (!udid || process.platform !== 'darwin') { - console.log(`[rnfb-e2e] install-state label=${label} udid=unknown skipped=non-darwin-or-no-udid`); - return; + let platform = 'unknown'; + try { + if (typeof detox !== 'undefined' && detox?.device?.getPlatform) { + platform = detox.device.getPlatform(); + } + } catch (_) { + // Detox device may not be ready yet. } - try { - const container = execSync( - `/usr/bin/xcrun simctl get_app_container ${udid} com.invertase.testing 2>&1`, - { encoding: 'utf8', timeout: 15000 }, - ).trim(); - console.log(`[rnfb-e2e] install-state label=${label} udid=${udid} container=${container}`); - } catch (err) { - const detail = err?.stdout?.toString?.() || err?.message || String(err); - console.warn(`[rnfb-e2e] install-state label=${label} udid=${udid} container=missing detail=${detail}`); + if (platform === 'ios' && process.platform === 'darwin') { + const udid = resolveIosSimulatorUdid(); + if (!udid) { + console.log(`[rnfb-e2e] install-state label=${label} udid=unknown skipped=no-ios-udid`); + return; + } + + try { + const container = execSync( + `/usr/bin/xcrun simctl get_app_container ${udid} com.invertase.testing 2>&1`, + { encoding: 'utf8', timeout: 15000 }, + ).trim(); + console.log(`[rnfb-e2e] install-state label=${label} udid=${udid} container=${container}`); + } catch (err) { + const detail = err?.stdout?.toString?.() || err?.message || String(err); + console.warn( + `[rnfb-e2e] install-state label=${label} udid=${udid} container=missing detail=${detail}`, + ); + } + + try { + const apps = execSync(`/usr/bin/xcrun simctl listapps ${udid} 2>/dev/null`, { + encoding: 'utf8', + timeout: 30000, + }); + const invertaseLine = + apps + .split('\n') + .find(line => line.includes('com.invertase.testing')) || '(not listed)'; + console.log(`[rnfb-e2e] install-state label=${label} listapps=${invertaseLine.trim()}`); + } catch (err) { + console.warn( + `[rnfb-e2e] install-state label=${label} listapps=error detail=${err?.message || err}`, + ); + } + return; } - try { - const apps = execSync(`/usr/bin/xcrun simctl listapps ${udid} 2>/dev/null`, { - encoding: 'utf8', - timeout: 30000, - }); - const invertaseLine = - apps - .split('\n') - .find(line => line.includes('com.invertase.testing')) || '(not listed)'; - console.log(`[rnfb-e2e] install-state label=${label} listapps=${invertaseLine.trim()}`); - } catch (err) { - console.warn( - `[rnfb-e2e] install-state label=${label} listapps=error detail=${err?.message || err}`, - ); + if (platform === 'android') { + const serial = resolveAndroidSerial(); + try { + const apk = adbShell(serial, 'pm path com.invertase.testing'); + console.log(`[rnfb-e2e] install-state label=${label} serial=${serial} apk=${apk}`); + } catch (err) { + console.warn( + `[rnfb-e2e] install-state label=${label} serial=${serial} apk=missing detail=${err?.message || err}`, + ); + } + return; } + + console.log(`[rnfb-e2e] install-state label=${label} skipped=platform-${platform}`); } function rebootIosSimulator(testsDir) { @@ -244,6 +281,31 @@ function resolveAdbPath() { return sdkRoot ? path.join(sdkRoot, 'platform-tools', 'adb') : 'adb'; } +function resolveEmulatorPath() { + const sdkRoot = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT; + if (!sdkRoot) { + throw new Error('ANDROID_HOME or ANDROID_SDK_ROOT is required to cold boot the Android emulator'); + } + return path.join(sdkRoot, 'emulator', 'emulator'); +} + +function resolveAndroidEmulatorPort(serial) { + const portMatch = serial.match(/^emulator-(\d+)$/); + return portMatch ? portMatch[1] : '5554'; +} + +function adbDeviceState(serial) { + const adb = resolveAdbPath(); + try { + return execSync(`${adb} -s ${serial} get-state`, { + encoding: 'utf8', + timeout: 5000, + }).trim(); + } catch (_) { + return 'unknown'; + } +} + function resolveAndroidSerial() { try { if (typeof device !== 'undefined' && device?.id) { @@ -269,13 +331,156 @@ function parseGuestLoad1Min(loadavgLine) { return Number.isFinite(load) ? load : NaN; } -function rebootAndroidEmulator() { +function killTcpPortListener(port, label) { + let pidList = ''; + try { + pidList = execSync(`lsof -nP -iTCP:${port} -sTCP:LISTEN -t 2>/dev/null || true`, { + encoding: 'utf8', + timeout: 5000, + }).trim(); + } catch (err) { + console.warn(`[rnfb-e2e] ${label}: unable to inspect :${port} listener: ${err?.message || err}`); + return; + } + + const pids = pidList + .split(/\s+/) + .filter(Boolean) + .filter(pid => /^\d+$/.test(pid)); + if (pids.length === 0) { + console.log(`[rnfb-e2e] ${label}: no listener on :${port}`); + return; + } + + console.warn(`[rnfb-e2e] ${label}: killing stray listener on :${port} pid=${pids.join(',')}`); + try { + execSync(`kill ${pids.join(' ')}`, { stdio: 'inherit', timeout: 5000 }); + } catch (err) { + console.warn(`[rnfb-e2e] ${label}: failed to kill :${port} listener: ${err?.message || err}`); + } +} + +async function ensureTcpPortClosed(port, label, timeoutMs = KILL_JET_FOR_LAUNCH_RETRY_TIMEOUT_MS) { + killTcpPortListener(port, label); + await waitForTcpPortClosed(port, '127.0.0.1', timeoutMs); +} + +function forceStopAndroidTestingApps(label) { + const adb = resolveAdbPath(); + const serial = resolveAndroidSerial(); + const packages = ['com.invertase.testing', 'com.invertase.testing.test']; + + for (const appId of packages) { + try { + console.log(`[rnfb-e2e] ${label}: force-stopping ${appId} serial=${serial}`); + execSync(`${adb} -s ${serial} shell am force-stop ${appId}`, { + stdio: 'inherit', + timeout: 15000, + }); + } catch (err) { + console.warn(`[rnfb-e2e] ${label}: force-stop ${appId} failed: ${err?.message || err}`); + } + } +} + +async function waitForAndroidInstrumentationStopped(label, timeoutMs = 30000) { + const serial = resolveAndroidSerial(); + const deadline = Date.now() + timeoutMs; + + while (Date.now() < deadline) { + try { + const pid = adbShell(serial, 'pidof com.invertase.testing.test', 5000); + if (!pid) { + console.log(`[rnfb-e2e] ${label}: instrumentation pid clear`); + return; + } + console.log(`[rnfb-e2e] ${label}: waiting for instrumentation pid=${pid}`); + } catch (_) { + console.log(`[rnfb-e2e] ${label}: instrumentation pid clear`); + return; + } + await sleep(1000); + } + + throw new Error(`[rnfb-e2e] ${label}: instrumentation pid still present after ${timeoutMs}ms`); +} + +function clearStaleMacOsTestingForSharedJetPort(label) { + if (process.platform !== 'darwin') { + return; + } + + console.log( + `[rnfb-e2e] ${label}: killing stale macOS io.invertase.testing for shared :${JET_REMOTE_PORT}`, + ); + try { + execSync('killall "io.invertase.testing"', { stdio: 'inherit', timeout: 5000 }); + } catch (_) { + // not running — expected + } + + try { + execSync("pkill -f 'tests:macos:test-cover|jet --target=macos' 2>/dev/null || true", { + stdio: 'inherit', + timeout: 5000, + }); + } catch (_) { + // no stray macOS jet — expected + } +} + +async function ensureAndroidJetHostClear(label = 'android-jet-host-clear') { + console.log(`[rnfb-e2e] ${label}: clearing Android apps and Jet port before spawn`); + clearStaleMacOsTestingForSharedJetPort(label); + forceStopAndroidTestingApps(label); + await waitForAndroidInstrumentationStopped(label); + await ensureTcpPortClosed(JET_REMOTE_PORT, label); + console.log(`[rnfb-e2e] ${label}: host clear`); +} + +function coldBootAndroidEmulator() { const adb = resolveAdbPath(); const serial = resolveAndroidSerial(); - console.warn(`[rnfb-e2e] Rebooting Android emulator serial=${serial} via adb reboot`); + const port = resolveAndroidEmulatorPort(serial); + const coldBootSerial = `emulator-${port}`; + const emulatorPath = resolveEmulatorPath(); + const extraBootArgs = ANDROID_EMULATOR_COLD_BOOT_ARGS.split(/\s+/).filter(Boolean); + + console.warn( + `[rnfb-e2e] Cold booting Android emulator serial=${serial} avd=${ANDROID_AVD_NAME} ` + + `(kill + relaunch with ${extraBootArgs.join(' ')})`, + ); + + try { + execSync(`${adb} -s ${serial} emu kill`, { stdio: 'inherit', timeout: 60000 }); + } catch (err) { + console.warn(`[rnfb-e2e] emu kill failed (continuing): ${err?.message || err}`); + } - execSync(`${adb} -s ${serial} reboot`, { stdio: 'inherit' }); - execSync(`${adb} -s ${serial} wait-for-device`, { + try { + execSync(`pkill -f "qemu-system.*@${ANDROID_AVD_NAME}"`, { stdio: 'ignore', timeout: 5000 }); + } catch (_) { + // No matching emulator process. + } + + const emulatorArgs = [ + '-verbose', + '-no-audio', + '-no-boot-anim', + '-read-only', + '-port', + port, + ...extraBootArgs, + `@${ANDROID_AVD_NAME}`, + ]; + + const child = spawn(emulatorPath, emulatorArgs, { + detached: true, + stdio: 'ignore', + }); + child.unref(); + + execSync(`${adb} -s ${coldBootSerial} wait-for-device`, { stdio: 'inherit', timeout: REBOOT_ANDROID_EMULATOR_TIMEOUT_MS, }); @@ -290,6 +495,17 @@ async function waitForAndroidEmulatorReady() { while (Date.now() < deadline) { try { + const deviceState = adbDeviceState(serial); + if (deviceState === 'offline') { + stableLoadPolls = 0; + console.warn( + `[rnfb-e2e] android-ready probe serial=${serial} state=offline (Quick Boot gray screen?) — ` + + 'kill emulator and rerun; Detox should cold boot with -no-snapshot-load', + ); + await sleep(ANDROID_READY_POLL_MS); + continue; + } + const bootCompleted = adbShell(serial, 'getprop sys.boot_completed'); const bootDev = adbShell(serial, 'getprop dev.bootcomplete'); const provisioned = adbShell(serial, 'settings get global device_provisioned'); @@ -333,6 +549,12 @@ async function waitForAndroidEmulatorReady() { } } + if (!isCI()) { + console.log('[rnfb-e2e] android-ready: skipping settle/load (not CI)'); + console.log(`[rnfb-e2e] Android emulator ready serial=${serial}`); + return; + } + if (!bootSettleDone) { console.log( `[rnfb-e2e] android-ready boot complete; settling ${ANDROID_BOOT_SETTLE_MS}ms before load polling`, @@ -379,25 +601,12 @@ async function drainJetAttempt(platform) { console.warn('[rnfb-e2e] Draining Jet attempt before outer retry...'); if (platform === 'android') { - const adb = resolveAdbPath(); - const serial = resolveAndroidSerial(); try { await device.terminateApp(); } catch (_) { // Detox may already be disconnected. } - try { - execSync(`${adb} -s ${serial} shell am force-stop com.invertase.testing`, { - stdio: 'inherit', - timeout: 15000, - }); - execSync(`${adb} -s ${serial} shell am force-stop com.invertase.testing.test`, { - stdio: 'inherit', - timeout: 15000, - }); - } catch (err) { - console.warn(`[rnfb-e2e] force-stop during drain: ${err?.message || err}`); - } + forceStopAndroidTestingApps('drain'); } else { try { await device.terminateApp(); @@ -425,25 +634,10 @@ async function drainJetAttempt(platform) { } } - await waitForTcpPortClosed(JET_REMOTE_PORT); - if (platform === 'android') { - const adb = resolveAdbPath(); - const serial = resolveAndroidSerial(); - - const instrumentationDeadline = Date.now() + 30000; - while (Date.now() < instrumentationDeadline) { - try { - const pid = adbShell(serial, 'pidof com.invertase.testing.test', 5000); - if (!pid) { - break; - } - console.log(`[rnfb-e2e] drain waiting for instrumentation pid=${pid}`); - } catch (_) { - break; - } - await sleep(1000); - } + await ensureAndroidJetHostClear('drain'); + } else { + await waitForTcpPortClosed(JET_REMOTE_PORT); } console.log('[rnfb-e2e] Jet attempt drain complete'); @@ -840,7 +1034,7 @@ function createJetSession(jetArgs, testsDir) { }; } -function runJetE2eAttempt(attempt) { +async function runJetE2eAttempt(attempt) { cachedUsesLiveMetro = undefined; cacheUsesLiveMetro(); @@ -851,6 +1045,10 @@ function runJetE2eAttempt(attempt) { ? ['jet', `--target=${platform}`] : ['jet', `--target=${platform}`, '--coverage']; + if (platform === 'android') { + await ensureAndroidJetHostClear(`jet-attempt-${attempt}`); + } + const jetSession = createJetSession(jetArgs, testsDir); const orchestrate = async () => { @@ -957,7 +1155,7 @@ describe('Jet Tests', function () { if (platform === 'ios' && process.platform === 'darwin') { await rebootIosSimulator(testsDir); } else if (platform === 'android') { - rebootAndroidEmulator(); + coldBootAndroidEmulator(); await waitForAndroidEmulatorReady(); } else { try { diff --git a/tests/globals.js b/tests/globals.js index 40501c2520..6f43122b79 100644 --- a/tests/globals.js +++ b/tests/globals.js @@ -46,7 +46,14 @@ import shouldMatchers from 'should'; // [RNFB<--Event][📣] storage_event <- {...} // [RNFB<-Native][🟢] RNFBStorageModule.putString <- {...} // [TEST->Finish][✅] uploads a base64url string -globalThis.RNFBDebug = false; +let harnessOverrides = {}; +try { + harnessOverrides = require('./harness.overrides.js'); +} catch (e) { + // Optional local overrides — see harness.overrides.example.js +} + +globalThis.RNFBDebug = harnessOverrides.RNFBDebug ?? false; // Needed for Platform.Other session storage import AsyncStorage from '@react-native-async-storage/async-storage'; @@ -357,7 +364,8 @@ Object.defineProperty(global, 'NativeModules', { {}, { get: (target, moduleName) => { - if (moduleName.startsWith('RNF')) { + // NewArch-AD-18 E4: e2e harness routes turbo/legacy names through the unified resolver. + if (moduleName.startsWith('RNF') || moduleName.startsWith('NativeRNFBTurbo')) { return getReactNativeModule(moduleName); } return target[moduleName] || (() => {}); diff --git a/tests/harness.overrides.example.js b/tests/harness.overrides.example.js new file mode 100644 index 0000000000..11c76a351c --- /dev/null +++ b/tests/harness.overrides.example.js @@ -0,0 +1,24 @@ +/* + * Local e2e harness overrides (copy to harness.overrides.js — gitignored). + * + * Copy this file: + * cp tests/harness.overrides.example.js tests/harness.overrides.js + * + * Then edit harness.overrides.js for your local run. Never commit harness.overrides.js. + * + * Shape: + * { + * RNFBDebug?: boolean, // true = verbose RNFB native/event logging; disables test retries + * modules?: string[], // filter platformSupportedModules to this list (both Platform blocks) + * } + * + * Example — app package only, debug on: + * module.exports = { + * RNFBDebug: true, + * modules: ['app'], + * }; + * + * Omit a field (or export {}) to keep committed defaults for that field. + */ + +module.exports = {}; diff --git a/tests/harness.overrides.stub.js b/tests/harness.overrides.stub.js new file mode 100644 index 0000000000..dc40c38c63 --- /dev/null +++ b/tests/harness.overrides.stub.js @@ -0,0 +1,15 @@ +/* + * Committed empty stub for the optional, gitignored tests/harness.overrides.js. + * + * tests/metro.config.js resolves `./harness.overrides.js` to this file whenever + * the local override does not exist. Without a real resolution target, Metro + * treats the optional (try/catch) require as an unresolved dependency and OMITS + * it from the module's dependency-id array, shifting every later dependency and + * dropping the last one — surfacing at runtime as + * `Requiring unknown module "undefined"`. Keeping this stub guarantees the + * dependency always resolves, so the dependency map stays intact. + * + * Do not add overrides here. Copy tests/harness.overrides.example.js to + * tests/harness.overrides.js for local customization instead. + */ +module.exports = {}; diff --git a/tests/ios/Podfile.lock b/tests/ios/Podfile.lock index 5b1c92bf38..613d83ba80 100644 --- a/tests/ios/Podfile.lock +++ b/tests/ios/Podfile.lock @@ -204,7 +204,7 @@ PODS: - GTMSessionFetcher/Core (< 6.0, >= 3.4) - fmt (12.1.0) - glog (0.3.5) - - GoogleAdsOnDeviceConversion (3.6.0): + - GoogleAdsOnDeviceConversion (3.6.1): - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Logger (~> 8.1) - GoogleUtilities/Network (~> 8.1) @@ -225,31 +225,31 @@ PODS: - GoogleDataTransport (10.1.0): - nanopb (~> 3.30910.0) - PromisesObjC (~> 2.4) - - GoogleUtilities/AppDelegateSwizzler (8.1.1): + - GoogleUtilities/AppDelegateSwizzler (8.1.2): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.1): + - GoogleUtilities/Environment (8.1.2): - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.1): + - GoogleUtilities/Logger (8.1.2): - GoogleUtilities/Environment - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.1.1): + - GoogleUtilities/MethodSwizzler (8.1.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.1): + - GoogleUtilities/Network (8.1.2): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Privacy - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.1)": + - "GoogleUtilities/NSData+zlib (8.1.2)": - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.1) - - GoogleUtilities/Reachability (8.1.1): + - GoogleUtilities/Privacy (8.1.2) + - GoogleUtilities/Reachability (8.1.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.1.1): + - GoogleUtilities/UserDefaults (8.1.2): - GoogleUtilities/Logger - GoogleUtilities/Privacy - GTMSessionFetcher/Core (5.3.0) @@ -1806,7 +1806,7 @@ PODS: - Yoga - RNDeviceInfo (15.0.2): - React-Core - - RNFBAnalytics (24.1.1): + - RNFBAnalytics (25.1.0): - DoubleConversion - FirebaseAnalytics/Core (= 12.15.0) - FirebaseAnalytics/IdentitySupport (= 12.15.0) @@ -1831,7 +1831,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBApp (24.1.1): + - RNFBApp (25.1.0): - DoubleConversion - Firebase/CoreOnly (= 12.15.0) - glog @@ -1853,7 +1853,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNFBAppCheck (24.1.1): + - RNFBAppCheck (25.1.0): - DoubleConversion - Firebase/AppCheck (= 12.15.0) - glog @@ -1876,7 +1876,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBAppDistribution (24.1.1): + - RNFBAppDistribution (25.1.0): - DoubleConversion - Firebase/AppDistribution (= 12.15.0) - glog @@ -1899,7 +1899,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBAuth (24.1.1): + - RNFBAuth (25.1.0): - DoubleConversion - Firebase/Auth (= 12.15.0) - glog @@ -1922,7 +1922,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBCrashlytics (24.1.1): + - RNFBCrashlytics (25.1.0): - DoubleConversion - Firebase/Crashlytics (= 12.15.0) - FirebaseCoreExtension @@ -1946,7 +1946,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBDatabase (24.1.1): + - RNFBDatabase (25.1.0): - DoubleConversion - Firebase/Database (= 12.15.0) - glog @@ -1969,7 +1969,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBFirestore (24.1.1): + - RNFBFirestore (25.1.0): - DoubleConversion - Firebase/Firestore (= 12.15.0) - glog @@ -1992,7 +1992,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBFunctions (24.1.1): + - RNFBFunctions (25.1.0): - DoubleConversion - Firebase/Functions (= 12.15.0) - glog @@ -2015,7 +2015,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBInAppMessaging (24.1.1): + - RNFBInAppMessaging (25.1.0): - DoubleConversion - Firebase/InAppMessaging (= 12.15.0) - glog @@ -2038,7 +2038,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBInstallations (24.1.1): + - RNFBInstallations (25.1.0): - DoubleConversion - Firebase/Installations (= 12.15.0) - glog @@ -2061,7 +2061,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBMessaging (24.1.1): + - RNFBMessaging (25.1.0): - DoubleConversion - Firebase/Messaging (= 12.15.0) - FirebaseCoreExtension @@ -2085,7 +2085,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBML (24.1.1): + - RNFBML (25.1.0): - DoubleConversion - glog - hermes-engine @@ -2107,7 +2107,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBPerf (24.1.1): + - RNFBPerf (25.1.0): - DoubleConversion - Firebase/Performance (= 12.15.0) - glog @@ -2130,7 +2130,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBRemoteConfig (24.1.1): + - RNFBRemoteConfig (25.1.0): - DoubleConversion - Firebase/RemoteConfig (= 12.15.0) - glog @@ -2153,7 +2153,7 @@ PODS: - ReactCommon/turbomodule/core - RNFBApp - Yoga - - RNFBStorage (24.1.1): + - RNFBStorage (25.1.0): - DoubleConversion - Firebase/Storage (= 12.15.0) - glog @@ -2531,10 +2531,10 @@ SPEC CHECKSUMS: FirebaseStorage: 949f0a5a8d8a77fff68ec8733057dc76a0e08179 fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac glog: eb93e2f488219332457c3c4eafd2738ddc7e80b8 - GoogleAdsOnDeviceConversion: 80ce443fa1b4b5750913d53a04ecda644ff57744 + GoogleAdsOnDeviceConversion: e3b71da24ff4cf01cf520756ac1c2b93c07b86ff GoogleAppMeasurement: a6d37949071d456e9147dac6789c4342e0e7a8c5 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleUtilities: 4f2618a4a1e762a1ee134a1e2323bba9843e06da + GoogleUtilities: 766ace00c6b10d8148408f329d10c4f051931850 GTMSessionFetcher: 127211aeec0b1e904fc49f4f6f895dcc535b0ecf hermes-engine: b5c9cfbe6415f1b0b24759f2942c8f33e9af6347 leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19 @@ -2602,22 +2602,22 @@ SPEC CHECKSUMS: RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba RNCAsyncStorage: 6a8127b6987dc9fbce778669b252b14c8355c7ce RNDeviceInfo: 4c852998208b60dc192ae3529e5867817719ad1e - RNFBAnalytics: 4edf25551bb71542a91f75fdb82a189841ab609e - RNFBApp: fa42bb744282de8757e622921993a48aca624898 - RNFBAppCheck: ab603f89628885a3fb26a582c19c936ff5c822c3 - RNFBAppDistribution: 07259ad8ca1eaf36f95c9cab270e83ef5efb7c49 - RNFBAuth: aae485c49f699c5f6a4281df5e39070b93a7d953 - RNFBCrashlytics: 62ab87002f0bdcfbc383b99a1f439d8a2821c4f1 - RNFBDatabase: 95529c19fb9d037a806824c9a72edfe869e8a3a0 - RNFBFirestore: b16837b10adc055cb4fb45ecf49539efbc134c23 - RNFBFunctions: 355da8e22e8c09d6a75b2e189d72f55f4744c382 - RNFBInAppMessaging: daa6c1c445576ba1ab2baaac21d3b637a3b41ed5 - RNFBInstallations: 645e6eb7ebe3ac676e576458f8cbc38b21e1e1a7 - RNFBMessaging: f0c63abac187249c6a5b6613c6085a0b6742e196 - RNFBML: 2aa57d48341bfab095e836b1cebebd3e9bf6081a - RNFBPerf: 2872ddee03fcba3f81956b5e987db398034f0078 - RNFBRemoteConfig: 3f057d6d8df516a25d6dbeb0b2e80a54ada2176f - RNFBStorage: 780713864cc9e678f61974f6f2024793294cbc4f + RNFBAnalytics: bd42ed19dd9145eece55dfaf254349cb7ce207da + RNFBApp: 893629fc75425937059b0f64e58ec9d5a066aefc + RNFBAppCheck: 8ba8648a565a2c9c5f057906323475bba79c1a6a + RNFBAppDistribution: 5fa4b64e4e62ffca3af9851a293b64ac801d11c1 + RNFBAuth: e24099af4c7db560ecdc07817f8fafaecbf2fa92 + RNFBCrashlytics: 14eea95d1f7669287597f1e27602abecc5699a91 + RNFBDatabase: a74a6e18a24749fcdfdfd9234e494da996a22511 + RNFBFirestore: 7b2480c59acae62bb9607cdf28c1e0e157641288 + RNFBFunctions: d0ffe52e4f6138c3e42e69937b0592838e6f2cc9 + RNFBInAppMessaging: f2d87f6f01b538581e8db0454ef1028203eae1b3 + RNFBInstallations: 9e3d5aa14c2397002f97a0215f04a43841fe5b33 + RNFBMessaging: 6b26d8df1f293b6225a94f2b06c3c5f4d7f64470 + RNFBML: 06b4f3115770b0bd748ff54e0bd4b0a1226f97d6 + RNFBPerf: 4f8174e09a34ef33e674ed069fb93a4e5d34a336 + RNFBRemoteConfig: 526b31077c716ee527580748a5943c89129118a8 + RNFBStorage: 3d1a1552a5806da31262e8b4c079f936275e5f90 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: 3bb1ee33b5133befbd33872601fa46efdd48e841 diff --git a/tests/ios/testing.xcodeproj/project.pbxproj b/tests/ios/testing.xcodeproj/project.pbxproj index f992435edd..c3c036eaaa 100644 --- a/tests/ios/testing.xcodeproj/project.pbxproj +++ b/tests/ios/testing.xcodeproj/project.pbxproj @@ -178,7 +178,6 @@ CC0F353E1D461097008BB94F /* Embed Frameworks */, 7D57265F10EEF7CD92D7973F /* Copy Detox Framework */, DAB1A184ED1FB4A446CF5BBC /* [CP-User] [RNFB] Core Configuration */, - 8512258DB46D3EF726067919 /* [CP-User] [RNFB] Crashlytics Configuration */, 2603193C849419258196E68A /* [CP] Copy Pods Resources */, 64F0A53627116CEBA061920E /* [CP] Embed Pods Frameworks */, ); @@ -346,20 +345,6 @@ shellPath = /bin/bash; shellScript = "if [ -n \"$DEPLOY_DETOX_FRAMEWORK\" ]; then\nmkdir -p \"${BUILT_PRODUCTS_DIR}\"/\"${FRAMEWORKS_FOLDER_PATH}\"\ncp -r \"${PROJECT_DIR}\"/../node_modules/detox/Detox.framework \"${BUILT_PRODUCTS_DIR}\"/\"${FRAMEWORKS_FOLDER_PATH}\"\nfi\n"; }; - 8512258DB46D3EF726067919 /* [CP-User] [RNFB] Crashlytics Configuration */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", - "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", - ); - name = "[CP-User] [RNFB] Crashlytics Configuration"; - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n"; - }; DAB1A184ED1FB4A446CF5BBC /* [CP-User] [RNFB] Core Configuration */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/tests/metro.config.js b/tests/metro.config.js index 7cb9b08329..df15756ec5 100644 --- a/tests/metro.config.js +++ b/tests/metro.config.js @@ -17,8 +17,8 @@ const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); -const { resolve, join } = require('path'); -const { readdirSync, statSync } = require('fs'); +const { resolve, join, dirname } = require('path'); +const { readdirSync, statSync, existsSync } = require('fs'); const exclusionList = require('metro-config/src/defaults/exclusionList'); @@ -62,6 +62,21 @@ const config = { }, ), resolveRequest(context, moduleName, platform) { + // The optional local harness overrides file (tests/harness.overrides.js) is + // gitignored and usually absent. Because it is required inside a try/catch, + // Metro treats it as an optional dependency and, when it cannot resolve, + // OMITS it from the requiring module's dependency-id array — shifting every + // later dependency and dropping the last one, which surfaces at runtime as + // `Requiring unknown module "undefined"`. Resolve to a committed empty stub + // when the local file does not exist so the dependency map stays intact. + if (moduleName === './harness.overrides.js') { + const originDir = context.originModulePath + ? dirname(context.originModulePath) + : __dirname; + if (!existsSync(resolve(originDir, 'harness.overrides.js'))) { + return { type: 'sourceFile', filePath: resolve(__dirname, 'harness.overrides.stub.js') }; + } + } if (moduleName === '@react-native-firebase/firestore/pipelines') { const filePath = join(rootDir, 'packages', 'firestore', 'lib', 'pipelines', 'index.ts'); return { type: 'sourceFile', filePath }; diff --git a/yarn.lock b/yarn.lock index c90e2f87d7..556ffb4789 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4290,7 +4290,7 @@ __metadata: languageName: node linkType: hard -"@jest/create-cache-key-function@npm:^29.6.3, @jest/create-cache-key-function@npm:^29.7.0": +"@jest/create-cache-key-function@npm:^29.6.3": version: 29.7.0 resolution: "@jest/create-cache-key-function@npm:29.7.0" dependencies: @@ -5596,18 +5596,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-clean@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-clean@npm:20.0.2" - dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - fast-glob: "npm:^3.3.2" - checksum: 10/d839318d979a83c0574b81f2eb765726431e2b3b14aee14621a72c2af527730072af58ab8a9c457e12e137c81ae41329f83f5f56a3d36b08efbed5d7fe6718bf - languageName: node - linkType: hard - "@react-native-community/cli-config-android@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-config-android@npm:15.1.3" @@ -5620,18 +5608,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-config-android@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-config-android@npm:20.0.2" - dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" - fast-glob: "npm:^3.3.2" - fast-xml-parser: "npm:^4.4.1" - checksum: 10/ccbe4998887d722332c6734dbee38d7ea99362000f7afd88af4f7301e87928d669287e78ab112e618f8785e10c483064d1c00ce34368b564152d291eee32cb43 - languageName: node - linkType: hard - "@react-native-community/cli-config-apple@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-config-apple@npm:15.1.3" @@ -5644,18 +5620,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-config-apple@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-config-apple@npm:20.0.2" - dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - fast-glob: "npm:^3.3.2" - checksum: 10/5f888674b70d8d52be2ea2f1e513afdf98a43de30d6db224514c7a3a0466ad99a1c8ad4080558b6ac172c92eaca2d1a20691afd0744fbcb8fafedf8e6cd73cf1 - languageName: node - linkType: hard - "@react-native-community/cli-config@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-config@npm:15.1.3" @@ -5670,20 +5634,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-config@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-config@npm:20.0.2" - dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" - cosmiconfig: "npm:^9.0.0" - deepmerge: "npm:^4.3.0" - fast-glob: "npm:^3.3.2" - joi: "npm:^17.2.1" - checksum: 10/05658bfeecce40f14d4c91d804b4748d0b514e73a572ff58a3420c41e4cbebe63fa6fb6ecf8f9622227e33891313e3494c7d26c469335f40e234e2470a7b6f6b - languageName: node - linkType: hard - "@react-native-community/cli-debugger-ui@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-debugger-ui@npm:15.1.3" @@ -5717,29 +5667,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-doctor@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-doctor@npm:20.0.2" - dependencies: - "@react-native-community/cli-config": "npm:20.0.2" - "@react-native-community/cli-platform-android": "npm:20.0.2" - "@react-native-community/cli-platform-apple": "npm:20.0.2" - "@react-native-community/cli-platform-ios": "npm:20.0.2" - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" - command-exists: "npm:^1.2.8" - deepmerge: "npm:^4.3.0" - envinfo: "npm:^7.13.0" - execa: "npm:^5.0.0" - node-stream-zip: "npm:^1.9.1" - ora: "npm:^5.4.1" - semver: "npm:^7.5.2" - wcwidth: "npm:^1.0.1" - yaml: "npm:^2.2.1" - checksum: 10/11a4a9ff5da4d471920418e8b4a598f997036d1d8e5d25f5957886b26727a5526789996430575dc422a5251f225df786a40ab42ec9c2c11f112ec980d6e1cc02 - languageName: node - linkType: hard - "@react-native-community/cli-platform-android@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-platform-android@npm:15.1.3" @@ -5753,19 +5680,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-platform-android@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-platform-android@npm:20.0.2" - dependencies: - "@react-native-community/cli-config-android": "npm:20.0.2" - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - logkitty: "npm:^0.7.1" - checksum: 10/465ef6988d335740cb998c51d29f837344e063bd04cf07b3f959e44df7823b2902ee6a25bf036e82581b1d6e1cfacbd8bcf87690f4dc0c6fb4b21f15eb64951e - languageName: node - linkType: hard - "@react-native-community/cli-platform-apple@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-platform-apple@npm:15.1.3" @@ -5779,19 +5693,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-platform-apple@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-platform-apple@npm:20.0.2" - dependencies: - "@react-native-community/cli-config-apple": "npm:20.0.2" - "@react-native-community/cli-tools": "npm:20.0.2" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - fast-xml-parser: "npm:^4.4.1" - checksum: 10/f316b4f54f6d323319c0df9b6bf3cd7a5aa3b81d170e18755b9dc80297b1989f5c275b779f1044f063392126ec510e172283d06ef9ab8700950d7b36e1cb4d72 - languageName: node - linkType: hard - "@react-native-community/cli-platform-ios@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-platform-ios@npm:15.1.3" @@ -5801,15 +5702,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-platform-ios@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-platform-ios@npm:20.0.2" - dependencies: - "@react-native-community/cli-platform-apple": "npm:20.0.2" - checksum: 10/a0290feadc079981429143e9829a3030a768593927e0c2bcf546f52c8c22a53a49ea5f9ae9484f7eb390e01a46d7b0d7d9dc3374268d07237c808e6e7e3c50b3 - languageName: node - linkType: hard - "@react-native-community/cli-server-api@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-server-api@npm:15.1.3" @@ -5827,24 +5719,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-server-api@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-server-api@npm:20.0.2" - dependencies: - "@react-native-community/cli-tools": "npm:20.0.2" - body-parser: "npm:^1.20.3" - compression: "npm:^1.7.1" - connect: "npm:^3.6.5" - errorhandler: "npm:^1.5.1" - nocache: "npm:^3.0.1" - open: "npm:^6.2.0" - pretty-format: "npm:^29.7.0" - serve-static: "npm:^1.13.1" - ws: "npm:^6.2.3" - checksum: 10/7771524a0016f200a15c9c5df430b18ada846ef4d426be9d6540a343e69d042b359069aeef156bec7b267bcf43a50f97b8ec7f1514dad55d84c4e16fbd4e176b - languageName: node - linkType: hard - "@react-native-community/cli-tools@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-tools@npm:15.1.3" @@ -5864,24 +5738,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-tools@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-tools@npm:20.0.2" - dependencies: - "@vscode/sudo-prompt": "npm:^9.0.0" - appdirsjs: "npm:^1.2.4" - chalk: "npm:^4.1.2" - execa: "npm:^5.0.0" - find-up: "npm:^5.0.0" - launch-editor: "npm:^2.9.1" - mime: "npm:^2.4.1" - ora: "npm:^5.4.1" - prompts: "npm:^2.4.2" - semver: "npm:^7.5.2" - checksum: 10/8f1c752a6bffa4dc201446bd4d8a7162ae296e87e3a7f2d87201e79cc9ceadb9ed4daafde83b732d79f54f76c4294e8822fae483c9120c358bc422482d98c045 - languageName: node - linkType: hard - "@react-native-community/cli-types@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli-types@npm:15.1.3" @@ -5891,15 +5747,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli-types@npm:20.0.2": - version: 20.0.2 - resolution: "@react-native-community/cli-types@npm:20.0.2" - dependencies: - joi: "npm:^17.2.1" - checksum: 10/b4e708fe759ef995b99bdbe89f0e83a00cba680c01a119d317f445528e8321d89a842e0641ad2a08f4c3793ddb9e02b0045d2e82da66d279cb21ee42961ba9ce - languageName: node - linkType: hard - "@react-native-community/cli@npm:15.1.3": version: 15.1.3 resolution: "@react-native-community/cli@npm:15.1.3" @@ -5926,31 +5773,6 @@ __metadata: languageName: node linkType: hard -"@react-native-community/cli@npm:latest": - version: 20.0.2 - resolution: "@react-native-community/cli@npm:20.0.2" - dependencies: - "@react-native-community/cli-clean": "npm:20.0.2" - "@react-native-community/cli-config": "npm:20.0.2" - "@react-native-community/cli-doctor": "npm:20.0.2" - "@react-native-community/cli-server-api": "npm:20.0.2" - "@react-native-community/cli-tools": "npm:20.0.2" - "@react-native-community/cli-types": "npm:20.0.2" - chalk: "npm:^4.1.2" - commander: "npm:^9.4.1" - deepmerge: "npm:^4.3.0" - execa: "npm:^5.0.0" - find-up: "npm:^5.0.0" - fs-extra: "npm:^8.1.0" - graceful-fs: "npm:^4.1.3" - prompts: "npm:^2.4.2" - semver: "npm:^7.5.2" - bin: - rnc-cli: build/bin.js - checksum: 10/8de75d8ab9c3ffce215e4dcff57832f22e8f8853a212dbd0c2b8e96cff6e6511593d7ed064aba920a8245147b4079a77ab4445461bab97a9e08bf84472a6e8e6 - languageName: node - linkType: hard - "@react-native-firebase/ai@npm:25.1.0, @react-native-firebase/ai@workspace:packages/ai": version: 0.0.0-use.local resolution: "@react-native-firebase/ai@workspace:packages/ai" @@ -6101,7 +5923,6 @@ __metadata: resolution: "@react-native-firebase/functions@workspace:packages/functions" dependencies: "@react-native-firebase/private-tests-firebase-functions": "npm:^0.0.1" - react-native: "npm:^0.80.1" react-native-builder-bob: "npm:^0.41.0" typescript: "npm:^6.0.3" peerDependencies: @@ -6255,20 +6076,6 @@ __metadata: languageName: node linkType: hard -"@react-native/assets-registry@npm:0.80.2": - version: 0.80.2 - resolution: "@react-native/assets-registry@npm:0.80.2" - checksum: 10/f52a83f3d4d3c6edd048d007df8c45609c05ce2d0e8f1d5aee5cc16fb7d80f9815b44c58c60111e1774c91310ed8ed1aaf7190b439c97a93063ae0a8075afe23 - languageName: node - linkType: hard - -"@react-native/assets-registry@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/assets-registry@npm:0.82.1" - checksum: 10/2c0880dd0923f6c876171783099c46daea5d2db1cffe4175b62f6988e50019c586b6ef477e41a2790529ca8ff351930b4f973b7ebfd1fb5593d155cd7f188acd - languageName: node - linkType: hard - "@react-native/babel-plugin-codegen@npm:0.78.3": version: 0.78.3 resolution: "@react-native/babel-plugin-codegen@npm:0.78.3" @@ -6416,55 +6223,6 @@ __metadata: languageName: node linkType: hard -"@react-native/codegen@npm:0.80.2": - version: 0.80.2 - resolution: "@react-native/codegen@npm:0.80.2" - dependencies: - glob: "npm:^7.1.1" - hermes-parser: "npm:0.28.1" - invariant: "npm:^2.2.4" - nullthrows: "npm:^1.1.1" - yargs: "npm:^17.6.2" - peerDependencies: - "@babel/core": "*" - checksum: 10/17645687b6c17f77b8f59a4c4ef1c6cb61907ddc7ac8768439748fd354026b8346cb198b04454223759ee8a665b2f3826307759f8c49e2d7d0ae25e22d3eabe0 - languageName: node - linkType: hard - -"@react-native/codegen@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/codegen@npm:0.82.1" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/parser": "npm:^7.25.3" - glob: "npm:^7.1.1" - hermes-parser: "npm:0.32.0" - invariant: "npm:^2.2.4" - nullthrows: "npm:^1.1.1" - yargs: "npm:^17.6.2" - peerDependencies: - "@babel/core": "*" - checksum: 10/6cf0e4b028a6ed49902e1ed2a7204cd2cbb3e86972e93ee1d67250e6b986eb108c90333f9308278de569a6439b095b14872a9039b9a96d3679c99b35823d58a2 - languageName: node - linkType: hard - -"@react-native/codegen@npm:0.83.6": - version: 0.83.6 - resolution: "@react-native/codegen@npm:0.83.6" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/parser": "npm:^7.25.3" - glob: "npm:^7.1.1" - hermes-parser: "npm:0.32.0" - invariant: "npm:^2.2.4" - nullthrows: "npm:^1.1.1" - yargs: "npm:^17.6.2" - peerDependencies: - "@babel/core": "*" - checksum: 10/5f819725e455953b387ae098ab05da0950f790ab5337f1131c779895f0de576c4b491f1017b7ce10c3530e55566859d398386e0e65baaa19089c5c5edb430e37 - languageName: node - linkType: hard - "@react-native/community-cli-plugin@npm:0.78.3": version: 0.78.3 resolution: "@react-native/community-cli-plugin@npm:0.78.3" @@ -6488,50 +6246,6 @@ __metadata: languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.80.2": - version: 0.80.2 - resolution: "@react-native/community-cli-plugin@npm:0.80.2" - dependencies: - "@react-native/dev-middleware": "npm:0.80.2" - chalk: "npm:^4.0.0" - debug: "npm:^4.4.0" - invariant: "npm:^2.2.4" - metro: "npm:^0.82.2" - metro-config: "npm:^0.82.2" - metro-core: "npm:^0.82.2" - semver: "npm:^7.1.3" - peerDependencies: - "@react-native-community/cli": "*" - peerDependenciesMeta: - "@react-native-community/cli": - optional: true - checksum: 10/0d79a4776c7e3f68171f2f629d158d4e55b60f38b610320412f89285afeef953087923b7b5cf8241dc4766806ab12a983f511d26cf41d1f8957fd983571ee1d5 - languageName: node - linkType: hard - -"@react-native/community-cli-plugin@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/community-cli-plugin@npm:0.82.1" - dependencies: - "@react-native/dev-middleware": "npm:0.82.1" - debug: "npm:^4.4.0" - invariant: "npm:^2.2.4" - metro: "npm:^0.83.1" - metro-config: "npm:^0.83.1" - metro-core: "npm:^0.83.1" - semver: "npm:^7.1.3" - peerDependencies: - "@react-native-community/cli": "*" - "@react-native/metro-config": "*" - peerDependenciesMeta: - "@react-native-community/cli": - optional: true - "@react-native/metro-config": - optional: true - checksum: 10/f794e77eb4d745ce307f8c6a2bbea1a0e33b4b890586bfdbdd8f57139a6545327618f761edd0a6844d78b1984c5dca2181a8c717db616ec325872038165a73cc - languageName: node - linkType: hard - "@react-native/debugger-frontend@npm:0.78.3": version: 0.78.3 resolution: "@react-native/debugger-frontend@npm:0.78.3" @@ -6539,20 +6253,6 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.80.2": - version: 0.80.2 - resolution: "@react-native/debugger-frontend@npm:0.80.2" - checksum: 10/5f75e3ab379c64c5c20397a2647197ba24c112a12fdd5202d956f31669ee78c9cc487f291524bd921f1d85f4843e0c47b2a1b946ebed1b071b43509e31c3cc56 - languageName: node - linkType: hard - -"@react-native/debugger-frontend@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/debugger-frontend@npm:0.82.1" - checksum: 10/8529451265cadb6418a5dd829bd08f0452d7da5a4698770dac9757bc2394a265a405a7c099ce628ad496e8668dd371a0bf30d7fd852383911f59ed927435d37b - languageName: node - linkType: hard - "@react-native/debugger-frontend@npm:0.83.6": version: 0.83.6 resolution: "@react-native/debugger-frontend@npm:0.83.6" @@ -6560,16 +6260,6 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-shell@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/debugger-shell@npm:0.82.1" - dependencies: - cross-spawn: "npm:^7.0.6" - fb-dotslash: "npm:0.5.8" - checksum: 10/4b84507dda0676e1a81b0016a25b4f0c54bb1008955e08c32cc7f40b8eec8d72f4a3941b957724db0c2e2bca3759498dec2e620d4b33e2b6488453b8a7b5cb59 - languageName: node - linkType: hard - "@react-native/debugger-shell@npm:0.83.6": version: 0.83.6 resolution: "@react-native/debugger-shell@npm:0.83.6" @@ -6600,45 +6290,6 @@ __metadata: languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.80.2": - version: 0.80.2 - resolution: "@react-native/dev-middleware@npm:0.80.2" - dependencies: - "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.80.2" - chrome-launcher: "npm:^0.15.2" - chromium-edge-launcher: "npm:^0.2.0" - connect: "npm:^3.6.5" - debug: "npm:^4.4.0" - invariant: "npm:^2.2.4" - nullthrows: "npm:^1.1.1" - open: "npm:^7.0.3" - serve-static: "npm:^1.16.2" - ws: "npm:^6.2.3" - checksum: 10/5dbf04f915483743ec9ba54b422d6edfef05c61e30a13ca9c8db179551e287874a0ebdbf6d4ca498b3c4f3b002f45f8a65679bed96154244518e1b64ce523e42 - languageName: node - linkType: hard - -"@react-native/dev-middleware@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/dev-middleware@npm:0.82.1" - dependencies: - "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.82.1" - "@react-native/debugger-shell": "npm:0.82.1" - chrome-launcher: "npm:^0.15.2" - chromium-edge-launcher: "npm:^0.2.0" - connect: "npm:^3.6.5" - debug: "npm:^4.4.0" - invariant: "npm:^2.2.4" - nullthrows: "npm:^1.1.1" - open: "npm:^7.0.3" - serve-static: "npm:^1.16.2" - ws: "npm:^6.2.3" - checksum: 10/124ac46440669c92d19457dd29319f00e1a9cd60e21942ae734b12a57a0efb76b02f291710af6cf06090674728f840485e05878c0ac4aabfd7088c0b624edf58 - languageName: node - linkType: hard - "@react-native/dev-middleware@npm:0.83.6": version: 0.83.6 resolution: "@react-native/dev-middleware@npm:0.83.6" @@ -6666,20 +6317,6 @@ __metadata: languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.80.2": - version: 0.80.2 - resolution: "@react-native/gradle-plugin@npm:0.80.2" - checksum: 10/9135efe45cc69e51bd0699c11a247d0ce17bb3e80fe0b8818da44cea5cf9bbf5946a59ac2960992b77d0b16edbc9c45755582c378711241fb6c804d17871cd96 - languageName: node - linkType: hard - -"@react-native/gradle-plugin@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/gradle-plugin@npm:0.82.1" - checksum: 10/73d41bf3a3fb98edf407f520e12eb6c300bb6048b7e2637d61f21f1f36735e1f0b6e47ab5fa138bac02df2de2308911b01c625b82884d3323ef9ce1199670177 - languageName: node - linkType: hard - "@react-native/js-polyfills@npm:0.78.3": version: 0.78.3 resolution: "@react-native/js-polyfills@npm:0.78.3" @@ -6687,20 +6324,6 @@ __metadata: languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.80.2": - version: 0.80.2 - resolution: "@react-native/js-polyfills@npm:0.80.2" - checksum: 10/444e195b2d3a374ed64d8eb054d09d3547a84678894c5f91209c98fab3a7fb9f21bc11b9c739761af0e06efbbc53d0bf5ca9b0311b3da8530748cba2038d8765 - languageName: node - linkType: hard - -"@react-native/js-polyfills@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/js-polyfills@npm:0.82.1" - checksum: 10/66b6640c320dd91330ce125b569217b90b845ce81d39d539f1bd663600bdab8c6a6fe7731abff54ac4426bd685f6d24e950fcf499913f4d54338f6e270e14b0a - languageName: node - linkType: hard - "@react-native/metro-babel-transformer@npm:0.78.3": version: 0.78.3 resolution: "@react-native/metro-babel-transformer@npm:0.78.3" @@ -6734,20 +6357,6 @@ __metadata: languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.80.2": - version: 0.80.2 - resolution: "@react-native/normalize-colors@npm:0.80.2" - checksum: 10/38ca3839a116026cd8a9bee0c4473aa6c789ca55819c5e423403f56678cedcd9633b1dd2b8c4da2947afd569f047fbffd75861ab88a61cf995725e8810ff4937 - languageName: node - linkType: hard - -"@react-native/normalize-colors@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/normalize-colors@npm:0.82.1" - checksum: 10/62f9ae165aeed20ad61c6a45472be8314a1e158fa5e6c6645f1332f5d72692e35cebba6b86fd3890ab4f29a7a71be731c46e208adea4965858612b1118645343 - languageName: node - linkType: hard - "@react-native/normalize-colors@npm:0.83.6": version: 0.83.6 resolution: "@react-native/normalize-colors@npm:0.83.6" @@ -6772,40 +6381,6 @@ __metadata: languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.80.2": - version: 0.80.2 - resolution: "@react-native/virtualized-lists@npm:0.80.2" - dependencies: - invariant: "npm:^2.2.4" - nullthrows: "npm:^1.1.1" - peerDependencies: - "@types/react": ^19.0.0 - react: "*" - react-native: "*" - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10/8247bbdd87b0b1745207b484dded636b2d8f1f751042a846ac483dd0847ad04d0e4ccc66986d2c030a156bc719774b574640b2a31d05b2a2d83c1440b22456c6 - languageName: node - linkType: hard - -"@react-native/virtualized-lists@npm:0.82.1": - version: 0.82.1 - resolution: "@react-native/virtualized-lists@npm:0.82.1" - dependencies: - invariant: "npm:^2.2.4" - nullthrows: "npm:^1.1.1" - peerDependencies: - "@types/react": ^19.1.1 - react: "*" - react-native: "*" - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10/f613f7d1fea6382d70b6fbef66b37f2480d9a41b8d75f76b613a61e6af29f8aab10583914be2ad550722e32864978fc9150624d6b17f6e1823ca070d73d34936 - languageName: node - linkType: hard - "@shikijs/engine-oniguruma@npm:^3.23.0": version: 3.23.0 resolution: "@shikijs/engine-oniguruma@npm:3.23.0" @@ -7774,13 +7349,6 @@ __metadata: languageName: node linkType: hard -"@vscode/sudo-prompt@npm:^9.0.0": - version: 9.3.1 - resolution: "@vscode/sudo-prompt@npm:9.3.1" - checksum: 10/233edb992ae5dda69b9c63101f85a7996ff7034cb9b0ea976f3ab06483511a35162a650d8e081ded5f07aa9b2f2bac93e45420d956cf1b1d8a76ac385d4a9581 - languageName: node - linkType: hard - "@wix-pilot/core@npm:^3.4.2": version: 3.4.2 resolution: "@wix-pilot/core@npm:3.4.2" @@ -8721,15 +8289,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-syntax-hermes-parser@npm:0.28.1, babel-plugin-syntax-hermes-parser@npm:^0.28.0": - version: 0.28.1 - resolution: "babel-plugin-syntax-hermes-parser@npm:0.28.1" - dependencies: - hermes-parser: "npm:0.28.1" - checksum: 10/2cbc921e663463480ead9ccc8bb229a5196032367ba2b5ccb18a44faa3afa84b4dc493297749983b9a837a3d76b0b123664aecc06f9122618c3246f03e076a9d - languageName: node - linkType: hard - "babel-plugin-syntax-hermes-parser@npm:0.32.0": version: 0.32.0 resolution: "babel-plugin-syntax-hermes-parser@npm:0.32.0" @@ -8739,6 +8298,15 @@ __metadata: languageName: node linkType: hard +"babel-plugin-syntax-hermes-parser@npm:^0.28.0": + version: 0.28.1 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.28.1" + dependencies: + hermes-parser: "npm:0.28.1" + checksum: 10/2cbc921e663463480ead9ccc8bb229a5196032367ba2b5ccb18a44faa3afa84b4dc493297749983b9a837a3d76b0b123664aecc06f9122618c3246f03e076a9d + languageName: node + linkType: hard + "babel-plugin-syntax-hermes-parser@npm:^0.32.0": version: 0.32.1 resolution: "babel-plugin-syntax-hermes-parser@npm:0.32.1" @@ -9023,7 +8591,7 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:^1.18.3, body-parser@npm:^1.19.0, body-parser@npm:^1.20.3, body-parser@npm:~1.20.3": +"body-parser@npm:^1.18.3, body-parser@npm:^1.19.0, body-parser@npm:~1.20.3": version: 1.20.4 resolution: "body-parser@npm:1.20.4" dependencies: @@ -14288,13 +13856,6 @@ __metadata: languageName: node linkType: hard -"hermes-compiler@npm:0.0.0": - version: 0.0.0 - resolution: "hermes-compiler@npm:0.0.0" - checksum: 10/8b6fc8a64c2fa18c9aa6ddb8831c92253b6a2f10adf7d5d8f361b574f07e91b64f0c44b1370665075c33c17dd71c02fd19422124a3d2aa1717c37006ab12a1f0 - languageName: node - linkType: hard - "hermes-estree@npm:0.25.1": version: 0.25.1 resolution: "hermes-estree@npm:0.25.1" @@ -14309,13 +13870,6 @@ __metadata: languageName: node linkType: hard -"hermes-estree@npm:0.29.1": - version: 0.29.1 - resolution: "hermes-estree@npm:0.29.1" - checksum: 10/8989fc224fcd2bb3356d7d330461c9f32303904824891ae4befafc08f13c871013b18d5d4cd4b20bf6f59e9d26afdbb10d33440c6e646de770db4b9543c39db4 - languageName: node - linkType: hard - "hermes-estree@npm:0.32.0": version: 0.32.0 resolution: "hermes-estree@npm:0.32.0" @@ -14362,15 +13916,6 @@ __metadata: languageName: node linkType: hard -"hermes-parser@npm:0.29.1": - version: 0.29.1 - resolution: "hermes-parser@npm:0.29.1" - dependencies: - hermes-estree: "npm:0.29.1" - checksum: 10/2d1ada9d48817668bf12b31deef7c5a4a7d88419448c7e07ad67197a7992462dea3f5e536aea2c6f7e2222940f96bb7cd7a7dc5a101c9b4b2d7a84e1a1272670 - languageName: node - linkType: hard - "hermes-parser@npm:0.32.0": version: 0.32.0 resolution: "hermes-parser@npm:0.32.0" @@ -15922,7 +15467,7 @@ __metadata: languageName: node linkType: hard -"jest-environment-node@npm:^29.6.3, jest-environment-node@npm:^29.7.0": +"jest-environment-node@npm:^29.6.3": version: 29.7.0 resolution: "jest-environment-node@npm:29.7.0" dependencies: @@ -16845,16 +16390,6 @@ __metadata: languageName: node linkType: hard -"launch-editor@npm:^2.9.1": - version: 2.12.0 - resolution: "launch-editor@npm:2.12.0" - dependencies: - picocolors: "npm:^1.1.1" - shell-quote: "npm:^1.8.3" - checksum: 10/43d2b66c674d129f9a96bbae602808a0afa7e6bb6f38de5518479e33b1a542e9772b262304505c2aa363b0185424580b4011a9198082d306e2b419c6f12da5e2 - languageName: node - linkType: hard - "lazystream@npm:^1.0.0": version: 1.0.1 resolution: "lazystream@npm:1.0.1" @@ -17957,30 +17492,6 @@ __metadata: languageName: node linkType: hard -"metro-babel-transformer@npm:0.82.5": - version: 0.82.5 - resolution: "metro-babel-transformer@npm:0.82.5" - dependencies: - "@babel/core": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - hermes-parser: "npm:0.29.1" - nullthrows: "npm:^1.1.1" - checksum: 10/1eea9e96292ee86b14158ac6de07278a87191eeb993f3f01a42a5a2bcaa54406cacf0093a4923ec6c3cc409e4c081d301ec6afcc4b3577890f6d1b5ef39bc81f - languageName: node - linkType: hard - -"metro-babel-transformer@npm:0.83.3": - version: 0.83.3 - resolution: "metro-babel-transformer@npm:0.83.3" - dependencies: - "@babel/core": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - hermes-parser: "npm:0.32.0" - nullthrows: "npm:^1.1.1" - checksum: 10/dd178409d1718dae12dfffb6572ebc5bb78f1e0d7e93dce829c945957f8a686cb1b4c466c69585d7b982b3937fbea28d5c53a80691f2fc66717a0bcc800bc5b8 - languageName: node - linkType: hard - "metro-babel-transformer@npm:0.83.7": version: 0.83.7 resolution: "metro-babel-transformer@npm:0.83.7" @@ -18003,24 +17514,6 @@ __metadata: languageName: node linkType: hard -"metro-cache-key@npm:0.82.5": - version: 0.82.5 - resolution: "metro-cache-key@npm:0.82.5" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/d5dcd86249905c7adad0375111a4bef395a5021df251a463f840eb21bf7b34f4e581ae919a88fb612a63c48a5f379ce50f104a576bd71e052693d89ae6a0d9f0 - languageName: node - linkType: hard - -"metro-cache-key@npm:0.83.3": - version: 0.83.3 - resolution: "metro-cache-key@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/a6f9d2bf8b810f57d330d6f8f1ebf029e1224f426c5895f73d9bc1007482684048bfc7513a855626ee7f3ae72ca46e1b08cf983aefbfa84321bb7c0cef4ba4ae - languageName: node - linkType: hard - "metro-cache-key@npm:0.83.7": version: 0.83.7 resolution: "metro-cache-key@npm:0.83.7" @@ -18041,30 +17534,6 @@ __metadata: languageName: node linkType: hard -"metro-cache@npm:0.82.5": - version: 0.82.5 - resolution: "metro-cache@npm:0.82.5" - dependencies: - exponential-backoff: "npm:^3.1.1" - flow-enums-runtime: "npm:^0.0.6" - https-proxy-agent: "npm:^7.0.5" - metro-core: "npm:0.82.5" - checksum: 10/e90299ae6e411349e5283c57a69ec0d4dd8a4424c3a85078d72d740b425b3dfc77078601ab426e6fb35bcb985e835374846e89f9730f4db413424bd48d9df863 - languageName: node - linkType: hard - -"metro-cache@npm:0.83.3": - version: 0.83.3 - resolution: "metro-cache@npm:0.83.3" - dependencies: - exponential-backoff: "npm:^3.1.1" - flow-enums-runtime: "npm:^0.0.6" - https-proxy-agent: "npm:^7.0.5" - metro-core: "npm:0.83.3" - checksum: 10/4bc263ac92f176451710ebd330d156675e40f028be02eb9659a9b024db9897f3ad8510809d699969cb6f06dc0f06d85c38ca7162fb9a70be44510fa03270e089 - languageName: node - linkType: hard - "metro-cache@npm:0.83.7": version: 0.83.7 resolution: "metro-cache@npm:0.83.7" @@ -18093,38 +17562,6 @@ __metadata: languageName: node linkType: hard -"metro-config@npm:0.82.5, metro-config@npm:^0.82.2": - version: 0.82.5 - resolution: "metro-config@npm:0.82.5" - dependencies: - connect: "npm:^3.6.5" - cosmiconfig: "npm:^5.0.5" - flow-enums-runtime: "npm:^0.0.6" - jest-validate: "npm:^29.7.0" - metro: "npm:0.82.5" - metro-cache: "npm:0.82.5" - metro-core: "npm:0.82.5" - metro-runtime: "npm:0.82.5" - checksum: 10/91e7860a6a3dfaf7287d5abe553fec1592699f92c756fae1218e0cad5a027396b16d4ba7edea75a9fac26c431f719858c9ae17ed737e54605969730c338eb07f - languageName: node - linkType: hard - -"metro-config@npm:0.83.3, metro-config@npm:^0.83.1": - version: 0.83.3 - resolution: "metro-config@npm:0.83.3" - dependencies: - connect: "npm:^3.6.5" - flow-enums-runtime: "npm:^0.0.6" - jest-validate: "npm:^29.7.0" - metro: "npm:0.83.3" - metro-cache: "npm:0.83.3" - metro-core: "npm:0.83.3" - metro-runtime: "npm:0.83.3" - yaml: "npm:^2.6.1" - checksum: 10/e377c375a48afc85a4d742f80a17fc178f9af7f5b007375e65bb49472ad78bc8e1f0ba4399411310ee8b856fb767bd81bd6dae19bec6ef6a44f0ece4d8457b30 - languageName: node - linkType: hard - "metro-config@npm:0.83.7": version: 0.83.7 resolution: "metro-config@npm:0.83.7" @@ -18152,28 +17589,6 @@ __metadata: languageName: node linkType: hard -"metro-core@npm:0.82.5, metro-core@npm:^0.82.2": - version: 0.82.5 - resolution: "metro-core@npm:0.82.5" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - lodash.throttle: "npm:^4.1.1" - metro-resolver: "npm:0.82.5" - checksum: 10/e97282e0164042d1206fee7ac764eddb33f02abb238c139f0d5804a284a2c9e40683293913e29c900b95ee257f85cd18803a07ab3143481bdddc436e137bdf05 - languageName: node - linkType: hard - -"metro-core@npm:0.83.3, metro-core@npm:^0.83.1": - version: 0.83.3 - resolution: "metro-core@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - lodash.throttle: "npm:^4.1.1" - metro-resolver: "npm:0.83.3" - checksum: 10/6ef06214faa1d727396d986f989a8150f699d73c5764c66e06e61b08017e462141a7b4c9ca63f67becee58ea1394b41aabfff441e644fc1e945c715e07c60612 - languageName: node - linkType: hard - "metro-core@npm:0.83.7": version: 0.83.7 resolution: "metro-core@npm:0.83.7" @@ -18202,40 +17617,6 @@ __metadata: languageName: node linkType: hard -"metro-file-map@npm:0.82.5": - version: 0.82.5 - resolution: "metro-file-map@npm:0.82.5" - dependencies: - debug: "npm:^4.4.0" - fb-watchman: "npm:^2.0.0" - flow-enums-runtime: "npm:^0.0.6" - graceful-fs: "npm:^4.2.4" - invariant: "npm:^2.2.4" - jest-worker: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - nullthrows: "npm:^1.1.1" - walker: "npm:^1.0.7" - checksum: 10/3228947bb567f0e3fee200df55315928fac527a8ce4a5e95de44d3e3a125b153b49e4f8f4f59748842880848a5dd87ac8907e75b55786298fb2e2b4b2581d882 - languageName: node - linkType: hard - -"metro-file-map@npm:0.83.3": - version: 0.83.3 - resolution: "metro-file-map@npm:0.83.3" - dependencies: - debug: "npm:^4.4.0" - fb-watchman: "npm:^2.0.0" - flow-enums-runtime: "npm:^0.0.6" - graceful-fs: "npm:^4.2.4" - invariant: "npm:^2.2.4" - jest-worker: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - nullthrows: "npm:^1.1.1" - walker: "npm:^1.0.7" - checksum: 10/be621b144168b6a35567d4313557596df68ee61c1b9a067fbf8272ec3db7c2d9d76849c9b8d2331716d6839c3f8e243e2b715ca2551d7ffebbd206a34c19591a - languageName: node - linkType: hard - "metro-file-map@npm:0.83.7": version: 0.83.7 resolution: "metro-file-map@npm:0.83.7" @@ -18249,37 +17630,17 @@ __metadata: micromatch: "npm:^4.0.4" nullthrows: "npm:^1.1.1" walker: "npm:^1.0.7" - checksum: 10/175fee3f2d407bbc01b6312ecab63ce515d3d7de97c9404a563a390c24d03074cd3e983d46d31dba56806dda53c52adc4c40ec29d23dd620e82f43f8f36db371 - languageName: node - linkType: hard - -"metro-minify-terser@npm:0.81.5": - version: 0.81.5 - resolution: "metro-minify-terser@npm:0.81.5" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - terser: "npm:^5.15.0" - checksum: 10/4623743676e2bb8bb74b99bd2b2c26feb2509a8db5596f265e21042b43e84611f9025977ae298b8271644cb27e8da8a60b8dff791f57517b4bd2f5ae366f2945 - languageName: node - linkType: hard - -"metro-minify-terser@npm:0.82.5": - version: 0.82.5 - resolution: "metro-minify-terser@npm:0.82.5" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - terser: "npm:^5.15.0" - checksum: 10/754c150f0928460e1254e90e4e11bd87e069a0b286d21906758cb71fb8b4ec50dc8f78337bf8a9f8a28ddbd34230f5c66dad0fecf18dbe49715bf1300e5318c2 + checksum: 10/175fee3f2d407bbc01b6312ecab63ce515d3d7de97c9404a563a390c24d03074cd3e983d46d31dba56806dda53c52adc4c40ec29d23dd620e82f43f8f36db371 languageName: node linkType: hard -"metro-minify-terser@npm:0.83.3": - version: 0.83.3 - resolution: "metro-minify-terser@npm:0.83.3" +"metro-minify-terser@npm:0.81.5": + version: 0.81.5 + resolution: "metro-minify-terser@npm:0.81.5" dependencies: flow-enums-runtime: "npm:^0.0.6" terser: "npm:^5.15.0" - checksum: 10/1de88b70b7c903147807baa46497491a87600594fd0868b6538bbb9d7785242cabfbe8bccf36cc2285d0e17be72445b512d00c496952a159572545f3e6bcb199 + checksum: 10/4623743676e2bb8bb74b99bd2b2c26feb2509a8db5596f265e21042b43e84611f9025977ae298b8271644cb27e8da8a60b8dff791f57517b4bd2f5ae366f2945 languageName: node linkType: hard @@ -18302,24 +17663,6 @@ __metadata: languageName: node linkType: hard -"metro-resolver@npm:0.82.5": - version: 0.82.5 - resolution: "metro-resolver@npm:0.82.5" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/2ccabf3d9e1f931496b0cbc7075713b79cd6989f802607c845d2ce2fb0a1eeab8133d045fd92d8654ce7a943a276b2ab59e9e1039c9b6744a26d0107554d6f2f - languageName: node - linkType: hard - -"metro-resolver@npm:0.83.3": - version: 0.83.3 - resolution: "metro-resolver@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/a425376447505a088a365fc1fbe2753d452c0353a189f2c74833f2b30d6401de7ed90e36a927d355fa454d6c439a156eb66bcfcedfbbe8a78d313cf49acfbb4c - languageName: node - linkType: hard - "metro-resolver@npm:0.83.7": version: 0.83.7 resolution: "metro-resolver@npm:0.83.7" @@ -18339,26 +17682,6 @@ __metadata: languageName: node linkType: hard -"metro-runtime@npm:0.82.5, metro-runtime@npm:^0.82.2": - version: 0.82.5 - resolution: "metro-runtime@npm:0.82.5" - dependencies: - "@babel/runtime": "npm:^7.25.0" - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/212ae207e507fa5fdac81ba079ccb4f6939dcea19416435885f16c173711b71f72eb4269eeb78ffde451e2307b6b01dbe7fc7b8cca117729a67ad4773b9e2d2d - languageName: node - linkType: hard - -"metro-runtime@npm:0.83.3, metro-runtime@npm:^0.83.1": - version: 0.83.3 - resolution: "metro-runtime@npm:0.83.3" - dependencies: - "@babel/runtime": "npm:^7.25.0" - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/bf916759a7178e1d12e131c64ac67d6015ba35ead7a178e6efedd23f12ec65de99f450fe7da0ffb6c6edbfeb3cd186d2006b979a1c1c588377ae54f5f5d7921d - languageName: node - linkType: hard - "metro-runtime@npm:0.83.7": version: 0.83.7 resolution: "metro-runtime@npm:0.83.7" @@ -18387,42 +17710,6 @@ __metadata: languageName: node linkType: hard -"metro-source-map@npm:0.82.5, metro-source-map@npm:^0.82.2": - version: 0.82.5 - resolution: "metro-source-map@npm:0.82.5" - dependencies: - "@babel/traverse": "npm:^7.25.3" - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3" - "@babel/types": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - invariant: "npm:^2.2.4" - metro-symbolicate: "npm:0.82.5" - nullthrows: "npm:^1.1.1" - ob1: "npm:0.82.5" - source-map: "npm:^0.5.6" - vlq: "npm:^1.0.0" - checksum: 10/8731c6257afa7bf2b460d4059d7fea1498c91d982b09e536e6dda73e166c7155ceea2eb7709dbea6d1e10a59be746ec9a7b3e5000e5cc79fd38d30d833c181c6 - languageName: node - linkType: hard - -"metro-source-map@npm:0.83.3, metro-source-map@npm:^0.83.1": - version: 0.83.3 - resolution: "metro-source-map@npm:0.83.3" - dependencies: - "@babel/traverse": "npm:^7.25.3" - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3" - "@babel/types": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - invariant: "npm:^2.2.4" - metro-symbolicate: "npm:0.83.3" - nullthrows: "npm:^1.1.1" - ob1: "npm:0.83.3" - source-map: "npm:^0.5.6" - vlq: "npm:^1.0.0" - checksum: 10/1dcfce503628275f97dd85945ca575c71e5654fd8872b7d86449f3352cfc84ea7a59889b2aad012361245b5497e1e097db73390245952dcfb63258ba32fa90bf - languageName: node - linkType: hard - "metro-source-map@npm:0.83.7": version: 0.83.7 resolution: "metro-source-map@npm:0.83.7" @@ -18456,38 +17743,6 @@ __metadata: languageName: node linkType: hard -"metro-symbolicate@npm:0.82.5": - version: 0.82.5 - resolution: "metro-symbolicate@npm:0.82.5" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - invariant: "npm:^2.2.4" - metro-source-map: "npm:0.82.5" - nullthrows: "npm:^1.1.1" - source-map: "npm:^0.5.6" - vlq: "npm:^1.0.0" - bin: - metro-symbolicate: src/index.js - checksum: 10/593e853b702f3ff2d3f9e6677fcfef832cf3373506a6116a9ec5e3d3f6ab46f83af34167cfd6d53a52cda2238a504b7bac63436dc8b59a6c5d3da54bce9140ad - languageName: node - linkType: hard - -"metro-symbolicate@npm:0.83.3": - version: 0.83.3 - resolution: "metro-symbolicate@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - invariant: "npm:^2.2.4" - metro-source-map: "npm:0.83.3" - nullthrows: "npm:^1.1.1" - source-map: "npm:^0.5.6" - vlq: "npm:^1.0.0" - bin: - metro-symbolicate: src/index.js - checksum: 10/f3be0740655732044e92728a3bccd5f4a73ab2f9e4423ca05faee02446e9b2efd9400cc7bcd761fad9bc2a1b92855ce5b03bf13e0421a203fe179be40dcc9381 - languageName: node - linkType: hard - "metro-symbolicate@npm:0.83.7": version: 0.83.7 resolution: "metro-symbolicate@npm:0.83.7" @@ -18518,34 +17773,6 @@ __metadata: languageName: node linkType: hard -"metro-transform-plugins@npm:0.82.5": - version: 0.82.5 - resolution: "metro-transform-plugins@npm:0.82.5" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.3" - flow-enums-runtime: "npm:^0.0.6" - nullthrows: "npm:^1.1.1" - checksum: 10/413811c1e2cef44ba77f02f3cd823e8987bdfc69b3c051bd41e886f9243fa131fa4a366e34c9483c85e77c8960d5151eecb34924c0f66b3e0f87706ca6ff37c5 - languageName: node - linkType: hard - -"metro-transform-plugins@npm:0.83.3": - version: 0.83.3 - resolution: "metro-transform-plugins@npm:0.83.3" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.3" - flow-enums-runtime: "npm:^0.0.6" - nullthrows: "npm:^1.1.1" - checksum: 10/fa7efe6ab4f2ce5f66e1cb302f71341cf7fd55319cf360a269b187d2f507cecce8db8069f92585cf43517aee63e18cf6e66dd124db95c293902ab27c68ac43b1 - languageName: node - linkType: hard - "metro-transform-plugins@npm:0.83.7": version: 0.83.7 resolution: "metro-transform-plugins@npm:0.83.7" @@ -18581,48 +17808,6 @@ __metadata: languageName: node linkType: hard -"metro-transform-worker@npm:0.82.5": - version: 0.82.5 - resolution: "metro-transform-worker@npm:0.82.5" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/types": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - metro: "npm:0.82.5" - metro-babel-transformer: "npm:0.82.5" - metro-cache: "npm:0.82.5" - metro-cache-key: "npm:0.82.5" - metro-minify-terser: "npm:0.82.5" - metro-source-map: "npm:0.82.5" - metro-transform-plugins: "npm:0.82.5" - nullthrows: "npm:^1.1.1" - checksum: 10/169203ececd0aa4c3d323f0579398ce9b77d3775d046cfa163c53d3dea97425dba6362b7630889fc8eea8232aa7567489f7e4e512ca3f58777c51f5f5e2894dc - languageName: node - linkType: hard - -"metro-transform-worker@npm:0.83.3": - version: 0.83.3 - resolution: "metro-transform-worker@npm:0.83.3" - dependencies: - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/types": "npm:^7.25.2" - flow-enums-runtime: "npm:^0.0.6" - metro: "npm:0.83.3" - metro-babel-transformer: "npm:0.83.3" - metro-cache: "npm:0.83.3" - metro-cache-key: "npm:0.83.3" - metro-minify-terser: "npm:0.83.3" - metro-source-map: "npm:0.83.3" - metro-transform-plugins: "npm:0.83.3" - nullthrows: "npm:^1.1.1" - checksum: 10/e6db9b54a9b21f4b06fc665321a7aebc6206dbac3976bda74bdf4d101dbd50f91b2e49163581ca1c27b684a4eecc2db988f0fc7aaeb200d2d947cb05d3e89f18 - languageName: node - linkType: hard - "metro-transform-worker@npm:0.83.7": version: 0.83.7 resolution: "metro-transform-worker@npm:0.83.7" @@ -18694,106 +17879,6 @@ __metadata: languageName: node linkType: hard -"metro@npm:0.82.5, metro@npm:^0.82.2": - version: 0.82.5 - resolution: "metro@npm:0.82.5" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.3" - "@babel/types": "npm:^7.25.2" - accepts: "npm:^1.3.7" - chalk: "npm:^4.0.0" - ci-info: "npm:^2.0.0" - connect: "npm:^3.6.5" - debug: "npm:^4.4.0" - error-stack-parser: "npm:^2.0.6" - flow-enums-runtime: "npm:^0.0.6" - graceful-fs: "npm:^4.2.4" - hermes-parser: "npm:0.29.1" - image-size: "npm:^1.0.2" - invariant: "npm:^2.2.4" - jest-worker: "npm:^29.7.0" - jsc-safe-url: "npm:^0.2.2" - lodash.throttle: "npm:^4.1.1" - metro-babel-transformer: "npm:0.82.5" - metro-cache: "npm:0.82.5" - metro-cache-key: "npm:0.82.5" - metro-config: "npm:0.82.5" - metro-core: "npm:0.82.5" - metro-file-map: "npm:0.82.5" - metro-resolver: "npm:0.82.5" - metro-runtime: "npm:0.82.5" - metro-source-map: "npm:0.82.5" - metro-symbolicate: "npm:0.82.5" - metro-transform-plugins: "npm:0.82.5" - metro-transform-worker: "npm:0.82.5" - mime-types: "npm:^2.1.27" - nullthrows: "npm:^1.1.1" - serialize-error: "npm:^2.1.0" - source-map: "npm:^0.5.6" - throat: "npm:^5.0.0" - ws: "npm:^7.5.10" - yargs: "npm:^17.6.2" - bin: - metro: src/cli.js - checksum: 10/8ada9adce330756249103181c3f99331d095f53d0630a192fd1a2729543dfdc2b71aea024bfa6bba2b38e8c3afdc25b50a6aedb2b6bc4d73b45fbc0599494066 - languageName: node - linkType: hard - -"metro@npm:0.83.3, metro@npm:^0.83.1": - version: 0.83.3 - resolution: "metro@npm:0.83.3" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/core": "npm:^7.25.2" - "@babel/generator": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.3" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.3" - "@babel/types": "npm:^7.25.2" - accepts: "npm:^1.3.7" - chalk: "npm:^4.0.0" - ci-info: "npm:^2.0.0" - connect: "npm:^3.6.5" - debug: "npm:^4.4.0" - error-stack-parser: "npm:^2.0.6" - flow-enums-runtime: "npm:^0.0.6" - graceful-fs: "npm:^4.2.4" - hermes-parser: "npm:0.32.0" - image-size: "npm:^1.0.2" - invariant: "npm:^2.2.4" - jest-worker: "npm:^29.7.0" - jsc-safe-url: "npm:^0.2.2" - lodash.throttle: "npm:^4.1.1" - metro-babel-transformer: "npm:0.83.3" - metro-cache: "npm:0.83.3" - metro-cache-key: "npm:0.83.3" - metro-config: "npm:0.83.3" - metro-core: "npm:0.83.3" - metro-file-map: "npm:0.83.3" - metro-resolver: "npm:0.83.3" - metro-runtime: "npm:0.83.3" - metro-source-map: "npm:0.83.3" - metro-symbolicate: "npm:0.83.3" - metro-transform-plugins: "npm:0.83.3" - metro-transform-worker: "npm:0.83.3" - mime-types: "npm:^2.1.27" - nullthrows: "npm:^1.1.1" - serialize-error: "npm:^2.1.0" - source-map: "npm:^0.5.6" - throat: "npm:^5.0.0" - ws: "npm:^7.5.10" - yargs: "npm:^17.6.2" - bin: - metro: src/cli.js - checksum: 10/c989031710f02e51d3030660f1913870885647c5a216068333f7b4c43363f9ede03a9efb3b068b6750c6decab40f541376c3d81b32389d24932a46e10d19ebe1 - languageName: node - linkType: hard - "metro@npm:0.83.7": version: 0.83.7 resolution: "metro@npm:0.83.7" @@ -20495,24 +19580,6 @@ __metadata: languageName: node linkType: hard -"ob1@npm:0.82.5": - version: 0.82.5 - resolution: "ob1@npm:0.82.5" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/3faa161e5b5307188b6bbbf7e21727b1e434b8f6c31c51386808b2efd5e7238cf85a7ce71416d9a3f073625afb5a2212f80ec267996dc88fe086944adbb525d9 - languageName: node - linkType: hard - -"ob1@npm:0.83.3": - version: 0.83.3 - resolution: "ob1@npm:0.83.3" - dependencies: - flow-enums-runtime: "npm:^0.0.6" - checksum: 10/20dfe91d48d0cadd97159cfd53f5abdca435b55d58b1f562e0687485e8f44f8a95e8ab3c835badd13d0d8c01e3d7b14d639a316aa4bf82841ac78b49611d4e5c - languageName: node - linkType: hard - "ob1@npm:0.83.7": version: 0.83.7 resolution: "ob1@npm:0.83.7" @@ -22188,7 +21255,7 @@ __metadata: languageName: node linkType: hard -"react-devtools-core@npm:^6.0.1, react-devtools-core@npm:^6.1.1, react-devtools-core@npm:^6.1.5": +"react-devtools-core@npm:^6.0.1": version: 6.1.5 resolution: "react-devtools-core@npm:6.1.5" dependencies: @@ -22373,7 +21440,7 @@ __metadata: "@firebase/rules-unit-testing": "npm:^5.0.0" "@inquirer/prompts": "npm:^8.4.2" "@octokit/core": "npm:^7.0.6" - "@react-native-community/cli": "npm:latest" + "@react-native-community/cli": "npm:15.1.3" "@tsconfig/node-lts": "npm:^24.0.0" "@types/react": "npm:~19.2.14" "@types/react-native": "npm:^0.73.0" @@ -22501,57 +21568,6 @@ __metadata: languageName: node linkType: hard -"react-native@npm:*": - version: 0.82.1 - resolution: "react-native@npm:0.82.1" - dependencies: - "@jest/create-cache-key-function": "npm:^29.7.0" - "@react-native/assets-registry": "npm:0.82.1" - "@react-native/codegen": "npm:0.82.1" - "@react-native/community-cli-plugin": "npm:0.82.1" - "@react-native/gradle-plugin": "npm:0.82.1" - "@react-native/js-polyfills": "npm:0.82.1" - "@react-native/normalize-colors": "npm:0.82.1" - "@react-native/virtualized-lists": "npm:0.82.1" - abort-controller: "npm:^3.0.0" - anser: "npm:^1.4.9" - ansi-regex: "npm:^5.0.0" - babel-jest: "npm:^29.7.0" - babel-plugin-syntax-hermes-parser: "npm:0.32.0" - base64-js: "npm:^1.5.1" - commander: "npm:^12.0.0" - flow-enums-runtime: "npm:^0.0.6" - glob: "npm:^7.1.1" - hermes-compiler: "npm:0.0.0" - invariant: "npm:^2.2.4" - jest-environment-node: "npm:^29.7.0" - memoize-one: "npm:^5.0.0" - metro-runtime: "npm:^0.83.1" - metro-source-map: "npm:^0.83.1" - nullthrows: "npm:^1.1.1" - pretty-format: "npm:^29.7.0" - promise: "npm:^8.3.0" - react-devtools-core: "npm:^6.1.5" - react-refresh: "npm:^0.14.0" - regenerator-runtime: "npm:^0.13.2" - scheduler: "npm:0.26.0" - semver: "npm:^7.1.3" - stacktrace-parser: "npm:^0.1.10" - whatwg-fetch: "npm:^3.0.0" - ws: "npm:^6.2.3" - yargs: "npm:^17.6.2" - peerDependencies: - "@types/react": ^19.1.1 - react: ^19.1.1 - peerDependenciesMeta: - "@types/react": - optional: true - bin: - react-native: cli.js - checksum: 10/49a9173fc930cb151ec03e262a116e78e1059ee03c4215f28cf4bbd956af57b6efa688d6e518fc6825bd0516a8511ae41d84693b7bdd0a8b9095229f11e5e4d1 - languageName: node - linkType: hard - "react-native@npm:0.78.3": version: 0.78.3 resolution: "react-native@npm:0.78.3" @@ -22604,57 +21620,6 @@ __metadata: languageName: node linkType: hard -"react-native@npm:^0.80.1": - version: 0.80.2 - resolution: "react-native@npm:0.80.2" - dependencies: - "@jest/create-cache-key-function": "npm:^29.7.0" - "@react-native/assets-registry": "npm:0.80.2" - "@react-native/codegen": "npm:0.80.2" - "@react-native/community-cli-plugin": "npm:0.80.2" - "@react-native/gradle-plugin": "npm:0.80.2" - "@react-native/js-polyfills": "npm:0.80.2" - "@react-native/normalize-colors": "npm:0.80.2" - "@react-native/virtualized-lists": "npm:0.80.2" - abort-controller: "npm:^3.0.0" - anser: "npm:^1.4.9" - ansi-regex: "npm:^5.0.0" - babel-jest: "npm:^29.7.0" - babel-plugin-syntax-hermes-parser: "npm:0.28.1" - base64-js: "npm:^1.5.1" - chalk: "npm:^4.0.0" - commander: "npm:^12.0.0" - flow-enums-runtime: "npm:^0.0.6" - glob: "npm:^7.1.1" - invariant: "npm:^2.2.4" - jest-environment-node: "npm:^29.7.0" - memoize-one: "npm:^5.0.0" - metro-runtime: "npm:^0.82.2" - metro-source-map: "npm:^0.82.2" - nullthrows: "npm:^1.1.1" - pretty-format: "npm:^29.7.0" - promise: "npm:^8.3.0" - react-devtools-core: "npm:^6.1.1" - react-refresh: "npm:^0.14.0" - regenerator-runtime: "npm:^0.13.2" - scheduler: "npm:0.26.0" - semver: "npm:^7.1.3" - stacktrace-parser: "npm:^0.1.10" - whatwg-fetch: "npm:^3.0.0" - ws: "npm:^6.2.3" - yargs: "npm:^17.6.2" - peerDependencies: - "@types/react": ^19.1.0 - react: ^19.1.0 - peerDependenciesMeta: - "@types/react": - optional: true - bin: - react-native: cli.js - checksum: 10/0809575e618168f048a06c34c33e60eb7deee0b45ffc267a962a31df165be3ecd058344c5fce2ee7abb2b32f152176138b4fc56fea53b9a00f8ef131c2f271bf - languageName: node - linkType: hard - "react-refresh@npm:^0.14.0, react-refresh@npm:^0.14.2": version: 0.14.2 resolution: "react-refresh@npm:0.14.2" @@ -23582,13 +22547,6 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:0.26.0": - version: 0.26.0 - resolution: "scheduler@npm:0.26.0" - checksum: 10/1ecf2e5d7de1a7a132796834afe14a2d589ba7e437615bd8c06f3e0786a3ac3434655e67aac8755d9b14e05754c177e49c064261de2673aaa3c926bc98caa002 - languageName: node - linkType: hard - "selfsigned@npm:^2.4.1": version: 2.4.1 resolution: "selfsigned@npm:2.4.1" @@ -23839,7 +22797,7 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.6.1, shell-quote@npm:^1.7.2, shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.3": +"shell-quote@npm:^1.6.1, shell-quote@npm:^1.7.2, shell-quote@npm:^1.7.3": version: 1.8.3 resolution: "shell-quote@npm:1.8.3" checksum: 10/5473e354637c2bd698911224129c9a8961697486cff1fb221f234d71c153fc377674029b0223d1d3c953a68d451d79366abfe53d1a0b46ee1f28eb9ade928f4c