@react-native-firebase/app 26.4.0 → 27.1.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 (242) hide show
  1. package/CHANGELOG.md +62 -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 +182 -59
  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 +143 -12
  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 -21
  58. package/dist/module/FirebaseApp.js +10 -0
  59. package/dist/module/FirebaseApp.js.map +1 -1
  60. package/dist/module/common/deeps.js +3 -0
  61. package/dist/module/common/deeps.js.map +1 -1
  62. package/dist/module/internal/FirebaseModule.js.map +1 -1
  63. package/dist/module/internal/RNFBNativeEventEmitter.js +12 -1
  64. package/dist/module/internal/RNFBNativeEventEmitter.js.map +1 -1
  65. package/dist/module/internal/SharedEventEmitter.js +3 -1
  66. package/dist/module/internal/SharedEventEmitter.js.map +1 -1
  67. package/dist/module/internal/index.js +1 -0
  68. package/dist/module/internal/index.js.map +1 -1
  69. package/dist/module/internal/registry/app.js +7 -1
  70. package/dist/module/internal/registry/app.js.map +1 -1
  71. package/dist/module/types/app.js.map +1 -1
  72. package/dist/module/types/internal.js +2 -0
  73. package/dist/module/version.js +1 -1
  74. package/dist/typescript/lib/FirebaseApp.d.ts +7 -0
  75. package/dist/typescript/lib/FirebaseApp.d.ts.map +1 -1
  76. package/dist/typescript/lib/common/deeps.d.ts.map +1 -1
  77. package/dist/typescript/lib/internal/FirebaseModule.d.ts +2 -3
  78. package/dist/typescript/lib/internal/FirebaseModule.d.ts.map +1 -1
  79. package/dist/typescript/lib/internal/NativeModules.d.ts +4 -1
  80. package/dist/typescript/lib/internal/NativeModules.d.ts.map +1 -1
  81. package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts +2 -2
  82. package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts.map +1 -1
  83. package/dist/typescript/lib/internal/SharedEventEmitter.d.ts +3 -3
  84. package/dist/typescript/lib/internal/SharedEventEmitter.d.ts.map +1 -1
  85. package/dist/typescript/lib/internal/index.d.ts +1 -0
  86. package/dist/typescript/lib/internal/index.d.ts.map +1 -1
  87. package/dist/typescript/lib/internal/registry/app.d.ts.map +1 -1
  88. package/dist/typescript/lib/types/app.d.ts +10 -3
  89. package/dist/typescript/lib/types/app.d.ts.map +1 -1
  90. package/dist/typescript/lib/types/internal.d.ts +12 -0
  91. package/dist/typescript/lib/types/internal.d.ts.map +1 -1
  92. package/dist/typescript/lib/version.d.ts +1 -1
  93. package/firebase-schema.json +4 -0
  94. package/firebase_spm.rb +552 -96
  95. package/ios/RNFBApp/RCTConvert+FIRApp.h +2 -5
  96. package/ios/RNFBApp/RCTConvert+FIRApp.m +11 -6
  97. package/ios/RNFBApp/RCTConvert+FIROptions.h +2 -5
  98. package/ios/RNFBApp/RCTConvert+FIROptions.m +11 -10
  99. package/ios/RNFBApp/RCTConvertFIRApp.swift +86 -0
  100. package/ios/RNFBApp/RCTConvertFIROptions.swift +259 -0
  101. package/ios/RNFBApp/RNFBAppCustomAuthDomains.swift +63 -0
  102. package/ios/RNFBApp/RNFBAppInitializeOptionsMapper.swift +113 -0
  103. package/ios/RNFBApp/RNFBAppLogLevelMapper.swift +53 -0
  104. package/ios/RNFBApp/RNFBAppModule+CustomAuthDomain.m +35 -0
  105. package/ios/RNFBApp/RNFBAppModule.h +6 -2
  106. package/ios/RNFBApp/RNFBAppModule.mm +65 -228
  107. package/ios/RNFBApp/RNFBAppModuleFirebase.swift +439 -0
  108. package/ios/RNFBApp/RNFBAppModuleImplementation.h +68 -0
  109. package/ios/RNFBApp/RNFBAppModuleImplementation.m +195 -0
  110. package/ios/RNFBApp/RNFBHandleMap.m +27 -56
  111. package/ios/RNFBApp/RNFBHandleMapStorage.swift +90 -0
  112. package/ios/RNFBApp/RNFBInitializeAppArguments.swift +82 -0
  113. package/ios/RNFBApp/RNFBJSON.m +22 -38
  114. package/ios/RNFBApp/RNFBJSONImplementation.swift +71 -0
  115. package/ios/RNFBApp/RNFBMeta.m +24 -26
  116. package/ios/RNFBApp/RNFBMetaStorage.swift +76 -0
  117. package/ios/RNFBApp/RNFBNullSentinelDecoding.swift +135 -0
  118. package/ios/RNFBApp/RNFBNullSentinelInterceptor.h +30 -3
  119. package/ios/RNFBApp/RNFBNullSentinelInterceptor.m +28 -5
  120. package/ios/RNFBApp/RNFBPreferences.m +22 -20
  121. package/ios/RNFBApp/RNFBPreferencesStorage.swift +101 -0
  122. package/ios/RNFBApp/RNFBRCTEventEmitter.m +36 -93
  123. package/ios/RNFBApp/RNFBRCTEventEmitterCore.swift +161 -0
  124. package/ios/RNFBApp/RNFBSharedUtils.h +2 -5
  125. package/ios/RNFBApp/RNFBSharedUtils.m +109 -198
  126. package/ios/RNFBApp/RNFBSharedUtilsConfig.swift +72 -0
  127. package/ios/RNFBApp/RNFBSharedUtilsFIRApp.swift +271 -0
  128. package/ios/RNFBApp/RNFBSharedUtilsFormatting.swift +59 -0
  129. package/ios/RNFBApp/RNFBSharedUtilsPromiseRejection.swift +88 -0
  130. package/ios/RNFBApp/RNFBUtilsHelpers.swift +116 -0
  131. package/ios/RNFBApp/RNFBUtilsModule+Foundation.m +44 -0
  132. package/ios/RNFBApp/RNFBUtilsModule+PhotoAssets.m +47 -0
  133. package/ios/RNFBApp/RNFBUtilsModule.h +11 -1
  134. package/ios/RNFBApp/RNFBUtilsModule.mm +10 -85
  135. package/ios/RNFBApp/RNFBUtilsModuleImplementation.h +32 -0
  136. package/ios/RNFBApp/RNFBUtilsModuleImplementation.m +56 -0
  137. package/ios/RNFBApp/RNFBVersion.m +1 -1
  138. package/ios/RNFBApp.xcodeproj/project.pbxproj +100 -0
  139. package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FIRApp.m +171 -0
  140. package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FirebaseCore.h +78 -0
  141. package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FIRInstallations.m +7 -0
  142. package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FirebaseInstallations.h +8 -0
  143. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppModuleHostStub.m +55 -0
  144. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.h +89 -0
  145. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.mm +30 -0
  146. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.h +19 -0
  147. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.m +32 -0
  148. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridgeModule.h +19 -0
  149. package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.h +28 -0
  150. package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.m +23 -0
  151. package/ios/RNFBAppUnitTests/HostStubs/React/RCTEventEmitter.h +9 -0
  152. package/ios/RNFBAppUnitTests/HostStubs/React/RCTInvalidating.h +24 -0
  153. package/ios/RNFBAppUnitTests/HostStubs/React/RCTUtils.h +9 -0
  154. package/ios/RNFBAppUnitTests/HostStubs/module.modulemap +13 -0
  155. package/ios/RNFBAppUnitTests/RCTConvertFIRAppFacadeTests.m +61 -0
  156. package/ios/RNFBAppUnitTests/RCTConvertFIRAppTests.swift +73 -0
  157. package/ios/RNFBAppUnitTests/RCTConvertFIROptionsFacadeTests.m +57 -0
  158. package/ios/RNFBAppUnitTests/RCTConvertFIROptionsTests.swift +243 -0
  159. package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsFacadeTests.m +73 -0
  160. package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsTests.swift +70 -0
  161. package/ios/RNFBAppUnitTests/RNFBAppInitializeOptionsMapperTests.swift +190 -0
  162. package/ios/RNFBAppUnitTests/RNFBAppLogLevelFacadeTests.m +76 -0
  163. package/ios/RNFBAppUnitTests/RNFBAppLogLevelMapperTests.swift +59 -0
  164. package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseFacadeTests.m +215 -0
  165. package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseTests.swift +430 -0
  166. package/ios/RNFBAppUnitTests/RNFBAppModuleLifecycleTests.m +206 -0
  167. package/ios/RNFBAppUnitTests/RNFBAppModuleShellTests.mm +367 -0
  168. package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/project.pbxproj +355 -2
  169. package/ios/RNFBAppUnitTests/RNFBFirebaseAppClientTests.swift +165 -0
  170. package/ios/RNFBAppUnitTests/RNFBHandleMapStorageTests.swift +121 -0
  171. package/ios/RNFBAppUnitTests/RNFBInitializeAppArgumentsTests.swift +256 -0
  172. package/ios/RNFBAppUnitTests/RNFBJSONImplementationTests.swift +126 -0
  173. package/ios/RNFBAppUnitTests/RNFBJSONTests.m +172 -0
  174. package/ios/RNFBAppUnitTests/RNFBMetaStorageTests.swift +106 -0
  175. package/ios/RNFBAppUnitTests/RNFBMetaTests.m +65 -0
  176. package/ios/RNFBAppUnitTests/RNFBNullSentinelDecodingTests.swift +286 -0
  177. package/ios/RNFBAppUnitTests/RNFBNullSentinelInterceptorTests.m +312 -0
  178. package/ios/RNFBAppUnitTests/RNFBPreferencesStorageTests.swift +105 -0
  179. package/ios/RNFBAppUnitTests/RNFBPreferencesTests.m +110 -0
  180. package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterCoreTests.swift +163 -0
  181. package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterFacadeTests.m +141 -0
  182. package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigFacadeTests.m +100 -0
  183. package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigTests.swift +234 -0
  184. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppFacadeTests.m +145 -0
  185. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppTests.swift +173 -0
  186. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingFacadeTests.m +38 -0
  187. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingTests.swift +82 -0
  188. package/ios/RNFBAppUnitTests/RNFBSharedUtilsNullSentinelTests.m +35 -0
  189. package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionFacadeTests.m +107 -0
  190. package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionTests.swift +133 -0
  191. package/ios/RNFBAppUnitTests/RNFBUtilsHelpersTests.swift +144 -0
  192. package/ios/RNFBAppUnitTests/RNFBUtilsModuleFacadeTests.m +72 -0
  193. package/ios/RNFBAppUnitTests/RNFBUtilsModuleShellTests.mm +282 -0
  194. package/ios/RNFBFirebase/Package.swift +53 -0
  195. package/ios/RNFBFirebase/Sources/RNFBFirebase/RNFBFirebase.swift +285 -0
  196. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/Public/.gitkeep +0 -0
  197. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/RNFBFirebaseBridge.m +169 -0
  198. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/include/RNFBFirebaseBridge.h +52 -0
  199. package/ios/RNFBFirebaseUnitTests/RNFBAppDynamicFacadeTests.swift +240 -0
  200. package/{android/src/main/java/io/invertase/firebase/common/RNFBHandleCollisionException.java → ios/RNFBFirebaseUnitTests/RNFBFirebaseClientImport.swift} +23 -14
  201. package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/project.pbxproj +588 -0
  202. package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBFirebaseUnitTests.xcscheme +83 -0
  203. package/ios_config.sh +50 -22
  204. package/lib/FirebaseApp.ts +10 -0
  205. package/lib/common/deeps.ts +3 -0
  206. package/lib/internal/FirebaseModule.ts +6 -3
  207. package/lib/internal/NativeModules.ts +4 -1
  208. package/lib/internal/RNFBNativeEventEmitter.ts +14 -5
  209. package/lib/internal/SharedEventEmitter.ts +5 -1
  210. package/lib/internal/index.ts +1 -0
  211. package/lib/internal/react-native-vendor-emitter.d.ts +11 -0
  212. package/lib/internal/registry/app.ts +7 -1
  213. package/lib/types/app.ts +10 -3
  214. package/lib/types/internal.ts +19 -0
  215. package/lib/version.ts +1 -1
  216. package/package.json +8 -8
  217. package/plugin/build/ios/appDelegate.js +2 -2
  218. package/plugin/build/ios/podfile.js +16 -16
  219. package/plugin/build/pluginConfig.d.ts +4 -2
  220. package/plugin/src/ios/appDelegate.ts +2 -2
  221. package/plugin/src/ios/podfile.ts +20 -23
  222. package/plugin/src/pluginConfig.ts +4 -2
  223. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleMap.java +0 -150
  224. package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.java +0 -148
  225. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebaseModule.java +0 -62
  226. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebasePreferences.java +0 -91
  227. package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java +0 -224
  228. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseApp.java +0 -46
  229. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java +0 -49
  230. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppRegistrar.java +0 -35
  231. package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java +0 -192
  232. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEvent.java +0 -53
  233. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitter.java +0 -606
  234. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java +0 -109
  235. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseMeta.java +0 -101
  236. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseModule.java +0 -146
  237. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebasePreferences.java +0 -96
  238. package/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.java +0 -441
  239. package/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.java +0 -223
  240. package/android/src/test/java/io/invertase/firebase/common/RNFBHandleMapTest.java +0 -275
  241. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONTest.java +0 -108
  242. package/android/src/test/java/io/invertase/firebase/common/TaskExecutorServiceTest.java +0 -97
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`);
@@ -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;
@@ -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;
@@ -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';
@@ -0,0 +1,11 @@
1
+ declare module 'react-native/Libraries/vendor/emitter/EventEmitter' {
2
+ export default class EventEmitter {
3
+ addListener(
4
+ eventType: string,
5
+ listener: (...args: Array<unknown>) => unknown,
6
+ context?: unknown,
7
+ ): { remove(): void };
8
+ removeAllListeners(eventType?: string): void;
9
+ emit(eventType: string, ...args: Array<unknown>): void;
10
+ }
11
+ }
@@ -191,7 +191,13 @@ export function initializeApp(
191
191
 
192
192
  return getAppModule()
193
193
  .initializeApp(options as FirebaseAppOptions, appConfig)
194
- .then(() => {
194
+ .then(nativeResult => {
195
+ // Native resolves the real SDK flag, which differs from the input when the key was omitted
196
+ // (SDK / Info.plist default). Web echoes the input and Jest mocks resolve void; both keep `!!input`.
197
+ const nativeEnabled = nativeResult?.appConfig?.automaticDataCollectionEnabled;
198
+ if (typeof nativeEnabled === 'boolean') {
199
+ app._setAutomaticDataCollectionEnabledFromNative(nativeEnabled);
200
+ }
195
201
  app._initialized = true;
196
202
  return app as unknown as ReactNativeFirebase.FirebaseApp;
197
203
  })
package/lib/types/app.ts CHANGED
@@ -119,9 +119,13 @@ export namespace ReactNativeFirebase {
119
119
 
120
120
  /**
121
121
  * Default setting for data collection on startup that affects all Firebase module startup data collection settings,
122
- * in the absence of module-specific overrides. This will start as false if you set "app_data_collection_default_enabled"
123
- * to false in firebase.json and may be used in opt-in flows, for example a GDPR-compliant app.
122
+ * in the absence of module-specific overrides. It may be used in opt-in flows, for example a GDPR-compliant app.
124
123
  * If configured false initially, set to true after obtaining consent, then enable module-specific settings as needed afterwards.
124
+ *
125
+ * On iOS this starts as false if you set "app_data_collection_default_enabled" to false in firebase.json
126
+ * (written to Info.plist "FirebaseDataCollectionDefaultEnabled"). On Android that firebase.json key does not change
127
+ * this flag, which defaults to true unless the host app sets the manifest meta-data "firebase_data_collection_default_enabled".
128
+ * When omitted from the config passed to `initializeApp`, the native default is left unchanged on both platforms.
125
129
  */
126
130
  automaticDataCollectionEnabled?: boolean;
127
131
 
@@ -148,7 +152,10 @@ export namespace ReactNativeFirebase {
148
152
  readonly options: FirebaseAppOptions;
149
153
 
150
154
  /**
151
- * The settable config flag for GDPR opt-in/opt-out
155
+ * The settable config flag for GDPR opt-in/opt-out.
156
+ *
157
+ * After `initializeApp` resolves, this reflects the flag the native SDK is using, which can
158
+ * differ from the value passed in when the key was omitted.
152
159
  */
153
160
  automaticDataCollectionEnabled: boolean;
154
161
 
@@ -20,6 +20,25 @@
20
20
  * These types are used internally across multiple files and should not be exported to consumers
21
21
  */
22
22
 
23
+ import type { EventSubscription } from 'react-native';
24
+
25
+ /**
26
+ * RN 0.88's generated `EventEmitter` class types require a `context` argument
27
+ * and `Object` payloads. The runtime still accepts the historical 2-argument
28
+ * `addListener` and nullable `emit` values used across modules.
29
+ */
30
+ export interface ReactNativeFirebaseEventEmitter {
31
+ addListener(
32
+ eventType: string,
33
+ // RN 0.88 listener params are invariant; `any` keeps module-specific callbacks assignable.
34
+ listener: (...args: any[]) => any,
35
+ context?: unknown,
36
+ ): EventSubscription;
37
+ emit(eventType: string, ...args: any[]): void;
38
+ removeAllListeners(eventType?: string | null): void;
39
+ listenerCount(eventType: string): number;
40
+ }
41
+
23
42
  /**
24
43
  * Firebase JSON configuration from firebase.json file
25
44
  * Structure: { "react-native": { [key: string]: boolean | string }, ... }
package/lib/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- export const version = '26.4.0';
2
+ export const version = '27.1.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native-firebase/app",
3
- "version": "26.4.0",
3
+ "version": "27.1.0",
4
4
  "author": "Invertase <oss@invertase.io> (http://invertase.io)",
5
5
  "description": "A well tested, feature rich Firebase implementation for React Native, supporting iOS & Android. Individual module support for Admob, Analytics, Auth, Crash Reporting, Cloud Firestore, Database, Dynamic Links, Functions, Messaging (FCM), Remote Config, Storage and more.",
6
6
  "main": "./dist/module/index.js",
@@ -111,10 +111,10 @@
111
111
  "peerDependencies": {
112
112
  "expo": ">=47.0.0",
113
113
  "react": "*",
114
- "react-native": "*"
114
+ "react-native": ">=0.60.0-0"
115
115
  },
116
116
  "dependencies": {
117
- "firebase": "12.17.1"
117
+ "firebase": "13.1.0"
118
118
  },
119
119
  "devDependencies": {
120
120
  "expo": "^55.0.18",
@@ -131,17 +131,17 @@
131
131
  },
132
132
  "sdkVersions": {
133
133
  "ios": {
134
- "firebase": "12.18.0",
134
+ "firebase": "13.1.1",
135
135
  "firebaseSpmUrl": "https://github.com/firebase/firebase-ios-sdk.git",
136
136
  "iosTarget": "15.0",
137
- "macosTarget": "10.15",
137
+ "macosTarget": "11.0",
138
138
  "tvosTarget": "15.0"
139
139
  },
140
140
  "android": {
141
- "minSdk": 23,
141
+ "minSdk": 24,
142
142
  "targetSdk": 34,
143
143
  "compileSdk": 34,
144
- "firebase": "34.18.0",
144
+ "firebase": "35.0.2",
145
145
  "firebaseCrashlyticsGradle": "3.0.8",
146
146
  "firebasePerfGradle": "2.0.2",
147
147
  "gmsGoogleServicesGradle": "4.5.0",
@@ -185,5 +185,5 @@
185
185
  }
186
186
  }
187
187
  },
188
- "gitHead": "06701af5fdc19bae9f379567eadb29dfe81953c0"
188
+ "gitHead": "c65e1ee3b78bcd0c5b66996100d7d1e579ca1614"
189
189
  }
@@ -74,9 +74,9 @@ function modifyObjcAppDelegate(contents) {
74
74
  }
75
75
  function modifySwiftAppDelegate(contents) {
76
76
  const methodInvocationBlock = `FirebaseApp.configure()`;
77
- const methodInvocationLineMatcher = /(?:self\.moduleName\s*=\s*"([^"]*)")|(?:factory\.startReactNative\()/;
77
+ const methodInvocationLineMatcher = /(?:self\.moduleName\s*=\s*"([^"]*)")|(?:factory\.startReactNative\()|(?:return\s+super\.application\(\s*application\s*,\s*didFinishLaunchingWithOptions:\s*launchOptions\s*\))/;
78
78
  // Add import
79
- contents = addImport(contents, 'import FirebaseCore', /^[ \t]*import\s+FirebaseCore[ \t]*$/m, /^[ \t]*import\s+Expo[ \t]*$/m, /^[ \t]*import\b[^\r\n]*$/m);
79
+ contents = addImport(contents, 'import FirebaseCore', /^[ \t]*import\s+FirebaseCore[ \t]*$/m, /^[ \t]*(?:internal\s+)?import\s+Expo[ \t]*$/m, /^[ \t]*import\b[^\r\n]*$/m);
80
80
  // To avoid potential issues with existing changes from older plugin versions
81
81
  if (contents.includes(methodInvocationBlock)) {
82
82
  return contents;
@@ -5,27 +5,27 @@ exports.setAppPodfileDisableSPM = setAppPodfileDisableSPM;
5
5
  const config_plugins_1 = require("@expo/config-plugins");
6
6
  const generateCode_1 = require("@expo/config-plugins/build/utils/generateCode");
7
7
  const TAG = '@react-native-firebase/app-disableSPM';
8
- const ANCHOR = /prepare_react_native_project!/;
9
- const FLAG = '$RNFirebaseDisableSPM = true';
10
- // The flag must be defined before any target block so firebase_spm.rb sees it
11
- // when pods are declared - anchoring just after `prepare_react_native_project!`
12
- // guarantees that in the Podfile Expo generates.
8
+ const DISABLE_SPM_UNSUPPORTED = '[react-native-firebase] ios.disableSPM is no longer supported. ' +
9
+ 'Firebase Apple SDK 13+ is distributed only through Swift Package Manager. ' +
10
+ 'Remove `disableSPM` from the `@react-native-firebase/app` config plugin and ' +
11
+ 'use dynamic frameworks (`expo-build-properties` ios.useFrameworks: "dynamic"). ' +
12
+ 'See https://rnfirebase.io/ios-spm';
13
+ // Historically injected `$RNFirebaseDisableSPM = true` before target blocks.
14
+ // Firebase 13+ is SPM-only: enabling this option must fail loudly, and any
15
+ // leftover generated flag is stripped on prebuild.
13
16
  function setAppPodfileDisableSPM(src, enabled = false) {
14
- if (!enabled) {
15
- return (0, generateCode_1.removeGeneratedContents)(src, TAG) ?? src;
17
+ if (enabled) {
18
+ throw new Error(DISABLE_SPM_UNSUPPORTED);
16
19
  }
17
- return (0, generateCode_1.mergeContents)({
18
- src,
19
- newSrc: FLAG,
20
- tag: TAG,
21
- anchor: ANCHOR,
22
- offset: 1,
23
- comment: '#',
24
- }).contents;
20
+ return (0, generateCode_1.removeGeneratedContents)(src, TAG) ?? src;
25
21
  }
26
22
  const withIosDisableSPM = (config, props) => {
23
+ if (props?.ios?.disableSPM === true) {
24
+ throw new Error(DISABLE_SPM_UNSUPPORTED);
25
+ }
27
26
  return (0, config_plugins_1.withPodfile)(config, config => {
28
- config.modResults.contents = setAppPodfileDisableSPM(config.modResults.contents, props?.ios?.disableSPM === true);
27
+ // Strip a leftover DisableSPM flag from older prebuilds; never re-add it.
28
+ config.modResults.contents = setAppPodfileDisableSPM(config.modResults.contents, false);
29
29
  return config;
30
30
  });
31
31
  };
@@ -3,8 +3,10 @@ export interface PluginConfigType {
3
3
  }
4
4
  export interface PluginConfigTypeIos {
5
5
  /**
6
- * Sets `$RNFirebaseDisableSPM = true` in the Podfile, forcing Firebase
7
- * dependencies to be installed with CocoaPods instead of Swift Package Manager.
6
+ * @deprecated Firebase Apple SDK 13+ is SPM-only. Setting this to `true`
7
+ * fails Expo prebuild / `pod install` — CocoaPods no longer distributes Firebase.
8
+ * Remove this option and use `use_frameworks! :linkage => :dynamic` (via
9
+ * `expo-build-properties` `ios.useFrameworks: "dynamic"`).
8
10
  *
9
11
  * @platform ios iOS
10
12
  */
@@ -101,14 +101,14 @@ export function modifyObjcAppDelegate(contents: string): string {
101
101
  export function modifySwiftAppDelegate(contents: string): string {
102
102
  const methodInvocationBlock = `FirebaseApp.configure()`;
103
103
  const methodInvocationLineMatcher =
104
- /(?:self\.moduleName\s*=\s*"([^"]*)")|(?:factory\.startReactNative\()/;
104
+ /(?:self\.moduleName\s*=\s*"([^"]*)")|(?:factory\.startReactNative\()|(?:return\s+super\.application\(\s*application\s*,\s*didFinishLaunchingWithOptions:\s*launchOptions\s*\))/;
105
105
 
106
106
  // Add import
107
107
  contents = addImport(
108
108
  contents,
109
109
  'import FirebaseCore',
110
110
  /^[ \t]*import\s+FirebaseCore[ \t]*$/m,
111
- /^[ \t]*import\s+Expo[ \t]*$/m,
111
+ /^[ \t]*(?:internal\s+)?import\s+Expo[ \t]*$/m,
112
112
  /^[ \t]*import\b[^\r\n]*$/m,
113
113
  );
114
114
 
@@ -1,39 +1,36 @@
1
1
  import { ConfigPlugin, withPodfile } from '@expo/config-plugins';
2
- import {
3
- mergeContents,
4
- removeGeneratedContents,
5
- } from '@expo/config-plugins/build/utils/generateCode';
2
+ import { removeGeneratedContents } from '@expo/config-plugins/build/utils/generateCode';
6
3
 
7
4
  import { PluginConfigType } from '../pluginConfig';
8
5
 
9
6
  const TAG = '@react-native-firebase/app-disableSPM';
10
- const ANCHOR = /prepare_react_native_project!/;
11
- const FLAG = '$RNFirebaseDisableSPM = true';
12
7
 
13
- // The flag must be defined before any target block so firebase_spm.rb sees it
14
- // when pods are declared - anchoring just after `prepare_react_native_project!`
15
- // guarantees that in the Podfile Expo generates.
8
+ const DISABLE_SPM_UNSUPPORTED =
9
+ '[react-native-firebase] ios.disableSPM is no longer supported. ' +
10
+ 'Firebase Apple SDK 13+ is distributed only through Swift Package Manager. ' +
11
+ 'Remove `disableSPM` from the `@react-native-firebase/app` config plugin and ' +
12
+ 'use dynamic frameworks (`expo-build-properties` ios.useFrameworks: "dynamic"). ' +
13
+ 'See https://rnfirebase.io/ios-spm';
14
+
15
+ // Historically injected `$RNFirebaseDisableSPM = true` before target blocks.
16
+ // Firebase 13+ is SPM-only: enabling this option must fail loudly, and any
17
+ // leftover generated flag is stripped on prebuild.
16
18
  export function setAppPodfileDisableSPM(src: string, enabled: boolean = false): string {
17
- if (!enabled) {
18
- return removeGeneratedContents(src, TAG) ?? src;
19
+ if (enabled) {
20
+ throw new Error(DISABLE_SPM_UNSUPPORTED);
19
21
  }
20
22
 
21
- return mergeContents({
22
- src,
23
- newSrc: FLAG,
24
- tag: TAG,
25
- anchor: ANCHOR,
26
- offset: 1,
27
- comment: '#',
28
- }).contents;
23
+ return removeGeneratedContents(src, TAG) ?? src;
29
24
  }
30
25
 
31
26
  export const withIosDisableSPM: ConfigPlugin<PluginConfigType> = (config, props) => {
27
+ if (props?.ios?.disableSPM === true) {
28
+ throw new Error(DISABLE_SPM_UNSUPPORTED);
29
+ }
30
+
32
31
  return withPodfile(config, config => {
33
- config.modResults.contents = setAppPodfileDisableSPM(
34
- config.modResults.contents,
35
- props?.ios?.disableSPM === true,
36
- );
32
+ // Strip a leftover DisableSPM flag from older prebuilds; never re-add it.
33
+ config.modResults.contents = setAppPodfileDisableSPM(config.modResults.contents, false);
37
34
 
38
35
  return config;
39
36
  });