@react-native-firebase/app 26.3.3 → 27.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +10 -27
  3. package/RNFBApp.podspec +13 -5
  4. package/android/build.gradle +3 -0
  5. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleCollisionException.kt +29 -0
  6. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleMap.kt +146 -0
  7. package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.kt +156 -0
  8. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebaseModule.kt +44 -0
  9. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebasePreferences.kt +100 -0
  10. package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.kt +250 -0
  11. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseApp.kt +64 -0
  12. package/android/src/reactnative/java/io/invertase/firebase/app/{ReactNativeFirebaseAppInitProvider.java → ReactNativeFirebaseAppInitProvider.kt} +3 -4
  13. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.kt +47 -0
  14. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppRegistrar.kt +33 -0
  15. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseVersion.java +1 -1
  16. package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.kt +185 -0
  17. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEvent.kt +35 -0
  18. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitter.kt +662 -0
  19. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.kt +103 -0
  20. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseMeta.kt +96 -0
  21. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseModule.kt +140 -0
  22. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebasePreferences.kt +109 -0
  23. package/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.kt +451 -0
  24. package/android/src/reactnative/java/io/invertase/firebase/interfaces/{ContextProvider.java → ContextProvider.kt} +8 -8
  25. package/android/src/reactnative/java/io/invertase/firebase/interfaces/{NativeError.java → NativeError.kt} +8 -8
  26. package/android/src/reactnative/java/io/invertase/firebase/interfaces/{NativeEvent.java → NativeEvent.kt} +6 -6
  27. package/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.kt +219 -0
  28. package/android/src/test/java/expo/core/ModuleRegistry.java +9 -0
  29. package/android/src/test/java/io/invertase/firebase/app/NativeRNFBTurboAppTest.java +208 -60
  30. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppComponentsJavaCompatibilityTest.java +70 -0
  31. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppJavaCompatibilityTest.java +60 -0
  32. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackageTest.java +165 -0
  33. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppTest.kt +167 -0
  34. package/android/src/test/java/io/invertase/firebase/common/RCTConvertFirebaseJavaCompatibilityTest.java +112 -0
  35. package/android/src/test/java/io/invertase/firebase/common/RCTConvertFirebaseTest.kt +317 -0
  36. package/android/src/test/java/io/invertase/firebase/common/RNFBHandleMapTest.kt +309 -0
  37. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterJavaCompatibilityTest.java +176 -0
  38. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterTest.java +144 -13
  39. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventTest.kt +61 -0
  40. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONJavaCompatibilityTest.java +85 -0
  41. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONTest.kt +296 -0
  42. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseMetaJavaCompatibilityTest.java +67 -0
  43. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseMetaTest.kt +246 -0
  44. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseModuleTest.kt +254 -0
  45. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebasePreferencesJavaCompatibilityTest.java +87 -0
  46. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebasePreferencesTest.kt +260 -0
  47. package/android/src/test/java/io/invertase/firebase/common/SharedUtilsJavaCompatibilityTest.java +255 -0
  48. package/android/src/test/java/io/invertase/firebase/common/SharedUtilsTest.kt +674 -0
  49. package/android/src/test/java/io/invertase/firebase/common/TaskExecutorServiceTest.kt +290 -0
  50. package/android/src/test/java/io/invertase/firebase/common/UniversalFirebaseModuleJavaCompatibilityTest.java +178 -0
  51. package/android/src/test/java/io/invertase/firebase/common/UniversalFirebasePreferencesJavaCompatibilityTest.java +99 -0
  52. package/android/src/test/java/io/invertase/firebase/common/UniversalFirebasePreferencesTest.kt +217 -0
  53. package/android/src/test/java/io/invertase/firebase/commoncompat/ReactNativeFirebaseModuleJavaCompatibilityTest.java +176 -0
  54. package/android/src/test/java/io/invertase/firebase/commoncompat/ReactNativeFirebaseModuleKotlinCompatibilityTest.kt +52 -0
  55. package/android/src/test/java/io/invertase/firebase/interfaces/InterfacesJavaCompatibilityTest.java +144 -0
  56. package/android/src/test/java/io/invertase/firebase/interfaces/NativeEventTest.kt +56 -0
  57. package/android/src/test/java/io/invertase/firebase/utils/NativeRNFBTurboUtilsTest.java +517 -23
  58. package/dist/module/FirebaseApp.js +10 -0
  59. package/dist/module/FirebaseApp.js.map +1 -1
  60. package/dist/module/common/Base64.js +13 -21
  61. package/dist/module/common/Base64.js.map +1 -1
  62. package/dist/module/common/deeps.js +3 -0
  63. package/dist/module/common/deeps.js.map +1 -1
  64. package/dist/module/common/index.js +17 -9
  65. package/dist/module/common/index.js.map +1 -1
  66. package/dist/module/internal/FirebaseModule.js.map +1 -1
  67. package/dist/module/internal/RNFBNativeEventEmitter.js +12 -1
  68. package/dist/module/internal/RNFBNativeEventEmitter.js.map +1 -1
  69. package/dist/module/internal/SharedEventEmitter.js +3 -1
  70. package/dist/module/internal/SharedEventEmitter.js.map +1 -1
  71. package/dist/module/internal/asyncStorage.js +7 -11
  72. package/dist/module/internal/asyncStorage.js.map +1 -1
  73. package/dist/module/internal/index.js +1 -0
  74. package/dist/module/internal/index.js.map +1 -1
  75. package/dist/module/internal/logger.js +44 -40
  76. package/dist/module/internal/logger.js.map +1 -1
  77. package/dist/module/internal/nativeModuleAndroidIos.js +2 -29
  78. package/dist/module/internal/nativeModuleAndroidIos.js.map +1 -1
  79. package/dist/module/internal/nativeModuleDebug.js +74 -0
  80. package/dist/module/internal/nativeModuleDebug.js.map +1 -0
  81. package/dist/module/internal/nativeModuleWeb.js +9 -29
  82. package/dist/module/internal/nativeModuleWeb.js.map +1 -1
  83. package/dist/module/internal/registry/app.js +8 -2
  84. package/dist/module/internal/registry/app.js.map +1 -1
  85. package/dist/module/internal/registry/modular.js +2 -2
  86. package/dist/module/internal/registry/modular.js.map +1 -1
  87. package/dist/module/internal/registry/nativeModule.js +3 -3
  88. package/dist/module/internal/registry/nativeModule.js.map +1 -1
  89. package/dist/module/internal/web/RNFBAppModule.js +16 -15
  90. package/dist/module/internal/web/RNFBAppModule.js.map +1 -1
  91. package/dist/module/internal/web/memidb/lib/FakeEventTarget.js +3 -1
  92. package/dist/module/internal/web/memidb/lib/FakeEventTarget.js.map +1 -1
  93. package/dist/module/types/app.js.map +1 -1
  94. package/dist/module/types/internal.js +2 -0
  95. package/dist/module/version.js +1 -1
  96. package/dist/typescript/lib/FirebaseApp.d.ts +7 -0
  97. package/dist/typescript/lib/FirebaseApp.d.ts.map +1 -1
  98. package/dist/typescript/lib/common/Base64.d.ts.map +1 -1
  99. package/dist/typescript/lib/common/deeps.d.ts.map +1 -1
  100. package/dist/typescript/lib/common/index.d.ts.map +1 -1
  101. package/dist/typescript/lib/internal/FirebaseModule.d.ts +2 -3
  102. package/dist/typescript/lib/internal/FirebaseModule.d.ts.map +1 -1
  103. package/dist/typescript/lib/internal/NativeModules.d.ts +4 -1
  104. package/dist/typescript/lib/internal/NativeModules.d.ts.map +1 -1
  105. package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts +2 -2
  106. package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts.map +1 -1
  107. package/dist/typescript/lib/internal/SharedEventEmitter.d.ts +3 -3
  108. package/dist/typescript/lib/internal/SharedEventEmitter.d.ts.map +1 -1
  109. package/dist/typescript/lib/internal/asyncStorage.d.ts.map +1 -1
  110. package/dist/typescript/lib/internal/index.d.ts +1 -0
  111. package/dist/typescript/lib/internal/index.d.ts.map +1 -1
  112. package/dist/typescript/lib/internal/logger.d.ts.map +1 -1
  113. package/dist/typescript/lib/internal/nativeModuleAndroidIos.d.ts.map +1 -1
  114. package/dist/typescript/lib/internal/nativeModuleDebug.d.ts +2 -0
  115. package/dist/typescript/lib/internal/nativeModuleDebug.d.ts.map +1 -0
  116. package/dist/typescript/lib/internal/nativeModuleWeb.d.ts.map +1 -1
  117. package/dist/typescript/lib/internal/registry/app.d.ts.map +1 -1
  118. package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts +7 -7
  119. package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts.map +1 -1
  120. package/dist/typescript/lib/types/app.d.ts +10 -3
  121. package/dist/typescript/lib/types/app.d.ts.map +1 -1
  122. package/dist/typescript/lib/types/internal.d.ts +12 -0
  123. package/dist/typescript/lib/types/internal.d.ts.map +1 -1
  124. package/dist/typescript/lib/version.d.ts +1 -1
  125. package/firebase-schema.json +5 -1
  126. package/firebase_spm.rb +552 -96
  127. package/ios/RNFBApp/RCTConvert+FIRApp.h +2 -5
  128. package/ios/RNFBApp/RCTConvert+FIRApp.m +11 -6
  129. package/ios/RNFBApp/RCTConvert+FIROptions.h +2 -5
  130. package/ios/RNFBApp/RCTConvert+FIROptions.m +11 -10
  131. package/ios/RNFBApp/RCTConvertFIRApp.swift +86 -0
  132. package/ios/RNFBApp/RCTConvertFIROptions.swift +259 -0
  133. package/ios/RNFBApp/RNFBAppCustomAuthDomains.swift +63 -0
  134. package/ios/RNFBApp/RNFBAppInitializeOptionsMapper.swift +113 -0
  135. package/ios/RNFBApp/RNFBAppLogLevelMapper.swift +53 -0
  136. package/ios/RNFBApp/RNFBAppModule+CustomAuthDomain.m +35 -0
  137. package/ios/RNFBApp/RNFBAppModule.h +6 -2
  138. package/ios/RNFBApp/RNFBAppModule.mm +67 -204
  139. package/ios/RNFBApp/RNFBAppModuleFirebase.swift +439 -0
  140. package/ios/RNFBApp/RNFBAppModuleImplementation.h +68 -0
  141. package/ios/RNFBApp/RNFBAppModuleImplementation.m +195 -0
  142. package/ios/RNFBApp/RNFBHandleMap.h +73 -0
  143. package/ios/RNFBApp/RNFBHandleMap.m +87 -0
  144. package/ios/RNFBApp/RNFBHandleMapStorage.swift +90 -0
  145. package/ios/RNFBApp/RNFBInitializeAppArguments.swift +82 -0
  146. package/ios/RNFBApp/RNFBJSON.m +22 -38
  147. package/ios/RNFBApp/RNFBJSONImplementation.swift +71 -0
  148. package/ios/RNFBApp/RNFBMeta.m +24 -26
  149. package/ios/RNFBApp/RNFBMetaStorage.swift +76 -0
  150. package/ios/RNFBApp/RNFBNullSentinelDecoding.swift +135 -0
  151. package/ios/RNFBApp/RNFBNullSentinelInterceptor.h +30 -3
  152. package/ios/RNFBApp/RNFBNullSentinelInterceptor.m +28 -5
  153. package/ios/RNFBApp/RNFBPreferences.m +22 -20
  154. package/ios/RNFBApp/RNFBPreferencesStorage.swift +101 -0
  155. package/ios/RNFBApp/RNFBRCTEventEmitter.m +36 -93
  156. package/ios/RNFBApp/RNFBRCTEventEmitterCore.swift +161 -0
  157. package/ios/RNFBApp/RNFBSharedUtils.h +2 -5
  158. package/ios/RNFBApp/RNFBSharedUtils.m +109 -197
  159. package/ios/RNFBApp/RNFBSharedUtilsConfig.swift +72 -0
  160. package/ios/RNFBApp/RNFBSharedUtilsFIRApp.swift +271 -0
  161. package/ios/RNFBApp/RNFBSharedUtilsFormatting.swift +59 -0
  162. package/ios/RNFBApp/RNFBSharedUtilsPromiseRejection.swift +88 -0
  163. package/ios/RNFBApp/RNFBUtilsHelpers.swift +116 -0
  164. package/ios/RNFBApp/RNFBUtilsModule+Foundation.m +44 -0
  165. package/ios/RNFBApp/RNFBUtilsModule+PhotoAssets.m +47 -0
  166. package/ios/RNFBApp/RNFBUtilsModule.h +11 -1
  167. package/ios/RNFBApp/RNFBUtilsModule.mm +10 -85
  168. package/ios/RNFBApp/RNFBUtilsModuleImplementation.h +32 -0
  169. package/ios/RNFBApp/RNFBUtilsModuleImplementation.m +56 -0
  170. package/ios/RNFBApp/RNFBVersion.m +1 -1
  171. package/ios/RNFBApp.xcodeproj/project.pbxproj +106 -0
  172. package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FIRApp.m +171 -0
  173. package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FirebaseCore.h +78 -0
  174. package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FIRInstallations.m +7 -0
  175. package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FirebaseInstallations.h +8 -0
  176. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppModuleHostStub.m +55 -0
  177. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.h +89 -0
  178. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.mm +30 -0
  179. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.h +19 -0
  180. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.m +32 -0
  181. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridgeModule.h +19 -0
  182. package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.h +28 -0
  183. package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.m +23 -0
  184. package/ios/RNFBAppUnitTests/HostStubs/React/RCTEventEmitter.h +9 -0
  185. package/ios/RNFBAppUnitTests/HostStubs/React/RCTInvalidating.h +24 -0
  186. package/ios/RNFBAppUnitTests/HostStubs/React/RCTUtils.h +9 -0
  187. package/ios/RNFBAppUnitTests/HostStubs/module.modulemap +13 -0
  188. package/ios/RNFBAppUnitTests/RCTConvertFIRAppFacadeTests.m +61 -0
  189. package/ios/RNFBAppUnitTests/RCTConvertFIRAppTests.swift +73 -0
  190. package/ios/RNFBAppUnitTests/RCTConvertFIROptionsFacadeTests.m +57 -0
  191. package/ios/RNFBAppUnitTests/RCTConvertFIROptionsTests.swift +243 -0
  192. package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsFacadeTests.m +73 -0
  193. package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsTests.swift +70 -0
  194. package/ios/RNFBAppUnitTests/RNFBAppInitializeOptionsMapperTests.swift +190 -0
  195. package/ios/RNFBAppUnitTests/RNFBAppLogLevelFacadeTests.m +76 -0
  196. package/ios/RNFBAppUnitTests/RNFBAppLogLevelMapperTests.swift +59 -0
  197. package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseFacadeTests.m +215 -0
  198. package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseTests.swift +430 -0
  199. package/ios/RNFBAppUnitTests/RNFBAppModuleLifecycleTests.m +206 -0
  200. package/ios/RNFBAppUnitTests/RNFBAppModuleShellTests.mm +367 -0
  201. package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/project.pbxproj +590 -0
  202. package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBAppUnitTests.xcscheme +69 -0
  203. package/ios/RNFBAppUnitTests/RNFBFirebaseAppClientTests.swift +165 -0
  204. package/ios/RNFBAppUnitTests/RNFBHandleMapStorageTests.swift +121 -0
  205. package/ios/RNFBAppUnitTests/RNFBHandleMapTests.m +238 -0
  206. package/ios/RNFBAppUnitTests/RNFBInitializeAppArgumentsTests.swift +256 -0
  207. package/ios/RNFBAppUnitTests/RNFBJSONImplementationTests.swift +126 -0
  208. package/ios/RNFBAppUnitTests/RNFBJSONTests.m +172 -0
  209. package/ios/RNFBAppUnitTests/RNFBMetaStorageTests.swift +106 -0
  210. package/ios/RNFBAppUnitTests/RNFBMetaTests.m +65 -0
  211. package/ios/RNFBAppUnitTests/RNFBNullSentinelDecodingTests.swift +286 -0
  212. package/ios/RNFBAppUnitTests/RNFBNullSentinelInterceptorTests.m +312 -0
  213. package/ios/RNFBAppUnitTests/RNFBPreferencesStorageTests.swift +105 -0
  214. package/ios/RNFBAppUnitTests/RNFBPreferencesTests.m +110 -0
  215. package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterCoreTests.swift +163 -0
  216. package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterFacadeTests.m +141 -0
  217. package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigFacadeTests.m +100 -0
  218. package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigTests.swift +234 -0
  219. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppFacadeTests.m +145 -0
  220. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppTests.swift +173 -0
  221. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingFacadeTests.m +38 -0
  222. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingTests.swift +82 -0
  223. package/ios/RNFBAppUnitTests/RNFBSharedUtilsNullSentinelTests.m +35 -0
  224. package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionFacadeTests.m +107 -0
  225. package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionTests.swift +133 -0
  226. package/ios/RNFBAppUnitTests/RNFBUtilsHelpersTests.swift +144 -0
  227. package/ios/RNFBAppUnitTests/RNFBUtilsModuleFacadeTests.m +72 -0
  228. package/ios/RNFBAppUnitTests/RNFBUtilsModuleShellTests.mm +282 -0
  229. package/ios/RNFBFirebase/Package.swift +53 -0
  230. package/ios/RNFBFirebase/Sources/RNFBFirebase/RNFBFirebase.swift +285 -0
  231. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/Public/.gitkeep +0 -0
  232. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/RNFBFirebaseBridge.m +169 -0
  233. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/include/RNFBFirebaseBridge.h +52 -0
  234. package/ios/RNFBFirebaseUnitTests/RNFBAppDynamicFacadeTests.swift +240 -0
  235. package/{android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppRegistrar.java → ios/RNFBFirebaseUnitTests/RNFBFirebaseClientImport.swift} +22 -17
  236. package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/project.pbxproj +588 -0
  237. package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBFirebaseUnitTests.xcscheme +83 -0
  238. package/ios_config.sh +50 -22
  239. package/lib/FirebaseApp.ts +10 -0
  240. package/lib/common/Base64.ts +10 -16
  241. package/lib/common/deeps.ts +3 -0
  242. package/lib/common/index.ts +20 -9
  243. package/lib/internal/FirebaseModule.ts +6 -3
  244. package/lib/internal/NativeModules.ts +4 -1
  245. package/lib/internal/RNFBNativeEventEmitter.ts +14 -5
  246. package/lib/internal/SharedEventEmitter.ts +5 -1
  247. package/lib/internal/asyncStorage.ts +7 -11
  248. package/lib/internal/index.ts +1 -0
  249. package/lib/internal/logger.ts +53 -43
  250. package/lib/internal/nativeModuleAndroidIos.ts +2 -40
  251. package/lib/internal/nativeModuleDebug.ts +97 -0
  252. package/lib/internal/nativeModuleWeb.ts +10 -40
  253. package/lib/internal/react-native-vendor-emitter.d.ts +11 -0
  254. package/lib/internal/registry/app.ts +8 -2
  255. package/lib/internal/registry/modular.ts +2 -2
  256. package/lib/internal/registry/nativeModule.ts +3 -3
  257. package/lib/internal/web/RNFBAppModule.ts +16 -15
  258. package/lib/internal/web/memidb/lib/FakeEventTarget.js +3 -1
  259. package/lib/types/app.ts +10 -3
  260. package/lib/types/internal.ts +19 -0
  261. package/lib/version.ts +1 -1
  262. package/package.json +9 -8
  263. package/plugin/build/ios/appDelegate.js +19 -9
  264. package/plugin/build/ios/podfile.js +16 -16
  265. package/plugin/build/pluginConfig.d.ts +4 -2
  266. package/plugin/src/ios/appDelegate.ts +45 -15
  267. package/plugin/src/ios/podfile.ts +20 -23
  268. package/plugin/src/pluginConfig.ts +4 -2
  269. package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.java +0 -124
  270. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebaseModule.java +0 -62
  271. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebasePreferences.java +0 -91
  272. package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java +0 -222
  273. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseApp.java +0 -46
  274. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java +0 -49
  275. package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java +0 -191
  276. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEvent.java +0 -53
  277. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitter.java +0 -606
  278. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java +0 -107
  279. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseMeta.java +0 -101
  280. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseModule.java +0 -146
  281. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebasePreferences.java +0 -96
  282. package/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.java +0 -441
  283. package/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.java +0 -223
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import Foundation
18
+ import XCTest
19
+
20
+ private final class RecordingConfigSource: NSObject, RNFBConfigBooleanProviding {
21
+ var containsCalls: [String] = []
22
+ var getBooleanCalls: [(key: String, defaultValue: Bool)] = []
23
+ var containsResult = false
24
+ var booleanResult = false
25
+ /// When true, `getBooleanValue` returns the passed-in `defaultValue` (Meta missing-key path).
26
+ var echoDefaultValue = false
27
+
28
+ func contains(_ key: String) -> Bool {
29
+ containsCalls.append(key)
30
+ return containsResult
31
+ }
32
+
33
+ func getBooleanValue(_ key: String, defaultValue: Bool) -> Bool {
34
+ getBooleanCalls.append((key, defaultValue))
35
+ if echoDefaultValue {
36
+ return defaultValue
37
+ }
38
+ return booleanResult
39
+ }
40
+ }
41
+
42
+ final class RNFBSharedUtilsConfigTests: XCTestCase {
43
+ private let key = "rnfb.config.waterfall.test"
44
+
45
+ func testConfigContainsIsOrOfPreferencesJsonMeta() {
46
+ let preferences = RecordingConfigSource()
47
+ let json = RecordingConfigSource()
48
+ let meta = RecordingConfigSource()
49
+
50
+ preferences.containsResult = false
51
+ json.containsResult = false
52
+ meta.containsResult = false
53
+ XCTAssertFalse(
54
+ RNFBSharedUtilsConfig.configContains(
55
+ key,
56
+ preferences: preferences,
57
+ json: json,
58
+ meta: meta
59
+ )
60
+ )
61
+
62
+ meta.containsResult = true
63
+ XCTAssertTrue(
64
+ RNFBSharedUtilsConfig.configContains(
65
+ key,
66
+ preferences: preferences,
67
+ json: json,
68
+ meta: meta
69
+ )
70
+ )
71
+
72
+ json.containsResult = true
73
+ meta.containsResult = false
74
+ XCTAssertTrue(
75
+ RNFBSharedUtilsConfig.configContains(
76
+ key,
77
+ preferences: preferences,
78
+ json: json,
79
+ meta: meta
80
+ )
81
+ )
82
+
83
+ preferences.containsResult = true
84
+ json.containsResult = false
85
+ XCTAssertTrue(
86
+ RNFBSharedUtilsConfig.configContains(
87
+ key,
88
+ preferences: preferences,
89
+ json: json,
90
+ meta: meta
91
+ )
92
+ )
93
+ }
94
+
95
+ func testConfigContainsShortCircuitsLeftToRight() {
96
+ let preferences = RecordingConfigSource()
97
+ let json = RecordingConfigSource()
98
+ let meta = RecordingConfigSource()
99
+ preferences.containsResult = true
100
+
101
+ XCTAssertTrue(
102
+ RNFBSharedUtilsConfig.configContains(
103
+ key,
104
+ preferences: preferences,
105
+ json: json,
106
+ meta: meta
107
+ )
108
+ )
109
+ XCTAssertEqual(preferences.containsCalls, [key])
110
+ XCTAssertTrue(json.containsCalls.isEmpty)
111
+ XCTAssertTrue(meta.containsCalls.isEmpty)
112
+
113
+ preferences.containsResult = false
114
+ json.containsResult = true
115
+ preferences.containsCalls.removeAll()
116
+ json.containsCalls.removeAll()
117
+ meta.containsCalls.removeAll()
118
+
119
+ XCTAssertTrue(
120
+ RNFBSharedUtilsConfig.configContains(
121
+ key,
122
+ preferences: preferences,
123
+ json: json,
124
+ meta: meta
125
+ )
126
+ )
127
+ XCTAssertEqual(preferences.containsCalls, [key])
128
+ XCTAssertEqual(json.containsCalls, [key])
129
+ XCTAssertTrue(meta.containsCalls.isEmpty)
130
+ }
131
+
132
+ func testGetConfigBooleanValuePreferencesWinsOverJsonAndMeta() {
133
+ let preferences = RecordingConfigSource()
134
+ let json = RecordingConfigSource()
135
+ let meta = RecordingConfigSource()
136
+ preferences.containsResult = true
137
+ preferences.booleanResult = true
138
+ json.containsResult = true
139
+ json.booleanResult = false
140
+ meta.containsResult = true
141
+ meta.booleanResult = false
142
+
143
+ XCTAssertTrue(
144
+ RNFBSharedUtilsConfig.getConfigBooleanValue(
145
+ forKey: key,
146
+ defaultValue: false,
147
+ preferences: preferences,
148
+ json: json,
149
+ meta: meta
150
+ )
151
+ )
152
+ XCTAssertEqual(preferences.getBooleanCalls.count, 1)
153
+ XCTAssertTrue(json.getBooleanCalls.isEmpty)
154
+ XCTAssertTrue(meta.getBooleanCalls.isEmpty)
155
+ }
156
+
157
+ func testGetConfigBooleanValueJsonWinsOverMeta() {
158
+ let preferences = RecordingConfigSource()
159
+ let json = RecordingConfigSource()
160
+ let meta = RecordingConfigSource()
161
+ preferences.containsResult = false
162
+ json.containsResult = true
163
+ json.booleanResult = true
164
+ meta.containsResult = true
165
+ meta.booleanResult = false
166
+
167
+ XCTAssertTrue(
168
+ RNFBSharedUtilsConfig.getConfigBooleanValue(
169
+ forKey: key,
170
+ defaultValue: false,
171
+ preferences: preferences,
172
+ json: json,
173
+ meta: meta
174
+ )
175
+ )
176
+ XCTAssertTrue(preferences.getBooleanCalls.isEmpty)
177
+ XCTAssertEqual(json.getBooleanCalls.count, 1)
178
+ XCTAssertTrue(meta.getBooleanCalls.isEmpty)
179
+ }
180
+
181
+ func testGetConfigBooleanValueMetaPathUsesPassedInDefault() {
182
+ let preferences = RecordingConfigSource()
183
+ let json = RecordingConfigSource()
184
+ let meta = RecordingConfigSource()
185
+ preferences.containsResult = false
186
+ json.containsResult = false
187
+ // Meta missing-key path forwards the caller defaultValue.
188
+ meta.echoDefaultValue = true
189
+
190
+ XCTAssertTrue(
191
+ RNFBSharedUtilsConfig.getConfigBooleanValue(
192
+ forKey: key,
193
+ defaultValue: true,
194
+ preferences: preferences,
195
+ json: json,
196
+ meta: meta
197
+ )
198
+ )
199
+ XCTAssertFalse(
200
+ RNFBSharedUtilsConfig.getConfigBooleanValue(
201
+ forKey: key,
202
+ defaultValue: false,
203
+ preferences: preferences,
204
+ json: json,
205
+ meta: meta
206
+ )
207
+ )
208
+ XCTAssertEqual(meta.getBooleanCalls.count, 2)
209
+ XCTAssertEqual(meta.getBooleanCalls[0].defaultValue, true)
210
+ XCTAssertEqual(meta.getBooleanCalls[1].defaultValue, false)
211
+ XCTAssertTrue(preferences.getBooleanCalls.isEmpty)
212
+ XCTAssertTrue(json.getBooleanCalls.isEmpty)
213
+ }
214
+
215
+ func testGetConfigBooleanValueMetaPathReturnsSourceValue() {
216
+ let preferences = RecordingConfigSource()
217
+ let json = RecordingConfigSource()
218
+ let meta = RecordingConfigSource()
219
+ preferences.containsResult = false
220
+ json.containsResult = false
221
+ meta.booleanResult = true
222
+
223
+ XCTAssertTrue(
224
+ RNFBSharedUtilsConfig.getConfigBooleanValue(
225
+ forKey: key,
226
+ defaultValue: false,
227
+ preferences: preferences,
228
+ json: json,
229
+ meta: meta
230
+ )
231
+ )
232
+ XCTAssertEqual(meta.getBooleanCalls[0].defaultValue, false)
233
+ }
234
+ }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #import <XCTest/XCTest.h>
18
+
19
+ #import <React/RCTBridge.h>
20
+
21
+ #import "FirebaseCore/FirebaseCore.h"
22
+ #import "RNFBAppModule.h"
23
+ #import "RNFBHandleMapStorage-Swift.inc"
24
+ #import "RNFBRCTEventEmitter.h"
25
+ #import "RNFBSharedUtils.h"
26
+
27
+ @interface RNFBAppModule (Testing)
28
+ + (void)setCustomDomainForTesting:(NSString *)domain forAppName:(NSString *)appName;
29
+ + (void)resetCustomDomainsForTesting;
30
+ @end
31
+
32
+ @interface RNFBSharedUtilsFIRAppFacadeTests : XCTestCase
33
+ @end
34
+
35
+ @implementation RNFBSharedUtilsFIRAppFacadeTests
36
+
37
+ - (FIROptions *)fullyPopulatedOptions {
38
+ FIROptions *options = [[FIROptions alloc] init];
39
+ options.APIKey = @"api-key";
40
+ options.googleAppID = @"app-id";
41
+ options.projectID = @"project-id";
42
+ options.databaseURL = @"https://example.firebaseio.com";
43
+ options.storageBucket = @"example.appspot.com";
44
+ options.GCMSenderID = @"sender-id";
45
+ options.clientID = @"client-id";
46
+ return options;
47
+ }
48
+
49
+ - (void)tearDown {
50
+ [RNFBAppModule resetCustomDomainsForTesting];
51
+ RNFBRCTEventEmitter *emitter = [RNFBRCTEventEmitter shared];
52
+ // Rebuild a core whose bridge/emit closures capture *shared*, not a disposable
53
+ // template (stealing template.core leaves dangling weakSelf → permanent queue-only).
54
+ __weak RNFBRCTEventEmitter *weakEmitter = emitter;
55
+ RNFBRCTEventEmitterCore *restoredCore = [[RNFBRCTEventEmitterCore alloc]
56
+ initWithIsBridgePresent:^BOOL {
57
+ return weakEmitter.bridge != nil;
58
+ }
59
+ emitHandler:^(NSString *eventName, id body) {
60
+ __strong RNFBRCTEventEmitter *strongEmitter = weakEmitter;
61
+ NSString *prefixedEventName = [@"rnfb_" stringByAppendingString:eventName];
62
+ [strongEmitter.bridge
63
+ enqueueJSCall:@"RCTDeviceEventEmitter"
64
+ method:@"emit"
65
+ args:body ? @[ prefixedEventName, body ] : @[ prefixedEventName ]
66
+ completion:NULL];
67
+ }];
68
+ [emitter setValue:restoredCore forKey:@"core"];
69
+ [emitter invalidate];
70
+ emitter.bridge = nil;
71
+ [super tearDown];
72
+ }
73
+
74
+ - (void)testFacadeDefaultNameMappingAndOptions {
75
+ FIRApp *app = [[FIRApp alloc] initWithName:DEFAULT_APP_NAME options:[self fullyPopulatedOptions]];
76
+ [app setDataCollectionDefaultEnabled:YES];
77
+
78
+ NSDictionary *result = [RNFBSharedUtils firAppToDictionary:app];
79
+ NSDictionary *appConfig = result[@"appConfig"];
80
+ NSDictionary *options = result[@"options"];
81
+
82
+ XCTAssertEqualObjects(appConfig[@"name"], DEFAULT_APP_DISPLAY_NAME);
83
+ XCTAssertEqualObjects(appConfig[@"automaticDataCollectionEnabled"], @YES);
84
+ XCTAssertEqualObjects(options[@"apiKey"], @"api-key");
85
+ XCTAssertEqualObjects(options[@"appId"], @"app-id");
86
+ XCTAssertEqualObjects(options[@"projectId"], @"project-id");
87
+ XCTAssertEqualObjects(options[@"databaseURL"], @"https://example.firebaseio.com");
88
+ XCTAssertEqualObjects(options[@"storageBucket"], @"example.appspot.com");
89
+ XCTAssertEqualObjects(options[@"messagingSenderId"], @"sender-id");
90
+ XCTAssertEqualObjects(options[@"clientId"], @"client-id");
91
+ XCTAssertNil(options[@"authDomain"]);
92
+ }
93
+
94
+ - (void)testFacadeAuthDomainPresentAndAbsent {
95
+ FIRApp *app = [[FIRApp alloc] initWithName:@"secondary" options:[self fullyPopulatedOptions]];
96
+
97
+ NSDictionary *withoutDomain = [RNFBSharedUtils firAppToDictionary:app];
98
+ XCTAssertNil(withoutDomain[@"options"][@"authDomain"]);
99
+
100
+ [RNFBAppModule setCustomDomainForTesting:@"custom.example.com" forAppName:@"secondary"];
101
+ NSDictionary *withDomain = [RNFBSharedUtils firAppToDictionary:app];
102
+ XCTAssertEqualObjects(withDomain[@"options"][@"authDomain"], @"custom.example.com");
103
+ }
104
+
105
+ - (void)testFacadeAuthDomainUsesMappedDefaultName {
106
+ FIRApp *app = [[FIRApp alloc] initWithName:DEFAULT_APP_NAME options:[self fullyPopulatedOptions]];
107
+ [RNFBAppModule setCustomDomainForTesting:@"default-domain.example.com"
108
+ forAppName:DEFAULT_APP_DISPLAY_NAME];
109
+
110
+ NSDictionary *result = [RNFBSharedUtils firAppToDictionary:app];
111
+ XCTAssertEqualObjects(result[@"options"][@"authDomain"], @"default-domain.example.com");
112
+ }
113
+
114
+ - (void)testFacadeSendJSEventInjectsAppNameAndForwards {
115
+ FIRApp *app = [[FIRApp alloc] initWithName:DEFAULT_APP_NAME options:[self fullyPopulatedOptions]];
116
+ RNFBRCTEventEmitter *emitter = [RNFBRCTEventEmitter shared];
117
+ [emitter invalidate];
118
+
119
+ __block NSString *capturedName = nil;
120
+ __block NSDictionary *capturedBody = nil;
121
+ RNFBRCTEventEmitterCore *recordingCore = [[RNFBRCTEventEmitterCore alloc]
122
+ initWithIsBridgePresent:^BOOL {
123
+ return YES;
124
+ }
125
+ emitHandler:^(NSString *eventName, id body) {
126
+ capturedName = [eventName copy];
127
+ capturedBody = body;
128
+ }];
129
+ [emitter setValue:recordingCore forKey:@"core"];
130
+ [emitter notifyJsReady:YES];
131
+ [emitter addListener:@"facade_event"];
132
+
133
+ [RNFBSharedUtils sendJSEventForApp:app name:@"facade_event" body:@{@"foo" : @"bar"}];
134
+
135
+ XCTAssertEqualObjects(capturedName, @"facade_event");
136
+ XCTAssertEqualObjects(capturedBody[@"foo"], @"bar");
137
+ XCTAssertEqualObjects(capturedBody[@"appName"], DEFAULT_APP_DISPLAY_NAME);
138
+ }
139
+
140
+ - (void)testFacadePublicSelectorsUnchanged {
141
+ XCTAssertTrue([RNFBSharedUtils respondsToSelector:@selector(firAppToDictionary:)]);
142
+ XCTAssertTrue([RNFBSharedUtils respondsToSelector:@selector(sendJSEventForApp:name:body:)]);
143
+ }
144
+
145
+ @end
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import Foundation
18
+ import XCTest
19
+
20
+ private final class StubFIROptions: NSObject, RNFBFIROptionsProviding {
21
+ var apiKey: String?
22
+ var googleAppID: String?
23
+ var projectID: String?
24
+ var databaseURL: String?
25
+ var storageBucket: String?
26
+ var gcmSenderID: String?
27
+ var clientID: String?
28
+ }
29
+
30
+ private final class StubFIRApp: NSObject, RNFBFIRAppProviding {
31
+ var name: String
32
+ var options: RNFBFIROptionsProviding
33
+ var dataCollectionEnabled = false
34
+
35
+ init(name: String, options: RNFBFIROptionsProviding) {
36
+ self.name = name
37
+ self.options = options
38
+ }
39
+
40
+ func isDataCollectionDefaultEnabled() -> Bool {
41
+ dataCollectionEnabled
42
+ }
43
+ }
44
+
45
+ private final class StubCustomDomainProvider: NSObject, RNFBCustomDomainProviding {
46
+ var domains: [String: String] = [:]
47
+ var lastRequestedName: String?
48
+
49
+ func getCustomDomain(_ appName: String) -> String? {
50
+ lastRequestedName = appName
51
+ return domains[appName]
52
+ }
53
+ }
54
+
55
+ private final class RecordingEventSender: NSObject, RNFBJSEventSending {
56
+ var lastName: String?
57
+ var lastBody: Any?
58
+
59
+ func sendEvent(name: String, body: Any?) {
60
+ lastName = name
61
+ lastBody = body
62
+ }
63
+ }
64
+
65
+ final class RNFBSharedUtilsFIRAppTests: XCTestCase {
66
+ private func fullyPopulatedOptions() -> StubFIROptions {
67
+ let options = StubFIROptions()
68
+ options.apiKey = "api-key"
69
+ options.googleAppID = "app-id"
70
+ options.projectID = "project-id"
71
+ options.databaseURL = "https://example.firebaseio.com"
72
+ options.storageBucket = "example.appspot.com"
73
+ options.gcmSenderID = "sender-id"
74
+ options.clientID = "client-id"
75
+ return options
76
+ }
77
+
78
+ func testDefaultAppNameMapsToDisplayName() {
79
+ let app = StubFIRApp(name: "__FIRAPP_DEFAULT", options: fullyPopulatedOptions())
80
+ app.dataCollectionEnabled = true
81
+ let domains = StubCustomDomainProvider()
82
+
83
+ let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
84
+ let appConfig = result["appConfig"] as? NSDictionary
85
+
86
+ XCTAssertEqual(appConfig?["name"] as? String, "[DEFAULT]")
87
+ XCTAssertEqual(appConfig?["automaticDataCollectionEnabled"] as? Bool, true)
88
+ XCTAssertEqual(domains.lastRequestedName, "[DEFAULT]")
89
+ }
90
+
91
+ func testNamedAppPreservesName() {
92
+ let app = StubFIRApp(name: "secondary", options: fullyPopulatedOptions())
93
+ let domains = StubCustomDomainProvider()
94
+
95
+ let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
96
+ let appConfig = result["appConfig"] as? NSDictionary
97
+
98
+ XCTAssertEqual(appConfig?["name"] as? String, "secondary")
99
+ XCTAssertEqual(domains.lastRequestedName, "secondary")
100
+ }
101
+
102
+ func testOptionsFieldMapping() {
103
+ let app = StubFIRApp(name: "secondary", options: fullyPopulatedOptions())
104
+ let domains = StubCustomDomainProvider()
105
+
106
+ let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
107
+ let options = result["options"] as? NSDictionary
108
+
109
+ XCTAssertEqual(options?["apiKey"] as? String, "api-key")
110
+ XCTAssertEqual(options?["appId"] as? String, "app-id")
111
+ XCTAssertEqual(options?["projectId"] as? String, "project-id")
112
+ XCTAssertEqual(options?["databaseURL"] as? String, "https://example.firebaseio.com")
113
+ XCTAssertEqual(options?["storageBucket"] as? String, "example.appspot.com")
114
+ XCTAssertEqual(options?["messagingSenderId"] as? String, "sender-id")
115
+ XCTAssertEqual(options?["clientId"] as? String, "client-id")
116
+ XCTAssertNil(options?["authDomain"])
117
+ }
118
+
119
+ func testAuthDomainPresentWhenProviderReturnsValue() {
120
+ let app = StubFIRApp(name: "secondary", options: fullyPopulatedOptions())
121
+ let domains = StubCustomDomainProvider()
122
+ domains.domains["secondary"] = "custom.example.com"
123
+
124
+ let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
125
+ let options = result["options"] as? NSDictionary
126
+
127
+ XCTAssertEqual(options?["authDomain"] as? String, "custom.example.com")
128
+ }
129
+
130
+ func testAuthDomainAbsentWhenProviderReturnsNil() {
131
+ let app = StubFIRApp(name: "__FIRAPP_DEFAULT", options: fullyPopulatedOptions())
132
+ let domains = StubCustomDomainProvider()
133
+
134
+ let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
135
+ let options = result["options"] as? NSDictionary
136
+
137
+ XCTAssertNil(options?["authDomain"])
138
+ XCTAssertEqual(domains.lastRequestedName, "[DEFAULT]")
139
+ }
140
+
141
+ func testSendJSEventInjectsAppNameAndForwards() {
142
+ let app = StubFIRApp(name: "__FIRAPP_DEFAULT", options: fullyPopulatedOptions())
143
+ let sender = RecordingEventSender()
144
+ let body: NSDictionary = ["foo": "bar"]
145
+
146
+ RNFBSharedUtilsFIRApp.sendJSEvent(
147
+ forApp: app,
148
+ name: "app_event",
149
+ body: body,
150
+ eventSender: sender
151
+ )
152
+
153
+ XCTAssertEqual(sender.lastName, "app_event")
154
+ let forwarded = sender.lastBody as? NSDictionary
155
+ XCTAssertEqual(forwarded?["foo"] as? String, "bar")
156
+ XCTAssertEqual(forwarded?["appName"] as? String, "[DEFAULT]")
157
+ }
158
+
159
+ func testSendJSEventPreservesNamedAppName() {
160
+ let app = StubFIRApp(name: "secondary", options: fullyPopulatedOptions())
161
+ let sender = RecordingEventSender()
162
+
163
+ RNFBSharedUtilsFIRApp.sendJSEvent(
164
+ forApp: app,
165
+ name: "named_event",
166
+ body: [:],
167
+ eventSender: sender
168
+ )
169
+
170
+ let forwarded = sender.lastBody as? NSDictionary
171
+ XCTAssertEqual(forwarded?["appName"] as? String, "secondary")
172
+ }
173
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #import <XCTest/XCTest.h>
18
+
19
+ #import "RNFBHandleMapStorage-Swift.inc"
20
+ #import "RNFBSharedUtils.h"
21
+
22
+ @interface RNFBSharedUtilsFormattingFacadeTests : XCTestCase
23
+ @end
24
+
25
+ @implementation RNFBSharedUtilsFormattingFacadeTests
26
+
27
+ - (void)testFacadeMapsDefaultAppName {
28
+ XCTAssertEqualObjects([RNFBSharedUtils getAppJavaScriptName:DEFAULT_APP_NAME],
29
+ DEFAULT_APP_DISPLAY_NAME);
30
+ XCTAssertEqualObjects([RNFBSharedUtils getAppJavaScriptName:@"secondary"], @"secondary");
31
+ }
32
+
33
+ - (void)testFacadeFormatsISO8601WithTrailingZ {
34
+ NSDate *date = [NSDate dateWithTimeIntervalSince1970:1577934245];
35
+ XCTAssertEqualObjects([RNFBSharedUtils getISO8601String:date], @"2020-01-02T03:04:05Z");
36
+ }
37
+
38
+ @end
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import Foundation
18
+ import XCTest
19
+
20
+ final class RNFBSharedUtilsFormattingTests: XCTestCase {
21
+ func testDefaultAppNameMapsToDisplayName() {
22
+ XCTAssertEqual(
23
+ RNFBSharedUtilsFormatting.getAppJavaScriptName("__FIRAPP_DEFAULT"),
24
+ "[DEFAULT]"
25
+ )
26
+ }
27
+
28
+ func testNonDefaultAppNameIsReturnedUnchanged() {
29
+ XCTAssertEqual(
30
+ RNFBSharedUtilsFormatting.getAppJavaScriptName("secondary"),
31
+ "secondary"
32
+ )
33
+ XCTAssertEqual(
34
+ RNFBSharedUtilsFormatting.getAppJavaScriptName("[DEFAULT]"),
35
+ "[DEFAULT]"
36
+ )
37
+ XCTAssertEqual(RNFBSharedUtilsFormatting.getAppJavaScriptName(""), "")
38
+ }
39
+
40
+ func testNilAppNameReturnsNil() {
41
+ XCTAssertNil(RNFBSharedUtilsFormatting.getAppJavaScriptName(nil))
42
+ }
43
+
44
+ func testISO8601UsesPOSIXUTCAndTrailingZ() {
45
+ var components = DateComponents()
46
+ components.calendar = Calendar(identifier: .gregorian)
47
+ components.timeZone = TimeZone(abbreviation: "UTC")
48
+ components.year = 2020
49
+ components.month = 1
50
+ components.day = 2
51
+ components.hour = 3
52
+ components.minute = 4
53
+ components.second = 5
54
+
55
+ let date = components.date!
56
+ XCTAssertEqual(
57
+ RNFBSharedUtilsFormatting.getISO8601String(date),
58
+ "2020-01-02T03:04:05Z"
59
+ )
60
+ }
61
+
62
+ func testISO8601FormatsInUTCRegardlessOfLocalOffset() {
63
+ // 2020-01-02 03:04:05 UTC as absolute instant; format must stay UTC/`Z`.
64
+ let date = Date(timeIntervalSince1970: 1_577_934_245)
65
+ XCTAssertEqual(
66
+ RNFBSharedUtilsFormatting.getISO8601String(date),
67
+ "2020-01-02T03:04:05Z"
68
+ )
69
+ }
70
+
71
+ func testISO8601OmitsFractionalSeconds() {
72
+ let date = Date(timeIntervalSince1970: 1_577_934_245.789)
73
+ XCTAssertEqual(
74
+ RNFBSharedUtilsFormatting.getISO8601String(date),
75
+ "2020-01-02T03:04:05Z"
76
+ )
77
+ }
78
+
79
+ func testNilDateReturnsNil() {
80
+ XCTAssertNil(RNFBSharedUtilsFormatting.getISO8601String(nil))
81
+ }
82
+ }