@react-native-firebase/app 26.3.3 → 27.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +10 -27
  3. package/RNFBApp.podspec +13 -5
  4. package/android/build.gradle +3 -0
  5. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleCollisionException.kt +29 -0
  6. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleMap.kt +146 -0
  7. package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.kt +156 -0
  8. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebaseModule.kt +44 -0
  9. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebasePreferences.kt +100 -0
  10. package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.kt +250 -0
  11. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseApp.kt +64 -0
  12. package/android/src/reactnative/java/io/invertase/firebase/app/{ReactNativeFirebaseAppInitProvider.java → ReactNativeFirebaseAppInitProvider.kt} +3 -4
  13. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.kt +47 -0
  14. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppRegistrar.kt +33 -0
  15. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseVersion.java +1 -1
  16. package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.kt +185 -0
  17. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEvent.kt +35 -0
  18. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitter.kt +662 -0
  19. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.kt +103 -0
  20. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseMeta.kt +96 -0
  21. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseModule.kt +140 -0
  22. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebasePreferences.kt +109 -0
  23. package/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.kt +451 -0
  24. package/android/src/reactnative/java/io/invertase/firebase/interfaces/{ContextProvider.java → ContextProvider.kt} +8 -8
  25. package/android/src/reactnative/java/io/invertase/firebase/interfaces/{NativeError.java → NativeError.kt} +8 -8
  26. package/android/src/reactnative/java/io/invertase/firebase/interfaces/{NativeEvent.java → NativeEvent.kt} +6 -6
  27. package/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.kt +219 -0
  28. package/android/src/test/java/expo/core/ModuleRegistry.java +9 -0
  29. package/android/src/test/java/io/invertase/firebase/app/NativeRNFBTurboAppTest.java +208 -60
  30. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppComponentsJavaCompatibilityTest.java +70 -0
  31. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppJavaCompatibilityTest.java +60 -0
  32. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackageTest.java +165 -0
  33. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppTest.kt +167 -0
  34. package/android/src/test/java/io/invertase/firebase/common/RCTConvertFirebaseJavaCompatibilityTest.java +112 -0
  35. package/android/src/test/java/io/invertase/firebase/common/RCTConvertFirebaseTest.kt +317 -0
  36. package/android/src/test/java/io/invertase/firebase/common/RNFBHandleMapTest.kt +309 -0
  37. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterJavaCompatibilityTest.java +176 -0
  38. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterTest.java +144 -13
  39. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventTest.kt +61 -0
  40. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONJavaCompatibilityTest.java +85 -0
  41. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONTest.kt +296 -0
  42. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseMetaJavaCompatibilityTest.java +67 -0
  43. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseMetaTest.kt +246 -0
  44. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseModuleTest.kt +254 -0
  45. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebasePreferencesJavaCompatibilityTest.java +87 -0
  46. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebasePreferencesTest.kt +260 -0
  47. package/android/src/test/java/io/invertase/firebase/common/SharedUtilsJavaCompatibilityTest.java +255 -0
  48. package/android/src/test/java/io/invertase/firebase/common/SharedUtilsTest.kt +674 -0
  49. package/android/src/test/java/io/invertase/firebase/common/TaskExecutorServiceTest.kt +290 -0
  50. package/android/src/test/java/io/invertase/firebase/common/UniversalFirebaseModuleJavaCompatibilityTest.java +178 -0
  51. package/android/src/test/java/io/invertase/firebase/common/UniversalFirebasePreferencesJavaCompatibilityTest.java +99 -0
  52. package/android/src/test/java/io/invertase/firebase/common/UniversalFirebasePreferencesTest.kt +217 -0
  53. package/android/src/test/java/io/invertase/firebase/commoncompat/ReactNativeFirebaseModuleJavaCompatibilityTest.java +176 -0
  54. package/android/src/test/java/io/invertase/firebase/commoncompat/ReactNativeFirebaseModuleKotlinCompatibilityTest.kt +52 -0
  55. package/android/src/test/java/io/invertase/firebase/interfaces/InterfacesJavaCompatibilityTest.java +144 -0
  56. package/android/src/test/java/io/invertase/firebase/interfaces/NativeEventTest.kt +56 -0
  57. package/android/src/test/java/io/invertase/firebase/utils/NativeRNFBTurboUtilsTest.java +517 -23
  58. package/dist/module/FirebaseApp.js +10 -0
  59. package/dist/module/FirebaseApp.js.map +1 -1
  60. package/dist/module/common/Base64.js +13 -21
  61. package/dist/module/common/Base64.js.map +1 -1
  62. package/dist/module/common/deeps.js +3 -0
  63. package/dist/module/common/deeps.js.map +1 -1
  64. package/dist/module/common/index.js +17 -9
  65. package/dist/module/common/index.js.map +1 -1
  66. package/dist/module/internal/FirebaseModule.js.map +1 -1
  67. package/dist/module/internal/RNFBNativeEventEmitter.js +12 -1
  68. package/dist/module/internal/RNFBNativeEventEmitter.js.map +1 -1
  69. package/dist/module/internal/SharedEventEmitter.js +3 -1
  70. package/dist/module/internal/SharedEventEmitter.js.map +1 -1
  71. package/dist/module/internal/asyncStorage.js +7 -11
  72. package/dist/module/internal/asyncStorage.js.map +1 -1
  73. package/dist/module/internal/index.js +1 -0
  74. package/dist/module/internal/index.js.map +1 -1
  75. package/dist/module/internal/logger.js +44 -40
  76. package/dist/module/internal/logger.js.map +1 -1
  77. package/dist/module/internal/nativeModuleAndroidIos.js +2 -29
  78. package/dist/module/internal/nativeModuleAndroidIos.js.map +1 -1
  79. package/dist/module/internal/nativeModuleDebug.js +74 -0
  80. package/dist/module/internal/nativeModuleDebug.js.map +1 -0
  81. package/dist/module/internal/nativeModuleWeb.js +9 -29
  82. package/dist/module/internal/nativeModuleWeb.js.map +1 -1
  83. package/dist/module/internal/registry/app.js +8 -2
  84. package/dist/module/internal/registry/app.js.map +1 -1
  85. package/dist/module/internal/registry/modular.js +2 -2
  86. package/dist/module/internal/registry/modular.js.map +1 -1
  87. package/dist/module/internal/registry/nativeModule.js +3 -3
  88. package/dist/module/internal/registry/nativeModule.js.map +1 -1
  89. package/dist/module/internal/web/RNFBAppModule.js +16 -15
  90. package/dist/module/internal/web/RNFBAppModule.js.map +1 -1
  91. package/dist/module/internal/web/memidb/lib/FakeEventTarget.js +3 -1
  92. package/dist/module/internal/web/memidb/lib/FakeEventTarget.js.map +1 -1
  93. package/dist/module/types/app.js.map +1 -1
  94. package/dist/module/types/internal.js +2 -0
  95. package/dist/module/version.js +1 -1
  96. package/dist/typescript/lib/FirebaseApp.d.ts +7 -0
  97. package/dist/typescript/lib/FirebaseApp.d.ts.map +1 -1
  98. package/dist/typescript/lib/common/Base64.d.ts.map +1 -1
  99. package/dist/typescript/lib/common/deeps.d.ts.map +1 -1
  100. package/dist/typescript/lib/common/index.d.ts.map +1 -1
  101. package/dist/typescript/lib/internal/FirebaseModule.d.ts +2 -3
  102. package/dist/typescript/lib/internal/FirebaseModule.d.ts.map +1 -1
  103. package/dist/typescript/lib/internal/NativeModules.d.ts +4 -1
  104. package/dist/typescript/lib/internal/NativeModules.d.ts.map +1 -1
  105. package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts +2 -2
  106. package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts.map +1 -1
  107. package/dist/typescript/lib/internal/SharedEventEmitter.d.ts +3 -3
  108. package/dist/typescript/lib/internal/SharedEventEmitter.d.ts.map +1 -1
  109. package/dist/typescript/lib/internal/asyncStorage.d.ts.map +1 -1
  110. package/dist/typescript/lib/internal/index.d.ts +1 -0
  111. package/dist/typescript/lib/internal/index.d.ts.map +1 -1
  112. package/dist/typescript/lib/internal/logger.d.ts.map +1 -1
  113. package/dist/typescript/lib/internal/nativeModuleAndroidIos.d.ts.map +1 -1
  114. package/dist/typescript/lib/internal/nativeModuleDebug.d.ts +2 -0
  115. package/dist/typescript/lib/internal/nativeModuleDebug.d.ts.map +1 -0
  116. package/dist/typescript/lib/internal/nativeModuleWeb.d.ts.map +1 -1
  117. package/dist/typescript/lib/internal/registry/app.d.ts.map +1 -1
  118. package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts +7 -7
  119. package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts.map +1 -1
  120. package/dist/typescript/lib/types/app.d.ts +10 -3
  121. package/dist/typescript/lib/types/app.d.ts.map +1 -1
  122. package/dist/typescript/lib/types/internal.d.ts +12 -0
  123. package/dist/typescript/lib/types/internal.d.ts.map +1 -1
  124. package/dist/typescript/lib/version.d.ts +1 -1
  125. package/firebase-schema.json +5 -1
  126. package/firebase_spm.rb +552 -96
  127. package/ios/RNFBApp/RCTConvert+FIRApp.h +2 -5
  128. package/ios/RNFBApp/RCTConvert+FIRApp.m +11 -6
  129. package/ios/RNFBApp/RCTConvert+FIROptions.h +2 -5
  130. package/ios/RNFBApp/RCTConvert+FIROptions.m +11 -10
  131. package/ios/RNFBApp/RCTConvertFIRApp.swift +86 -0
  132. package/ios/RNFBApp/RCTConvertFIROptions.swift +259 -0
  133. package/ios/RNFBApp/RNFBAppCustomAuthDomains.swift +63 -0
  134. package/ios/RNFBApp/RNFBAppInitializeOptionsMapper.swift +113 -0
  135. package/ios/RNFBApp/RNFBAppLogLevelMapper.swift +53 -0
  136. package/ios/RNFBApp/RNFBAppModule+CustomAuthDomain.m +35 -0
  137. package/ios/RNFBApp/RNFBAppModule.h +6 -2
  138. package/ios/RNFBApp/RNFBAppModule.mm +67 -204
  139. package/ios/RNFBApp/RNFBAppModuleFirebase.swift +439 -0
  140. package/ios/RNFBApp/RNFBAppModuleImplementation.h +68 -0
  141. package/ios/RNFBApp/RNFBAppModuleImplementation.m +195 -0
  142. package/ios/RNFBApp/RNFBHandleMap.h +73 -0
  143. package/ios/RNFBApp/RNFBHandleMap.m +87 -0
  144. package/ios/RNFBApp/RNFBHandleMapStorage.swift +90 -0
  145. package/ios/RNFBApp/RNFBInitializeAppArguments.swift +82 -0
  146. package/ios/RNFBApp/RNFBJSON.m +22 -38
  147. package/ios/RNFBApp/RNFBJSONImplementation.swift +71 -0
  148. package/ios/RNFBApp/RNFBMeta.m +24 -26
  149. package/ios/RNFBApp/RNFBMetaStorage.swift +76 -0
  150. package/ios/RNFBApp/RNFBNullSentinelDecoding.swift +135 -0
  151. package/ios/RNFBApp/RNFBNullSentinelInterceptor.h +30 -3
  152. package/ios/RNFBApp/RNFBNullSentinelInterceptor.m +28 -5
  153. package/ios/RNFBApp/RNFBPreferences.m +22 -20
  154. package/ios/RNFBApp/RNFBPreferencesStorage.swift +101 -0
  155. package/ios/RNFBApp/RNFBRCTEventEmitter.m +36 -93
  156. package/ios/RNFBApp/RNFBRCTEventEmitterCore.swift +161 -0
  157. package/ios/RNFBApp/RNFBSharedUtils.h +2 -5
  158. package/ios/RNFBApp/RNFBSharedUtils.m +109 -197
  159. package/ios/RNFBApp/RNFBSharedUtilsConfig.swift +72 -0
  160. package/ios/RNFBApp/RNFBSharedUtilsFIRApp.swift +271 -0
  161. package/ios/RNFBApp/RNFBSharedUtilsFormatting.swift +59 -0
  162. package/ios/RNFBApp/RNFBSharedUtilsPromiseRejection.swift +88 -0
  163. package/ios/RNFBApp/RNFBUtilsHelpers.swift +116 -0
  164. package/ios/RNFBApp/RNFBUtilsModule+Foundation.m +44 -0
  165. package/ios/RNFBApp/RNFBUtilsModule+PhotoAssets.m +47 -0
  166. package/ios/RNFBApp/RNFBUtilsModule.h +11 -1
  167. package/ios/RNFBApp/RNFBUtilsModule.mm +10 -85
  168. package/ios/RNFBApp/RNFBUtilsModuleImplementation.h +32 -0
  169. package/ios/RNFBApp/RNFBUtilsModuleImplementation.m +56 -0
  170. package/ios/RNFBApp/RNFBVersion.m +1 -1
  171. package/ios/RNFBApp.xcodeproj/project.pbxproj +106 -0
  172. package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FIRApp.m +171 -0
  173. package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FirebaseCore.h +78 -0
  174. package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FIRInstallations.m +7 -0
  175. package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FirebaseInstallations.h +8 -0
  176. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppModuleHostStub.m +55 -0
  177. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.h +89 -0
  178. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.mm +30 -0
  179. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.h +19 -0
  180. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.m +32 -0
  181. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridgeModule.h +19 -0
  182. package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.h +28 -0
  183. package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.m +23 -0
  184. package/ios/RNFBAppUnitTests/HostStubs/React/RCTEventEmitter.h +9 -0
  185. package/ios/RNFBAppUnitTests/HostStubs/React/RCTInvalidating.h +24 -0
  186. package/ios/RNFBAppUnitTests/HostStubs/React/RCTUtils.h +9 -0
  187. package/ios/RNFBAppUnitTests/HostStubs/module.modulemap +13 -0
  188. package/ios/RNFBAppUnitTests/RCTConvertFIRAppFacadeTests.m +61 -0
  189. package/ios/RNFBAppUnitTests/RCTConvertFIRAppTests.swift +73 -0
  190. package/ios/RNFBAppUnitTests/RCTConvertFIROptionsFacadeTests.m +57 -0
  191. package/ios/RNFBAppUnitTests/RCTConvertFIROptionsTests.swift +243 -0
  192. package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsFacadeTests.m +73 -0
  193. package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsTests.swift +70 -0
  194. package/ios/RNFBAppUnitTests/RNFBAppInitializeOptionsMapperTests.swift +190 -0
  195. package/ios/RNFBAppUnitTests/RNFBAppLogLevelFacadeTests.m +76 -0
  196. package/ios/RNFBAppUnitTests/RNFBAppLogLevelMapperTests.swift +59 -0
  197. package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseFacadeTests.m +215 -0
  198. package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseTests.swift +430 -0
  199. package/ios/RNFBAppUnitTests/RNFBAppModuleLifecycleTests.m +206 -0
  200. package/ios/RNFBAppUnitTests/RNFBAppModuleShellTests.mm +367 -0
  201. package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/project.pbxproj +590 -0
  202. package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBAppUnitTests.xcscheme +69 -0
  203. package/ios/RNFBAppUnitTests/RNFBFirebaseAppClientTests.swift +165 -0
  204. package/ios/RNFBAppUnitTests/RNFBHandleMapStorageTests.swift +121 -0
  205. package/ios/RNFBAppUnitTests/RNFBHandleMapTests.m +238 -0
  206. package/ios/RNFBAppUnitTests/RNFBInitializeAppArgumentsTests.swift +256 -0
  207. package/ios/RNFBAppUnitTests/RNFBJSONImplementationTests.swift +126 -0
  208. package/ios/RNFBAppUnitTests/RNFBJSONTests.m +172 -0
  209. package/ios/RNFBAppUnitTests/RNFBMetaStorageTests.swift +106 -0
  210. package/ios/RNFBAppUnitTests/RNFBMetaTests.m +65 -0
  211. package/ios/RNFBAppUnitTests/RNFBNullSentinelDecodingTests.swift +286 -0
  212. package/ios/RNFBAppUnitTests/RNFBNullSentinelInterceptorTests.m +312 -0
  213. package/ios/RNFBAppUnitTests/RNFBPreferencesStorageTests.swift +105 -0
  214. package/ios/RNFBAppUnitTests/RNFBPreferencesTests.m +110 -0
  215. package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterCoreTests.swift +163 -0
  216. package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterFacadeTests.m +141 -0
  217. package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigFacadeTests.m +100 -0
  218. package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigTests.swift +234 -0
  219. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppFacadeTests.m +145 -0
  220. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppTests.swift +173 -0
  221. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingFacadeTests.m +38 -0
  222. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingTests.swift +82 -0
  223. package/ios/RNFBAppUnitTests/RNFBSharedUtilsNullSentinelTests.m +35 -0
  224. package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionFacadeTests.m +107 -0
  225. package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionTests.swift +133 -0
  226. package/ios/RNFBAppUnitTests/RNFBUtilsHelpersTests.swift +144 -0
  227. package/ios/RNFBAppUnitTests/RNFBUtilsModuleFacadeTests.m +72 -0
  228. package/ios/RNFBAppUnitTests/RNFBUtilsModuleShellTests.mm +282 -0
  229. package/ios/RNFBFirebase/Package.swift +53 -0
  230. package/ios/RNFBFirebase/Sources/RNFBFirebase/RNFBFirebase.swift +285 -0
  231. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/Public/.gitkeep +0 -0
  232. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/RNFBFirebaseBridge.m +169 -0
  233. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/include/RNFBFirebaseBridge.h +52 -0
  234. package/ios/RNFBFirebaseUnitTests/RNFBAppDynamicFacadeTests.swift +240 -0
  235. package/{android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppRegistrar.java → ios/RNFBFirebaseUnitTests/RNFBFirebaseClientImport.swift} +22 -17
  236. package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/project.pbxproj +588 -0
  237. package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBFirebaseUnitTests.xcscheme +83 -0
  238. package/ios_config.sh +50 -22
  239. package/lib/FirebaseApp.ts +10 -0
  240. package/lib/common/Base64.ts +10 -16
  241. package/lib/common/deeps.ts +3 -0
  242. package/lib/common/index.ts +20 -9
  243. package/lib/internal/FirebaseModule.ts +6 -3
  244. package/lib/internal/NativeModules.ts +4 -1
  245. package/lib/internal/RNFBNativeEventEmitter.ts +14 -5
  246. package/lib/internal/SharedEventEmitter.ts +5 -1
  247. package/lib/internal/asyncStorage.ts +7 -11
  248. package/lib/internal/index.ts +1 -0
  249. package/lib/internal/logger.ts +53 -43
  250. package/lib/internal/nativeModuleAndroidIos.ts +2 -40
  251. package/lib/internal/nativeModuleDebug.ts +97 -0
  252. package/lib/internal/nativeModuleWeb.ts +10 -40
  253. package/lib/internal/react-native-vendor-emitter.d.ts +11 -0
  254. package/lib/internal/registry/app.ts +8 -2
  255. package/lib/internal/registry/modular.ts +2 -2
  256. package/lib/internal/registry/nativeModule.ts +3 -3
  257. package/lib/internal/web/RNFBAppModule.ts +16 -15
  258. package/lib/internal/web/memidb/lib/FakeEventTarget.js +3 -1
  259. package/lib/types/app.ts +10 -3
  260. package/lib/types/internal.ts +19 -0
  261. package/lib/version.ts +1 -1
  262. package/package.json +9 -8
  263. package/plugin/build/ios/appDelegate.js +19 -9
  264. package/plugin/build/ios/podfile.js +16 -16
  265. package/plugin/build/pluginConfig.d.ts +4 -2
  266. package/plugin/src/ios/appDelegate.ts +45 -15
  267. package/plugin/src/ios/podfile.ts +20 -23
  268. package/plugin/src/pluginConfig.ts +4 -2
  269. package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.java +0 -124
  270. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebaseModule.java +0 -62
  271. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebasePreferences.java +0 -91
  272. package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java +0 -222
  273. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseApp.java +0 -46
  274. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java +0 -49
  275. package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java +0 -191
  276. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEvent.java +0 -53
  277. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitter.java +0 -606
  278. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java +0 -107
  279. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseMeta.java +0 -101
  280. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseModule.java +0 -146
  281. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebasePreferences.java +0 -96
  282. package/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.java +0 -441
  283. package/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.java +0 -223
@@ -0,0 +1,282 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #import <Photos/Photos.h>
18
+ #import <XCTest/XCTest.h>
19
+ #import <objc/runtime.h>
20
+
21
+ #import "RNFBAppTurboModules.h"
22
+ #import "RNFBUtilsModule.h"
23
+ #import "RNFBUtilsModuleImplementation.h"
24
+
25
+ /**
26
+ * Exercises the shipped `RNFBUtilsModule.mm` shell, the Android-only stubs in
27
+ * `RNFBUtilsModuleImplementation.m` and the PhotoKit category in
28
+ * `RNFBUtilsModule+PhotoAssets.m`. All three are compiled into this target.
29
+ */
30
+ @interface RNFBUtilsModule (ShellTesting)
31
+ - (facebook::react::ModuleConstants<JS::NativeRNFBTurboUtils::Constants>)constantsToExport;
32
+ - (facebook::react::ModuleConstants<JS::NativeRNFBTurboUtils::Constants>)getConstants;
33
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
34
+ (const facebook::react::ObjCTurboModule::InitParams &)params;
35
+ + (BOOL)requiresMainQueueSetup;
36
+ + (NSString *)moduleName;
37
+ - (void)androidGetPlayServicesStatus:(RCTPromiseResolveBlock)resolve
38
+ reject:(RCTPromiseRejectBlock)reject;
39
+ - (void)androidPromptForPlayServices:(RCTPromiseResolveBlock)resolve
40
+ reject:(RCTPromiseRejectBlock)reject;
41
+ - (void)androidResolutionForPlayServices:(RCTPromiseResolveBlock)resolve
42
+ reject:(RCTPromiseRejectBlock)reject;
43
+ - (void)androidMakePlayServicesAvailable:(RCTPromiseResolveBlock)resolve
44
+ reject:(RCTPromiseRejectBlock)reject;
45
+ @end
46
+
47
+ /** `PHFetchResult` stand-in whose `firstObject` is controlled by the test. */
48
+ @interface RNFBFakeFetchResult : PHFetchResult
49
+ @property(nonatomic, strong, nullable) PHAsset *stubbedFirstObject;
50
+ @end
51
+
52
+ @implementation RNFBFakeFetchResult
53
+ - (id)firstObject {
54
+ return self.stubbedFirstObject;
55
+ }
56
+ @end
57
+
58
+ static SEL PHAssetFetchSelector(void) {
59
+ return @selector(fetchAssetsWithLocalIdentifiers:options:);
60
+ }
61
+
62
+ @interface RNFBUtilsModuleShellTests : XCTestCase
63
+ @property(nonatomic, strong) PHAsset *fakeAsset;
64
+ @property(nonatomic, strong) NSMutableArray<NSArray<NSString *> *> *fetchedIdentifiers;
65
+ @property(nonatomic, strong) NSMutableArray<NSNumber *> *fetchedOptionsWereNil;
66
+ @property(nonatomic, assign) IMP originalFetchImplementation;
67
+ @end
68
+
69
+ @implementation RNFBUtilsModuleShellTests
70
+
71
+ #pragma mark - Module shell
72
+
73
+ - (void)testExportedModuleNameAndMainQueueSetup {
74
+ XCTAssertEqualObjects([RNFBUtilsModule moduleName], @"NativeRNFBTurboUtils");
75
+ XCTAssertFalse([RNFBUtilsModule requiresMainQueueSetup]);
76
+ }
77
+
78
+ - (void)testGetTurboModuleCreatesTheUtilsSpecModule {
79
+ RNFBUtilsModule *module = [[RNFBUtilsModule alloc] init];
80
+ facebook::react::ObjCTurboModule::InitParams params;
81
+
82
+ auto turboModule = [module getTurboModule:params];
83
+
84
+ XCTAssertTrue(turboModule != nullptr);
85
+ XCTAssertTrue(std::dynamic_pointer_cast<facebook::react::NativeRNFBTurboUtilsSpecJSI>(
86
+ turboModule) != nullptr);
87
+ }
88
+
89
+ - (void)testConstantsToExportAndGetConstantsReturnUtilsConstants {
90
+ RNFBUtilsModule *module = [[RNFBUtilsModule alloc] init];
91
+
92
+ auto exported = [module constantsToExport];
93
+ auto fetched = [module getConstants];
94
+
95
+ for (NSDictionary *constants in @[ exported.dictionary, fetched.dictionary ]) {
96
+ XCTAssertEqualObjects(constants[@"isRunningInTestLab"], @NO);
97
+ XCTAssertNotNil(constants[@"MAIN_BUNDLE"]);
98
+ XCTAssertNotNil(constants[@"TEMP_DIRECTORY"]);
99
+ XCTAssertNotNil(constants[@"CACHES_DIRECTORY"]);
100
+ }
101
+ XCTAssertEqualObjects(RNFBUtilsModuleConstantsDictionary()[@"isRunningInTestLab"], @NO);
102
+ }
103
+
104
+ #pragma mark - Android-only stubs
105
+
106
+ - (void)testAndroidPlayServicesStatusReportsAvailableOnIOS {
107
+ RNFBUtilsModule *module = [[RNFBUtilsModule alloc] init];
108
+ __block NSDictionary *viaModule = nil;
109
+ __block NSDictionary *viaFunction = nil;
110
+
111
+ [module
112
+ androidGetPlayServicesStatus:^(id result) {
113
+ viaModule = result;
114
+ }
115
+ reject:^(NSString *code, NSString *message, NSError *error) {
116
+ XCTFail(@"unexpected reject %@", message);
117
+ }];
118
+ RNFBUtilsModuleAndroidGetPlayServicesStatus(
119
+ ^(id result) {
120
+ viaFunction = result;
121
+ },
122
+ ^(NSString *code, NSString *message, NSError *error) {
123
+ XCTFail(@"unexpected reject %@", message);
124
+ });
125
+
126
+ NSDictionary *expected = @{
127
+ @"isAvailable" : @YES,
128
+ @"status" : @0,
129
+ @"hasResolution" : @NO,
130
+ @"isUserResolvableError" : @NO,
131
+ };
132
+ XCTAssertEqualObjects(viaModule, expected);
133
+ XCTAssertEqualObjects(viaFunction, expected);
134
+ }
135
+
136
+ - (void)testAndroidPromptResolutionAndMakeAvailableResolveNil {
137
+ RNFBUtilsModule *module = [[RNFBUtilsModule alloc] init];
138
+ RCTPromiseRejectBlock failOnReject = ^(NSString *code, NSString *message, NSError *error) {
139
+ XCTFail(@"unexpected reject %@", message);
140
+ };
141
+ __block NSUInteger resolveCount = 0;
142
+ __block BOOL sawNonNil = NO;
143
+ RCTPromiseResolveBlock countNil = ^(id result) {
144
+ resolveCount += 1;
145
+ sawNonNil = sawNonNil || result != nil;
146
+ };
147
+
148
+ [module androidPromptForPlayServices:countNil reject:failOnReject];
149
+ [module androidResolutionForPlayServices:countNil reject:failOnReject];
150
+ [module androidMakePlayServicesAvailable:countNil reject:failOnReject];
151
+ RNFBUtilsModuleAndroidPromptForPlayServices(countNil, failOnReject);
152
+ RNFBUtilsModuleAndroidResolutionForPlayServices(countNil, failOnReject);
153
+ RNFBUtilsModuleAndroidMakePlayServicesAvailable(countNil, failOnReject);
154
+
155
+ XCTAssertEqual(resolveCount, 6);
156
+ XCTAssertFalse(sawNonNil);
157
+ }
158
+
159
+ #pragma mark - PhotoKit category
160
+
161
+ - (void)testAssetsLibraryPathsAreUnsupportedAndNeverQueryPhotos {
162
+ [self stubPhotoLibraryReturning:[self fetchResultContaining:self.fakeAsset]];
163
+
164
+ // The one-time warning is suppressed on later calls; the result stays nil and PhotoKit is never
165
+ // consulted for the removed `assets-library://` scheme, even when an id is present.
166
+ XCTAssertNil([RNFBUtilsModule fetchAssetForPath:@"assets-library://asset/asset.JPG?id=1"]);
167
+ XCTAssertNil([RNFBUtilsModule fetchAssetForPath:@"assets-library://asset/asset.JPG?id=2"]);
168
+
169
+ XCTAssertEqual(self.fetchedIdentifiers.count, 0);
170
+ }
171
+
172
+ - (void)testPhotoLibraryPathPassesEverythingAfterTheSchemeToPhotoKit {
173
+ [self stubPhotoLibraryReturning:[self fetchResultContaining:self.fakeAsset]];
174
+
175
+ PHAsset *asset = [RNFBUtilsModule fetchAssetForPath:@"ph://ABC-123/L0/001"];
176
+
177
+ XCTAssertEqual(asset, self.fakeAsset);
178
+ XCTAssertEqualObjects(self.fetchedIdentifiers, @[ @[ @"ABC-123/L0/001" ] ]);
179
+ XCTAssertEqual(self.fetchedOptionsWereNil.count, 1);
180
+ XCTAssertEqualObjects(self.fetchedOptionsWereNil.firstObject, @YES);
181
+ }
182
+
183
+ - (void)testPhotoLibraryPathWithNoMatchingAssetReturnsNil {
184
+ [self stubPhotoLibraryReturning:[self fetchResultContaining:nil]];
185
+
186
+ XCTAssertNil([RNFBUtilsModule fetchAssetForPath:@"ph://missing-local-identifier"]);
187
+ XCTAssertEqualObjects(self.fetchedIdentifiers, @[ @[ @"missing-local-identifier" ] ]);
188
+ }
189
+
190
+ - (void)testPhotoLibraryPathWithNoIdentifierLooksUpTheEmptyIdentifier {
191
+ [self stubPhotoLibraryReturning:[self fetchResultContaining:nil]];
192
+
193
+ XCTAssertNil([RNFBUtilsModule fetchAssetForPath:@"ph://"]);
194
+ XCTAssertEqualObjects(self.fetchedIdentifiers, @[ @[ @"" ] ]);
195
+ }
196
+
197
+ - (void)testOtherPathsLookUpTheIdQueryItem {
198
+ [self stubPhotoLibraryReturning:[self fetchResultContaining:self.fakeAsset]];
199
+
200
+ PHAsset *asset =
201
+ [RNFBUtilsModule fetchAssetForPath:@"file:///asset.jpg?w=100&id=local-identifier&h=50"];
202
+
203
+ XCTAssertEqual(asset, self.fakeAsset);
204
+ XCTAssertEqualObjects(self.fetchedIdentifiers, @[ @[ @"local-identifier" ] ]);
205
+ XCTAssertEqualObjects(self.fetchedOptionsWereNil.firstObject, @YES);
206
+ }
207
+
208
+ - (void)testOtherPathsWithNoMatchingAssetReturnNil {
209
+ [self stubPhotoLibraryReturning:[self fetchResultContaining:nil]];
210
+
211
+ XCTAssertNil(
212
+ [RNFBUtilsModule fetchAssetForPath:@"file:///asset.jpg?id=missing-local-identifier"]);
213
+ XCTAssertEqualObjects(self.fetchedIdentifiers, @[ @[ @"missing-local-identifier" ] ]);
214
+ }
215
+
216
+ - (void)testOtherPathsWithoutAnIdQueryItemRaiseBeforeQueryingPhotos {
217
+ [self stubPhotoLibraryReturning:[self fetchResultContaining:self.fakeAsset]];
218
+
219
+ // Pre-port parity: a missing `id` yields a nil identifier and the `@[ assetId ]` literal
220
+ // raises. `RNFBStorageCommon` only reaches this method for `ph://` / `assets-library://`
221
+ // paths (`isRemoteAsset:`), so this is not reachable from the storage upload flow.
222
+ for (NSString *path in @[ @"file:///asset.jpg", @"file:///asset.jpg?other=1", @"" ]) {
223
+ XCTAssertThrowsSpecificNamed([RNFBUtilsModule fetchAssetForPath:path], NSException,
224
+ NSInvalidArgumentException, @"%@", path);
225
+ }
226
+ XCTAssertEqual(self.fetchedIdentifiers.count, 0);
227
+ }
228
+
229
+ - (void)testUnknownIdentifiersReturnNilWhenPhotoKitFindsNothing {
230
+ // Hostless macOS XCTest has no NSPhotoLibraryUsageDescription; never touch live PhotoKit.
231
+ // Stub an empty fetch for both lookup branches (`ph://` and `file://?id=`).
232
+ [self stubPhotoLibraryReturning:[self fetchResultContaining:nil]];
233
+
234
+ XCTAssertNil([RNFBUtilsModule fetchAssetForPath:@"ph://missing-local-identifier"]);
235
+ XCTAssertNil(
236
+ [RNFBUtilsModule fetchAssetForPath:@"file:///asset.jpg?id=missing-local-identifier"]);
237
+ XCTAssertEqualObjects(self.fetchedIdentifiers, (@[
238
+ @[ @"missing-local-identifier" ],
239
+ @[ @"missing-local-identifier" ],
240
+ ]));
241
+ }
242
+
243
+ #pragma mark - PhotoKit stubbing
244
+
245
+ - (void)setUp {
246
+ [super setUp];
247
+ self.fakeAsset = (PHAsset *)class_createInstance([PHAsset class], 0);
248
+ self.fetchedIdentifiers = [NSMutableArray array];
249
+ self.fetchedOptionsWereNil = [NSMutableArray array];
250
+ }
251
+
252
+ - (void)tearDown {
253
+ if (self.originalFetchImplementation != NULL) {
254
+ Method method = class_getClassMethod([PHAsset class], PHAssetFetchSelector());
255
+ method_setImplementation(method, self.originalFetchImplementation);
256
+ self.originalFetchImplementation = NULL;
257
+ }
258
+ [super tearDown];
259
+ }
260
+
261
+ - (id)fetchResultContaining:(PHAsset *)asset {
262
+ RNFBFakeFetchResult *result =
263
+ (RNFBFakeFetchResult *)class_createInstance([RNFBFakeFetchResult class], 0);
264
+ result.stubbedFirstObject = asset;
265
+ return result;
266
+ }
267
+
268
+ /** Replaces `+[PHAsset fetchAssetsWithLocalIdentifiers:options:]`, recording each call. */
269
+ - (void)stubPhotoLibraryReturning:(id)fetchResult {
270
+ Method method = class_getClassMethod([PHAsset class], PHAssetFetchSelector());
271
+ self.originalFetchImplementation = method_getImplementation(method);
272
+ __weak RNFBUtilsModuleShellTests *weakSelf = self;
273
+ IMP stub = imp_implementationWithBlock(
274
+ ^id(id _self, NSArray<NSString *> *identifiers, PHFetchOptions *options) {
275
+ [weakSelf.fetchedIdentifiers addObject:identifiers];
276
+ [weakSelf.fetchedOptionsWereNil addObject:@(options == nil)];
277
+ return fetchResult;
278
+ });
279
+ method_setImplementation(method, stub);
280
+ }
281
+
282
+ @end
@@ -0,0 +1,53 @@
1
+ // swift-tools-version: 5.9
2
+ //
3
+ // CI probe only (RNFB_TEST_RN_BARE_DYNAMIC_FIREBASE=1). Shipped podspecs keep
4
+ // spm_dependency on firebase-ios-sdk. Exact pin tracks packages/app/package.json
5
+ // sdkVersions.ios.firebase (checked by .github/workflows/scripts/check-ios-probe-sdk-pin.js).
6
+ //
7
+ // This package resolver rejects mixed Swift and Objective-C sources in one
8
+ // target. SDK calls live in RNFBFirebaseBridge. The dynamic product links that
9
+ // target beside the Swift target. The Swift target does not depend on it, so
10
+ // the emitted module does not record FirebaseCore for clients.
11
+
12
+ import PackageDescription
13
+
14
+ let package = Package(
15
+ name: "RNFBFirebase",
16
+ platforms: [
17
+ .iOS(.v15),
18
+ .macOS(.v11),
19
+ .tvOS(.v15),
20
+ ],
21
+ products: [
22
+ .library(
23
+ name: "RNFBFirebase",
24
+ type: .dynamic,
25
+ targets: ["RNFBFirebase", "RNFBFirebaseBridge"]
26
+ ),
27
+ ],
28
+ dependencies: [
29
+ .package(
30
+ url: "https://github.com/firebase/firebase-ios-sdk.git",
31
+ exact: "13.0.0"
32
+ ),
33
+ ],
34
+ targets: [
35
+ .target(
36
+ name: "RNFBFirebaseBridge",
37
+ dependencies: [
38
+ .product(name: "FirebaseCore", package: "firebase-ios-sdk"),
39
+ .product(name: "FirebaseInstallations", package: "firebase-ios-sdk"),
40
+ ],
41
+ // Public headers stay empty so this clang target does not publish a
42
+ // module. The dynamic product still links the object file. The Swift
43
+ // target does not depend on it, so clients do not inherit FirebaseCore.
44
+ publicHeadersPath: "Public",
45
+ cSettings: [
46
+ .headerSearchPath("include"),
47
+ ]
48
+ ),
49
+ .target(
50
+ name: "RNFBFirebase"
51
+ ),
52
+ ]
53
+ )
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import Foundation
18
+
19
+ /// Foundation-only snapshot of a live app for RNFBApp mapping code.
20
+ public final class RNFBFirebaseAppSnapshot: NSObject {
21
+ public let name: String
22
+ public let apiKey: String?
23
+ public let googleAppID: String?
24
+ public let projectID: String?
25
+ public let databaseURL: String?
26
+ public let storageBucket: String?
27
+ public let gcmSenderID: String?
28
+ public let clientID: String?
29
+ public let isDataCollectionDefaultEnabled: Bool
30
+
31
+ public init(
32
+ name: String,
33
+ apiKey: String?,
34
+ googleAppID: String?,
35
+ projectID: String?,
36
+ databaseURL: String?,
37
+ storageBucket: String?,
38
+ gcmSenderID: String?,
39
+ clientID: String?,
40
+ isDataCollectionDefaultEnabled: Bool
41
+ ) {
42
+ self.name = name
43
+ self.apiKey = apiKey
44
+ self.googleAppID = googleAppID
45
+ self.projectID = projectID
46
+ self.databaseURL = databaseURL
47
+ self.storageBucket = storageBucket
48
+ self.gcmSenderID = gcmSenderID
49
+ self.clientID = clientID
50
+ self.isDataCollectionDefaultEnabled = isDataCollectionDefaultEnabled
51
+ }
52
+ }
53
+
54
+ /// Live options operations. Public signatures stay Foundation types.
55
+ public enum RNFBFirebaseOptionsClient {
56
+ public static func create(googleAppID: String?, gcmSenderID: String?) -> NSObject {
57
+ rnfbWithCString(googleAppID) { appID in
58
+ rnfbWithCString(gcmSenderID) { senderID in
59
+ rnfbRetainedObject(RNFBFirebaseCreateOptions(appID, senderID))
60
+ }
61
+ }
62
+ }
63
+
64
+ public static func apiKey(_ options: NSObject) -> String? {
65
+ rnfbString(RNFBFirebaseOptionsAPIKey(options))
66
+ }
67
+
68
+ public static func setAPIKey(_ value: String?, on options: NSObject) {
69
+ rnfbWithCString(value) { RNFBFirebaseOptionsSetAPIKey(options, $0) }
70
+ }
71
+
72
+ public static func projectID(_ options: NSObject) -> String? {
73
+ rnfbString(RNFBFirebaseOptionsProjectID(options))
74
+ }
75
+
76
+ public static func setProjectID(_ value: String?, on options: NSObject) {
77
+ rnfbWithCString(value) { RNFBFirebaseOptionsSetProjectID(options, $0) }
78
+ }
79
+
80
+ public static func clientID(_ options: NSObject) -> String? {
81
+ rnfbString(RNFBFirebaseOptionsClientID(options))
82
+ }
83
+
84
+ public static func setClientID(_ value: String?, on options: NSObject) {
85
+ rnfbWithCString(value) { RNFBFirebaseOptionsSetClientID(options, $0) }
86
+ }
87
+
88
+ public static func databaseURL(_ options: NSObject) -> String? {
89
+ rnfbString(RNFBFirebaseOptionsDatabaseURL(options))
90
+ }
91
+
92
+ public static func setDatabaseURL(_ value: String?, on options: NSObject) {
93
+ rnfbWithCString(value) { RNFBFirebaseOptionsSetDatabaseURL(options, $0) }
94
+ }
95
+
96
+ public static func storageBucket(_ options: NSObject) -> String? {
97
+ rnfbString(RNFBFirebaseOptionsStorageBucket(options))
98
+ }
99
+
100
+ public static func setStorageBucket(_ value: String?, on options: NSObject) {
101
+ rnfbWithCString(value) { RNFBFirebaseOptionsSetStorageBucket(options, $0) }
102
+ }
103
+
104
+ public static func bundleID(_ options: NSObject) -> String? {
105
+ rnfbString(RNFBFirebaseOptionsBundleID(options))
106
+ }
107
+
108
+ public static func setBundleID(_ value: String?, on options: NSObject) {
109
+ rnfbWithCString(value) { RNFBFirebaseOptionsSetBundleID(options, $0) }
110
+ }
111
+
112
+ public static func appGroupID(_ options: NSObject) -> String? {
113
+ rnfbString(RNFBFirebaseOptionsAppGroupID(options))
114
+ }
115
+
116
+ public static func setAppGroupID(_ value: String?, on options: NSObject) {
117
+ rnfbWithCString(value) { RNFBFirebaseOptionsSetAppGroupID(options, $0) }
118
+ }
119
+ }
120
+
121
+ /// Live app operations. No SDK types cross this boundary.
122
+ public enum RNFBFirebaseAppClient {
123
+ public static func defaultApp() -> NSObject? {
124
+ rnfbObject(RNFBFirebaseDefaultApp())
125
+ }
126
+
127
+ public static func app(named name: String) -> NSObject? {
128
+ name.withCString { rnfbObject(RNFBFirebaseAppNamed($0)) }
129
+ }
130
+
131
+ public static func allApps() -> [AnyHashable: Any]? {
132
+ guard let apps = rnfbDictionary(RNFBFirebaseAllApps()) else { return nil }
133
+ var result: [AnyHashable: Any] = [:]
134
+ for (key, value) in apps {
135
+ guard let key = key as? AnyHashable else { continue }
136
+ result[key] = value
137
+ }
138
+ return result
139
+ }
140
+
141
+ /// Default-plist configure. The dynamic probe app cannot name the SDK app type.
142
+ public static func configure() {
143
+ RNFBFirebaseConfigure()
144
+ }
145
+
146
+ public static func configure(options: NSObject) {
147
+ RNFBFirebaseConfigureWithOptions(options)
148
+ }
149
+
150
+ public static func configure(name: String, options: NSObject) {
151
+ name.withCString { RNFBFirebaseConfigureWithName($0, options) }
152
+ }
153
+
154
+ public static func snapshot(of app: NSObject) -> RNFBFirebaseAppSnapshot {
155
+ let raw = rnfbDictionary(RNFBFirebaseSnapshot(app)) ?? [:]
156
+ return RNFBFirebaseAppSnapshot(
157
+ name: raw["name"] as? String ?? "",
158
+ apiKey: snapshotString(raw, "apiKey"),
159
+ googleAppID: snapshotString(raw, "googleAppID"),
160
+ projectID: snapshotString(raw, "projectID"),
161
+ databaseURL: snapshotString(raw, "databaseURL"),
162
+ storageBucket: snapshotString(raw, "storageBucket"),
163
+ gcmSenderID: snapshotString(raw, "gcmSenderID"),
164
+ clientID: snapshotString(raw, "clientID"),
165
+ isDataCollectionDefaultEnabled: raw["isDataCollectionDefaultEnabled"] as? Bool ?? false
166
+ )
167
+ }
168
+
169
+ /// Returns false when `app` is not a live app (caller no-ops).
170
+ public static func setDataCollectionDefaultEnabled(_ enabled: Bool, forApp app: NSObject) -> Bool {
171
+ RNFBFirebaseSetDataCollectionDefaultEnabled(ObjCBool(enabled), app).boolValue
172
+ }
173
+
174
+ /// Returns false when `app` is not a live app. Does not invoke `completion` in that case.
175
+ public static func deleteApp(_ app: NSObject, completion: @escaping (Bool) -> Void) -> Bool {
176
+ RNFBFirebaseDeleteApp(app) { success in
177
+ completion(success.boolValue)
178
+ }.boolValue
179
+ }
180
+
181
+ public static func setLoggerLevel(_ level: Int) {
182
+ RNFBFirebaseSetLoggerLevel(level)
183
+ }
184
+
185
+ public static func registerLibrary(name: String, version: String) {
186
+ name.withCString { libraryName in
187
+ version.withCString { libraryVersion in
188
+ RNFBFirebaseRegisterLibrary(libraryName, libraryVersion)
189
+ }
190
+ }
191
+ }
192
+
193
+ private static func snapshotString(_ raw: NSDictionary, _ key: String) -> String? {
194
+ guard let value = raw[key], !(value is NSNull) else { return nil }
195
+ return value as? String
196
+ }
197
+ }
198
+
199
+ // `@_silgen_name` sees the C ABI directly. Class optionals are not null
200
+ // pointers here, so object results cross as `OpaquePointer`. +0 results use
201
+ // `takeUnretainedValue`. The Create result is +1 and uses `takeRetainedValue`.
202
+
203
+ private func rnfbWithCString<T>(_ value: String?, _ body: (UnsafePointer<CChar>?) -> T) -> T {
204
+ guard let value else { return body(nil) }
205
+ return value.withCString(body)
206
+ }
207
+
208
+ private func rnfbRetainedObject(_ pointer: OpaquePointer) -> NSObject {
209
+ Unmanaged<NSObject>.fromOpaque(UnsafeMutableRawPointer(pointer)).takeRetainedValue()
210
+ }
211
+
212
+ private func rnfbObject(_ pointer: OpaquePointer?) -> NSObject? {
213
+ guard let pointer else { return nil }
214
+ return Unmanaged<NSObject>.fromOpaque(UnsafeMutableRawPointer(pointer)).takeUnretainedValue()
215
+ }
216
+
217
+ private func rnfbString(_ pointer: OpaquePointer?) -> String? {
218
+ guard let pointer else { return nil }
219
+ let value = Unmanaged<NSString>.fromOpaque(UnsafeMutableRawPointer(pointer)).takeUnretainedValue()
220
+ return value as String
221
+ }
222
+
223
+ private func rnfbDictionary(_ pointer: OpaquePointer?) -> NSDictionary? {
224
+ guard let pointer else { return nil }
225
+ return Unmanaged<NSDictionary>.fromOpaque(UnsafeMutableRawPointer(pointer)).takeUnretainedValue()
226
+ }
227
+
228
+ @_silgen_name("RNFBFirebaseCreateOptions")
229
+ private func RNFBFirebaseCreateOptions(
230
+ _ googleAppID: UnsafePointer<CChar>?,
231
+ _ senderID: UnsafePointer<CChar>?
232
+ ) -> OpaquePointer
233
+ @_silgen_name("RNFBFirebaseOptionsAPIKey")
234
+ private func RNFBFirebaseOptionsAPIKey(_ options: NSObject) -> OpaquePointer?
235
+ @_silgen_name("RNFBFirebaseOptionsSetAPIKey")
236
+ private func RNFBFirebaseOptionsSetAPIKey(_ options: NSObject, _ value: UnsafePointer<CChar>?)
237
+ @_silgen_name("RNFBFirebaseOptionsProjectID")
238
+ private func RNFBFirebaseOptionsProjectID(_ options: NSObject) -> OpaquePointer?
239
+ @_silgen_name("RNFBFirebaseOptionsSetProjectID")
240
+ private func RNFBFirebaseOptionsSetProjectID(_ options: NSObject, _ value: UnsafePointer<CChar>?)
241
+ @_silgen_name("RNFBFirebaseOptionsClientID")
242
+ private func RNFBFirebaseOptionsClientID(_ options: NSObject) -> OpaquePointer?
243
+ @_silgen_name("RNFBFirebaseOptionsSetClientID")
244
+ private func RNFBFirebaseOptionsSetClientID(_ options: NSObject, _ value: UnsafePointer<CChar>?)
245
+ @_silgen_name("RNFBFirebaseOptionsDatabaseURL")
246
+ private func RNFBFirebaseOptionsDatabaseURL(_ options: NSObject) -> OpaquePointer?
247
+ @_silgen_name("RNFBFirebaseOptionsSetDatabaseURL")
248
+ private func RNFBFirebaseOptionsSetDatabaseURL(_ options: NSObject, _ value: UnsafePointer<CChar>?)
249
+ @_silgen_name("RNFBFirebaseOptionsStorageBucket")
250
+ private func RNFBFirebaseOptionsStorageBucket(_ options: NSObject) -> OpaquePointer?
251
+ @_silgen_name("RNFBFirebaseOptionsSetStorageBucket")
252
+ private func RNFBFirebaseOptionsSetStorageBucket(_ options: NSObject, _ value: UnsafePointer<CChar>?)
253
+ @_silgen_name("RNFBFirebaseOptionsBundleID")
254
+ private func RNFBFirebaseOptionsBundleID(_ options: NSObject) -> OpaquePointer?
255
+ @_silgen_name("RNFBFirebaseOptionsSetBundleID")
256
+ private func RNFBFirebaseOptionsSetBundleID(_ options: NSObject, _ value: UnsafePointer<CChar>?)
257
+ @_silgen_name("RNFBFirebaseOptionsAppGroupID")
258
+ private func RNFBFirebaseOptionsAppGroupID(_ options: NSObject) -> OpaquePointer?
259
+ @_silgen_name("RNFBFirebaseOptionsSetAppGroupID")
260
+ private func RNFBFirebaseOptionsSetAppGroupID(_ options: NSObject, _ value: UnsafePointer<CChar>?)
261
+ @_silgen_name("RNFBFirebaseDefaultApp")
262
+ private func RNFBFirebaseDefaultApp() -> OpaquePointer?
263
+ @_silgen_name("RNFBFirebaseAppNamed")
264
+ private func RNFBFirebaseAppNamed(_ name: UnsafePointer<CChar>) -> OpaquePointer?
265
+ @_silgen_name("RNFBFirebaseAllApps")
266
+ private func RNFBFirebaseAllApps() -> OpaquePointer?
267
+ @_silgen_name("RNFBFirebaseConfigure")
268
+ private func RNFBFirebaseConfigure()
269
+ @_silgen_name("RNFBFirebaseConfigureWithOptions")
270
+ private func RNFBFirebaseConfigureWithOptions(_ options: NSObject)
271
+ @_silgen_name("RNFBFirebaseConfigureWithName")
272
+ private func RNFBFirebaseConfigureWithName(_ name: UnsafePointer<CChar>, _ options: NSObject)
273
+ @_silgen_name("RNFBFirebaseSnapshot")
274
+ private func RNFBFirebaseSnapshot(_ app: NSObject) -> OpaquePointer
275
+ @_silgen_name("RNFBFirebaseSetDataCollectionDefaultEnabled")
276
+ private func RNFBFirebaseSetDataCollectionDefaultEnabled(_ enabled: ObjCBool, _ app: NSObject) -> ObjCBool
277
+ @_silgen_name("RNFBFirebaseDeleteApp")
278
+ private func RNFBFirebaseDeleteApp(
279
+ _ app: NSObject,
280
+ _ completion: @convention(block) (ObjCBool) -> Void
281
+ ) -> ObjCBool
282
+ @_silgen_name("RNFBFirebaseSetLoggerLevel")
283
+ private func RNFBFirebaseSetLoggerLevel(_ level: Int)
284
+ @_silgen_name("RNFBFirebaseRegisterLibrary")
285
+ private func RNFBFirebaseRegisterLibrary(_ name: UnsafePointer<CChar>, _ version: UnsafePointer<CChar>)