@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,73 @@
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
+
18
+ #import <Foundation/Foundation.h>
19
+
20
+ NS_ASSUME_NONNULL_BEGIN
21
+
22
+ FOUNDATION_EXPORT NSErrorDomain const RNFBHandleMapErrorDomain;
23
+
24
+ typedef NS_ERROR_ENUM(RNFBHandleMapErrorDomain, RNFBHandleMapErrorCode){
25
+ RNFBHandleMapErrorCollision = 1,
26
+ };
27
+
28
+ /**
29
+ * Thread-safe id → handle registry. The lock only moves pointers; this class never invokes methods
30
+ * on stored values (no SDK cancel/remove). Callers `take` or `takeAll`, then act on the returned
31
+ * object(s) outside the lock. Keys are typically NSNumber or NSString.
32
+ *
33
+ * `put` is unique: an occupied id fails with `RNFBHandleMapErrorCollision`. There is no upsert.
34
+ * Use `putIfAbsent` (first wins), `putIfAbsentOrSame` (first wins or same instance), or
35
+ * `putReplacing` (last wins) for atomic upsert.
36
+ *
37
+ * Do not lock on a `RNFBHandleMap` instance. This type uses a private lock object; callers that
38
+ * synchronize on the map can deadlock. Never `@synchronized(handleMap)` around these methods.
39
+ */
40
+ @interface RNFBHandleMap : NSObject
41
+
42
+ /// Registers `value` under `key`. Returns NO and sets `error` if `key` is already occupied.
43
+ - (BOOL)put:(id)key value:(id)value error:(NSError *_Nullable *_Nullable)error;
44
+
45
+ /// Stores `value` under `key` only when the key is free (first wins). Returns NO if occupied.
46
+ - (BOOL)putIfAbsent:(id)key value:(id)value;
47
+
48
+ /// Under one lock: stores when free, or YES when existing is the same instance (`==`). NO if
49
+ /// occupied by a different value.
50
+ - (BOOL)putIfAbsentOrSame:(id)key value:(id)value;
51
+
52
+ /// Atomically replaces the mapping for `key` (last wins). Returns the previous value, or nil.
53
+ - (nullable id)putReplacing:(id)key value:(id)value;
54
+
55
+ /// Peeks at the handle for `key` without removing it (for emit while still registered).
56
+ - (nullable id)get:(id)key;
57
+
58
+ /// Removes and returns the handle for `key`, or nil if absent.
59
+ - (nullable id)take:(id)key;
60
+
61
+ /// When `key` is mapped and `condition` returns YES for the handle, removes and returns it;
62
+ /// otherwise returns nil and leaves the map unchanged. Lookup, condition, and removal run under one
63
+ /// lock — use for check-and-take that must not race with concurrent `put` / `take` on the same key.
64
+ /// Keep `condition` lightweight (no SDK cancel/remove).
65
+ - (nullable id)takeIf:(id)key when:(BOOL (^)(id value))condition;
66
+
67
+ /// Snapshot of current values, then clear. Cancel/remove each returned object after this method
68
+ /// returns, not under this map's lock.
69
+ - (NSArray *)takeAll;
70
+
71
+ @end
72
+
73
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,87 @@
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
+
18
+ #import "RNFBHandleMap.h"
19
+
20
+ #if __has_include(<RNFBApp/RNFBApp-Swift.h>)
21
+ #import <RNFBApp/RNFBApp-Swift.h>
22
+ #elif __has_include("RNFBApp-Swift.h")
23
+ #import "RNFBApp-Swift.h"
24
+ #elif __has_include("RNFBHandleMapStorage-Swift.inc")
25
+ #import "RNFBHandleMapStorage-Swift.inc"
26
+ #else
27
+ #error "RNFBHandleMapStorage Swift interface not found"
28
+ #endif
29
+
30
+ NSErrorDomain const RNFBHandleMapErrorDomain = @"io.invertase.firebase.RNFBHandleMap";
31
+
32
+ @interface RNFBHandleMap ()
33
+ @property(nonatomic, strong) RNFBHandleMapStorage *storage;
34
+ @end
35
+
36
+ @implementation RNFBHandleMap
37
+
38
+ - (instancetype)init {
39
+ self = [super init];
40
+ if (self) {
41
+ _storage = [[RNFBHandleMapStorage alloc] init];
42
+ }
43
+ return self;
44
+ }
45
+
46
+ - (BOOL)put:(id)key value:(id)value error:(NSError **)error {
47
+ if (![self.storage putIfAbsent:key value:value]) {
48
+ if (error != nil) {
49
+ NSString *message = [NSString stringWithFormat:@"Handle id already registered: %@", key];
50
+ *error = [NSError errorWithDomain:RNFBHandleMapErrorDomain
51
+ code:RNFBHandleMapErrorCollision
52
+ userInfo:@{NSLocalizedDescriptionKey : message}];
53
+ }
54
+ return NO;
55
+ }
56
+ return YES;
57
+ }
58
+
59
+ - (BOOL)putIfAbsent:(id)key value:(id)value {
60
+ return [self.storage putIfAbsent:key value:value];
61
+ }
62
+
63
+ - (BOOL)putIfAbsentOrSame:(id)key value:(id)value {
64
+ return [self.storage putIfAbsentOrSame:key value:value];
65
+ }
66
+
67
+ - (id)putReplacing:(id)key value:(id)value {
68
+ return [self.storage putReplacing:key value:value];
69
+ }
70
+
71
+ - (id)get:(id)key {
72
+ return [self.storage get:key];
73
+ }
74
+
75
+ - (id)take:(id)key {
76
+ return [self.storage take:key];
77
+ }
78
+
79
+ - (id)takeIf:(id)key when:(BOOL (^)(id))condition {
80
+ return [self.storage takeIf:key when:condition];
81
+ }
82
+
83
+ - (NSArray *)takeAll {
84
+ return [self.storage takeAll];
85
+ }
86
+
87
+ @end
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import Foundation
18
+
19
+ @objc(RNFBHandleMapStorage)
20
+ public final class RNFBHandleMapStorage: NSObject {
21
+ private let map = NSMutableDictionary()
22
+ private let lock = NSRecursiveLock()
23
+
24
+ @objc(putIfAbsent:value:)
25
+ public func putIfAbsent(_ key: AnyObject, value: AnyObject) -> Bool {
26
+ lock.withLock {
27
+ guard map.object(forKey: key) == nil else {
28
+ return false
29
+ }
30
+ map[key] = value
31
+ return true
32
+ }
33
+ }
34
+
35
+ @objc(putIfAbsentOrSame:value:)
36
+ public func putIfAbsentOrSame(_ key: AnyObject, value: AnyObject) -> Bool {
37
+ lock.withLock {
38
+ guard let existing = map.object(forKey: key) as AnyObject? else {
39
+ map[key] = value
40
+ return true
41
+ }
42
+ return existing === value
43
+ }
44
+ }
45
+
46
+ @objc(putReplacing:value:)
47
+ public func putReplacing(_ key: AnyObject, value: AnyObject) -> AnyObject? {
48
+ lock.withLock {
49
+ let previous = map.object(forKey: key) as AnyObject?
50
+ map[key] = value
51
+ return previous
52
+ }
53
+ }
54
+
55
+ @objc(get:)
56
+ public func get(_ key: AnyObject) -> AnyObject? {
57
+ lock.withLock {
58
+ map.object(forKey: key) as AnyObject?
59
+ }
60
+ }
61
+
62
+ @objc(take:)
63
+ public func take(_ key: AnyObject) -> AnyObject? {
64
+ lock.withLock {
65
+ let value = map.object(forKey: key) as AnyObject?
66
+ map.removeObject(forKey: key)
67
+ return value
68
+ }
69
+ }
70
+
71
+ @objc(takeIf:when:)
72
+ public func takeIf(_ key: AnyObject, when condition: (AnyObject) -> Bool) -> AnyObject? {
73
+ lock.withLock {
74
+ guard let value = map.object(forKey: key) as AnyObject?, condition(value) else {
75
+ return nil
76
+ }
77
+ map.removeObject(forKey: key)
78
+ return value
79
+ }
80
+ }
81
+
82
+ @objc
83
+ public func takeAll() -> [AnyObject] {
84
+ lock.withLock {
85
+ let values = map.allValues as [AnyObject]
86
+ map.removeAllObjects()
87
+ return values
88
+ }
89
+ }
90
+ }
@@ -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
+
19
+ /**
20
+ * Foundation-only normalisation of the `options` and `appConfig` dictionaries passed to
21
+ * `initializeApp`. Decodes `{__rnfbNull: true}` sentinels and drops optional keys whose
22
+ * value is `NSNull` (except `automaticDataCollectionEnabled`, where null means false).
23
+ */
24
+ @objc(RNFBInitializeAppArguments)
25
+ public final class RNFBInitializeAppArguments: NSObject {
26
+ @objc(normalizedOptions:)
27
+ public static func normalizedOptions(_ options: NSDictionary?) -> NSDictionary? {
28
+ decodedDictionary(
29
+ options,
30
+ optionalKeys: [
31
+ "databaseURL",
32
+ "storageBucket",
33
+ "iosBundleId",
34
+ "iosClientId",
35
+ "appGroupId",
36
+ "authDomain",
37
+ ],
38
+ nullReplacements: [:]
39
+ )
40
+ }
41
+
42
+ @objc(normalizedAppConfig:)
43
+ public static func normalizedAppConfig(_ appConfig: NSDictionary?) -> NSDictionary? {
44
+ decodedDictionary(
45
+ appConfig,
46
+ optionalKeys: ["name"],
47
+ nullReplacements: ["automaticDataCollectionEnabled": NSNumber(value: false)]
48
+ )
49
+ }
50
+
51
+ @objc(automaticDataCollectionEnabledFromAppConfig:)
52
+ public static func automaticDataCollectionEnabled(fromAppConfig appConfig: NSDictionary?) -> NSNumber? {
53
+ guard let value = appConfig?["automaticDataCollectionEnabled"] as? NSNumber else {
54
+ return nil
55
+ }
56
+ return NSNumber(value: value.boolValue)
57
+ }
58
+
59
+ private static func decodedDictionary(
60
+ _ dictionary: NSDictionary?,
61
+ optionalKeys: [String],
62
+ nullReplacements: [String: Any]
63
+ ) -> NSDictionary? {
64
+ let decoded = RNFBNullSentinelDecoder.decodeNullSentinels(dictionary)
65
+ guard let decodedDict = decoded as? NSDictionary else {
66
+ return nil
67
+ }
68
+
69
+ let normalized = NSMutableDictionary(dictionary: decodedDict)
70
+ for key in optionalKeys {
71
+ if normalized[key] is NSNull {
72
+ normalized.removeObject(forKey: key)
73
+ }
74
+ }
75
+ for (key, replacement) in nullReplacements {
76
+ if normalized[key] is NSNull {
77
+ normalized[key] = replacement
78
+ }
79
+ }
80
+ return normalized
81
+ }
82
+ }
@@ -17,8 +17,18 @@
17
17
 
18
18
  #import "RNFBJSON.h"
19
19
 
20
+ #if __has_include(<RNFBApp/RNFBApp-Swift.h>)
21
+ #import <RNFBApp/RNFBApp-Swift.h>
22
+ #elif __has_include("RNFBApp-Swift.h")
23
+ #import "RNFBApp-Swift.h"
24
+ #elif __has_include("RNFBHandleMapStorage-Swift.inc")
25
+ #import "RNFBHandleMapStorage-Swift.inc"
26
+ #else
27
+ #error "RNFBJSONImplementation Swift interface not found"
28
+ #endif
29
+
20
30
  @interface RNFBJSON ()
21
- @property(nonatomic, strong) NSDictionary *firebaseJson;
31
+ @property(nonatomic, strong) RNFBJSONImplementation *implementation;
22
32
  @end
23
33
 
24
34
  @implementation RNFBJSON
@@ -31,69 +41,43 @@
31
41
  sharedInstance = [[RNFBJSON alloc] init];
32
42
  NSString *__nullable firebaseJsonRaw =
33
43
  [[NSBundle mainBundle].infoDictionary valueForKey:@"firebase_json_raw"];
34
-
35
- if (firebaseJsonRaw == nil) {
36
- sharedInstance.firebaseJson = [NSDictionary dictionary];
37
- return;
38
- }
39
-
40
- NSData *data = [[NSData alloc] initWithBase64EncodedString:firebaseJsonRaw options:0];
41
-
42
- if (data == nil) {
43
- sharedInstance.firebaseJson = [NSDictionary dictionary];
44
- return;
45
- }
46
-
47
- NSError *jsonError = nil;
48
- NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data
49
- options:0
50
- error:&jsonError];
51
- if (jsonError != nil) {
52
- sharedInstance.firebaseJson = [NSDictionary dictionary];
53
- return;
54
- }
55
-
56
- sharedInstance.firebaseJson = dictionary;
44
+ sharedInstance.implementation =
45
+ [[RNFBJSONImplementation alloc] initWithRawValue:firebaseJsonRaw];
57
46
  });
58
47
 
59
48
  return sharedInstance;
60
49
  }
61
50
 
62
51
  - (BOOL)contains:(NSString *)key {
63
- return [_firebaseJson valueForKey:key] != nil;
52
+ return [self.implementation contains:key];
64
53
  }
65
54
 
66
55
  - (BOOL)getBooleanValue:(NSString *)key defaultValue:(BOOL)defaultValue {
67
- if ([_firebaseJson valueForKey:key] == nil) return defaultValue;
68
- NSNumber *boolean = [_firebaseJson valueForKey:key];
56
+ NSNumber *boolean = [self.implementation valueForKey:key defaultValue:nil];
57
+ if (boolean == nil) return defaultValue;
69
58
  return [boolean boolValue];
70
59
  }
71
60
 
72
61
  - (NSString *)getStringValue:(NSString *)key defaultValue:(NSString *)defaultValue {
73
- if ([_firebaseJson valueForKey:key] == nil) return defaultValue;
74
- NSString *string = [_firebaseJson valueForKey:key];
75
- return string;
62
+ return [self.implementation valueForKey:key defaultValue:defaultValue];
76
63
  }
77
64
 
78
65
  - (NSArray *)getArrayValue:(NSString *)key defaultValue:(NSArray *)defaultValue {
79
- if ([_firebaseJson valueForKey:key] == nil) return defaultValue;
80
- NSArray *array = [_firebaseJson valueForKey:key];
81
- return array;
66
+ return [self.implementation valueForKey:key defaultValue:defaultValue];
82
67
  }
83
68
 
84
69
  - (NSDictionary *)getAll {
85
- return [[NSDictionary alloc] initWithDictionary:_firebaseJson copyItems:YES];
70
+ return [[NSDictionary alloc] initWithDictionary:(NSDictionary *)self.implementation.jsonObject
71
+ copyItems:YES];
86
72
  }
87
73
 
88
74
  - (NSString *)getRawJSON {
89
75
  NSString *__nullable firebaseJsonRaw =
90
76
  [[NSBundle mainBundle].infoDictionary valueForKey:@"firebase_json_raw"];
91
77
  if (firebaseJsonRaw == nil) {
92
- return @"{}";
78
+ return [RNFBJSONImplementation rawJSONFromRawValue:nil];
93
79
  }
94
80
 
95
- NSData *data = [[NSData alloc] initWithBase64EncodedString:firebaseJsonRaw options:0];
96
- return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
97
- ;
81
+ return [RNFBJSONImplementation rawJSONFromRawValue:firebaseJsonRaw];
98
82
  }
99
83
  @end
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import Foundation
18
+
19
+ @objc(RNFBJSONImplementation)
20
+ public final class RNFBJSONImplementation: NSObject {
21
+ private let firebaseJSON: NSObject
22
+
23
+ @objc(initWithRawValue:)
24
+ public init(rawValue: String?) {
25
+ guard
26
+ let rawValue,
27
+ let data = Data(base64Encoded: rawValue),
28
+ let object = try? JSONSerialization.jsonObject(with: data),
29
+ let firebaseJSON = object as? NSObject
30
+ else {
31
+ self.firebaseJSON = NSDictionary()
32
+ super.init()
33
+ return
34
+ }
35
+
36
+ self.firebaseJSON = firebaseJSON
37
+ super.init()
38
+ }
39
+
40
+ @objc(initWithJSONObject:)
41
+ public init(jsonObject: NSObject) {
42
+ firebaseJSON = jsonObject
43
+ super.init()
44
+ }
45
+
46
+ @objc(contains:)
47
+ public func contains(_ key: String) -> Bool {
48
+ firebaseJSON.value(forKey: key) != nil
49
+ }
50
+
51
+ @objc(valueForKey:defaultValue:)
52
+ public func value(forKey key: String, defaultValue: AnyObject?) -> AnyObject? {
53
+ firebaseJSON.value(forKey: key) as AnyObject? ?? defaultValue
54
+ }
55
+
56
+ @objc
57
+ public func jsonObject() -> NSObject {
58
+ firebaseJSON
59
+ }
60
+
61
+ @objc(rawJSONFromRawValue:)
62
+ public static func rawJSON(from rawValue: String?) -> String? {
63
+ guard let rawValue else {
64
+ return "{}"
65
+ }
66
+ guard let data = Data(base64Encoded: rawValue) else {
67
+ return nil
68
+ }
69
+ return String(data: data, encoding: .utf8)
70
+ }
71
+ }
@@ -17,45 +17,43 @@
17
17
 
18
18
  #import "RNFBMeta.h"
19
19
 
20
- @interface RNFBMeta ()
21
- @property(nonatomic, strong) NSDictionary *firebaseJson;
22
- @end
23
-
24
- NSString *const RNFBMetaPrefix = @"rnfirebase_";
20
+ #if __has_include(<RNFBApp/RNFBApp-Swift.h>)
21
+ #import <RNFBApp/RNFBApp-Swift.h>
22
+ #elif __has_include("RNFBApp-Swift.h")
23
+ #import "RNFBApp-Swift.h"
24
+ #elif __has_include("RNFBHandleMapStorage-Swift.inc")
25
+ #import "RNFBHandleMapStorage-Swift.inc"
26
+ #else
27
+ #error "RNFBMetaStorage Swift interface not found"
28
+ #endif
25
29
 
26
30
  @implementation RNFBMeta
27
31
 
32
+ + (RNFBMetaStorage *)sharedStorage {
33
+ static dispatch_once_t once;
34
+ static RNFBMetaStorage *sharedStorage;
35
+
36
+ dispatch_once(&once, ^{
37
+ sharedStorage = [[RNFBMetaStorage alloc] init];
38
+ });
39
+
40
+ return sharedStorage;
41
+ }
42
+
28
43
  + (BOOL)contains:(NSString *)key {
29
- id keyValue = [[NSBundle mainBundle].infoDictionary
30
- valueForKey:[RNFBMetaPrefix stringByAppendingString:key]];
31
- return keyValue != nil;
44
+ return [[self sharedStorage] contains:key];
32
45
  }
33
46
 
34
47
  + (BOOL)getBooleanValue:(NSString *)key defaultValue:(BOOL)defaultValue {
35
- NSNumber *keyValue = [[NSBundle mainBundle].infoDictionary
36
- valueForKey:[RNFBMetaPrefix stringByAppendingString:key]];
37
- if (keyValue == nil) return defaultValue;
38
- return [keyValue boolValue];
48
+ return [[self sharedStorage] getBooleanValue:key defaultValue:defaultValue];
39
49
  }
40
50
 
41
51
  + (NSString *)getStringValue:(NSString *)key defaultValue:(NSString *)defaultValue {
42
- NSString *keyValue = [[NSBundle mainBundle].infoDictionary
43
- valueForKey:[RNFBMetaPrefix stringByAppendingString:key]];
44
- if (keyValue == nil) return defaultValue;
45
- return keyValue;
52
+ return [[self sharedStorage] getStringValue:key defaultValue:defaultValue];
46
53
  }
47
54
 
48
55
  + (NSDictionary *)getAll {
49
- NSMutableDictionary *allMetaValues = [NSMutableDictionary dictionary];
50
-
51
- NSArray *keys = [[NSBundle mainBundle].infoDictionary allKeys];
52
- for (NSString *key in keys) {
53
- if ([key hasPrefix:RNFBMetaPrefix]) {
54
- allMetaValues[key] = [NSBundle mainBundle].infoDictionary[key];
55
- }
56
- }
57
-
58
- return allMetaValues;
56
+ return [[self sharedStorage] getAll];
59
57
  }
60
58
 
61
59
  @end
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Copyright (c) 2016-present Invertase Limited & Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this library except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import Foundation
18
+
19
+ private let RNFBMetaPrefix = "rnfirebase_"
20
+
21
+ @objc(RNFBMetaStorage)
22
+ public final class RNFBMetaStorage: NSObject {
23
+ private let infoDictionary: NSDictionary
24
+
25
+ public override convenience init() {
26
+ self.init(infoDictionary: Bundle.main.infoDictionary ?? [:])
27
+ }
28
+
29
+ @objc(initWithInfoDictionary:)
30
+ public init(infoDictionary: [String: Any]) {
31
+ self.infoDictionary = infoDictionary as NSDictionary
32
+ super.init()
33
+ }
34
+
35
+ private func prefixed(_ key: String) -> String {
36
+ RNFBMetaPrefix + key
37
+ }
38
+
39
+ @objc(contains:)
40
+ public func contains(_ key: String) -> Bool {
41
+ infoDictionary.value(forKey: prefixed(key)) != nil
42
+ }
43
+
44
+ @objc(getBooleanValue:defaultValue:)
45
+ public func getBooleanValue(_ key: String, defaultValue: Bool) -> Bool {
46
+ guard let keyValue = infoDictionary.value(forKey: prefixed(key)) else {
47
+ return defaultValue
48
+ }
49
+ // Pre-port: `[NSNumber boolValue]` after KVC lookup (NSString also responds).
50
+ if let number = keyValue as? NSNumber {
51
+ return number.boolValue
52
+ }
53
+ return (keyValue as! NSString).boolValue
54
+ }
55
+
56
+ @objc(getStringValue:defaultValue:)
57
+ public func getStringValue(_ key: String, defaultValue: String) -> String {
58
+ guard let keyValue = infoDictionary.value(forKey: prefixed(key)) else {
59
+ return defaultValue
60
+ }
61
+ // Pre-port returned the unchecked `id` typed as `NSString *`.
62
+ return keyValue as! String
63
+ }
64
+
65
+ @objc
66
+ public func getAll() -> [String: Any] {
67
+ var allMetaValues: [String: Any] = [:]
68
+ for key in infoDictionary.allKeys {
69
+ guard let key = key as? String, key.hasPrefix(RNFBMetaPrefix) else {
70
+ continue
71
+ }
72
+ allMetaValues[key] = infoDictionary[key]
73
+ }
74
+ return allMetaValues
75
+ }
76
+ }