svelte-firekit 0.1.9 → 0.2.1

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 (439) hide show
  1. package/README.md +550 -354
  2. package/dist/components/AuthGuard.svelte +64 -0
  3. package/dist/components/AuthGuard.svelte.d.ts +15 -0
  4. package/dist/components/Collection.svelte +62 -0
  5. package/dist/components/Collection.svelte.d.ts +39 -0
  6. package/dist/components/CustomGuard.svelte +87 -0
  7. package/dist/components/CustomGuard.svelte.d.ts +13 -0
  8. package/dist/components/Doc.svelte +56 -0
  9. package/dist/components/Doc.svelte.d.ts +36 -0
  10. package/dist/components/DownloadURL.svelte +48 -0
  11. package/dist/components/DownloadURL.svelte.d.ts +14 -0
  12. package/dist/components/FirebaseApp.svelte +81 -0
  13. package/dist/components/FirebaseApp.svelte.d.ts +12 -0
  14. package/dist/components/Node.svelte +54 -0
  15. package/dist/components/Node.svelte.d.ts +36 -0
  16. package/dist/components/SignedIn.svelte +22 -0
  17. package/dist/components/{firekit/signed-in.svelte.d.ts → SignedIn.svelte.d.ts} +1 -4
  18. package/dist/components/SignedOut.svelte +32 -0
  19. package/dist/components/{firekit/signed-out.svelte.d.ts → SignedOut.svelte.d.ts} +3 -5
  20. package/dist/components/UploadTask.svelte +75 -0
  21. package/dist/components/UploadTask.svelte.d.ts +33 -0
  22. package/dist/config.d.ts +29 -6
  23. package/dist/config.js +37 -74
  24. package/dist/context.d.ts +46 -0
  25. package/dist/context.js +56 -0
  26. package/dist/firebase.d.ts +25 -84
  27. package/dist/firebase.js +75 -125
  28. package/dist/index.d.ts +31 -20
  29. package/dist/index.js +47 -30
  30. package/dist/services/ai.svelte.d.ts +152 -0
  31. package/dist/services/ai.svelte.js +302 -0
  32. package/dist/services/analytics.d.ts +39 -231
  33. package/dist/services/analytics.js +89 -421
  34. package/dist/services/app-check.svelte.d.ts +82 -0
  35. package/dist/services/app-check.svelte.js +159 -0
  36. package/dist/services/auth.d.ts +63 -352
  37. package/dist/services/auth.js +353 -718
  38. package/dist/services/bundles.d.ts +42 -0
  39. package/dist/services/bundles.js +57 -0
  40. package/dist/services/callable.d.ts +57 -0
  41. package/dist/services/callable.js +115 -0
  42. package/dist/services/collection.svelte.d.ts +154 -221
  43. package/dist/services/collection.svelte.js +357 -663
  44. package/dist/services/document.svelte.d.ts +73 -254
  45. package/dist/services/document.svelte.js +196 -497
  46. package/dist/services/in-app-messaging.js +4 -0
  47. package/dist/services/messaging.svelte.d.ts +75 -0
  48. package/dist/services/messaging.svelte.js +190 -0
  49. package/dist/services/mutations.d.ts +59 -282
  50. package/dist/services/mutations.js +202 -951
  51. package/dist/services/performance.d.ts +60 -0
  52. package/dist/services/performance.js +118 -0
  53. package/dist/services/presence.svelte.d.ts +21 -89
  54. package/dist/services/presence.svelte.js +232 -469
  55. package/dist/services/realtime.svelte.d.ts +54 -125
  56. package/dist/services/realtime.svelte.js +111 -175
  57. package/dist/services/remote-config.svelte.d.ts +73 -0
  58. package/dist/services/remote-config.svelte.js +204 -0
  59. package/dist/services/storage.svelte.d.ts +81 -208
  60. package/dist/services/storage.svelte.js +190 -305
  61. package/dist/services/user.svelte.d.ts +23 -244
  62. package/dist/services/user.svelte.js +129 -439
  63. package/dist/types/analytics.d.ts +2 -36
  64. package/dist/types/analytics.js +0 -5
  65. package/dist/types/auth.d.ts +15 -85
  66. package/dist/types/auth.js +0 -17
  67. package/dist/types/collection.d.ts +31 -225
  68. package/dist/types/collection.js +5 -51
  69. package/dist/types/document.d.ts +11 -236
  70. package/dist/types/document.js +2 -47
  71. package/dist/types/firebase.d.ts +10 -13
  72. package/dist/types/firebase.js +3 -9
  73. package/dist/types/index.d.ts +5 -5
  74. package/dist/types/index.js +5 -4
  75. package/dist/types/mutations.d.ts +11 -225
  76. package/dist/types/mutations.js +6 -51
  77. package/dist/types/presence.d.ts +5 -158
  78. package/dist/types/presence.js +0 -20
  79. package/dist/utils/errors.d.ts +10 -14
  80. package/dist/utils/errors.js +11 -16
  81. package/dist/utils/firestore.d.ts +3 -4
  82. package/dist/utils/firestore.js +7 -10
  83. package/dist/utils/index.d.ts +4 -4
  84. package/dist/utils/index.js +4 -8
  85. package/dist/utils/providers.d.ts +4 -13
  86. package/dist/utils/providers.js +14 -13
  87. package/dist/utils/user.d.ts +1 -3
  88. package/dist/utils/user.js +1 -3
  89. package/package.json +41 -55
  90. package/dist/components/docs/doc-content.svelte +0 -19
  91. package/dist/components/docs/doc-content.svelte.d.ts +0 -6
  92. package/dist/components/docs/doc-header.svelte +0 -24
  93. package/dist/components/docs/doc-header.svelte.d.ts +0 -13
  94. package/dist/components/docs/doc-renderer.svelte +0 -27
  95. package/dist/components/docs/doc-renderer.svelte.d.ts +0 -8
  96. package/dist/components/docs/mobile-table-of-contents.svelte +0 -42
  97. package/dist/components/docs/mobile-table-of-contents.svelte.d.ts +0 -3
  98. package/dist/components/docs/table-of-contents.svelte +0 -33
  99. package/dist/components/docs/table-of-contents.svelte.d.ts +0 -4
  100. package/dist/components/docs/toc.svelte.d.ts +0 -16
  101. package/dist/components/docs/toc.svelte.js +0 -59
  102. package/dist/components/firekit/Collection.svelte +0 -122
  103. package/dist/components/firekit/Collection.svelte.d.ts +0 -27
  104. package/dist/components/firekit/Doc.svelte +0 -140
  105. package/dist/components/firekit/Doc.svelte.d.ts +0 -28
  106. package/dist/components/firekit/Node.svelte +0 -97
  107. package/dist/components/firekit/Node.svelte.d.ts +0 -23
  108. package/dist/components/firekit/auth-guard.svelte +0 -120
  109. package/dist/components/firekit/auth-guard.svelte.d.ts +0 -26
  110. package/dist/components/firekit/custom-guard.svelte +0 -163
  111. package/dist/components/firekit/custom-guard.svelte.d.ts +0 -31
  112. package/dist/components/firekit/download-url.svelte +0 -92
  113. package/dist/components/firekit/download-url.svelte.d.ts +0 -19
  114. package/dist/components/firekit/firebase-app.svelte +0 -33
  115. package/dist/components/firekit/firebase-app.svelte.d.ts +0 -7
  116. package/dist/components/firekit/node-list.svelte +0 -102
  117. package/dist/components/firekit/node-list.svelte.d.ts +0 -27
  118. package/dist/components/firekit/signed-in.svelte +0 -42
  119. package/dist/components/firekit/signed-out.svelte +0 -42
  120. package/dist/components/firekit/storage-list.svelte +0 -97
  121. package/dist/components/firekit/storage-list.svelte.d.ts +0 -26
  122. package/dist/components/firekit/upload-task.svelte +0 -108
  123. package/dist/components/firekit/upload-task.svelte.d.ts +0 -24
  124. package/dist/components/nav/app-sidebar.svelte +0 -175
  125. package/dist/components/nav/app-sidebar.svelte.d.ts +0 -9
  126. package/dist/components/nav/auto-breadcrumb.svelte +0 -41
  127. package/dist/components/nav/auto-breadcrumb.svelte.d.ts +0 -3
  128. package/dist/components/nav/dark-mode-toggle.svelte +0 -17
  129. package/dist/components/nav/dark-mode-toggle.svelte.d.ts +0 -18
  130. package/dist/components/nav/nav-components.svelte +0 -24
  131. package/dist/components/nav/nav-components.svelte.d.ts +0 -11
  132. package/dist/components/nav/nav-main.svelte +0 -45
  133. package/dist/components/nav/nav-main.svelte.d.ts +0 -11
  134. package/dist/components/nav/nav-secondary.svelte +0 -32
  135. package/dist/components/nav/nav-secondary.svelte.d.ts +0 -14
  136. package/dist/components/nav/site-header.svelte +0 -32
  137. package/dist/components/nav/site-header.svelte.d.ts +0 -18
  138. package/dist/components/ui/avatar/avatar-fallback.svelte +0 -17
  139. package/dist/components/ui/avatar/avatar-fallback.svelte.d.ts +0 -4
  140. package/dist/components/ui/avatar/avatar-image.svelte +0 -17
  141. package/dist/components/ui/avatar/avatar-image.svelte.d.ts +0 -4
  142. package/dist/components/ui/avatar/avatar.svelte +0 -19
  143. package/dist/components/ui/avatar/avatar.svelte.d.ts +0 -4
  144. package/dist/components/ui/avatar/index.d.ts +0 -4
  145. package/dist/components/ui/avatar/index.js +0 -6
  146. package/dist/components/ui/badge/badge.svelte +0 -50
  147. package/dist/components/ui/badge/badge.svelte.d.ts +0 -32
  148. package/dist/components/ui/badge/index.d.ts +0 -2
  149. package/dist/components/ui/badge/index.js +0 -2
  150. package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +0 -23
  151. package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte.d.ts +0 -5
  152. package/dist/components/ui/breadcrumb/breadcrumb-item.svelte +0 -20
  153. package/dist/components/ui/breadcrumb/breadcrumb-item.svelte.d.ts +0 -5
  154. package/dist/components/ui/breadcrumb/breadcrumb-link.svelte +0 -31
  155. package/dist/components/ui/breadcrumb/breadcrumb-link.svelte.d.ts +0 -11
  156. package/dist/components/ui/breadcrumb/breadcrumb-list.svelte +0 -23
  157. package/dist/components/ui/breadcrumb/breadcrumb-list.svelte.d.ts +0 -5
  158. package/dist/components/ui/breadcrumb/breadcrumb-page.svelte +0 -23
  159. package/dist/components/ui/breadcrumb/breadcrumb-page.svelte.d.ts +0 -5
  160. package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte +0 -27
  161. package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte.d.ts +0 -5
  162. package/dist/components/ui/breadcrumb/breadcrumb.svelte +0 -21
  163. package/dist/components/ui/breadcrumb/breadcrumb.svelte.d.ts +0 -5
  164. package/dist/components/ui/breadcrumb/index.d.ts +0 -8
  165. package/dist/components/ui/breadcrumb/index.js +0 -10
  166. package/dist/components/ui/button/button.svelte +0 -80
  167. package/dist/components/ui/button/button.svelte.d.ts +0 -58
  168. package/dist/components/ui/button/index.d.ts +0 -2
  169. package/dist/components/ui/button/index.js +0 -4
  170. package/dist/components/ui/card/card-action.svelte +0 -20
  171. package/dist/components/ui/card/card-action.svelte.d.ts +0 -5
  172. package/dist/components/ui/card/card-content.svelte +0 -15
  173. package/dist/components/ui/card/card-content.svelte.d.ts +0 -5
  174. package/dist/components/ui/card/card-description.svelte +0 -20
  175. package/dist/components/ui/card/card-description.svelte.d.ts +0 -5
  176. package/dist/components/ui/card/card-footer.svelte +0 -20
  177. package/dist/components/ui/card/card-footer.svelte.d.ts +0 -5
  178. package/dist/components/ui/card/card-header.svelte +0 -23
  179. package/dist/components/ui/card/card-header.svelte.d.ts +0 -5
  180. package/dist/components/ui/card/card-title.svelte +0 -20
  181. package/dist/components/ui/card/card-title.svelte.d.ts +0 -5
  182. package/dist/components/ui/card/card.svelte +0 -23
  183. package/dist/components/ui/card/card.svelte.d.ts +0 -5
  184. package/dist/components/ui/card/index.d.ts +0 -8
  185. package/dist/components/ui/card/index.js +0 -10
  186. package/dist/components/ui/chart/chart-container.svelte +0 -80
  187. package/dist/components/ui/chart/chart-container.svelte.d.ts +0 -9
  188. package/dist/components/ui/chart/chart-style.svelte +0 -36
  189. package/dist/components/ui/chart/chart-style.svelte.d.ts +0 -8
  190. package/dist/components/ui/chart/chart-tooltip.svelte +0 -159
  191. package/dist/components/ui/chart/chart-tooltip.svelte.d.ts +0 -27
  192. package/dist/components/ui/chart/chart-utils.d.ts +0 -36
  193. package/dist/components/ui/chart/chart-utils.js +0 -33
  194. package/dist/components/ui/chart/index.d.ts +0 -4
  195. package/dist/components/ui/chart/index.js +0 -4
  196. package/dist/components/ui/checkbox/checkbox.svelte +0 -36
  197. package/dist/components/ui/checkbox/checkbox.svelte.d.ts +0 -4
  198. package/dist/components/ui/checkbox/index.d.ts +0 -2
  199. package/dist/components/ui/checkbox/index.js +0 -4
  200. package/dist/components/ui/data-table/data-table.svelte.d.ts +0 -40
  201. package/dist/components/ui/data-table/data-table.svelte.js +0 -110
  202. package/dist/components/ui/data-table/flex-render.svelte +0 -36
  203. package/dist/components/ui/data-table/flex-render.svelte.d.ts +0 -30
  204. package/dist/components/ui/data-table/index.d.ts +0 -3
  205. package/dist/components/ui/data-table/index.js +0 -3
  206. package/dist/components/ui/data-table/render-helpers.d.ts +0 -90
  207. package/dist/components/ui/data-table/render-helpers.js +0 -99
  208. package/dist/components/ui/dialog/dialog-close.svelte +0 -7
  209. package/dist/components/ui/dialog/dialog-close.svelte.d.ts +0 -4
  210. package/dist/components/ui/dialog/dialog-content.svelte +0 -43
  211. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +0 -11
  212. package/dist/components/ui/dialog/dialog-description.svelte +0 -17
  213. package/dist/components/ui/dialog/dialog-description.svelte.d.ts +0 -4
  214. package/dist/components/ui/dialog/dialog-footer.svelte +0 -20
  215. package/dist/components/ui/dialog/dialog-footer.svelte.d.ts +0 -5
  216. package/dist/components/ui/dialog/dialog-header.svelte +0 -20
  217. package/dist/components/ui/dialog/dialog-header.svelte.d.ts +0 -5
  218. package/dist/components/ui/dialog/dialog-overlay.svelte +0 -20
  219. package/dist/components/ui/dialog/dialog-overlay.svelte.d.ts +0 -4
  220. package/dist/components/ui/dialog/dialog-title.svelte +0 -17
  221. package/dist/components/ui/dialog/dialog-title.svelte.d.ts +0 -4
  222. package/dist/components/ui/dialog/dialog-trigger.svelte +0 -7
  223. package/dist/components/ui/dialog/dialog-trigger.svelte.d.ts +0 -4
  224. package/dist/components/ui/dialog/index.d.ts +0 -11
  225. package/dist/components/ui/dialog/index.js +0 -14
  226. package/dist/components/ui/drawer/drawer-close.svelte +0 -7
  227. package/dist/components/ui/drawer/drawer-close.svelte.d.ts +0 -4
  228. package/dist/components/ui/drawer/drawer-content.svelte +0 -37
  229. package/dist/components/ui/drawer/drawer-content.svelte.d.ts +0 -7
  230. package/dist/components/ui/drawer/drawer-description.svelte +0 -17
  231. package/dist/components/ui/drawer/drawer-description.svelte.d.ts +0 -4
  232. package/dist/components/ui/drawer/drawer-footer.svelte +0 -20
  233. package/dist/components/ui/drawer/drawer-footer.svelte.d.ts +0 -5
  234. package/dist/components/ui/drawer/drawer-header.svelte +0 -20
  235. package/dist/components/ui/drawer/drawer-header.svelte.d.ts +0 -5
  236. package/dist/components/ui/drawer/drawer-nested.svelte +0 -12
  237. package/dist/components/ui/drawer/drawer-nested.svelte.d.ts +0 -3
  238. package/dist/components/ui/drawer/drawer-overlay.svelte +0 -20
  239. package/dist/components/ui/drawer/drawer-overlay.svelte.d.ts +0 -4
  240. package/dist/components/ui/drawer/drawer-title.svelte +0 -17
  241. package/dist/components/ui/drawer/drawer-title.svelte.d.ts +0 -4
  242. package/dist/components/ui/drawer/drawer-trigger.svelte +0 -7
  243. package/dist/components/ui/drawer/drawer-trigger.svelte.d.ts +0 -4
  244. package/dist/components/ui/drawer/drawer.svelte +0 -12
  245. package/dist/components/ui/drawer/drawer.svelte.d.ts +0 -3
  246. package/dist/components/ui/drawer/index.d.ts +0 -13
  247. package/dist/components/ui/drawer/index.js +0 -15
  248. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +0 -41
  249. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +0 -9
  250. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +0 -27
  251. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte.d.ts +0 -7
  252. package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +0 -22
  253. package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +0 -8
  254. package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte +0 -7
  255. package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte.d.ts +0 -4
  256. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +0 -27
  257. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +0 -8
  258. package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte +0 -24
  259. package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte.d.ts +0 -8
  260. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +0 -16
  261. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +0 -4
  262. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +0 -31
  263. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +0 -4
  264. package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +0 -17
  265. package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte.d.ts +0 -4
  266. package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +0 -20
  267. package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +0 -5
  268. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +0 -20
  269. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +0 -4
  270. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +0 -29
  271. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +0 -7
  272. package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -7
  273. package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +0 -4
  274. package/dist/components/ui/dropdown-menu/index.d.ts +0 -25
  275. package/dist/components/ui/dropdown-menu/index.js +0 -17
  276. package/dist/components/ui/input/index.d.ts +0 -2
  277. package/dist/components/ui/input/index.js +0 -4
  278. package/dist/components/ui/input/input.svelte +0 -51
  279. package/dist/components/ui/input/input.svelte.d.ts +0 -13
  280. package/dist/components/ui/label/index.d.ts +0 -2
  281. package/dist/components/ui/label/index.js +0 -4
  282. package/dist/components/ui/label/label.svelte +0 -20
  283. package/dist/components/ui/label/label.svelte.d.ts +0 -4
  284. package/dist/components/ui/scroll-area/index.d.ts +0 -3
  285. package/dist/components/ui/scroll-area/index.js +0 -5
  286. package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte +0 -31
  287. package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte.d.ts +0 -4
  288. package/dist/components/ui/scroll-area/scroll-area.svelte +0 -40
  289. package/dist/components/ui/scroll-area/scroll-area.svelte.d.ts +0 -10
  290. package/dist/components/ui/select/index.d.ts +0 -11
  291. package/dist/components/ui/select/index.js +0 -14
  292. package/dist/components/ui/select/select-content.svelte +0 -40
  293. package/dist/components/ui/select/select-content.svelte.d.ts +0 -8
  294. package/dist/components/ui/select/select-group-heading.svelte +0 -21
  295. package/dist/components/ui/select/select-group-heading.svelte.d.ts +0 -10
  296. package/dist/components/ui/select/select-group.svelte +0 -7
  297. package/dist/components/ui/select/select-group.svelte.d.ts +0 -4
  298. package/dist/components/ui/select/select-item.svelte +0 -38
  299. package/dist/components/ui/select/select-item.svelte.d.ts +0 -4
  300. package/dist/components/ui/select/select-label.svelte +0 -20
  301. package/dist/components/ui/select/select-label.svelte.d.ts +0 -6
  302. package/dist/components/ui/select/select-scroll-down-button.svelte +0 -20
  303. package/dist/components/ui/select/select-scroll-down-button.svelte.d.ts +0 -4
  304. package/dist/components/ui/select/select-scroll-up-button.svelte +0 -20
  305. package/dist/components/ui/select/select-scroll-up-button.svelte.d.ts +0 -4
  306. package/dist/components/ui/select/select-separator.svelte +0 -18
  307. package/dist/components/ui/select/select-separator.svelte.d.ts +0 -4
  308. package/dist/components/ui/select/select-trigger.svelte +0 -29
  309. package/dist/components/ui/select/select-trigger.svelte.d.ts +0 -8
  310. package/dist/components/ui/separator/index.d.ts +0 -2
  311. package/dist/components/ui/separator/index.js +0 -4
  312. package/dist/components/ui/separator/separator.svelte +0 -20
  313. package/dist/components/ui/separator/separator.svelte.d.ts +0 -4
  314. package/dist/components/ui/sheet/index.d.ts +0 -11
  315. package/dist/components/ui/sheet/index.js +0 -14
  316. package/dist/components/ui/sheet/sheet-close.svelte +0 -7
  317. package/dist/components/ui/sheet/sheet-close.svelte.d.ts +0 -4
  318. package/dist/components/ui/sheet/sheet-content.svelte +0 -58
  319. package/dist/components/ui/sheet/sheet-content.svelte.d.ts +0 -35
  320. package/dist/components/ui/sheet/sheet-description.svelte +0 -17
  321. package/dist/components/ui/sheet/sheet-description.svelte.d.ts +0 -4
  322. package/dist/components/ui/sheet/sheet-footer.svelte +0 -20
  323. package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +0 -5
  324. package/dist/components/ui/sheet/sheet-header.svelte +0 -20
  325. package/dist/components/ui/sheet/sheet-header.svelte.d.ts +0 -5
  326. package/dist/components/ui/sheet/sheet-overlay.svelte +0 -20
  327. package/dist/components/ui/sheet/sheet-overlay.svelte.d.ts +0 -4
  328. package/dist/components/ui/sheet/sheet-title.svelte +0 -17
  329. package/dist/components/ui/sheet/sheet-title.svelte.d.ts +0 -4
  330. package/dist/components/ui/sheet/sheet-trigger.svelte +0 -7
  331. package/dist/components/ui/sheet/sheet-trigger.svelte.d.ts +0 -4
  332. package/dist/components/ui/sidebar/constants.d.ts +0 -6
  333. package/dist/components/ui/sidebar/constants.js +0 -6
  334. package/dist/components/ui/sidebar/context.svelte.d.ts +0 -42
  335. package/dist/components/ui/sidebar/context.svelte.js +0 -54
  336. package/dist/components/ui/sidebar/index.d.ts +0 -25
  337. package/dist/components/ui/sidebar/index.js +0 -27
  338. package/dist/components/ui/sidebar/sidebar-content.svelte +0 -24
  339. package/dist/components/ui/sidebar/sidebar-content.svelte.d.ts +0 -5
  340. package/dist/components/ui/sidebar/sidebar-footer.svelte +0 -21
  341. package/dist/components/ui/sidebar/sidebar-footer.svelte.d.ts +0 -5
  342. package/dist/components/ui/sidebar/sidebar-group-action.svelte +0 -36
  343. package/dist/components/ui/sidebar/sidebar-group-action.svelte.d.ts +0 -11
  344. package/dist/components/ui/sidebar/sidebar-group-content.svelte +0 -21
  345. package/dist/components/ui/sidebar/sidebar-group-content.svelte.d.ts +0 -5
  346. package/dist/components/ui/sidebar/sidebar-group-label.svelte +0 -34
  347. package/dist/components/ui/sidebar/sidebar-group-label.svelte.d.ts +0 -11
  348. package/dist/components/ui/sidebar/sidebar-group.svelte +0 -21
  349. package/dist/components/ui/sidebar/sidebar-group.svelte.d.ts +0 -5
  350. package/dist/components/ui/sidebar/sidebar-header.svelte +0 -21
  351. package/dist/components/ui/sidebar/sidebar-header.svelte.d.ts +0 -5
  352. package/dist/components/ui/sidebar/sidebar-input.svelte +0 -21
  353. package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +0 -11
  354. package/dist/components/ui/sidebar/sidebar-inset.svelte +0 -24
  355. package/dist/components/ui/sidebar/sidebar-inset.svelte.d.ts +0 -5
  356. package/dist/components/ui/sidebar/sidebar-menu-action.svelte +0 -43
  357. package/dist/components/ui/sidebar/sidebar-menu-action.svelte.d.ts +0 -12
  358. package/dist/components/ui/sidebar/sidebar-menu-badge.svelte +0 -29
  359. package/dist/components/ui/sidebar/sidebar-menu-badge.svelte.d.ts +0 -5
  360. package/dist/components/ui/sidebar/sidebar-menu-button.svelte +0 -103
  361. package/dist/components/ui/sidebar/sidebar-menu-button.svelte.d.ts +0 -51
  362. package/dist/components/ui/sidebar/sidebar-menu-item.svelte +0 -21
  363. package/dist/components/ui/sidebar/sidebar-menu-item.svelte.d.ts +0 -5
  364. package/dist/components/ui/sidebar/sidebar-menu-skeleton.svelte +0 -36
  365. package/dist/components/ui/sidebar/sidebar-menu-skeleton.svelte.d.ts +0 -8
  366. package/dist/components/ui/sidebar/sidebar-menu-sub-button.svelte +0 -43
  367. package/dist/components/ui/sidebar/sidebar-menu-sub-button.svelte.d.ts +0 -13
  368. package/dist/components/ui/sidebar/sidebar-menu-sub-item.svelte +0 -21
  369. package/dist/components/ui/sidebar/sidebar-menu-sub-item.svelte.d.ts +0 -5
  370. package/dist/components/ui/sidebar/sidebar-menu-sub.svelte +0 -25
  371. package/dist/components/ui/sidebar/sidebar-menu-sub.svelte.d.ts +0 -5
  372. package/dist/components/ui/sidebar/sidebar-menu.svelte +0 -21
  373. package/dist/components/ui/sidebar/sidebar-menu.svelte.d.ts +0 -5
  374. package/dist/components/ui/sidebar/sidebar-provider.svelte +0 -53
  375. package/dist/components/ui/sidebar/sidebar-provider.svelte.d.ts +0 -9
  376. package/dist/components/ui/sidebar/sidebar-rail.svelte +0 -36
  377. package/dist/components/ui/sidebar/sidebar-rail.svelte.d.ts +0 -5
  378. package/dist/components/ui/sidebar/sidebar-separator.svelte +0 -19
  379. package/dist/components/ui/sidebar/sidebar-separator.svelte.d.ts +0 -13
  380. package/dist/components/ui/sidebar/sidebar-trigger.svelte +0 -35
  381. package/dist/components/ui/sidebar/sidebar-trigger.svelte.d.ts +0 -8
  382. package/dist/components/ui/sidebar/sidebar.svelte +0 -104
  383. package/dist/components/ui/sidebar/sidebar.svelte.d.ts +0 -10
  384. package/dist/components/ui/skeleton/index.d.ts +0 -2
  385. package/dist/components/ui/skeleton/index.js +0 -4
  386. package/dist/components/ui/skeleton/skeleton.svelte +0 -17
  387. package/dist/components/ui/skeleton/skeleton.svelte.d.ts +0 -5
  388. package/dist/components/ui/table/index.d.ts +0 -9
  389. package/dist/components/ui/table/index.js +0 -11
  390. package/dist/components/ui/table/table-body.svelte +0 -20
  391. package/dist/components/ui/table/table-body.svelte.d.ts +0 -5
  392. package/dist/components/ui/table/table-caption.svelte +0 -20
  393. package/dist/components/ui/table/table-caption.svelte.d.ts +0 -5
  394. package/dist/components/ui/table/table-cell.svelte +0 -20
  395. package/dist/components/ui/table/table-cell.svelte.d.ts +0 -5
  396. package/dist/components/ui/table/table-footer.svelte +0 -20
  397. package/dist/components/ui/table/table-footer.svelte.d.ts +0 -5
  398. package/dist/components/ui/table/table-head.svelte +0 -23
  399. package/dist/components/ui/table/table-head.svelte.d.ts +0 -5
  400. package/dist/components/ui/table/table-header.svelte +0 -20
  401. package/dist/components/ui/table/table-header.svelte.d.ts +0 -5
  402. package/dist/components/ui/table/table-row.svelte +0 -23
  403. package/dist/components/ui/table/table-row.svelte.d.ts +0 -5
  404. package/dist/components/ui/table/table.svelte +0 -22
  405. package/dist/components/ui/table/table.svelte.d.ts +0 -5
  406. package/dist/components/ui/tabs/index.d.ts +0 -5
  407. package/dist/components/ui/tabs/index.js +0 -7
  408. package/dist/components/ui/tabs/tabs-content.svelte +0 -17
  409. package/dist/components/ui/tabs/tabs-content.svelte.d.ts +0 -4
  410. package/dist/components/ui/tabs/tabs-list.svelte +0 -20
  411. package/dist/components/ui/tabs/tabs-list.svelte.d.ts +0 -4
  412. package/dist/components/ui/tabs/tabs-trigger.svelte +0 -20
  413. package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +0 -4
  414. package/dist/components/ui/tabs/tabs.svelte +0 -19
  415. package/dist/components/ui/tabs/tabs.svelte.d.ts +0 -4
  416. package/dist/components/ui/toggle/index.d.ts +0 -3
  417. package/dist/components/ui/toggle/index.js +0 -5
  418. package/dist/components/ui/toggle/toggle.svelte +0 -52
  419. package/dist/components/ui/toggle/toggle.svelte.d.ts +0 -43
  420. package/dist/components/ui/toggle-group/index.d.ts +0 -3
  421. package/dist/components/ui/toggle-group/index.js +0 -5
  422. package/dist/components/ui/toggle-group/toggle-group-item.svelte +0 -34
  423. package/dist/components/ui/toggle-group/toggle-group-item.svelte.d.ts +0 -6
  424. package/dist/components/ui/toggle-group/toggle-group.svelte +0 -47
  425. package/dist/components/ui/toggle-group/toggle-group.svelte.d.ts +0 -8
  426. package/dist/components/ui/tooltip/index.d.ts +0 -7
  427. package/dist/components/ui/tooltip/index.js +0 -9
  428. package/dist/components/ui/tooltip/tooltip-content.svelte +0 -47
  429. package/dist/components/ui/tooltip/tooltip-content.svelte.d.ts +0 -7
  430. package/dist/components/ui/tooltip/tooltip-trigger.svelte +0 -7
  431. package/dist/components/ui/tooltip/tooltip-trigger.svelte.d.ts +0 -4
  432. package/dist/hooks/is-mobile.svelte.d.ts +0 -4
  433. package/dist/hooks/is-mobile.svelte.js +0 -7
  434. package/dist/services/index.d.ts +0 -9
  435. package/dist/services/index.js +0 -10
  436. package/dist/types/docs.d.ts +0 -67
  437. package/dist/utils.d.ts +0 -15
  438. package/dist/utils.js +0 -44
  439. /package/dist/{types/docs.js → services/in-app-messaging.d.ts} +0 -0
package/README.md CHANGED
@@ -1,502 +1,698 @@
1
- # Svelte Firebase Library
1
+ # svelte-firekit
2
2
 
3
- A comprehensive, production-ready Firebase integration library for Svelte 5 applications. Built with reactive state management using Svelte 5 runes, providing a complete solution for authentication, Firestore, Storage, Realtime Database, Analytics, and more.
3
+ A complete Firebase integration library for **Svelte 5** and **SvelteKit**. Built with Svelte 5 runes throughout, works in any Svelte 5 project not just SvelteKit.
4
4
 
5
- ## 🚀 Features
5
+ - Firebase v12 (modular SDK)
6
+ - Svelte 5 runes (`$state`, `$derived`) — fully reactive, no stores
7
+ - SSR-safe — all services degrade gracefully on the server
8
+ - Works without SvelteKit (`$app/*`, `$env/*` are never imported)
6
9
 
7
- - **Complete Firebase Integration** - All Firebase products supported
8
- - **Svelte 5 Runes** - Reactive state management with optimal performance
9
- - **TypeScript First** - Full type safety and excellent developer experience
10
- - **SSR Compatible** - Server-side rendering support
11
- - **Real-time Updates** - Live data synchronization across all services
12
- - **Authentication System** - Complete auth solution with multiple providers
13
- - **Advanced Querying** - Complex Firestore queries with type safety
14
- - **File Management** - Storage upload/download with progress tracking
15
- - **Presence System** - User online/offline tracking with geolocation
16
- - **Analytics Integration** - Comprehensive event tracking
17
- - **Error Handling** - Robust error management with retry mechanisms
18
- - **Performance Optimized** - Persistent cache, memory management, and optimizations
10
+ ---
19
11
 
20
- ## 📦 Installation
12
+ ## Installation
21
13
 
22
- ```bash
14
+ ```sh
23
15
  npm install svelte-firekit firebase
24
16
  ```
25
17
 
26
- ## 🔧 Quick Setup
18
+ ---
19
+
20
+ ## Setup
27
21
 
28
- ### 1. Environment Variables
22
+ ### 1. Initialize Firebase
29
23
 
30
- Create a `.env` file with your Firebase configuration:
24
+ Call `initFirekit` once before your app renders — in your root layout or entry point:
31
25
 
32
- ```dotenv
33
- PUBLIC_FIREBASE_API_KEY=your_api_key
34
- PUBLIC_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
35
- PUBLIC_FIREBASE_PROJECT_ID=your_project_id
36
- PUBLIC_FIREBASE_STORAGE_BUCKET=your_project.appspot.com
37
- PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_sender_id
38
- PUBLIC_FIREBASE_APP_ID=your_app_id
39
- PUBLIC_FIREBASE_MEASUREMENT_ID=your_measurement_id
26
+ ```ts
27
+ import { initFirekit } from 'svelte-firekit';
28
+
29
+ initFirekit({
30
+ apiKey: '...',
31
+ authDomain: '...',
32
+ projectId: '...',
33
+ storageBucket: '...',
34
+ messagingSenderId: '...',
35
+ appId: '...',
36
+ databaseURL: '...' // required for Realtime Database
37
+ });
40
38
  ```
41
39
 
42
- ### 2. Initialize Firebase
40
+ ### 2. Wrap your app
43
41
 
44
42
  ```svelte
45
- <script>
46
- import { FirebaseApp } from 'svelte-firekit';
43
+ <!-- +layout.svelte -->
44
+ <script lang="ts">
45
+ import { FirebaseApp } from 'svelte-firekit';
46
+ import { firebaseConfig } from '$lib/firebase';
47
47
  </script>
48
48
 
49
- <FirebaseApp>
50
- <!-- Your app content -->
49
+ <FirebaseApp config={firebaseConfig}>
50
+ {@render children()}
51
51
  </FirebaseApp>
52
52
  ```
53
53
 
54
- ### 3. Basic Usage
54
+ `FirebaseApp` initializes Firebase, sets up Svelte context for all services, and optionally enables App Check:
55
55
 
56
56
  ```svelte
57
- <script>
58
- import { firekitUser, firekitCollection, firekitDoc } from 'svelte-firekit';
59
-
60
- // Reactive user state
61
- const user = $derived(firekitUser.user);
62
- const isAuthenticated = $derived(firekitUser.isAuthenticated);
63
-
64
- // Reactive document
65
- const userDoc = firekitDoc('users/123');
66
-
67
- // Reactive collection
68
- const posts = firekitCollection('posts', [
69
- where('published', '==', true),
70
- orderBy('createdAt', 'desc'),
71
- limit(10)
72
- ]);
73
- </script>
74
-
75
- {#if isAuthenticated}
76
- <h1>Welcome, {user?.displayName}!</h1>
77
-
78
- {#if userDoc.loading}
79
- <p>Loading user data...</p>
80
- {:else if userDoc.data}
81
- <p>Email: {userDoc.data.email}</p>
82
- {/if}
83
-
84
- <h2>Recent Posts</h2>
85
- {#each posts.data as post}
86
- <article>
87
- <h3>{post.title}</h3>
88
- <p>{post.content}</p>
89
- </article>
90
- {/each}
91
- {/if}
57
+ <FirebaseApp {config} appCheckOptions={{ provider: new ReCaptchaEnterpriseProvider('SITE_KEY'), isTokenAutoRefreshEnabled: true }}>
58
+ {@render children()}
59
+ </FirebaseApp>
92
60
  ```
93
61
 
94
- ## 📚 Core Services
62
+ ---
95
63
 
96
- ### Authentication
64
+ ## Authentication
97
65
 
98
- ```typescript
66
+ ```ts
99
67
  import { firekitAuth, firekitUser } from 'svelte-firekit';
68
+ ```
100
69
 
101
- // Sign in methods
70
+ ### Sign in
71
+
72
+ ```ts
73
+ // Email / password
102
74
  await firekitAuth.signInWithEmail('user@example.com', 'password');
75
+
76
+ // OAuth (popup)
103
77
  await firekitAuth.signInWithGoogle();
78
+ await firekitAuth.signInWithGithub();
104
79
  await firekitAuth.signInWithFacebook();
105
80
  await firekitAuth.signInWithApple();
81
+ await firekitAuth.signInWithTwitter();
82
+ await firekitAuth.signInWithMicrosoft();
83
+
84
+ // OAuth (redirect — call getRedirectResult() on app load)
85
+ await firekitAuth.signInWithGoogleRedirect();
86
+ const result = await firekitAuth.getRedirectResult(); // null if no pending redirect
87
+
88
+ // SAML / OIDC
89
+ await firekitAuth.signInWithSAML('saml.my-provider');
90
+ await firekitAuth.signInWithOIDC('oidc.my-provider', ['email', 'profile']);
91
+
92
+ // Custom token (server-issued)
93
+ await firekitAuth.signInWithCustomToken(token);
106
94
 
107
- // User registration
108
- await firekitAuth.registerWithEmail('user@example.com', 'password', 'John Doe');
95
+ // Anonymous
96
+ await firekitAuth.signInAnonymously();
109
97
 
110
- // Reactive user state
111
- const user = $derived(firekitUser.user);
112
- const isAuthenticated = $derived(firekitUser.isAuthenticated);
113
- const isEmailVerified = $derived(firekitUser.isEmailVerified);
98
+ // Phone
99
+ const { confirm } = await firekitAuth.signInWithPhoneNumber('+1234567890', 'recaptcha-container');
100
+ await confirm('123456');
114
101
  ```
115
102
 
116
- ### Firestore Documents
103
+ ### Registration & profile
104
+
105
+ ```ts
106
+ await firekitAuth.registerWithEmail('user@example.com', 'password', 'Jane Doe');
107
+ await firekitAuth.updateUserProfile({ displayName: 'Jane', photoURL: 'https://...' });
108
+ await firekitAuth.updateEmail('new@example.com');
109
+ await firekitAuth.updatePassword('newPassword', 'currentPassword');
110
+ await firekitAuth.sendPasswordReset('user@example.com');
111
+ await firekitAuth.sendEmailVerification();
112
+ await firekitAuth.signOut();
113
+ await firekitAuth.deleteAccount('currentPassword');
114
+ ```
117
115
 
118
- ```typescript
119
- import { firekitDoc, firekitDocOnce } from 'svelte-firekit';
116
+ ### Multi-factor authentication (MFA)
120
117
 
121
- // Real-time document subscription
122
- const userDoc = firekitDoc<User>('users/123', {
123
- name: 'Loading...',
124
- email: ''
125
- });
118
+ ```ts
119
+ // Enroll phone MFA
120
+ const verificationId = await firekitAuth.startPhoneMFAEnrollment('+1234567890', 'recaptcha-container');
121
+ await firekitAuth.completeMFAEnrollment(verificationId, '123456', 'My Phone');
126
122
 
127
- // One-time document fetch
128
- const userData = firekitDocOnce<User>('users/123');
123
+ // Check enrolled factors
124
+ const factors = firekitAuth.getMFAEnrolledFactors();
129
125
 
130
- // Access reactive state
131
- const isLoading = $derived(userDoc.loading);
132
- const userData = $derived(userDoc.data);
133
- const userError = $derived(userDoc.error);
126
+ // Unenroll
127
+ await firekitAuth.unenrollMFA(factors[0]);
134
128
 
135
- $effect(() => {
136
- if (isLoading) console.log('Loading...');
137
- if (userData) console.log('User:', userData);
138
- if (userError) console.error('Error:', userError);
139
- });
129
+ // Complete an MFA-required sign-in (catch the MultiFactorError first)
130
+ try {
131
+ await firekitAuth.signInWithEmail(email, password);
132
+ } catch (err) {
133
+ const resolver = firekitAuth.getMFAResolver(err);
134
+ const verificationId = await firekitAuth.startMFASignIn(resolver, 0, 'recaptcha-container');
135
+ const result = await firekitAuth.completeMFASignIn(resolver, verificationId, '123456');
136
+ }
140
137
  ```
141
138
 
142
- ### Firestore Collections
139
+ ### Reactive user state
143
140
 
144
- ```typescript
145
- import { firekitCollection, where, orderBy, limit } from 'svelte-firekit';
141
+ ```svelte
142
+ <script lang="ts">
143
+ import { firekitUser } from 'svelte-firekit';
144
+ </script>
146
145
 
147
- // Simple collection
148
- const users = firekitCollection<User>('users');
146
+ {#if firekitUser.loading}
147
+ <p>Loading...</p>
148
+ {:else if firekitUser.isAuthenticated}
149
+ <p>Welcome, {firekitUser.user?.displayName}</p>
150
+ {:else}
151
+ <p>Not signed in</p>
152
+ {/if}
153
+ ```
149
154
 
150
- // With query constraints
151
- const activeUsers = firekitCollection<User>('users', [
152
- where('active', '==', true),
153
- orderBy('name'),
154
- limit(10)
155
- ]);
155
+ | Property | Type | Description |
156
+ |---|---|---|
157
+ | `user` | `UserProfile \| null` | Current user profile |
158
+ | `loading` | `boolean` | Auth state initializing |
159
+ | `isAuthenticated` | `boolean` | Signed in and not anonymous |
160
+ | `isAnonymous` | `boolean` | Anonymous session |
161
+ | `initialized` | `boolean` | First auth state received |
162
+
163
+ ```ts
164
+ // Wait for auth to initialize (useful for SSR / load functions)
165
+ const user = await firekitUser.waitForAuth();
166
+ ```
156
167
 
157
- // Advanced options
158
- const paginatedUsers = firekitCollection<User>('users', {
159
- pagination: { enabled: true, pageSize: 20 },
160
- cache: { enabled: true, ttl: 300000 }
161
- });
168
+ ### Auth components
162
169
 
163
- // Access reactive state
164
- const usersData = $derived(users.data);
165
- const usersLoading = $derived(users.loading);
166
- const usersError = $derived(users.error);
170
+ ```svelte
171
+ <SignedIn> <p>Only shown when signed in</p> </SignedIn>
172
+ <SignedOut> <p>Only shown when signed out</p> </SignedOut>
167
173
 
168
- $effect(() => {
169
- console.log('Users:', usersData);
170
- console.log('Loading:', usersLoading);
171
- console.log('Error:', usersError);
172
- });
174
+ <!-- Route guard with redirect callback -->
175
+ <AuthGuard requireAuth={true} onUnauthorized={() => goto('/login')}>
176
+ <p>Protected content</p>
177
+ </AuthGuard>
178
+
179
+ <!-- Custom guard with async checks (e.g. role verification) -->
180
+ <CustomGuard
181
+ verificationChecks={[
182
+ async () => { const doc = await getDoc(...); return doc.data()?.role === 'admin'; }
183
+ ]}
184
+ onUnauthorized={() => goto('/403')}
185
+ >
186
+ <p>Admin only</p>
187
+ </CustomGuard>
173
188
  ```
174
189
 
175
- ### Document Mutations
190
+ ---
176
191
 
177
- ```typescript
178
- import { firekitDocMutations } from 'svelte-firekit';
192
+ ## Firestore
179
193
 
180
- // Create document
181
- const result = await firekitDocMutations.add(
182
- 'users',
183
- {
184
- name: 'John Doe',
185
- email: 'john@example.com'
186
- },
187
- {
188
- timestamps: true,
189
- validate: true
190
- }
191
- );
194
+ ### Reactive document
192
195
 
193
- // Update document
194
- await firekitDocMutations.update('users/123', {
195
- name: 'Jane Doe'
196
- });
196
+ ```svelte
197
+ <script lang="ts">
198
+ import { firekitDoc } from 'svelte-firekit';
197
199
 
198
- // Delete document
199
- await firekitDocMutations.delete('users/123');
200
+ const post = firekitDoc<Post>('posts/post-id');
201
+ </script>
200
202
 
201
- // Batch operations
202
- const batchResult = await firekitDocMutations.batch([
203
- { type: 'create', path: 'users', data: userData },
204
- { type: 'update', path: 'profiles/123', data: profileUpdate }
205
- ]);
203
+ {#if post.loading}<p>Loading...</p>{/if}
204
+ {#if post.data}<h1>{post.data.title}</h1>{/if}
206
205
  ```
207
206
 
208
- ### Storage Management
207
+ Using the `<Doc>` component:
209
208
 
210
- ```typescript
211
- import { firekitDownloadUrl, firekitUploadTask, firekitStorageList } from 'svelte-firekit';
209
+ ```svelte
210
+ <Doc path="posts/post-id">
211
+ {#snippet data(post)}
212
+ <h1>{post.title}</h1>
213
+ {/snippet}
214
+ {#snippet loading()}<p>Loading...</p>{/snippet}
215
+ </Doc>
216
+ ```
212
217
 
213
- // Download URL
214
- const imageUrl = firekitDownloadUrl('images/photo.jpg');
215
- const downloadUrl = $derived(imageUrl.url);
218
+ **Change path reactively:**
216
219
 
217
- // File upload with progress
218
- const upload = firekitUploadTask('uploads/file.pdf', file);
219
- const uploadProgress = $derived(upload.progress);
220
- const uploadCompleted = $derived(upload.completed);
221
- const uploadDownloadUrl = $derived(upload.downloadURL);
220
+ ```ts
221
+ post.setPath('posts/other-id'); // tears down listener, re-subscribes
222
+ ```
222
223
 
223
- $effect(() => {
224
- if (downloadUrl) console.log('Image URL:', downloadUrl);
225
- console.log('Upload progress:', uploadProgress);
226
- if (uploadCompleted) console.log('Download URL:', uploadDownloadUrl);
227
- });
224
+ **One-time fetch:**
228
225
 
229
- // Storage listing
230
- const files = firekitStorageList('uploads');
231
- const fileItems = $derived(files.items);
232
- const filePrefixes = $derived(files.prefixes);
226
+ ```ts
227
+ const post = firekitDocOnce<Post>('posts/post-id');
228
+ ```
233
229
 
234
- $effect(() => {
235
- console.log('Files:', fileItems);
236
- console.log('Folders:', filePrefixes);
237
- });
230
+ ### Reactive collection
231
+
232
+ ```svelte
233
+ <script lang="ts">
234
+ import { firekitCollection } from 'svelte-firekit';
235
+ import { where, orderBy } from 'firebase/firestore';
236
+
237
+ const posts = firekitCollection<Post>('posts', [
238
+ where('published', '==', true),
239
+ orderBy('createdAt', 'desc')
240
+ ]);
241
+ </script>
242
+
243
+ {#each posts.data as post}
244
+ <p>{post.title}</p>
245
+ {/each}
238
246
  ```
239
247
 
240
- ### Realtime Database
248
+ **Cursor-based pagination:**
241
249
 
242
- ```typescript
243
- import { firekitRealtimeDB, firekitRealtimeList } from 'svelte-firekit';
250
+ ```ts
251
+ await posts.setPagination(10); // 10 per page, switches to one-time fetch
252
+ await posts.nextPage(); // next page (replaces data)
253
+ await posts.prevPage(); // previous page
254
+ await posts.loadMore(); // append next page (infinite scroll)
255
+ await posts.resetPagination(); // back to page 1
244
256
 
245
- // Single value
246
- const userStatus = firekitRealtimeDB<{ online: boolean }>('users/123/status');
257
+ posts.currentPage // number
258
+ posts.hasMore // boolean
259
+ ```
247
260
 
248
- // List data
249
- const messages = firekitRealtimeList<Message>('messages');
261
+ **Fluent query builder:**
250
262
 
251
- // Access data
252
- const statusData = $derived(userStatus.data);
253
- const messagesList = $derived(messages.list);
263
+ ```ts
264
+ import { FirekitQueryBuilder } from 'svelte-firekit';
254
265
 
255
- $effect(() => {
256
- console.log('Status:', statusData);
257
- console.log('Messages:', messagesList);
258
- });
266
+ const constraints = new FirekitQueryBuilder<Post>()
267
+ .where('published', '==', true)
268
+ .orderBy('createdAt', 'desc')
269
+ .limit(20)
270
+ .build();
271
+ ```
259
272
 
260
- // Update data
261
- await userStatus.set({ online: true });
262
- await messages.push({ text: 'Hello', userId: '123' });
273
+ **Collection group:**
274
+
275
+ ```ts
276
+ const allComments = firekitCollectionGroup<Comment>('comments');
263
277
  ```
264
278
 
265
- ### Presence System
279
+ ### Document mutations
266
280
 
267
- ```typescript
268
- import { firekitPresence } from 'svelte-firekit';
281
+ ```ts
282
+ import { firekitMutations } from 'svelte-firekit';
269
283
 
270
- // Initialize presence
271
- await firekitPresence.initialize(user, {
272
- geolocation: {
273
- enabled: true,
274
- type: 'browser',
275
- requireConsent: true
276
- }
284
+ await firekitMutations.add('posts', { title: 'Hello' });
285
+ await firekitMutations.set('posts/id', { title: 'Hello' });
286
+ await firekitMutations.update('posts/id', { title: 'Updated' });
287
+ await firekitMutations.delete('posts/id');
288
+
289
+ // Existence check
290
+ const exists = await firekitMutations.exists('posts/id');
291
+
292
+ // Field value helpers
293
+ await firekitMutations.update('posts/id', {
294
+ views: firekitMutations.increment(1),
295
+ tags: firekitMutations.arrayUnion('svelte'),
296
+ draft: firekitMutations.deleteField(),
297
+ updatedAt: firekitMutations.serverTimestamp()
277
298
  });
278
299
 
279
- // Set presence status
280
- await firekitPresence.setPresence('online');
300
+ // Batch (auto-chunked at 500)
301
+ await firekitMutations.batchOps([
302
+ { type: 'set', path: 'posts', id: 'a', data: { title: 'A' } },
303
+ { type: 'update', path: 'posts/b', data: { views: 1 } },
304
+ { type: 'delete', path: 'posts/c' }
305
+ ]);
281
306
 
282
- // Access reactive state
283
- const presenceStatus = $derived(firekitPresence.status);
284
- const presenceLocation = $derived(firekitPresence.location);
285
- const presenceSessions = $derived(firekitPresence.sessions);
307
+ // Transaction
308
+ await firekitMutations.transaction(async (tx) => {
309
+ const snap = await tx.get(ref);
310
+ tx.update(ref, { count: snap.data().count + 1 });
311
+ });
286
312
  ```
287
313
 
288
- ### Analytics
314
+ ### Timestamps and options
289
315
 
290
- ```typescript
291
- import { firekitAnalytics } from 'svelte-firekit';
316
+ ```ts
317
+ // Auto-adds createdAt/updatedAt
318
+ await firekitMutations.add('posts', data, { timestamps: true, userId: uid });
292
319
 
293
- // Track custom events
294
- firekitAnalytics.trackEvent('button_click', {
295
- button_name: 'signup',
296
- page_location: '/home'
320
+ // Retry on failure
321
+ await firekitMutations.set('posts/id', data, {
322
+ retry: { enabled: true, maxAttempts: 3, baseDelay: 200, strategy: 'exponential' }
297
323
  });
324
+ ```
298
325
 
299
- // Track purchases
300
- firekitAnalytics.trackPurchase({
301
- transaction_id: 'T12345',
302
- value: 29.99,
303
- currency: 'USD',
304
- items: [{ item_id: 'prod_123', item_name: 'Premium Plan' }]
305
- });
326
+ ### Bundles
306
327
 
307
- // Set user properties
308
- firekitAnalytics.setUserProperties({
309
- user_type: 'premium',
310
- subscription_plan: 'pro'
311
- });
328
+ ```ts
329
+ import { loadFirestoreBundle, getNamedQuery } from 'svelte-firekit';
330
+ import { getDocs } from 'firebase/firestore';
331
+
332
+ const res = await fetch('/bundles/featured.bundle');
333
+ await loadFirestoreBundle(res.body!);
334
+
335
+ const q = await getNamedQuery<Post>('featured-posts');
336
+ if (q) {
337
+ const snap = await getDocs(q);
338
+ }
312
339
  ```
313
340
 
314
- ## 🧩 Components
341
+ ---
315
342
 
316
- ### Authentication Components
343
+ ## Realtime Database
317
344
 
318
345
  ```svelte
319
- <script>
320
- import { AuthGuard, SignedIn, SignedOut } from 'svelte-firekit';
346
+ <script lang="ts">
347
+ import { firekitNode, firekitNodeList } from 'svelte-firekit';
348
+
349
+ const counter = firekitNode<number>('counters/visitors');
350
+ const messages = firekitNodeList<Message>('chat/messages');
321
351
  </script>
322
352
 
323
- <!-- Route protection -->
324
- <AuthGuard requireAuth={true} redirectTo="/login">
325
- <h1>Protected Content</h1>
326
- </AuthGuard>
353
+ <p>Visitors: {counter.data}</p>
327
354
 
328
- <!-- Conditional rendering -->
329
- <SignedIn>
330
- <h1>Welcome back!</h1>
331
- </SignedIn>
355
+ {#each messages.list as msg}
356
+ <p>{msg.text}</p>
357
+ {/each}
358
+ ```
332
359
 
333
- <SignedOut>
334
- <h1>Please sign in</h1>
335
- </SignedOut>
360
+ ```ts
361
+ await counter.set(42);
362
+ await counter.update({ count: 10 });
363
+ await messages.push({ text: 'Hello!', userId: uid });
364
+ await messages.remove();
365
+ const once = await messages.fetchOnce();
336
366
  ```
337
367
 
338
- ### Data Components
368
+ Using the `<Node>` component:
339
369
 
340
370
  ```svelte
341
- <script>
342
- import { Doc, Collection } from 'svelte-firekit';
371
+ <Node path="chat/messages">
372
+ {#snippet data(messages)}<p>{messages}</p>{/snippet}
373
+ </Node>
374
+ ```
375
+
376
+ ---
377
+
378
+ ## Firebase Storage
379
+
380
+ ```svelte
381
+ <script lang="ts">
382
+ import { firekitDownloadUrl, firekitUploadTask } from 'svelte-firekit';
383
+
384
+ const avatar = firekitDownloadUrl('images/avatar.jpg');
385
+ let file: File;
386
+ $: upload = file ? firekitUploadTask('uploads/' + file.name, file) : null;
343
387
  </script>
344
388
 
345
- <!-- Document component -->
346
- <Doc ref="users/123" let:data let:ref let:firestore>
347
- <h1>{data.name}</h1>
348
- <p>{data.email}</p>
349
- </Doc>
389
+ {#if avatar.url}<img src={avatar.url} alt="avatar" />{/if}
390
+
391
+ {#if upload}
392
+ <progress value={upload.progress} max={100} />
393
+ {#if upload.downloadURL}<img src={upload.downloadURL} />{/if}
394
+ {/if}
395
+ ```
396
+
397
+ ```ts
398
+ import { deleteFile, getFileMetadata, updateFileMetadata } from 'svelte-firekit';
350
399
 
351
- <!-- Collection component -->
352
- <Collection ref="posts" let:data let:ref let:firestore let:count>
353
- <h1>Posts ({count})</h1>
354
- {#each data as post}
355
- <article>
356
- <h2>{post.title}</h2>
357
- <p>{post.content}</p>
358
- </article>
359
- {/each}
360
- </Collection>
400
+ await deleteFile('images/old.jpg');
401
+ const meta = await getFileMetadata('images/avatar.jpg');
402
+ await updateFileMetadata('images/avatar.jpg', {
403
+ contentType: 'image/webp',
404
+ customMetadata: { uploadedBy: uid }
405
+ });
361
406
  ```
362
407
 
363
- ### Storage Components
408
+ List files:
364
409
 
365
410
  ```svelte
366
- <script>
367
- import { StorageList, DownloadURL, UploadTask } from 'svelte-firekit';
411
+ <script lang="ts">
412
+ import { firekitStorageList } from 'svelte-firekit';
413
+ const dir = firekitStorageList('uploads/2024');
368
414
  </script>
415
+ {#each dir.items as item}<p>{item.name}</p>{/each}
416
+ ```
417
+
418
+ Using the `<DownloadURL>` and `<UploadTask>` components:
369
419
 
370
- <!-- Storage listing -->
371
- <StorageList path="uploads" let:items let:prefixes>
372
- <h2>Files</h2>
373
- {#each items as item}
374
- <p>{item.name}</p>
375
- {/each}
376
-
377
- <h2>Folders</h2>
378
- {#each prefixes as prefix}
379
- <p>{prefix.name}</p>
380
- {/each}
381
- </StorageList>
382
-
383
- <!-- Download URL -->
384
- <DownloadURL path="images/photo.jpg" let:url let:loading let:error>
385
- {#if loading}
386
- <p>Loading image...</p>
387
- {:else if url}
388
- <img src={url} alt="Photo" />
389
- {:else if error}
390
- <p>Error: {error.message}</p>
391
- {/if}
420
+ ```svelte
421
+ <DownloadURL path="images/avatar.jpg">
422
+ {#snippet data(url)}<img src={url} />{/snippet}
392
423
  </DownloadURL>
393
424
 
394
- <!-- Upload with progress -->
395
- <UploadTask path="uploads/file.pdf" file={selectedFile} let:progress let:completed let:error>
396
- {#if !completed}
397
- <div class="progress-bar">
398
- <div class="progress" style="width: {progress}%"></div>
399
- </div>
400
- <p>{progress}% uploaded</p>
401
- {:else}
402
- <p>Upload complete!</p>
403
- {/if}
425
+ <UploadTask path="uploads/file.jpg" {file}>
426
+ {#snippet data({ progress, downloadURL })}<progress value={progress} max={100} />{/snippet}
404
427
  </UploadTask>
405
428
  ```
406
429
 
407
- ## 🎯 Best Practices
430
+ ---
408
431
 
409
- ### 1. Use Reactive State
432
+ ## Cloud Functions
410
433
 
411
- ```typescript
412
- // Good - Reactive state
413
- const user = $derived(firekitUser.user);
414
- const isAuthenticated = $derived(firekitUser.isAuthenticated);
434
+ ```ts
435
+ import { firekitCallable, firekitCallableFromURL } from 'svelte-firekit';
415
436
 
416
- // Avoid - Direct service calls in templates
417
- const user = firekitUser.getCurrentUser();
437
+ const sendWelcome = firekitCallable<{ userId: string }, { sent: boolean }>('sendWelcomeEmail');
438
+ const result = await sendWelcome.call({ userId: 'abc' });
439
+ // sendWelcome.loading, sendWelcome.error, sendWelcome.result
440
+
441
+ const fn = firekitCallableFromURL<Input, Output>('https://region-project.cloudfunctions.net/fn');
418
442
  ```
419
443
 
420
- ### 2. Handle Loading States
444
+ ---
421
445
 
422
- ```svelte
423
- {#if userDoc.loading}
424
- <LoadingSpinner />
425
- {:else if userDoc.error}
426
- <ErrorMessage error={userDoc.error} />
427
- {:else if userDoc.data}
428
- <UserProfile user={userDoc.data} />
429
- {/if}
446
+ ## Firebase AI (Gemini)
447
+
448
+ ```ts
449
+ import { firekitGenerate, firekitStream, firekitChat } from 'svelte-firekit';
450
+
451
+ // One-shot
452
+ const gen = firekitGenerate({ model: 'gemini-2.0-flash' });
453
+ await gen.generate('Summarize: ...');
454
+ // gen.text, gen.loading, gen.error
455
+
456
+ // Streaming
457
+ const stream = firekitStream({ model: 'gemini-2.0-flash' });
458
+ await stream.generate('Write a poem about Svelte.');
459
+ // stream.text updates token-by-token, stream.streaming
460
+
461
+ // Multi-turn chat
462
+ const chat = firekitChat({ model: 'gemini-2.0-flash' });
463
+ await chat.send('Hello!');
464
+ await chat.send('Tell me more.');
465
+ // chat.history, chat.pendingText, chat.streaming
430
466
  ```
431
467
 
432
- ### 3. Clean Up Subscriptions
468
+ Switch between Google AI and Vertex AI:
433
469
 
434
- ```typescript
435
- import { onDestroy } from 'svelte';
470
+ ```ts
471
+ import { GoogleAIBackend, VertexAIBackend } from 'svelte-firekit';
472
+
473
+ const gen = firekitGenerate({ backend: 'vertexai', model: 'gemini-2.0-flash' });
474
+ ```
436
475
 
437
- const userDoc = firekitDoc('users/123');
476
+ Content helpers:
438
477
 
439
- onDestroy(() => {
440
- userDoc.dispose();
478
+ ```ts
479
+ import { textPart, imagePart, imageUrlPart } from 'svelte-firekit';
480
+
481
+ await gen.generate([textPart('Describe this image:'), imagePart(base64)]);
482
+ ```
483
+
484
+ ---
485
+
486
+ ## Remote Config
487
+
488
+ ```ts
489
+ import { firekitRemoteConfig } from 'svelte-firekit';
490
+
491
+ const rc = firekitRemoteConfig({
492
+ defaults: { welcomeMessage: 'Hello!', featureEnabled: false },
493
+ minimumFetchIntervalMs: 3_600_000,
494
+ realtime: true // subscribe to live config updates
441
495
  });
496
+
497
+ await rc.fetchAndActivate();
498
+
499
+ const msg = rc.getString('welcomeMessage');
500
+ const flag = rc.getBoolean('featureEnabled');
501
+ const count = rc.getNumber('itemsPerPage', 10);
442
502
  ```
443
503
 
444
- ### 4. Use Type Safety
504
+ ---
505
+
506
+ ## Performance Monitoring
445
507
 
446
- ```typescript
447
- interface User {
448
- id: string;
449
- name: string;
450
- email: string;
451
- active: boolean;
452
- }
508
+ ```ts
509
+ import { firekitPerformance } from 'svelte-firekit';
510
+
511
+ // Simple trace
512
+ const stop = await firekitPerformance.startTrace('load-dashboard');
513
+ // ... work ...
514
+ stop();
453
515
 
454
- const userDoc = firekitDoc<User>('users/123');
455
- const users = firekitCollection<User>('users');
516
+ // Timed block
517
+ const duration = await firekitPerformance.measure('render-posts', async () => {
518
+ await loadPosts();
519
+ });
456
520
  ```
457
521
 
458
- ### 5. Optimize Queries
522
+ ---
523
+
524
+ ## Analytics
459
525
 
460
- ```typescript
461
- // Good - Specific queries
462
- const activeUsers = firekitCollection('users', where('active', '==', true), limit(10));
526
+ ```ts
527
+ import { firekitAnalytics } from 'svelte-firekit';
463
528
 
464
- // Avoid - Fetching all data
465
- const allUsers = firekitCollection('users');
529
+ await firekitAnalytics.logEvent('purchase', { value: 9.99, currency: 'USD' });
530
+ await firekitAnalytics.setUserId('uid123');
531
+ await firekitAnalytics.setUserProperties({ plan: 'pro' });
532
+ await firekitAnalytics.logScreenView('Dashboard');
466
533
  ```
467
534
 
468
- ## 📚 Documentation
535
+ ---
469
536
 
470
- For complete documentation, examples, and API reference, visit:
537
+ ## Messaging (FCM)
471
538
 
472
- **[https://sveltefirekit.com](https://sveltefirekit.com)**
539
+ ```ts
540
+ import { firekitMessaging } from 'svelte-firekit';
473
541
 
474
- ### Key Sections:
542
+ const token = await firekitMessaging.requestPermission('YOUR_VAPID_KEY');
543
+ // firekitMessaging.token, firekitMessaging.permission, firekitMessaging.supported
475
544
 
476
- - [Installation Guide](https://sveltefirekit.com/installation) - Complete setup guide
477
- - [Authentication](https://sveltefirekit.com/auth) - User authentication and management
478
- - [Firestore Collections](https://sveltefirekit.com/collections) - Real-time data management
479
- - [Document Operations](https://sveltefirekit.com/documents) - Individual document handling
480
- - [File Storage](https://sveltefirekit.com/storage) - File upload and management
481
- - [Realtime Database](https://sveltefirekit.com/realtime) - Real-time data synchronization
482
- - [Analytics](https://sveltefirekit.com/analytics) - User and event tracking
483
- - [Components](https://sveltefirekit.com/components) - Pre-built Svelte components
484
- - [Presence System](https://sveltefirekit.com/presence) - User online/offline tracking
545
+ // Listen for foreground messages
546
+ const unsub = await firekitMessaging.onMessage((payload) => {
547
+ console.log(payload.notification?.title);
548
+ });
549
+ ```
485
550
 
486
- ## 🤝 Contributing
551
+ ---
552
+
553
+ ## In-App Messaging
554
+
555
+ ```ts
556
+ import { firekitInAppMessaging } from 'svelte-firekit';
557
+
558
+ // Suppress during critical flows (e.g. checkout)
559
+ firekitInAppMessaging.suppress();
560
+ // ... complete checkout ...
561
+ firekitInAppMessaging.unsuppress();
562
+
563
+ // firekitInAppMessaging.suppressed (reactive boolean)
564
+ // firekitInAppMessaging.supported
565
+ ```
566
+
567
+ ---
568
+
569
+ ## Presence
570
+
571
+ ```ts
572
+ import { firekitPresence } from 'svelte-firekit';
573
+
574
+ await firekitPresence.initialize(user, {
575
+ sessionTTL: 30 * 60_000,
576
+ trackDeviceInfo: true,
577
+ geolocation: { enabled: true, type: 'browser', requireConsent: true }
578
+ });
579
+
580
+ await firekitPresence.setPresence('away');
581
+
582
+ const stats = firekitPresence.getStats();
583
+ // stats.onlineSessions, stats.totalSessions, stats.uniqueDevices
584
+
585
+ await firekitPresence.dispose();
586
+ ```
587
+
588
+ ---
487
589
 
488
- We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
590
+ ## App Check
489
591
 
490
- ## 📄 License
592
+ ```svelte
593
+ <script>
594
+ import { ReCaptchaEnterpriseProvider } from 'svelte-firekit';
595
+ </script>
596
+
597
+ <FirebaseApp
598
+ {config}
599
+ appCheckOptions={{
600
+ provider: new ReCaptchaEnterpriseProvider('SITE_KEY'),
601
+ isTokenAutoRefreshEnabled: true
602
+ }}
603
+ >
604
+ {@render children()}
605
+ </FirebaseApp>
606
+ ```
607
+
608
+ ---
609
+
610
+ ## Context helpers
611
+
612
+ After `<FirebaseApp>`, you can retrieve any raw Firebase service instance from Svelte context:
491
613
 
492
- MIT License - see [LICENSE](LICENSE) for details.
614
+ ```ts
615
+ import {
616
+ getFirestoreContext,
617
+ getAuthContext,
618
+ getStorageContext,
619
+ getRTDBContext,
620
+ getFunctionsContext,
621
+ getAppCheckContext
622
+ } from 'svelte-firekit';
493
623
 
494
- ## 🆘 Support
624
+ // Inside a component:
625
+ const db = getFirestoreContext();
626
+ const auth = getAuthContext();
627
+ ```
628
+
629
+ ---
630
+
631
+ ## SSR
632
+
633
+ All services return safe defaults on the server (`loading: false`, empty arrays, `null` data) — no Firebase network calls happen during SSR. The only exception is `firekitPresence`, which is browser-only and will throw if you call `initialize()` on the server.
495
634
 
496
- - [Documentation](https://sveltefirekit.com)
497
- - [GitHub Issues](https://github.com/code-gio/svelte-firekit/issues)
498
- - [Discussions](https://github.com/code-gio/svelte-firekit/discussions)
635
+ ```ts
636
+ // Safe in load functions / SSR — resolves immediately on server
637
+ const user = await firekitUser.waitForAuth();
638
+ const posts = firekitCollection<Post>('posts');
639
+ const data = await posts.waitForReady();
640
+ ```
499
641
 
500
642
  ---
501
643
 
502
- **Built with ❤️ for the Svelte community**
644
+ ## API Reference
645
+
646
+ ### Services
647
+
648
+ | Import | Description |
649
+ |---|---|
650
+ | `firekitAuth` | Auth operations (sign-in, register, MFA, SAML/OIDC, redirect) |
651
+ | `firekitUser` | Reactive current user state |
652
+ | `firekitMutations` | Firestore CRUD, batch, transactions |
653
+ | `firekitPresence` | User presence tracking via RTDB |
654
+ | `firekitRemoteConfig()` | Remote Config per-instance |
655
+ | `firekitPerformance` | Performance Monitoring traces |
656
+ | `firekitAnalytics` | Analytics event logging |
657
+ | `firekitMessaging` | Firebase Cloud Messaging |
658
+ | `firekitInAppMessaging` | In-App Messaging suppression control |
659
+ | `firekitAppCheck` | App Check initialization |
660
+
661
+ ### Reactive classes
662
+
663
+ | Import | Description |
664
+ |---|---|
665
+ | `FirekitDoc` / `firekitDoc()` | Reactive Firestore document |
666
+ | `FirekitCollection` / `firekitCollection()` | Reactive Firestore collection with pagination |
667
+ | `FirekitCollectionGroup` / `firekitCollectionGroup()` | Collection group query |
668
+ | `FirekitNode` / `firekitNode()` | Reactive RTDB node |
669
+ | `FirekitNodeList` / `firekitNodeList()` | Reactive RTDB list |
670
+ | `FirekitDownloadUrl` / `firekitDownloadUrl()` | Reactive Storage download URL |
671
+ | `FirekitStorageList` / `firekitStorageList()` | Reactive Storage directory listing |
672
+ | `FirekitUploadTask` / `firekitUploadTask()` | Reactive resumable upload |
673
+ | `FirekitGenerate` / `firekitGenerate()` | One-shot AI generation |
674
+ | `FirekitStream` / `firekitStream()` | Streaming AI generation |
675
+ | `FirekitChat` / `firekitChat()` | Multi-turn AI chat session |
676
+ | `FirekitCallable` / `firekitCallable()` | Typed Cloud Function caller |
677
+ | `FirekitCallableFromURL` / `firekitCallableFromURL()` | Cloud Function by URL |
678
+
679
+ ### Components
680
+
681
+ | Component | Description |
682
+ |---|---|
683
+ | `<FirebaseApp>` | Root provider, initializes Firebase |
684
+ | `<SignedIn>` | Render when authenticated |
685
+ | `<SignedOut>` | Render when not authenticated |
686
+ | `<AuthGuard>` | Redirect unauthenticated users |
687
+ | `<CustomGuard>` | Async role/permission guard |
688
+ | `<Doc>` | Reactive Firestore document |
689
+ | `<Collection>` | Reactive Firestore collection |
690
+ | `<Node>` | Reactive RTDB node |
691
+ | `<DownloadURL>` | Storage download URL |
692
+ | `<UploadTask>` | Resumable file upload |
693
+
694
+ ---
695
+
696
+ ## License
697
+
698
+ MIT © Giovani Rodriguez