@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,105 @@
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 RNFBPreferencesStorageTests: XCTestCase {
21
+ private var domainIdentifier: String!
22
+ private var userDefaults: UserDefaults!
23
+ private var storage: RNFBPreferencesStorage!
24
+
25
+ override func setUp() {
26
+ super.setUp()
27
+ domainIdentifier = "io.invertase.firebase.tests.\(UUID().uuidString)"
28
+ userDefaults = UserDefaults(suiteName: domainIdentifier)
29
+ userDefaults.removePersistentDomain(forName: domainIdentifier)
30
+ storage = RNFBPreferencesStorage(
31
+ userDefaults: userDefaults,
32
+ domainIdentifier: domainIdentifier
33
+ )
34
+ }
35
+
36
+ override func tearDown() {
37
+ userDefaults.removePersistentDomain(forName: domainIdentifier)
38
+ storage = nil
39
+ userDefaults = nil
40
+ domainIdentifier = nil
41
+ super.tearDown()
42
+ }
43
+
44
+ func testMissingKeysUseDefaultsAndAreNotContained() {
45
+ XCTAssertFalse(storage.contains("missing"))
46
+ XCTAssertTrue(storage.getBooleanValue("missing", defaultValue: true))
47
+ XCTAssertEqual(storage.getIntegerValue("missing", defaultValue: Int.max), Int.max)
48
+ XCTAssertEqual(storage.getStringValue("missing", defaultValue: "fallback"), "fallback")
49
+ }
50
+
51
+ func testSettersAndGettersPreserveValuesAndDictionaryRepresentation() {
52
+ storage.setBooleanValue("bool", boolValue: true)
53
+ storage.setIntegerValue("integer", integerValue: Int.max)
54
+ storage.setStringValue("string", stringValue: "value")
55
+
56
+ XCTAssertTrue(storage.contains("bool"))
57
+ XCTAssertTrue(storage.getBooleanValue("bool", defaultValue: false))
58
+ XCTAssertEqual(storage.getIntegerValue("integer", defaultValue: 0), Int.max)
59
+ XCTAssertEqual(storage.getStringValue("string", defaultValue: "fallback"), "value")
60
+
61
+ let all = storage.getAll()
62
+ XCTAssertEqual(all["bool"] as? Bool, true)
63
+ XCTAssertEqual(all["integer"] as? Int, Int.max)
64
+ XCTAssertEqual(all["string"] as? String, "value")
65
+ }
66
+
67
+ func testStringForPresentNonStringValueMatchesNSUserDefaults() {
68
+ userDefaults.set(["value"], forKey: "notString")
69
+
70
+ XCTAssertTrue(storage.contains("notString"))
71
+ XCTAssertNil(storage.getStringValue("notString", defaultValue: "fallback"))
72
+ }
73
+
74
+ func testRemoveAndClearAllUseTheConfiguredPersistentDomain() {
75
+ storage.setStringValue("first", stringValue: "one")
76
+ storage.setStringValue("second", stringValue: "two")
77
+
78
+ storage.remove("first")
79
+ XCTAssertFalse(storage.contains("first"))
80
+ XCTAssertTrue(storage.contains("second"))
81
+
82
+ storage.clearAll()
83
+ XCTAssertFalse(storage.contains("second"))
84
+ let clearedDomain = userDefaults.persistentDomain(forName: domainIdentifier)
85
+ XCTAssertTrue(
86
+ clearedDomain == nil || clearedDomain?.isEmpty == true,
87
+ "clearAll must leave the persistent domain nil or empty; got \(String(describing: clearedDomain))"
88
+ )
89
+ }
90
+
91
+ func testDefaultInitializerUsesRNFBPreferencesSuite() {
92
+ let suiteName = "io.invertase.firebase"
93
+ let productionDefaults = UserDefaults(suiteName: suiteName)!
94
+ let key = "RNFBPreferencesStorageTests.\(UUID().uuidString)"
95
+ productionDefaults.removeObject(forKey: key)
96
+ defer {
97
+ productionDefaults.removeObject(forKey: key)
98
+ }
99
+
100
+ let productionStorage = RNFBPreferencesStorage()
101
+ productionStorage.setStringValue(key, stringValue: "suite-value")
102
+
103
+ XCTAssertEqual(productionDefaults.string(forKey: key), "suite-value")
104
+ }
105
+ }
@@ -0,0 +1,110 @@
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 "RNFBPreferences.h"
21
+
22
+ @interface RNFBPreferencesTests : XCTestCase
23
+ @property(nonatomic, strong) NSString *domainIdentifier;
24
+ @property(nonatomic, strong) NSUserDefaults *userDefaults;
25
+ @property(nonatomic, strong) RNFBPreferences *preferences;
26
+ @end
27
+
28
+ @implementation RNFBPreferencesTests
29
+
30
+ - (void)setUp {
31
+ [super setUp];
32
+ self.domainIdentifier =
33
+ [@"io.invertase.firebase.tests." stringByAppendingString:NSUUID.UUID.UUIDString];
34
+ self.userDefaults = [[NSUserDefaults alloc] initWithSuiteName:self.domainIdentifier];
35
+ [self.userDefaults removePersistentDomainForName:self.domainIdentifier];
36
+ RNFBPreferencesStorage *storage =
37
+ [[RNFBPreferencesStorage alloc] initWithUserDefaults:self.userDefaults
38
+ domainIdentifier:self.domainIdentifier];
39
+ self.preferences = [[RNFBPreferences alloc] init];
40
+ [self.preferences setValue:storage forKey:@"storage"];
41
+ }
42
+
43
+ - (void)tearDown {
44
+ [self.userDefaults removePersistentDomainForName:self.domainIdentifier];
45
+ self.preferences = nil;
46
+ self.userDefaults = nil;
47
+ self.domainIdentifier = nil;
48
+ [super tearDown];
49
+ }
50
+
51
+ - (void)testSharedIsAvailableAndStable {
52
+ XCTAssertNotNil(RNFBPreferences.shared);
53
+ XCTAssertIdentical(RNFBPreferences.shared, RNFBPreferences.shared);
54
+ }
55
+
56
+ - (void)testPublicSelectorsAndIntegerWidthsAreUnchanged {
57
+ NSArray<NSString *> *selectorNames = @[
58
+ @"contains:",
59
+ @"getBooleanValue:defaultValue:",
60
+ @"setBooleanValue:boolValue:",
61
+ @"setIntegerValue:integerValue:",
62
+ @"setStringValue:stringValue:",
63
+ @"getStringValue:defaultValue:",
64
+ @"getIntegerValue:defaultValue:",
65
+ @"getAll",
66
+ @"clearAll",
67
+ @"remove:",
68
+ ];
69
+ for (NSString *selectorName in selectorNames) {
70
+ XCTAssertTrue([self.preferences respondsToSelector:NSSelectorFromString(selectorName)]);
71
+ }
72
+
73
+ NSMethodSignature *setter =
74
+ [RNFBPreferences instanceMethodSignatureForSelector:@selector(setIntegerValue:integerValue:)];
75
+ XCTAssertEqual(strcmp([setter getArgumentTypeAtIndex:3], @encode(NSInteger)), 0);
76
+
77
+ NSMethodSignature *getter =
78
+ [RNFBPreferences instanceMethodSignatureForSelector:@selector(getIntegerValue:defaultValue:)];
79
+ XCTAssertEqual(strcmp(getter.methodReturnType, @encode(NSInteger)), 0);
80
+ XCTAssertEqual(strcmp([getter getArgumentTypeAtIndex:3], @encode(NSInteger)), 0);
81
+ }
82
+
83
+ - (void)testFacadeForwardsEveryPreferenceOperation {
84
+ XCTAssertFalse([self.preferences contains:@"missing"]);
85
+ XCTAssertTrue([self.preferences getBooleanValue:@"missing" defaultValue:YES]);
86
+ XCTAssertEqual([self.preferences getIntegerValue:@"missing" defaultValue:NSIntegerMax],
87
+ NSIntegerMax);
88
+ XCTAssertEqualObjects([self.preferences getStringValue:@"missing" defaultValue:@"fallback"],
89
+ @"fallback");
90
+
91
+ [self.preferences setBooleanValue:@"bool" boolValue:YES];
92
+ [self.preferences setIntegerValue:@"integer" integerValue:NSIntegerMax];
93
+ [self.preferences setStringValue:@"string" stringValue:@"value"];
94
+
95
+ XCTAssertTrue([self.preferences contains:@"bool"]);
96
+ XCTAssertTrue([self.preferences getBooleanValue:@"bool" defaultValue:NO]);
97
+ XCTAssertEqual([self.preferences getIntegerValue:@"integer" defaultValue:0], NSIntegerMax);
98
+ XCTAssertEqualObjects([self.preferences getStringValue:@"string" defaultValue:@"fallback"],
99
+ @"value");
100
+ XCTAssertEqualObjects([self.preferences getAll][@"string"], @"value");
101
+
102
+ [self.preferences remove:@"bool"];
103
+ XCTAssertFalse([self.preferences contains:@"bool"]);
104
+
105
+ [self.preferences clearAll];
106
+ XCTAssertFalse([self.preferences contains:@"integer"]);
107
+ XCTAssertFalse([self.preferences contains:@"string"]);
108
+ }
109
+
110
+ @end
@@ -0,0 +1,163 @@
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 RNFBRCTEventEmitterCoreTests: XCTestCase {
21
+ private var bridgePresent = false
22
+ private var emitted: [(String, Any?)] = []
23
+ private var core: RNFBRCTEventEmitterCore!
24
+
25
+ override func setUp() {
26
+ super.setUp()
27
+ bridgePresent = false
28
+ emitted = []
29
+ core = RNFBRCTEventEmitterCore(
30
+ isBridgePresent: { [unowned self] in self.bridgePresent },
31
+ emitHandler: { [unowned self] name, body in
32
+ self.emitted.append((name, body))
33
+ }
34
+ )
35
+ }
36
+
37
+ override func tearDown() {
38
+ core = nil
39
+ super.tearDown()
40
+ }
41
+
42
+ func testInvalidateResetsState() {
43
+ core.sendEvent(name: "a", body: ["x": 1])
44
+ core.addListener("a")
45
+ core.notifyJsReady(true)
46
+
47
+ core.invalidate()
48
+
49
+ let dict = core.getListenersDictionary()
50
+ XCTAssertEqual(dict["listeners"] as? Int, 0)
51
+ XCTAssertEqual(dict["queued"] as? Int, 0)
52
+ XCTAssertEqual((dict["events"] as? NSDictionary)?.count, 0)
53
+ }
54
+
55
+ func testSendEventQueuesWhenNotReadyToEmit() {
56
+ core.sendEvent(name: "evt", body: ["k": "v"])
57
+
58
+ let dict = core.getListenersDictionary()
59
+ XCTAssertEqual(dict["queued"] as? Int, 1)
60
+ XCTAssertTrue(emitted.isEmpty)
61
+ }
62
+
63
+ func testSendEventEmitsWhenBridgeObservingAndRegistered() {
64
+ bridgePresent = true
65
+ core.notifyJsReady(true)
66
+ core.addListener("evt")
67
+ emitted = []
68
+
69
+ core.sendEvent(name: "evt", body: ["k": "v"])
70
+
71
+ XCTAssertEqual(emitted.count, 1)
72
+ XCTAssertEqual(emitted[0].0, "evt")
73
+ XCTAssertEqual((emitted[0].1 as? NSDictionary)?["k"] as? String, "v")
74
+ XCTAssertEqual(core.getListenersDictionary()["queued"] as? Int, 0)
75
+ }
76
+
77
+ func testNotifyJsReadyFlushesQueue() {
78
+ bridgePresent = true
79
+ core.addListener("evt")
80
+ core.sendEvent(name: "evt", body: ["k": 1])
81
+ emitted = []
82
+
83
+ core.notifyJsReady(true)
84
+
85
+ XCTAssertEqual(emitted.count, 1)
86
+ XCTAssertEqual(emitted[0].0, "evt")
87
+ XCTAssertEqual(core.getListenersDictionary()["queued"] as? Int, 0)
88
+ }
89
+
90
+ func testAddListenerFlushesMatchingQueuedEvents() {
91
+ bridgePresent = true
92
+ core.notifyJsReady(true)
93
+ core.sendEvent(name: "evt", body: ["k": 1])
94
+ core.sendEvent(name: "other", body: ["k": 2])
95
+ emitted = []
96
+
97
+ core.addListener("evt")
98
+
99
+ XCTAssertEqual(emitted.count, 1)
100
+ XCTAssertEqual(emitted[0].0, "evt")
101
+ XCTAssertEqual(core.getListenersDictionary()["queued"] as? Int, 1)
102
+ }
103
+
104
+ func testAddListenerIncrementsCounts() {
105
+ core.addListener("evt")
106
+ core.addListener("evt")
107
+
108
+ let dict = core.getListenersDictionary()
109
+ XCTAssertEqual(dict["listeners"] as? Int, 2)
110
+ XCTAssertEqual((dict["events"] as? NSDictionary)?["evt"] as? Int, 2)
111
+ }
112
+
113
+ func testRemoveListenersDecrementsAndRemoves() {
114
+ core.addListener("evt")
115
+ core.addListener("evt")
116
+
117
+ core.removeListeners("evt", all: false)
118
+ XCTAssertEqual((core.getListenersDictionary()["events"] as? NSDictionary)?["evt"] as? Int, 1)
119
+ XCTAssertEqual(core.getListenersDictionary()["listeners"] as? Int, 1)
120
+
121
+ core.removeListeners("evt", all: false)
122
+ XCTAssertNil((core.getListenersDictionary()["events"] as? NSDictionary)?["evt"])
123
+ XCTAssertEqual(core.getListenersDictionary()["listeners"] as? Int, 0)
124
+ }
125
+
126
+ func testRemoveListenersAllRemovesEntireCount() {
127
+ core.addListener("evt")
128
+ core.addListener("evt")
129
+ core.addListener("evt")
130
+
131
+ core.removeListeners("evt", all: true)
132
+
133
+ XCTAssertNil((core.getListenersDictionary()["events"] as? NSDictionary)?["evt"])
134
+ XCTAssertEqual(core.getListenersDictionary()["listeners"] as? Int, 0)
135
+ }
136
+
137
+ func testRemoveListenersNoOpWhenMissing() {
138
+ core.removeListeners("missing", all: true)
139
+ XCTAssertEqual(core.getListenersDictionary()["listeners"] as? Int, 0)
140
+ }
141
+
142
+ func testSendEventWithNilBodyWhenEmitting() {
143
+ bridgePresent = true
144
+ core.notifyJsReady(true)
145
+ core.addListener("evt")
146
+ emitted = []
147
+
148
+ core.sendEvent(name: "evt", body: nil)
149
+
150
+ XCTAssertEqual(emitted.count, 1)
151
+ XCTAssertEqual(emitted[0].0, "evt")
152
+ XCTAssertNil(emitted[0].1)
153
+ }
154
+
155
+ func testIsObservingRequiresJsReady() {
156
+ bridgePresent = true
157
+ core.addListener("evt")
158
+ core.sendEvent(name: "evt", body: ["k": 1])
159
+
160
+ XCTAssertTrue(emitted.isEmpty)
161
+ XCTAssertEqual(core.getListenersDictionary()["queued"] as? Int, 1)
162
+ }
163
+ }
@@ -0,0 +1,141 @@
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
+ #import "RNFBHandleMapStorage-Swift.inc"
21
+ #import "RNFBRCTEventEmitter.h"
22
+
23
+ @interface RNFBRCTEventEmitterFacadeTests : XCTestCase
24
+ @property(nonatomic, strong) RNFBRCTEventEmitter *emitter;
25
+ @property(nonatomic, strong) RCTBridge *bridge;
26
+ @end
27
+
28
+ @implementation RNFBRCTEventEmitterFacadeTests
29
+
30
+ - (void)setUp {
31
+ [super setUp];
32
+ self.emitter = [[RNFBRCTEventEmitter alloc] init];
33
+ self.bridge = [[RCTBridge alloc] init];
34
+ [self.emitter invalidate];
35
+ }
36
+
37
+ - (void)tearDown {
38
+ [self.emitter invalidate];
39
+ self.emitter.bridge = nil;
40
+ self.emitter = nil;
41
+ self.bridge = nil;
42
+ [super tearDown];
43
+ }
44
+
45
+ - (void)testSharedIsSingleton {
46
+ XCTAssertIdentical([RNFBRCTEventEmitter shared], [RNFBRCTEventEmitter shared]);
47
+ }
48
+
49
+ - (void)testPublicSelectorsUnchanged {
50
+ NSArray<NSString *> *selectorNames = @[
51
+ @"invalidate",
52
+ @"addListener:",
53
+ @"removeListeners:all:",
54
+ @"sendEventWithName:body:",
55
+ @"notifyJsReady:",
56
+ @"getListenersDictionary",
57
+ ];
58
+ for (NSString *selectorName in selectorNames) {
59
+ XCTAssertTrue([self.emitter respondsToSelector:NSSelectorFromString(selectorName)]);
60
+ }
61
+ XCTAssertTrue([RNFBRCTEventEmitter respondsToSelector:@selector(shared)]);
62
+ XCTAssertTrue([self.emitter respondsToSelector:@selector(bridge)]);
63
+ XCTAssertTrue([self.emitter respondsToSelector:@selector(setBridge:)]);
64
+ }
65
+
66
+ - (void)testInvalidateResetsListenersAndQueue {
67
+ [self.emitter sendEventWithName:@"evt" body:@{@"a" : @1}];
68
+ [self.emitter addListener:@"evt"];
69
+ [self.emitter notifyJsReady:YES];
70
+
71
+ [self.emitter invalidate];
72
+
73
+ NSDictionary *dict = [self.emitter getListenersDictionary];
74
+ XCTAssertEqualObjects(dict[@"listeners"], @0);
75
+ XCTAssertEqualObjects(dict[@"queued"], @0);
76
+ XCTAssertEqual([dict[@"events"] count], 0u);
77
+ }
78
+
79
+ - (void)testSendEventQueuesWithoutBridge {
80
+ [self.emitter notifyJsReady:YES];
81
+ [self.emitter addListener:@"evt"];
82
+ [self.emitter sendEventWithName:@"evt" body:@{@"a" : @1}];
83
+
84
+ NSDictionary *dict = [self.emitter getListenersDictionary];
85
+ XCTAssertEqualObjects(dict[@"queued"], @1);
86
+ XCTAssertNil(self.bridge.lastModule);
87
+ }
88
+
89
+ - (void)testSendEventEmitsViaBridgeWhenReady {
90
+ self.emitter.bridge = self.bridge;
91
+ [self.emitter notifyJsReady:YES];
92
+ [self.emitter addListener:@"evt"];
93
+ [self.bridge resetLastJSCallForTesting];
94
+
95
+ [self.emitter sendEventWithName:@"evt" body:@{@"a" : @1}];
96
+
97
+ XCTAssertEqualObjects(self.bridge.lastModule, @"RCTDeviceEventEmitter");
98
+ XCTAssertEqualObjects(self.bridge.lastMethod, @"emit");
99
+ XCTAssertEqualObjects(self.bridge.lastArgs[0], @"rnfb_evt");
100
+ XCTAssertEqualObjects(self.bridge.lastArgs[1][@"a"], @1);
101
+ XCTAssertEqualObjects([self.emitter getListenersDictionary][@"queued"], @0);
102
+ }
103
+
104
+ - (void)testSendEventEmitsNilBodyAsSingleArg {
105
+ self.emitter.bridge = self.bridge;
106
+ [self.emitter notifyJsReady:YES];
107
+ [self.emitter addListener:@"evt"];
108
+ [self.bridge resetLastJSCallForTesting];
109
+
110
+ [self.emitter sendEventWithName:@"evt" body:nil];
111
+
112
+ XCTAssertEqualObjects(self.bridge.lastArgs, (@[ @"rnfb_evt" ]));
113
+ }
114
+
115
+ - (void)testNotifyJsReadyFlushesQueuedEvents {
116
+ self.emitter.bridge = self.bridge;
117
+ [self.emitter addListener:@"evt"];
118
+ [self.emitter sendEventWithName:@"evt" body:@{@"a" : @1}];
119
+ [self.bridge resetLastJSCallForTesting];
120
+
121
+ [self.emitter notifyJsReady:YES];
122
+
123
+ XCTAssertEqualObjects(self.bridge.lastArgs[0], @"rnfb_evt");
124
+ XCTAssertEqualObjects([self.emitter getListenersDictionary][@"queued"], @0);
125
+ }
126
+
127
+ - (void)testAddAndRemoveListeners {
128
+ [self.emitter addListener:@"evt"];
129
+ [self.emitter addListener:@"evt"];
130
+ XCTAssertEqualObjects([self.emitter getListenersDictionary][@"listeners"], @2);
131
+ XCTAssertEqualObjects([self.emitter getListenersDictionary][@"events"][@"evt"], @2);
132
+
133
+ [self.emitter removeListeners:@"evt" all:NO];
134
+ XCTAssertEqualObjects([self.emitter getListenersDictionary][@"events"][@"evt"], @1);
135
+
136
+ [self.emitter removeListeners:@"evt" all:YES];
137
+ XCTAssertNil([self.emitter getListenersDictionary][@"events"][@"evt"]);
138
+ XCTAssertEqualObjects([self.emitter getListenersDictionary][@"listeners"], @0);
139
+ }
140
+
141
+ @end
@@ -0,0 +1,100 @@
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 "RNFBJSON.h"
21
+ #import "RNFBPreferences.h"
22
+ #import "RNFBSharedUtils.h"
23
+
24
+ @interface RNFBSharedUtilsConfigFacadeTests : XCTestCase
25
+ @end
26
+
27
+ @implementation RNFBSharedUtilsConfigFacadeTests
28
+
29
+ - (void)tearDown {
30
+ [[RNFBPreferences shared] remove:@"__rnfb_config_facade_prefs__"];
31
+ [[RNFBPreferences shared] remove:@"__rnfb_config_facade_bool__"];
32
+ [[RNFBPreferences shared] remove:@"__rnfb_config_facade_json_lose__"];
33
+ [super tearDown];
34
+ }
35
+
36
+ - (void)testFacadeConfigContainsViaPreferences {
37
+ NSString *key = @"__rnfb_config_facade_prefs__";
38
+ XCTAssertFalse([RNFBSharedUtils configContains:key]);
39
+
40
+ [[RNFBPreferences shared] setBooleanValue:key boolValue:YES];
41
+ XCTAssertTrue([RNFBSharedUtils configContains:key]);
42
+ }
43
+
44
+ - (void)testFacadeGetConfigBooleanValuePreferencesWins {
45
+ NSString *key = @"__rnfb_config_facade_bool__";
46
+ [[RNFBPreferences shared] setBooleanValue:key boolValue:YES];
47
+
48
+ XCTAssertTrue([RNFBSharedUtils getConfigBooleanValue:@"ConfigFacadeTests"
49
+ key:key
50
+ defaultValue:NO]);
51
+ }
52
+
53
+ - (void)testFacadeGetConfigBooleanValueMetaPathUsesDefault {
54
+ NSString *key = @"__rnfb_config_facade_missing_everywhere__";
55
+ // Absent from Preferences / JSON / Meta → Meta path with passed-in defaultValue.
56
+ XCTAssertFalse([RNFBSharedUtils getConfigBooleanValue:@"ConfigFacadeTests"
57
+ key:key
58
+ defaultValue:NO]);
59
+ XCTAssertTrue([RNFBSharedUtils getConfigBooleanValue:@"ConfigFacadeTests"
60
+ key:key
61
+ defaultValue:YES]);
62
+ XCTAssertFalse([RNFBSharedUtils configContains:key]);
63
+ }
64
+
65
+ - (void)testFacadeGetConfigBooleanValueJsonOverMeta {
66
+ NSString *key = @"__rnfb_config_facade_json_win__";
67
+ RNFBJSONImplementation *implementation =
68
+ [[RNFBJSONImplementation alloc] initWithJSONObject:@{key : @YES}];
69
+
70
+ // Temporarily swap the shared JSON implementation so the façade resolves JSON before Meta.
71
+ RNFBJSON *shared = [RNFBJSON shared];
72
+ id previous = [shared valueForKey:@"implementation"];
73
+ [shared setValue:implementation forKey:@"implementation"];
74
+
75
+ @try {
76
+ XCTAssertFalse([[RNFBPreferences shared] contains:key]);
77
+ XCTAssertTrue([RNFBSharedUtils configContains:key]);
78
+ XCTAssertTrue([RNFBSharedUtils getConfigBooleanValue:@"ConfigFacadeTests"
79
+ key:key
80
+ defaultValue:NO]);
81
+ } @finally {
82
+ [shared setValue:previous forKey:@"implementation"];
83
+ }
84
+ }
85
+
86
+ - (void)testFacadePublicSelectorsUnchanged {
87
+ XCTAssertTrue([RNFBSharedUtils respondsToSelector:@selector(configContains:)]);
88
+ XCTAssertTrue(
89
+ [RNFBSharedUtils respondsToSelector:@selector(getConfigBooleanValue:key:defaultValue:)]);
90
+
91
+ NSMethodSignature *contains =
92
+ [RNFBSharedUtils methodSignatureForSelector:@selector(configContains:)];
93
+ XCTAssertEqual(strcmp(contains.methodReturnType, @encode(BOOL)), 0);
94
+
95
+ NSMethodSignature *boolean = [RNFBSharedUtils
96
+ methodSignatureForSelector:@selector(getConfigBooleanValue:key:defaultValue:)];
97
+ XCTAssertEqual(strcmp(boolean.methodReturnType, @encode(BOOL)), 0);
98
+ }
99
+
100
+ @end