@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
package/ios_config.sh CHANGED
@@ -32,7 +32,7 @@ _MAX_LOOKUPS=2;
32
32
  _SEARCH_RESULT=''
33
33
  _RN_ROOT_EXISTS=''
34
34
  _CURRENT_LOOKUPS=1
35
- _JSON_ROOT="'react-native'"
35
+ _JSON_ROOT='react-native'
36
36
  _JSON_FILE_NAME='firebase.json'
37
37
  _JSON_OUTPUT_BASE64='e30=' # { }
38
38
  _CURRENT_SEARCH_DIR=${PROJECT_DIR}
@@ -47,12 +47,33 @@ _PLIST_ENTRY_VALUES=()
47
47
 
48
48
  function setPlistValue {
49
49
  echo "note: setting plist entry '$1' of type '$2' in file '$4'"
50
- ${_PLIST_BUDDY} -c "Add :$1 $2 '$3'" $4 || echo "note: '$1' already exists"
50
+ # PlistBuddy is macOS-only (Xcode builds). Fall back to python3 plistlib so
51
+ # unit tests can exercise this script on Linux CI (ubuntu-latest).
52
+ if [[ -x "${_PLIST_BUDDY}" ]]; then
53
+ ${_PLIST_BUDDY} -c "Add :$1 $2 '$3'" $4 || echo "note: '$1' already exists"
54
+ else
55
+ python3 - "$1" "$2" "$3" "$4" <<'PY' || echo "note: failed to set '$1'"
56
+ import plistlib
57
+ import sys
58
+
59
+ key, typ, value, path = sys.argv[1:5]
60
+ with open(path, "rb") as handle:
61
+ data = plistlib.load(handle)
62
+ if key in data:
63
+ sys.exit(0)
64
+ if typ == "bool":
65
+ data[key] = value in ("YES", "true", "1")
66
+ else:
67
+ data[key] = value
68
+ with open(path, "wb") as handle:
69
+ plistlib.dump(data, handle)
70
+ PY
71
+ fi
51
72
  }
52
73
 
53
74
  function getFirebaseJsonKeyValue () {
54
75
  if [[ ${_RN_ROOT_EXISTS} ]]; then
55
- ruby -Ku -e "require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']"
76
+ ruby -rjson -e 'output=JSON.parse(File.read(ARGV.fetch(0))); puts output[ARGV.fetch(1)][ARGV.fetch(2)]' "$_SEARCH_RESULT" "$_JSON_ROOT" "$1"
56
77
  else
57
78
  echo ""
58
79
  fi;
@@ -87,15 +108,14 @@ while true; do
87
108
  done
88
109
 
89
110
  if [[ ${_SEARCH_RESULT} ]]; then
90
- _JSON_OUTPUT_RAW=$(cat "${_SEARCH_RESULT}")
91
- if ! _RN_ROOT_EXISTS=$(ruby -Ku -e "require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]"); then
111
+ if ! _RN_ROOT_EXISTS=$(ruby -rjson -e 'output=JSON.parse(File.read(ARGV.fetch(0))); puts output[ARGV.fetch(1)]' "$_SEARCH_RESULT" "$_JSON_ROOT"); then
92
112
  echo "error: Failed to parse firebase.json, check for syntax errors."
93
113
  exit 1
94
114
  fi
95
115
 
96
116
  if [[ ${_RN_ROOT_EXISTS} ]]; then
97
117
  if ! python3 --version >/dev/null 2>&1; then echo "error: python3 not found, firebase.json file processing error." && exit 1; fi
98
- _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('"'${_SEARCH_RESULT}'"', '"'rb'"').read())['${_JSON_ROOT}']), '"'utf-8'"')).decode())' || echo "e30=")
118
+ _JSON_OUTPUT_BASE64=$(python3 -c 'import base64,json,sys; print(base64.b64encode(json.dumps(json.load(open(sys.argv[1], "rb"))["react-native"]).encode()).decode())' "$_SEARCH_RESULT" || echo "e30=")
99
119
  fi
100
120
 
101
121
  _PLIST_ENTRY_KEYS+=("firebase_json_raw")
@@ -103,7 +123,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
103
123
  _PLIST_ENTRY_VALUES+=("$_JSON_OUTPUT_BASE64")
104
124
 
105
125
  # config.app_data_collection_default_enabled
106
- _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "app_data_collection_default_enabled")
126
+ _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue "app_data_collection_default_enabled")
107
127
  if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then
108
128
  _PLIST_ENTRY_KEYS+=("FirebaseDataCollectionDefaultEnabled")
109
129
  _PLIST_ENTRY_TYPES+=("bool")
@@ -111,7 +131,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
111
131
  fi
112
132
 
113
133
  # config.analytics_auto_collection_enabled
114
- _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "analytics_auto_collection_enabled")
134
+ _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue "analytics_auto_collection_enabled")
115
135
  if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then
116
136
  _PLIST_ENTRY_KEYS+=("FIREBASE_ANALYTICS_COLLECTION_ENABLED")
117
137
  _PLIST_ENTRY_TYPES+=("bool")
@@ -119,7 +139,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
119
139
  fi
120
140
 
121
141
  # config.analytics_collection_deactivated
122
- _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "analytics_collection_deactivated")
142
+ _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue "analytics_collection_deactivated")
123
143
  if [[ $_ANALYTICS_DEACTIVATED ]]; then
124
144
  _PLIST_ENTRY_KEYS+=("FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED")
125
145
  _PLIST_ENTRY_TYPES+=("bool")
@@ -127,7 +147,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
127
147
  fi
128
148
 
129
149
  # config.analytics_idfv_collection_enabled
130
- _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "analytics_idfv_collection_enabled")
150
+ _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue "analytics_idfv_collection_enabled")
131
151
  if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then
132
152
  _PLIST_ENTRY_KEYS+=("GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED")
133
153
  _PLIST_ENTRY_TYPES+=("bool")
@@ -135,7 +155,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
135
155
  fi
136
156
 
137
157
  # config.analytics_default_allow_analytics_storage
138
- _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "analytics_default_allow_analytics_storage")
158
+ _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue "analytics_default_allow_analytics_storage")
139
159
  if [[ $_ANALYTICS_STORAGE ]]; then
140
160
  _PLIST_ENTRY_KEYS+=("GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE")
141
161
  _PLIST_ENTRY_TYPES+=("bool")
@@ -143,7 +163,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
143
163
  fi
144
164
 
145
165
  # config.analytics_default_allow_ad_storage
146
- _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "analytics_default_allow_ad_storage")
166
+ _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue "analytics_default_allow_ad_storage")
147
167
  if [[ $_ANALYTICS_AD_STORAGE ]]; then
148
168
  _PLIST_ENTRY_KEYS+=("GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE")
149
169
  _PLIST_ENTRY_TYPES+=("bool")
@@ -151,7 +171,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
151
171
  fi
152
172
 
153
173
  # config.analytics_default_allow_ad_user_data
154
- _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "analytics_default_allow_ad_user_data")
174
+ _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue "analytics_default_allow_ad_user_data")
155
175
  if [[ $_ANALYTICS_AD_USER_DATA ]]; then
156
176
  _PLIST_ENTRY_KEYS+=("GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA")
157
177
  _PLIST_ENTRY_TYPES+=("bool")
@@ -159,7 +179,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
159
179
  fi
160
180
 
161
181
  # config.analytics_default_allow_ad_personalization_signals
162
- _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "analytics_default_allow_ad_personalization_signals")
182
+ _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue "analytics_default_allow_ad_personalization_signals")
163
183
  if [[ $_ANALYTICS_PERSONALIZATION ]]; then
164
184
  _PLIST_ENTRY_KEYS+=("GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS")
165
185
  _PLIST_ENTRY_TYPES+=("bool")
@@ -167,7 +187,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
167
187
  fi
168
188
 
169
189
  # config.analytics_registration_with_ad_network_enabled
170
- _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "google_analytics_registration_with_ad_network_enabled")
190
+ _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue "google_analytics_registration_with_ad_network_enabled")
171
191
  if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then
172
192
  _PLIST_ENTRY_KEYS+=("GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED")
173
193
  _PLIST_ENTRY_TYPES+=("bool")
@@ -175,7 +195,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
175
195
  fi
176
196
 
177
197
  # config.google_analytics_automatic_screen_reporting_enabled
178
- _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "google_analytics_automatic_screen_reporting_enabled")
198
+ _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue "google_analytics_automatic_screen_reporting_enabled")
179
199
  if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then
180
200
  _PLIST_ENTRY_KEYS+=("FirebaseAutomaticScreenReportingEnabled")
181
201
  _PLIST_ENTRY_TYPES+=("bool")
@@ -183,7 +203,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
183
203
  fi
184
204
 
185
205
  # config.perf_auto_collection_enabled
186
- _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "perf_auto_collection_enabled")
206
+ _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue "perf_auto_collection_enabled")
187
207
  if [[ $_PERF_AUTO_COLLECTION ]]; then
188
208
  _PLIST_ENTRY_KEYS+=("firebase_performance_collection_enabled")
189
209
  _PLIST_ENTRY_TYPES+=("bool")
@@ -191,7 +211,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
191
211
  fi
192
212
 
193
213
  # config.perf_collection_deactivated
194
- _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "perf_collection_deactivated")
214
+ _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue "perf_collection_deactivated")
195
215
  if [[ $_PERF_DEACTIVATED ]]; then
196
216
  _PLIST_ENTRY_KEYS+=("firebase_performance_collection_deactivated")
197
217
  _PLIST_ENTRY_TYPES+=("bool")
@@ -199,15 +219,23 @@ if [[ ${_SEARCH_RESULT} ]]; then
199
219
  fi
200
220
 
201
221
  # config.messaging_auto_init_enabled
202
- _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "messaging_auto_init_enabled")
222
+ _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue "messaging_auto_init_enabled")
203
223
  if [[ $_MESSAGING_AUTO_INIT ]]; then
204
224
  _PLIST_ENTRY_KEYS+=("FirebaseMessagingAutoInitEnabled")
205
225
  _PLIST_ENTRY_TYPES+=("bool")
206
226
  _PLIST_ENTRY_VALUES+=("$(jsonBoolToYesNo "$_MESSAGING_AUTO_INIT")")
207
227
  fi
208
228
 
229
+ # config.messaging_installation_id_enabled
230
+ _MESSAGING_INSTALLATION_ID=$(getFirebaseJsonKeyValue "messaging_installation_id_enabled")
231
+ if [[ $_MESSAGING_INSTALLATION_ID ]]; then
232
+ _PLIST_ENTRY_KEYS+=("FirebaseMessagingInstallationIdEnabled")
233
+ _PLIST_ENTRY_TYPES+=("bool")
234
+ _PLIST_ENTRY_VALUES+=("$(jsonBoolToYesNo "$_MESSAGING_INSTALLATION_ID")")
235
+ fi
236
+
209
237
  # config.in_app_messaging_auto_colllection_enabled
210
- _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "in_app_messaging_auto_collection_enabled")
238
+ _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue "in_app_messaging_auto_collection_enabled")
211
239
  if [[ $_FIAM_AUTO_INIT ]]; then
212
240
  _PLIST_ENTRY_KEYS+=("FirebaseInAppMessagingAutomaticDataCollectionEnabled")
213
241
  _PLIST_ENTRY_TYPES+=("bool")
@@ -215,7 +243,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
215
243
  fi
216
244
 
217
245
  # config.app_check_token_auto_refresh
218
- _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "app_check_token_auto_refresh")
246
+ _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue "app_check_token_auto_refresh")
219
247
  if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then
220
248
  _PLIST_ENTRY_KEYS+=("FirebaseAppCheckTokenAutoRefreshEnabled")
221
249
  _PLIST_ENTRY_TYPES+=("bool")
@@ -223,7 +251,7 @@ if [[ ${_SEARCH_RESULT} ]]; then
223
251
  fi
224
252
 
225
253
  # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful
226
- _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue "$_JSON_OUTPUT_RAW" "crashlytics_disable_auto_disabler")
254
+ _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue "crashlytics_disable_auto_disabler")
227
255
  if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == "true" ]]; then
228
256
  echo "Disabled Crashlytics auto disabler." # do nothing
229
257
  else
@@ -67,6 +67,16 @@ export default class FirebaseApp implements ReactNativeFirebase.FirebaseAppBase
67
67
  this._automaticDataCollectionEnabled = enabled;
68
68
  }
69
69
 
70
+ /**
71
+ * Package-internal: seeds the cached flag from the value the native SDK resolved at
72
+ * initialization, without calling back into native (unlike the public setter).
73
+ *
74
+ * @internal
75
+ */
76
+ _setAutomaticDataCollectionEnabledFromNative(enabled: boolean): void {
77
+ this._automaticDataCollectionEnabled = enabled;
78
+ }
79
+
70
80
  private _checkDestroyed(): void {
71
81
  if (this._deleted) {
72
82
  throw new Error(`Firebase App named '${this._name}' already deleted`);
@@ -17,7 +17,6 @@
17
17
 
18
18
  // @ts-expect-error - No type declarations available
19
19
  import binaryToBase64 from 'react-native/Libraries/Utilities/binaryToBase64';
20
- import { promiseDefer } from './promise';
21
20
 
22
21
  const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
23
22
 
@@ -90,23 +89,18 @@ export interface Base64Result {
90
89
  */
91
90
  function fromData(data: Blob | ArrayBuffer | Uint8Array): Promise<Base64Result> {
92
91
  if (data instanceof Blob) {
93
- const fileReader = new FileReader();
94
- const { resolve, reject, promise } = promiseDefer<Base64Result>();
92
+ return new Promise<Base64Result>((resolve, reject) => {
93
+ const fileReader = new FileReader();
95
94
 
96
- fileReader.readAsDataURL(data);
95
+ fileReader.onloadend = () => {
96
+ if (fileReader.result) {
97
+ resolve({ string: fileReader.result, format: 'data_url' });
98
+ }
99
+ };
97
100
 
98
- fileReader.onloadend = () => {
99
- if (fileReader?.result) {
100
- resolve?.({ string: fileReader.result, format: 'data_url' });
101
- }
102
- };
103
-
104
- fileReader.onerror = event => {
105
- fileReader?.abort();
106
- reject?.(event);
107
- };
108
-
109
- return promise;
101
+ fileReader.onerror = event => reject(event);
102
+ fileReader.readAsDataURL(data);
103
+ });
110
104
  }
111
105
 
112
106
  if (data instanceof ArrayBuffer || data instanceof Uint8Array) {
@@ -69,6 +69,9 @@ export function deepSet(
69
69
  return false;
70
70
  }
71
71
  const keys = path.split(joiner);
72
+ if (keys.some(key => ['__proto__', 'prototype', 'constructor'].includes(key))) {
73
+ return false;
74
+ }
72
75
 
73
76
  let i = 0;
74
77
  let _object: unknown = object;
@@ -30,18 +30,29 @@ export { default as ReferenceBase } from './ReferenceBase';
30
30
  export type { DataUrlParts, Observer };
31
31
 
32
32
  export function getDataUrlParts(dataUrlString: string): DataUrlParts {
33
- const isBase64 = dataUrlString.includes(';base64');
34
- let [mediaType, base64String] = dataUrlString.split(',');
35
- if (!mediaType || !base64String) {
33
+ const match = /^data:([^,]*?)(;base64)?,([\s\S]*)$/.exec(dataUrlString);
34
+ if (!match) {
36
35
  return { base64String: undefined, mediaType: undefined };
37
36
  }
38
- mediaType = mediaType.replace('data:', '').replace(';base64', '');
39
- if (base64String && base64String.includes('%')) {
40
- base64String = decodeURIComponent(base64String);
41
- }
42
- if (!isBase64) {
43
- base64String = Base64.btoa(base64String);
37
+
38
+ const mediaType = match[1] || undefined;
39
+ let base64String = match[3] ?? '';
40
+
41
+ try {
42
+ if (base64String.includes('%')) {
43
+ base64String = decodeURIComponent(base64String);
44
+ }
45
+ if (!match[2]) {
46
+ const binaryString = encodeURIComponent(base64String).replace(
47
+ /%([0-9A-F]{2})/g,
48
+ (_, hex: string) => String.fromCharCode(Number.parseInt(hex, 16)),
49
+ );
50
+ base64String = Base64.btoa(binaryString);
51
+ }
52
+ } catch (_) {
53
+ return { base64String: undefined, mediaType: undefined };
44
54
  }
55
+
45
56
  return { base64String, mediaType };
46
57
  }
47
58
 
@@ -18,9 +18,12 @@
18
18
  import { getAppModule, getNativeModule } from './registry/nativeModule';
19
19
  import SharedEventEmitter from './SharedEventEmitter';
20
20
  import type { ReactNativeFirebase } from '../types/app';
21
- import type { FirebaseJsonConfig, ModuleConfig } from '../types/internal';
21
+ import type {
22
+ FirebaseJsonConfig,
23
+ ModuleConfig,
24
+ ReactNativeFirebaseEventEmitter,
25
+ } from '../types/internal';
22
26
  import type { ReactNativeFirebaseNativeModules } from './NativeModules';
23
- import type EventEmitter from 'react-native/Libraries/vendor/emitter/EventEmitter';
24
27
 
25
28
  let firebaseJson: FirebaseJsonConfig | null = null;
26
29
 
@@ -55,7 +58,7 @@ export default class FirebaseModule<
55
58
  return firebaseJson as FirebaseJsonConfig;
56
59
  }
57
60
 
58
- get emitter(): EventEmitter {
61
+ get emitter(): ReactNativeFirebaseEventEmitter {
59
62
  return SharedEventEmitter;
60
63
  }
61
64
 
@@ -48,7 +48,10 @@ export interface RNFBAppModuleInterface {
48
48
  initializeApp(
49
49
  options: ReactNativeFirebase.FirebaseAppOptions,
50
50
  appConfig: ReactNativeFirebase.FirebaseAppConfig,
51
- ): Promise<void>;
51
+ ): Promise<{
52
+ options?: ReactNativeFirebase.FirebaseAppOptions;
53
+ appConfig?: ReactNativeFirebase.FirebaseAppConfig;
54
+ } | void>;
52
55
  deleteApp(name: string): Promise<void>;
53
56
  setLogLevel(logLevel: string): void;
54
57
  metaGetAll(): Promise<{ [key: string]: string | boolean }>;
@@ -53,8 +53,10 @@ class RNFBNativeEventEmitter extends NativeEventEmitter {
53
53
 
54
54
  addListener(
55
55
  eventType: string,
56
- listener: (...args: unknown[]) => unknown,
57
- context?: object,
56
+ // RN 0.88 NativeEventEmitter types the payload as `Object`, not `object`.
57
+ // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
58
+ listener: (...args: readonly Object[]) => unknown,
59
+ context?: unknown,
58
60
  ): EmitterSubscription {
59
61
  // NewArch-AD-18 E1: event bridge identity requires raw app-module host for listener registration.
60
62
  const RNFBAppModule = getReactNativeModule(
@@ -69,7 +71,8 @@ class RNFBNativeEventEmitter extends NativeEventEmitter {
69
71
  // eslint-disable-next-line no-console
70
72
  console.debug(`[RNFB-->Event][👂] ${eventType} -> listening`);
71
73
  }
72
- const listenerDebugger = (...args: unknown[]) => {
74
+ // eslint-disable-next-line @typescript-eslint/no-wrapper-object-types
75
+ const listenerDebugger = (...args: readonly Object[]) => {
73
76
  if (globalThis.RNFBDebug) {
74
77
  // eslint-disable-next-line no-console
75
78
  console.debug(`[RNFB<--Event][📣] ${eventType} <-`, JSON.stringify(args[0]));
@@ -89,7 +92,8 @@ class RNFBNativeEventEmitter extends NativeEventEmitter {
89
92
  return listener(...args);
90
93
  };
91
94
 
92
- let subscription = super.addListener(`rnfb_${eventType}`, listenerDebugger, context);
95
+ // Installed RN types disagree across 0.86 (`Object`) and 0.88 (wider emitter args).
96
+ let subscription = super.addListener(`rnfb_${eventType}`, listenerDebugger, context as any);
93
97
 
94
98
  // React Native 0.65+ altered EventEmitter:
95
99
  // - removeSubscription is gone
@@ -118,7 +122,12 @@ class RNFBNativeEventEmitter extends NativeEventEmitter {
118
122
  return subscription;
119
123
  }
120
124
 
121
- removeAllListeners(eventType: string): void {
125
+ removeAllListeners(eventType?: string | null): void {
126
+ if (eventType == null) {
127
+ // 0.86 types require `string`; 0.88 accepts a missing event type. The value is unchanged.
128
+ super.removeAllListeners(eventType as any);
129
+ return;
130
+ }
122
131
  // NewArch-AD-18 E1: raw host for eventsRemoveListener.
123
132
  const RNFBAppModule = getReactNativeModule(
124
133
  APP_NATIVE_MODULE,
@@ -15,6 +15,10 @@
15
15
  *
16
16
  */
17
17
 
18
+ // RN macOS 0.78 does not export EventEmitter from the public API; vendor path works on 0.78–0.88.
18
19
  import EventEmitter from 'react-native/Libraries/vendor/emitter/EventEmitter';
20
+ import type { ReactNativeFirebaseEventEmitter } from '../types/internal';
19
21
 
20
- export default new EventEmitter();
22
+ const emitter = new EventEmitter() as ReactNativeFirebaseEventEmitter;
23
+
24
+ export default emitter;
@@ -29,11 +29,7 @@ const asyncStorageMemory: AsyncStorageStatic = {
29
29
  return Promise.resolve();
30
30
  },
31
31
  getItem(key: string): Promise<string | null> {
32
- const hasValue = memoryStorage.has(key);
33
- if (hasValue) {
34
- return Promise.resolve(memoryStorage.get(key) || null);
35
- }
36
- return Promise.resolve(null);
32
+ return Promise.resolve(memoryStorage.get(key) ?? null);
37
33
  },
38
34
  removeItem(key: string): Promise<void> {
39
35
  memoryStorage.delete(key);
@@ -61,16 +57,16 @@ export function isMemoryStorage(): boolean {
61
57
  }
62
58
 
63
59
  // Set an item in storage with the React Native Firebase prefix
64
- export async function setItem(key: string, value: string): Promise<void> {
65
- return await asyncStorage.setItem(prefix + key, value);
60
+ export function setItem(key: string, value: string): Promise<void> {
61
+ return asyncStorage.setItem(prefix + key, value);
66
62
  }
67
63
 
68
64
  // Get an item from storage with the React Native Firebase prefix
69
- export async function getItem(key: string): Promise<string | null> {
70
- return await asyncStorage.getItem(prefix + key);
65
+ export function getItem(key: string): Promise<string | null> {
66
+ return asyncStorage.getItem(prefix + key);
71
67
  }
72
68
 
73
69
  // Remove an item from storage with the React Native Firebase prefix
74
- export async function removeItem(key: string): Promise<void> {
75
- return await asyncStorage.removeItem(prefix + key);
70
+ export function removeItem(key: string): Promise<void> {
71
+ return asyncStorage.removeItem(prefix + key);
76
72
  }
@@ -23,6 +23,7 @@ export * from './NativeModules';
23
23
  export * from './registry/app';
24
24
  export * from './registry/modular';
25
25
  export * from './registry/nativeModule';
26
+ export { getReactNativeModule, setReactNativeModule } from './nativeModule';
26
27
  export { default as SharedEventEmitter } from './SharedEventEmitter';
27
28
  export { Logger } from './logger';
28
29
  export type { ModuleConfig } from '../types/internal';
@@ -108,6 +108,50 @@ const defaultLogHandler: LogHandler = (instance, logType, ...args) => {
108
108
 
109
109
  const defaultLogLevel = LogLevel.INFO;
110
110
 
111
+ let currentLogLevel = defaultLogLevel;
112
+ let currentUserLogHandler: LogHandler | null = null;
113
+
114
+ function createUserLogHandler(
115
+ logCallback: LogCallback | null,
116
+ options?: LogOptions,
117
+ ): LogHandler | null {
118
+ if (logCallback === null) {
119
+ return null;
120
+ }
121
+
122
+ const customLogLevel = options?.level ? levelStringToEnum[options.level] : null;
123
+ return (instance, level, ...args) => {
124
+ const message = args
125
+ .map(arg => {
126
+ if (arg == null) {
127
+ return null;
128
+ } else if (typeof arg === 'string') {
129
+ return arg;
130
+ } else if (typeof arg === 'number' || typeof arg === 'boolean') {
131
+ return arg.toString();
132
+ } else if (arg instanceof Error) {
133
+ return arg.message;
134
+ } else {
135
+ try {
136
+ return JSON.stringify(arg);
137
+ } catch (_ignored) {
138
+ return null;
139
+ }
140
+ }
141
+ })
142
+ .filter(arg => arg)
143
+ .join(' ');
144
+ if (level >= (customLogLevel ?? instance.logLevel)) {
145
+ logCallback({
146
+ level: LogLevelReversed[level]!.toLowerCase() as LogLevelString,
147
+ message,
148
+ args,
149
+ type: instance.name,
150
+ });
151
+ }
152
+ };
153
+ }
154
+
111
155
  /**
112
156
  * A container for all of the Logger instances
113
157
  */
@@ -118,9 +162,9 @@ export const instances: Logger[] = [];
118
162
  */
119
163
  export class Logger {
120
164
  name: string;
121
- private _logLevel: LogLevel = defaultLogLevel;
165
+ private _logLevel: LogLevel = currentLogLevel;
122
166
  private _logHandler: LogHandler = defaultLogHandler;
123
- private _userLogHandler: LogHandler | null = null;
167
+ private _userLogHandler: LogHandler | null = currentUserLogHandler;
124
168
 
125
169
  /**
126
170
  * Gives you an instance of a Logger to capture messages according to
@@ -215,9 +259,11 @@ export class Logger {
215
259
  * Sets the log level for all Logger instances
216
260
  */
217
261
  export function setLogLevel(level: LogLevelString | LogLevel): void {
218
- instances.forEach(inst => {
219
- inst.setLogLevel(level);
220
- });
262
+ const normalizedLevel = typeof level === 'string' ? levelStringToEnum[level] : level;
263
+ currentLogLevel = normalizedLevel;
264
+ for (const instance of instances) {
265
+ instance.setLogLevel(normalizedLevel);
266
+ }
221
267
  }
222
268
 
223
269
  // Alias for compatibility
@@ -227,44 +273,8 @@ export const setLogLevelInternal = setLogLevel;
227
273
  * Sets a custom user log handler for all Logger instances
228
274
  */
229
275
  export function setUserLogHandler(logCallback: LogCallback | null, options?: LogOptions): void {
276
+ currentUserLogHandler = createUserLogHandler(logCallback, options);
230
277
  for (const instance of instances) {
231
- let customLogLevel: LogLevel | null = null;
232
- if (options?.level) {
233
- customLogLevel = levelStringToEnum[options.level];
234
- }
235
- if (logCallback === null) {
236
- instance.userLogHandler = null;
237
- } else {
238
- instance.userLogHandler = (_instance, level, ...args) => {
239
- const message = args
240
- .map(arg => {
241
- if (arg == null) {
242
- return null;
243
- } else if (typeof arg === 'string') {
244
- return arg;
245
- } else if (typeof arg === 'number' || typeof arg === 'boolean') {
246
- return arg.toString();
247
- } else if (arg instanceof Error) {
248
- return arg.message;
249
- } else {
250
- try {
251
- return JSON.stringify(arg);
252
- } catch (_ignored) {
253
- return null;
254
- }
255
- }
256
- })
257
- .filter(arg => arg)
258
- .join(' ');
259
- if (level >= (customLogLevel ?? _instance.logLevel)) {
260
- logCallback({
261
- level: LogLevelReversed[level]!.toLowerCase() as LogLevelString,
262
- message,
263
- args,
264
- type: _instance.name,
265
- });
266
- }
267
- };
268
- }
278
+ instance.userLogHandler = currentUserLogHandler;
269
279
  }
270
280
  }
@@ -1,5 +1,5 @@
1
- /* eslint-disable no-console */
2
1
  import { TurboModuleRegistry } from 'react-native';
2
+ import { createNativeModuleDebugProxy } from './nativeModuleDebug';
3
3
 
4
4
  const DYNAMIC_CONSTANT_KEYS = new Set(['androidPlayServices']);
5
5
 
@@ -64,45 +64,7 @@ export function getReactNativeModule(moduleName: string): Record<string, unknown
64
64
  return debugProxy;
65
65
  }
66
66
 
67
- debugProxy = new Proxy(nativeModule as Record<string, unknown>, {
68
- ownKeys(target) {
69
- const keys: string[] = [];
70
- for (const key in target) {
71
- keys.push(key);
72
- }
73
- return keys;
74
- },
75
- get: (_, name) => {
76
- const prop = (nativeModule as Record<string, unknown>)[name as string];
77
- if (typeof prop !== 'function') return prop;
78
- return (...args: unknown[]) => {
79
- console.debug(
80
- `[RNFB->Native][🔵] ${moduleName}.${String(name)} -> ${JSON.stringify(args)}`,
81
- );
82
- const result: unknown = (prop as (...args: unknown[]) => unknown).apply(nativeModule, args);
83
- if (result && typeof result === 'object' && 'then' in result) {
84
- return (result as Promise<unknown>).then(
85
- (res: unknown) => {
86
- console.debug(
87
- `[RNFB<-Native][🟢] ${moduleName}.${String(name)} <- ${JSON.stringify(res)}`,
88
- );
89
- return res;
90
- },
91
- (err: unknown) => {
92
- console.debug(
93
- `[RNFB<-Native][🔴] ${moduleName}.${String(name)} <- ${JSON.stringify(err)}`,
94
- );
95
- throw err;
96
- },
97
- );
98
- }
99
- console.debug(
100
- `[RNFB<-Native][🟢] ${moduleName}.${String(name)} <- ${JSON.stringify(result)}`,
101
- );
102
- return result;
103
- };
104
- },
105
- });
67
+ debugProxy = createNativeModuleDebugProxy(moduleName, nativeModule);
106
68
  memoizedDebugProxies.set(moduleName, debugProxy);
107
69
  return debugProxy;
108
70
  }