svelte-firekit 0.1.9 → 0.2.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 (440) 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 +32 -20
  29. package/dist/index.js +49 -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.d.ts +46 -0
  47. package/dist/services/in-app-messaging.js +88 -0
  48. package/dist/services/messaging.svelte.d.ts +75 -0
  49. package/dist/services/messaging.svelte.js +190 -0
  50. package/dist/services/mutations.d.ts +59 -282
  51. package/dist/services/mutations.js +202 -951
  52. package/dist/services/performance.d.ts +60 -0
  53. package/dist/services/performance.js +118 -0
  54. package/dist/services/presence.svelte.d.ts +21 -89
  55. package/dist/services/presence.svelte.js +232 -469
  56. package/dist/services/realtime.svelte.d.ts +54 -125
  57. package/dist/services/realtime.svelte.js +111 -175
  58. package/dist/services/remote-config.svelte.d.ts +73 -0
  59. package/dist/services/remote-config.svelte.js +204 -0
  60. package/dist/services/storage.svelte.d.ts +81 -208
  61. package/dist/services/storage.svelte.js +190 -305
  62. package/dist/services/user.svelte.d.ts +23 -244
  63. package/dist/services/user.svelte.js +129 -439
  64. package/dist/types/analytics.d.ts +2 -36
  65. package/dist/types/analytics.js +0 -5
  66. package/dist/types/auth.d.ts +15 -85
  67. package/dist/types/auth.js +0 -17
  68. package/dist/types/collection.d.ts +31 -225
  69. package/dist/types/collection.js +5 -51
  70. package/dist/types/document.d.ts +11 -236
  71. package/dist/types/document.js +2 -47
  72. package/dist/types/firebase.d.ts +10 -13
  73. package/dist/types/firebase.js +3 -9
  74. package/dist/types/index.d.ts +5 -5
  75. package/dist/types/index.js +5 -4
  76. package/dist/types/mutations.d.ts +11 -225
  77. package/dist/types/mutations.js +6 -51
  78. package/dist/types/presence.d.ts +5 -158
  79. package/dist/types/presence.js +0 -20
  80. package/dist/utils/errors.d.ts +10 -14
  81. package/dist/utils/errors.js +11 -16
  82. package/dist/utils/firestore.d.ts +3 -4
  83. package/dist/utils/firestore.js +7 -10
  84. package/dist/utils/index.d.ts +4 -4
  85. package/dist/utils/index.js +4 -8
  86. package/dist/utils/providers.d.ts +4 -13
  87. package/dist/utils/providers.js +14 -13
  88. package/dist/utils/user.d.ts +1 -3
  89. package/dist/utils/user.js +1 -3
  90. package/package.json +41 -55
  91. package/dist/components/docs/doc-content.svelte +0 -19
  92. package/dist/components/docs/doc-content.svelte.d.ts +0 -6
  93. package/dist/components/docs/doc-header.svelte +0 -24
  94. package/dist/components/docs/doc-header.svelte.d.ts +0 -13
  95. package/dist/components/docs/doc-renderer.svelte +0 -27
  96. package/dist/components/docs/doc-renderer.svelte.d.ts +0 -8
  97. package/dist/components/docs/mobile-table-of-contents.svelte +0 -42
  98. package/dist/components/docs/mobile-table-of-contents.svelte.d.ts +0 -3
  99. package/dist/components/docs/table-of-contents.svelte +0 -33
  100. package/dist/components/docs/table-of-contents.svelte.d.ts +0 -4
  101. package/dist/components/docs/toc.svelte.d.ts +0 -16
  102. package/dist/components/docs/toc.svelte.js +0 -59
  103. package/dist/components/firekit/Collection.svelte +0 -122
  104. package/dist/components/firekit/Collection.svelte.d.ts +0 -27
  105. package/dist/components/firekit/Doc.svelte +0 -140
  106. package/dist/components/firekit/Doc.svelte.d.ts +0 -28
  107. package/dist/components/firekit/Node.svelte +0 -97
  108. package/dist/components/firekit/Node.svelte.d.ts +0 -23
  109. package/dist/components/firekit/auth-guard.svelte +0 -120
  110. package/dist/components/firekit/auth-guard.svelte.d.ts +0 -26
  111. package/dist/components/firekit/custom-guard.svelte +0 -163
  112. package/dist/components/firekit/custom-guard.svelte.d.ts +0 -31
  113. package/dist/components/firekit/download-url.svelte +0 -92
  114. package/dist/components/firekit/download-url.svelte.d.ts +0 -19
  115. package/dist/components/firekit/firebase-app.svelte +0 -33
  116. package/dist/components/firekit/firebase-app.svelte.d.ts +0 -7
  117. package/dist/components/firekit/node-list.svelte +0 -102
  118. package/dist/components/firekit/node-list.svelte.d.ts +0 -27
  119. package/dist/components/firekit/signed-in.svelte +0 -42
  120. package/dist/components/firekit/signed-out.svelte +0 -42
  121. package/dist/components/firekit/storage-list.svelte +0 -97
  122. package/dist/components/firekit/storage-list.svelte.d.ts +0 -26
  123. package/dist/components/firekit/upload-task.svelte +0 -108
  124. package/dist/components/firekit/upload-task.svelte.d.ts +0 -24
  125. package/dist/components/nav/app-sidebar.svelte +0 -175
  126. package/dist/components/nav/app-sidebar.svelte.d.ts +0 -9
  127. package/dist/components/nav/auto-breadcrumb.svelte +0 -41
  128. package/dist/components/nav/auto-breadcrumb.svelte.d.ts +0 -3
  129. package/dist/components/nav/dark-mode-toggle.svelte +0 -17
  130. package/dist/components/nav/dark-mode-toggle.svelte.d.ts +0 -18
  131. package/dist/components/nav/nav-components.svelte +0 -24
  132. package/dist/components/nav/nav-components.svelte.d.ts +0 -11
  133. package/dist/components/nav/nav-main.svelte +0 -45
  134. package/dist/components/nav/nav-main.svelte.d.ts +0 -11
  135. package/dist/components/nav/nav-secondary.svelte +0 -32
  136. package/dist/components/nav/nav-secondary.svelte.d.ts +0 -14
  137. package/dist/components/nav/site-header.svelte +0 -32
  138. package/dist/components/nav/site-header.svelte.d.ts +0 -18
  139. package/dist/components/ui/avatar/avatar-fallback.svelte +0 -17
  140. package/dist/components/ui/avatar/avatar-fallback.svelte.d.ts +0 -4
  141. package/dist/components/ui/avatar/avatar-image.svelte +0 -17
  142. package/dist/components/ui/avatar/avatar-image.svelte.d.ts +0 -4
  143. package/dist/components/ui/avatar/avatar.svelte +0 -19
  144. package/dist/components/ui/avatar/avatar.svelte.d.ts +0 -4
  145. package/dist/components/ui/avatar/index.d.ts +0 -4
  146. package/dist/components/ui/avatar/index.js +0 -6
  147. package/dist/components/ui/badge/badge.svelte +0 -50
  148. package/dist/components/ui/badge/badge.svelte.d.ts +0 -32
  149. package/dist/components/ui/badge/index.d.ts +0 -2
  150. package/dist/components/ui/badge/index.js +0 -2
  151. package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +0 -23
  152. package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte.d.ts +0 -5
  153. package/dist/components/ui/breadcrumb/breadcrumb-item.svelte +0 -20
  154. package/dist/components/ui/breadcrumb/breadcrumb-item.svelte.d.ts +0 -5
  155. package/dist/components/ui/breadcrumb/breadcrumb-link.svelte +0 -31
  156. package/dist/components/ui/breadcrumb/breadcrumb-link.svelte.d.ts +0 -11
  157. package/dist/components/ui/breadcrumb/breadcrumb-list.svelte +0 -23
  158. package/dist/components/ui/breadcrumb/breadcrumb-list.svelte.d.ts +0 -5
  159. package/dist/components/ui/breadcrumb/breadcrumb-page.svelte +0 -23
  160. package/dist/components/ui/breadcrumb/breadcrumb-page.svelte.d.ts +0 -5
  161. package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte +0 -27
  162. package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte.d.ts +0 -5
  163. package/dist/components/ui/breadcrumb/breadcrumb.svelte +0 -21
  164. package/dist/components/ui/breadcrumb/breadcrumb.svelte.d.ts +0 -5
  165. package/dist/components/ui/breadcrumb/index.d.ts +0 -8
  166. package/dist/components/ui/breadcrumb/index.js +0 -10
  167. package/dist/components/ui/button/button.svelte +0 -80
  168. package/dist/components/ui/button/button.svelte.d.ts +0 -58
  169. package/dist/components/ui/button/index.d.ts +0 -2
  170. package/dist/components/ui/button/index.js +0 -4
  171. package/dist/components/ui/card/card-action.svelte +0 -20
  172. package/dist/components/ui/card/card-action.svelte.d.ts +0 -5
  173. package/dist/components/ui/card/card-content.svelte +0 -15
  174. package/dist/components/ui/card/card-content.svelte.d.ts +0 -5
  175. package/dist/components/ui/card/card-description.svelte +0 -20
  176. package/dist/components/ui/card/card-description.svelte.d.ts +0 -5
  177. package/dist/components/ui/card/card-footer.svelte +0 -20
  178. package/dist/components/ui/card/card-footer.svelte.d.ts +0 -5
  179. package/dist/components/ui/card/card-header.svelte +0 -23
  180. package/dist/components/ui/card/card-header.svelte.d.ts +0 -5
  181. package/dist/components/ui/card/card-title.svelte +0 -20
  182. package/dist/components/ui/card/card-title.svelte.d.ts +0 -5
  183. package/dist/components/ui/card/card.svelte +0 -23
  184. package/dist/components/ui/card/card.svelte.d.ts +0 -5
  185. package/dist/components/ui/card/index.d.ts +0 -8
  186. package/dist/components/ui/card/index.js +0 -10
  187. package/dist/components/ui/chart/chart-container.svelte +0 -80
  188. package/dist/components/ui/chart/chart-container.svelte.d.ts +0 -9
  189. package/dist/components/ui/chart/chart-style.svelte +0 -36
  190. package/dist/components/ui/chart/chart-style.svelte.d.ts +0 -8
  191. package/dist/components/ui/chart/chart-tooltip.svelte +0 -159
  192. package/dist/components/ui/chart/chart-tooltip.svelte.d.ts +0 -27
  193. package/dist/components/ui/chart/chart-utils.d.ts +0 -36
  194. package/dist/components/ui/chart/chart-utils.js +0 -33
  195. package/dist/components/ui/chart/index.d.ts +0 -4
  196. package/dist/components/ui/chart/index.js +0 -4
  197. package/dist/components/ui/checkbox/checkbox.svelte +0 -36
  198. package/dist/components/ui/checkbox/checkbox.svelte.d.ts +0 -4
  199. package/dist/components/ui/checkbox/index.d.ts +0 -2
  200. package/dist/components/ui/checkbox/index.js +0 -4
  201. package/dist/components/ui/data-table/data-table.svelte.d.ts +0 -40
  202. package/dist/components/ui/data-table/data-table.svelte.js +0 -110
  203. package/dist/components/ui/data-table/flex-render.svelte +0 -36
  204. package/dist/components/ui/data-table/flex-render.svelte.d.ts +0 -30
  205. package/dist/components/ui/data-table/index.d.ts +0 -3
  206. package/dist/components/ui/data-table/index.js +0 -3
  207. package/dist/components/ui/data-table/render-helpers.d.ts +0 -90
  208. package/dist/components/ui/data-table/render-helpers.js +0 -99
  209. package/dist/components/ui/dialog/dialog-close.svelte +0 -7
  210. package/dist/components/ui/dialog/dialog-close.svelte.d.ts +0 -4
  211. package/dist/components/ui/dialog/dialog-content.svelte +0 -43
  212. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +0 -11
  213. package/dist/components/ui/dialog/dialog-description.svelte +0 -17
  214. package/dist/components/ui/dialog/dialog-description.svelte.d.ts +0 -4
  215. package/dist/components/ui/dialog/dialog-footer.svelte +0 -20
  216. package/dist/components/ui/dialog/dialog-footer.svelte.d.ts +0 -5
  217. package/dist/components/ui/dialog/dialog-header.svelte +0 -20
  218. package/dist/components/ui/dialog/dialog-header.svelte.d.ts +0 -5
  219. package/dist/components/ui/dialog/dialog-overlay.svelte +0 -20
  220. package/dist/components/ui/dialog/dialog-overlay.svelte.d.ts +0 -4
  221. package/dist/components/ui/dialog/dialog-title.svelte +0 -17
  222. package/dist/components/ui/dialog/dialog-title.svelte.d.ts +0 -4
  223. package/dist/components/ui/dialog/dialog-trigger.svelte +0 -7
  224. package/dist/components/ui/dialog/dialog-trigger.svelte.d.ts +0 -4
  225. package/dist/components/ui/dialog/index.d.ts +0 -11
  226. package/dist/components/ui/dialog/index.js +0 -14
  227. package/dist/components/ui/drawer/drawer-close.svelte +0 -7
  228. package/dist/components/ui/drawer/drawer-close.svelte.d.ts +0 -4
  229. package/dist/components/ui/drawer/drawer-content.svelte +0 -37
  230. package/dist/components/ui/drawer/drawer-content.svelte.d.ts +0 -7
  231. package/dist/components/ui/drawer/drawer-description.svelte +0 -17
  232. package/dist/components/ui/drawer/drawer-description.svelte.d.ts +0 -4
  233. package/dist/components/ui/drawer/drawer-footer.svelte +0 -20
  234. package/dist/components/ui/drawer/drawer-footer.svelte.d.ts +0 -5
  235. package/dist/components/ui/drawer/drawer-header.svelte +0 -20
  236. package/dist/components/ui/drawer/drawer-header.svelte.d.ts +0 -5
  237. package/dist/components/ui/drawer/drawer-nested.svelte +0 -12
  238. package/dist/components/ui/drawer/drawer-nested.svelte.d.ts +0 -3
  239. package/dist/components/ui/drawer/drawer-overlay.svelte +0 -20
  240. package/dist/components/ui/drawer/drawer-overlay.svelte.d.ts +0 -4
  241. package/dist/components/ui/drawer/drawer-title.svelte +0 -17
  242. package/dist/components/ui/drawer/drawer-title.svelte.d.ts +0 -4
  243. package/dist/components/ui/drawer/drawer-trigger.svelte +0 -7
  244. package/dist/components/ui/drawer/drawer-trigger.svelte.d.ts +0 -4
  245. package/dist/components/ui/drawer/drawer.svelte +0 -12
  246. package/dist/components/ui/drawer/drawer.svelte.d.ts +0 -3
  247. package/dist/components/ui/drawer/index.d.ts +0 -13
  248. package/dist/components/ui/drawer/index.js +0 -15
  249. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +0 -41
  250. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +0 -9
  251. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +0 -27
  252. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte.d.ts +0 -7
  253. package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +0 -22
  254. package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +0 -8
  255. package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte +0 -7
  256. package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte.d.ts +0 -4
  257. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +0 -27
  258. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +0 -8
  259. package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte +0 -24
  260. package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte.d.ts +0 -8
  261. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +0 -16
  262. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +0 -4
  263. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +0 -31
  264. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +0 -4
  265. package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +0 -17
  266. package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte.d.ts +0 -4
  267. package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +0 -20
  268. package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +0 -5
  269. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +0 -20
  270. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +0 -4
  271. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +0 -29
  272. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +0 -7
  273. package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -7
  274. package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +0 -4
  275. package/dist/components/ui/dropdown-menu/index.d.ts +0 -25
  276. package/dist/components/ui/dropdown-menu/index.js +0 -17
  277. package/dist/components/ui/input/index.d.ts +0 -2
  278. package/dist/components/ui/input/index.js +0 -4
  279. package/dist/components/ui/input/input.svelte +0 -51
  280. package/dist/components/ui/input/input.svelte.d.ts +0 -13
  281. package/dist/components/ui/label/index.d.ts +0 -2
  282. package/dist/components/ui/label/index.js +0 -4
  283. package/dist/components/ui/label/label.svelte +0 -20
  284. package/dist/components/ui/label/label.svelte.d.ts +0 -4
  285. package/dist/components/ui/scroll-area/index.d.ts +0 -3
  286. package/dist/components/ui/scroll-area/index.js +0 -5
  287. package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte +0 -31
  288. package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte.d.ts +0 -4
  289. package/dist/components/ui/scroll-area/scroll-area.svelte +0 -40
  290. package/dist/components/ui/scroll-area/scroll-area.svelte.d.ts +0 -10
  291. package/dist/components/ui/select/index.d.ts +0 -11
  292. package/dist/components/ui/select/index.js +0 -14
  293. package/dist/components/ui/select/select-content.svelte +0 -40
  294. package/dist/components/ui/select/select-content.svelte.d.ts +0 -8
  295. package/dist/components/ui/select/select-group-heading.svelte +0 -21
  296. package/dist/components/ui/select/select-group-heading.svelte.d.ts +0 -10
  297. package/dist/components/ui/select/select-group.svelte +0 -7
  298. package/dist/components/ui/select/select-group.svelte.d.ts +0 -4
  299. package/dist/components/ui/select/select-item.svelte +0 -38
  300. package/dist/components/ui/select/select-item.svelte.d.ts +0 -4
  301. package/dist/components/ui/select/select-label.svelte +0 -20
  302. package/dist/components/ui/select/select-label.svelte.d.ts +0 -6
  303. package/dist/components/ui/select/select-scroll-down-button.svelte +0 -20
  304. package/dist/components/ui/select/select-scroll-down-button.svelte.d.ts +0 -4
  305. package/dist/components/ui/select/select-scroll-up-button.svelte +0 -20
  306. package/dist/components/ui/select/select-scroll-up-button.svelte.d.ts +0 -4
  307. package/dist/components/ui/select/select-separator.svelte +0 -18
  308. package/dist/components/ui/select/select-separator.svelte.d.ts +0 -4
  309. package/dist/components/ui/select/select-trigger.svelte +0 -29
  310. package/dist/components/ui/select/select-trigger.svelte.d.ts +0 -8
  311. package/dist/components/ui/separator/index.d.ts +0 -2
  312. package/dist/components/ui/separator/index.js +0 -4
  313. package/dist/components/ui/separator/separator.svelte +0 -20
  314. package/dist/components/ui/separator/separator.svelte.d.ts +0 -4
  315. package/dist/components/ui/sheet/index.d.ts +0 -11
  316. package/dist/components/ui/sheet/index.js +0 -14
  317. package/dist/components/ui/sheet/sheet-close.svelte +0 -7
  318. package/dist/components/ui/sheet/sheet-close.svelte.d.ts +0 -4
  319. package/dist/components/ui/sheet/sheet-content.svelte +0 -58
  320. package/dist/components/ui/sheet/sheet-content.svelte.d.ts +0 -35
  321. package/dist/components/ui/sheet/sheet-description.svelte +0 -17
  322. package/dist/components/ui/sheet/sheet-description.svelte.d.ts +0 -4
  323. package/dist/components/ui/sheet/sheet-footer.svelte +0 -20
  324. package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +0 -5
  325. package/dist/components/ui/sheet/sheet-header.svelte +0 -20
  326. package/dist/components/ui/sheet/sheet-header.svelte.d.ts +0 -5
  327. package/dist/components/ui/sheet/sheet-overlay.svelte +0 -20
  328. package/dist/components/ui/sheet/sheet-overlay.svelte.d.ts +0 -4
  329. package/dist/components/ui/sheet/sheet-title.svelte +0 -17
  330. package/dist/components/ui/sheet/sheet-title.svelte.d.ts +0 -4
  331. package/dist/components/ui/sheet/sheet-trigger.svelte +0 -7
  332. package/dist/components/ui/sheet/sheet-trigger.svelte.d.ts +0 -4
  333. package/dist/components/ui/sidebar/constants.d.ts +0 -6
  334. package/dist/components/ui/sidebar/constants.js +0 -6
  335. package/dist/components/ui/sidebar/context.svelte.d.ts +0 -42
  336. package/dist/components/ui/sidebar/context.svelte.js +0 -54
  337. package/dist/components/ui/sidebar/index.d.ts +0 -25
  338. package/dist/components/ui/sidebar/index.js +0 -27
  339. package/dist/components/ui/sidebar/sidebar-content.svelte +0 -24
  340. package/dist/components/ui/sidebar/sidebar-content.svelte.d.ts +0 -5
  341. package/dist/components/ui/sidebar/sidebar-footer.svelte +0 -21
  342. package/dist/components/ui/sidebar/sidebar-footer.svelte.d.ts +0 -5
  343. package/dist/components/ui/sidebar/sidebar-group-action.svelte +0 -36
  344. package/dist/components/ui/sidebar/sidebar-group-action.svelte.d.ts +0 -11
  345. package/dist/components/ui/sidebar/sidebar-group-content.svelte +0 -21
  346. package/dist/components/ui/sidebar/sidebar-group-content.svelte.d.ts +0 -5
  347. package/dist/components/ui/sidebar/sidebar-group-label.svelte +0 -34
  348. package/dist/components/ui/sidebar/sidebar-group-label.svelte.d.ts +0 -11
  349. package/dist/components/ui/sidebar/sidebar-group.svelte +0 -21
  350. package/dist/components/ui/sidebar/sidebar-group.svelte.d.ts +0 -5
  351. package/dist/components/ui/sidebar/sidebar-header.svelte +0 -21
  352. package/dist/components/ui/sidebar/sidebar-header.svelte.d.ts +0 -5
  353. package/dist/components/ui/sidebar/sidebar-input.svelte +0 -21
  354. package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +0 -11
  355. package/dist/components/ui/sidebar/sidebar-inset.svelte +0 -24
  356. package/dist/components/ui/sidebar/sidebar-inset.svelte.d.ts +0 -5
  357. package/dist/components/ui/sidebar/sidebar-menu-action.svelte +0 -43
  358. package/dist/components/ui/sidebar/sidebar-menu-action.svelte.d.ts +0 -12
  359. package/dist/components/ui/sidebar/sidebar-menu-badge.svelte +0 -29
  360. package/dist/components/ui/sidebar/sidebar-menu-badge.svelte.d.ts +0 -5
  361. package/dist/components/ui/sidebar/sidebar-menu-button.svelte +0 -103
  362. package/dist/components/ui/sidebar/sidebar-menu-button.svelte.d.ts +0 -51
  363. package/dist/components/ui/sidebar/sidebar-menu-item.svelte +0 -21
  364. package/dist/components/ui/sidebar/sidebar-menu-item.svelte.d.ts +0 -5
  365. package/dist/components/ui/sidebar/sidebar-menu-skeleton.svelte +0 -36
  366. package/dist/components/ui/sidebar/sidebar-menu-skeleton.svelte.d.ts +0 -8
  367. package/dist/components/ui/sidebar/sidebar-menu-sub-button.svelte +0 -43
  368. package/dist/components/ui/sidebar/sidebar-menu-sub-button.svelte.d.ts +0 -13
  369. package/dist/components/ui/sidebar/sidebar-menu-sub-item.svelte +0 -21
  370. package/dist/components/ui/sidebar/sidebar-menu-sub-item.svelte.d.ts +0 -5
  371. package/dist/components/ui/sidebar/sidebar-menu-sub.svelte +0 -25
  372. package/dist/components/ui/sidebar/sidebar-menu-sub.svelte.d.ts +0 -5
  373. package/dist/components/ui/sidebar/sidebar-menu.svelte +0 -21
  374. package/dist/components/ui/sidebar/sidebar-menu.svelte.d.ts +0 -5
  375. package/dist/components/ui/sidebar/sidebar-provider.svelte +0 -53
  376. package/dist/components/ui/sidebar/sidebar-provider.svelte.d.ts +0 -9
  377. package/dist/components/ui/sidebar/sidebar-rail.svelte +0 -36
  378. package/dist/components/ui/sidebar/sidebar-rail.svelte.d.ts +0 -5
  379. package/dist/components/ui/sidebar/sidebar-separator.svelte +0 -19
  380. package/dist/components/ui/sidebar/sidebar-separator.svelte.d.ts +0 -13
  381. package/dist/components/ui/sidebar/sidebar-trigger.svelte +0 -35
  382. package/dist/components/ui/sidebar/sidebar-trigger.svelte.d.ts +0 -8
  383. package/dist/components/ui/sidebar/sidebar.svelte +0 -104
  384. package/dist/components/ui/sidebar/sidebar.svelte.d.ts +0 -10
  385. package/dist/components/ui/skeleton/index.d.ts +0 -2
  386. package/dist/components/ui/skeleton/index.js +0 -4
  387. package/dist/components/ui/skeleton/skeleton.svelte +0 -17
  388. package/dist/components/ui/skeleton/skeleton.svelte.d.ts +0 -5
  389. package/dist/components/ui/table/index.d.ts +0 -9
  390. package/dist/components/ui/table/index.js +0 -11
  391. package/dist/components/ui/table/table-body.svelte +0 -20
  392. package/dist/components/ui/table/table-body.svelte.d.ts +0 -5
  393. package/dist/components/ui/table/table-caption.svelte +0 -20
  394. package/dist/components/ui/table/table-caption.svelte.d.ts +0 -5
  395. package/dist/components/ui/table/table-cell.svelte +0 -20
  396. package/dist/components/ui/table/table-cell.svelte.d.ts +0 -5
  397. package/dist/components/ui/table/table-footer.svelte +0 -20
  398. package/dist/components/ui/table/table-footer.svelte.d.ts +0 -5
  399. package/dist/components/ui/table/table-head.svelte +0 -23
  400. package/dist/components/ui/table/table-head.svelte.d.ts +0 -5
  401. package/dist/components/ui/table/table-header.svelte +0 -20
  402. package/dist/components/ui/table/table-header.svelte.d.ts +0 -5
  403. package/dist/components/ui/table/table-row.svelte +0 -23
  404. package/dist/components/ui/table/table-row.svelte.d.ts +0 -5
  405. package/dist/components/ui/table/table.svelte +0 -22
  406. package/dist/components/ui/table/table.svelte.d.ts +0 -5
  407. package/dist/components/ui/tabs/index.d.ts +0 -5
  408. package/dist/components/ui/tabs/index.js +0 -7
  409. package/dist/components/ui/tabs/tabs-content.svelte +0 -17
  410. package/dist/components/ui/tabs/tabs-content.svelte.d.ts +0 -4
  411. package/dist/components/ui/tabs/tabs-list.svelte +0 -20
  412. package/dist/components/ui/tabs/tabs-list.svelte.d.ts +0 -4
  413. package/dist/components/ui/tabs/tabs-trigger.svelte +0 -20
  414. package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +0 -4
  415. package/dist/components/ui/tabs/tabs.svelte +0 -19
  416. package/dist/components/ui/tabs/tabs.svelte.d.ts +0 -4
  417. package/dist/components/ui/toggle/index.d.ts +0 -3
  418. package/dist/components/ui/toggle/index.js +0 -5
  419. package/dist/components/ui/toggle/toggle.svelte +0 -52
  420. package/dist/components/ui/toggle/toggle.svelte.d.ts +0 -43
  421. package/dist/components/ui/toggle-group/index.d.ts +0 -3
  422. package/dist/components/ui/toggle-group/index.js +0 -5
  423. package/dist/components/ui/toggle-group/toggle-group-item.svelte +0 -34
  424. package/dist/components/ui/toggle-group/toggle-group-item.svelte.d.ts +0 -6
  425. package/dist/components/ui/toggle-group/toggle-group.svelte +0 -47
  426. package/dist/components/ui/toggle-group/toggle-group.svelte.d.ts +0 -8
  427. package/dist/components/ui/tooltip/index.d.ts +0 -7
  428. package/dist/components/ui/tooltip/index.js +0 -9
  429. package/dist/components/ui/tooltip/tooltip-content.svelte +0 -47
  430. package/dist/components/ui/tooltip/tooltip-content.svelte.d.ts +0 -7
  431. package/dist/components/ui/tooltip/tooltip-trigger.svelte +0 -7
  432. package/dist/components/ui/tooltip/tooltip-trigger.svelte.d.ts +0 -4
  433. package/dist/hooks/is-mobile.svelte.d.ts +0 -4
  434. package/dist/hooks/is-mobile.svelte.js +0 -7
  435. package/dist/services/index.d.ts +0 -9
  436. package/dist/services/index.js +0 -10
  437. package/dist/types/docs.d.ts +0 -67
  438. package/dist/types/docs.js +0 -1
  439. package/dist/utils.d.ts +0 -15
  440. package/dist/utils.js +0 -44
@@ -1,555 +1,254 @@
1
- /**
2
- * @fileoverview FirekitDoc - Optimized Firestore document management for Svelte
3
- * @module FirekitDoc
4
- * @version 1.0.0
5
- */
6
- import { doc, getDoc, onSnapshot } from 'firebase/firestore';
1
+ import { doc, getDoc, getDocFromServer, onSnapshot } from 'firebase/firestore';
7
2
  import { firebaseService } from '../firebase.js';
8
- import { browser } from '$app/environment';
9
- import { DocumentErrorCode, DocumentError } from '../types/document.js';
3
+ import { DocumentError, DocumentErrorCode } from '../types/document.js';
4
+ function getDb() {
5
+ const db = firebaseService.getDbInstance();
6
+ if (!db)
7
+ throw new Error('Firestore is not initialized.');
8
+ return db;
9
+ }
10
+ function mapFirestoreError(err, path) {
11
+ const codeMap = {
12
+ 'permission-denied': DocumentErrorCode.PERMISSION_DENIED,
13
+ 'unauthenticated': DocumentErrorCode.UNAUTHENTICATED,
14
+ 'not-found': DocumentErrorCode.NOT_FOUND,
15
+ 'already-exists': DocumentErrorCode.ALREADY_EXISTS,
16
+ 'unavailable': DocumentErrorCode.UNAVAILABLE,
17
+ 'deadline-exceeded': DocumentErrorCode.TIMEOUT,
18
+ 'cancelled': DocumentErrorCode.CANCELLED,
19
+ 'internal': DocumentErrorCode.INTERNAL_ERROR,
20
+ 'data-loss': DocumentErrorCode.DATA_LOSS,
21
+ 'failed-precondition': DocumentErrorCode.FAILED_PRECONDITION,
22
+ 'aborted': DocumentErrorCode.ABORTED,
23
+ 'out-of-range': DocumentErrorCode.OUT_OF_RANGE,
24
+ 'unimplemented': DocumentErrorCode.UNIMPLEMENTED,
25
+ 'resource-exhausted': DocumentErrorCode.UNAVAILABLE
26
+ };
27
+ const code = codeMap[err.code] ?? DocumentErrorCode.UNKNOWN;
28
+ return new DocumentError(code, err.message, err, { path });
29
+ }
10
30
  /**
11
- * Manages real-time Firestore document subscriptions with reactive state.
12
- * Uses Svelte 5 runes for optimal reactivity and performance.
31
+ * Reactive Firestore document subscription.
13
32
  *
14
- * @class FirekitDoc
15
- * @template T Document data type
33
+ * Manages a single Firestore document with reactive state via Svelte 5 runes.
34
+ * Automatically subscribes to real-time updates (or fetches once) when constructed.
16
35
  *
17
36
  * @example
18
- * ```typescript
19
- * interface User {
20
- * id: string;
21
- * name: string;
22
- * email: string;
23
- * }
24
- *
25
- * // Create document subscription
26
- * const userDoc = firekitDoc<User>('users/123', {
27
- * id: '123',
28
- * name: 'Loading...',
29
- * email: ''
30
- * });
31
- *
32
- * // Access reactive state in Svelte component
33
- * $: if (userDoc.loading) {
34
- * console.log('Loading user...');
35
- * } else if (userDoc.error) {
36
- * console.error('Error:', userDoc.error);
37
- * } else if (userDoc.exists) {
38
- * console.log('User data:', userDoc.data);
39
- * }
37
+ * ```svelte
38
+ * <script lang="ts">
39
+ * import { firekitDoc } from 'svelte-firekit';
40
+ * const user = firekitDoc<User>('users/uid123');
41
+ * </script>
42
+ * {#if user.loading}Loading...{/if}
43
+ * {#if user.data}{user.data.name}{/if}
40
44
  * ```
41
45
  */
42
- class FirekitDoc {
43
- /** Document reference */
44
- docRef = null;
45
- /** Unsubscribe function for real-time listener */
46
- unsubscribe = null;
47
- /** Configuration options */
48
- options;
49
- // ========================================
50
- // REACTIVE STATE (Svelte 5 Runes)
51
- // ========================================
52
- /** Current document data - reactive */
46
+ export class FirekitDoc {
47
+ // ── Reactive state ────────────────────────────────────────────────────────
53
48
  _data = $state(null);
54
- /** Loading state - reactive */
55
49
  _loading = $state(true);
56
- /** Error state - reactive */
57
50
  _error = $state(null);
58
- /** Document exists state - reactive */
59
51
  _exists = $state(false);
60
- // ========================================
61
- // ENHANCED DERIVED STATE
62
- // ========================================
63
- /** Computed document state with all reactive properties */
64
- _computedState = $derived({
65
- data: this._data,
66
- loading: this._loading,
67
- error: this._error,
68
- exists: this._exists,
69
- id: this.docRef?.id ?? '',
70
- isEmpty: !this._data && !this._loading && !this._error,
71
- isReady: !this._loading && !this._error,
72
- hasData: !!this._data,
73
- canRetry: this._error?.isRetryable() ?? false,
74
- isStale: this._data && this.isStale(300000), // 5 minutes default
75
- status: this.getStatus()
76
- });
77
- /** Derived: Whether document is in a valid state for operations */
78
- _isValid = $derived(this.docRef !== null && !this._loading && !this._error);
79
- /** Derived: Whether document can be refreshed */
80
- _canRefresh = $derived(this.docRef !== null && !this._loading);
81
- /** Derived: Whether document has pending operations */
82
- _hasPendingOperations = $derived(this._loading || (this._error ? this._error.isRetryable() : false));
83
- /**
84
- * Creates a document subscription with real-time updates
85
- *
86
- * @param ref Document path or DocumentReference
87
- * @param startWith Initial data to show while loading
88
- * @param options Configuration options
89
- */
90
- constructor(ref, startWith, options = {}) {
91
- this.options = {
92
- realtime: true,
93
- includeMetadata: false,
94
- source: 'default',
95
- ...options
96
- };
97
- // Set initial data if provided
98
- if (startWith) {
99
- this.updateState({
100
- data: startWith,
101
- exists: true,
102
- loading: false,
103
- error: null
104
- });
105
- }
106
- // Only initialize in browser environment
107
- if (browser) {
108
- this.initializeDocument(ref);
52
+ _id = $state('');
53
+ _fromCache = $state(false);
54
+ _hasPendingWrites = $state(false);
55
+ // ── Derived ───────────────────────────────────────────────────────────────
56
+ hasData = $derived(this._data !== null && this._exists);
57
+ isReady = $derived(!this._loading && this._exists && this._data !== null);
58
+ isEmpty = $derived(!this._loading && !this._exists);
59
+ canRetry = $derived(this._error !== null && (this._error.isRetryable?.() ?? false));
60
+ // ── Internal ──────────────────────────────────────────────────────────────
61
+ _ref = null;
62
+ _unsubscribe = null;
63
+ _path;
64
+ _options;
65
+ constructor(path, options = {}) {
66
+ this._path = path;
67
+ this._options = { realtime: true, includeMetadata: false, ...options };
68
+ this._init();
69
+ }
70
+ // ── Public getters ────────────────────────────────────────────────────────
71
+ get data() { return this._data; }
72
+ get loading() { return this._loading; }
73
+ get error() { return this._error; }
74
+ get exists() { return this._exists; }
75
+ get id() { return this._id; }
76
+ get path() { return this._path; }
77
+ get fromCache() { return this._fromCache; }
78
+ get hasPendingWrites() { return this._hasPendingWrites; }
79
+ get ref() { return this._ref; }
80
+ // ── Initialization ────────────────────────────────────────────────────────
81
+ _init() {
82
+ if (typeof window === 'undefined') {
83
+ this._loading = false;
84
+ return;
109
85
  }
110
- }
111
- /**
112
- * Initialize document reference and subscription
113
- */
114
- async initializeDocument(ref) {
115
86
  try {
116
- const firestore = firebaseService.getDbInstance();
117
- if (!firestore) {
118
- throw new DocumentError(DocumentErrorCode.FIRESTORE_UNAVAILABLE, 'Firestore instance not available');
119
- }
120
- // Create document reference
121
- this.docRef = typeof ref === 'string' ? doc(firestore, ref) : ref;
122
- // Set up real-time listener or one-time fetch
123
- if (this.options.realtime) {
124
- this.setupRealtimeListener();
87
+ const db = getDb();
88
+ this._ref = doc(db, this._path);
89
+ this._id = this._ref.id;
90
+ if (this._options.realtime) {
91
+ this._subscribe();
125
92
  }
126
93
  else {
127
- await this.fetchOnce();
94
+ this._fetchOnce();
128
95
  }
129
96
  }
130
- catch (error) {
131
- this.handleError(error);
97
+ catch (err) {
98
+ this._error = new DocumentError(DocumentErrorCode.REFERENCE_UNAVAILABLE, err instanceof Error ? err.message : String(err), err);
99
+ this._loading = false;
132
100
  }
133
101
  }
134
- /**
135
- * Set up real-time document listener
136
- */
137
- setupRealtimeListener() {
138
- if (!this.docRef)
102
+ _subscribe() {
103
+ if (!this._ref)
139
104
  return;
140
- const options = {
141
- includeMetadataChanges: this.options.includeMetadata
105
+ const listenOptions = {
106
+ includeMetadataChanges: this._options.includeMetadata
142
107
  };
143
- this.unsubscribe = onSnapshot(this.docRef, options, (snapshot) => {
144
- this.processSnapshot(snapshot);
145
- }, (error) => {
146
- this.handleError(error);
108
+ this._unsubscribe = onSnapshot(this._ref, listenOptions, (snap) => this._handleSnapshot(snap), (err) => {
109
+ this._error = mapFirestoreError(err, this._path);
110
+ this._loading = false;
147
111
  });
148
112
  }
149
- /**
150
- * Fetch document data once (no real-time updates)
151
- */
152
- async fetchOnce() {
153
- if (!this.docRef)
113
+ async _fetchOnce() {
114
+ if (!this._ref)
154
115
  return;
155
116
  try {
156
- this.updateState({ loading: true });
157
- const snapshot = await getDoc(this.docRef);
158
- this.processSnapshot(snapshot);
159
- }
160
- catch (error) {
161
- this.handleError(error);
162
- }
163
- }
164
- /**
165
- * Process document snapshot and update state
166
- */
167
- processSnapshot(snapshot) {
168
- try {
169
- const exists = snapshot.exists();
170
- const data = exists ? snapshot.data() : null;
171
- // Add document ID to data if it exists
172
- const processedData = data
173
- ? {
174
- ...data,
175
- id: snapshot.id
176
- }
177
- : null;
178
- // Update reactive state atomically
179
- this.updateState({
180
- data: processedData,
181
- exists,
182
- loading: false,
183
- error: null
184
- });
185
- }
186
- catch (error) {
187
- this.handleError(error);
188
- }
189
- }
190
- /**
191
- * Handle and process errors
192
- */
193
- handleError(error) {
194
- let documentError;
195
- if (error instanceof DocumentError) {
196
- documentError = error;
197
- }
198
- else {
199
- // Map Firestore errors to DocumentError
200
- const code = this.mapFirestoreErrorCode(error.code);
201
- documentError = new DocumentError(code, error.message, error);
202
- }
203
- this.updateState({
204
- error: documentError,
205
- loading: false
206
- });
207
- console.error('FirekitDoc error:', documentError);
208
- }
209
- /**
210
- * Map Firestore error codes to DocumentErrorCode
211
- */
212
- mapFirestoreErrorCode(firestoreCode) {
213
- switch (firestoreCode) {
214
- case 'permission-denied':
215
- return DocumentErrorCode.PERMISSION_DENIED;
216
- case 'not-found':
217
- return DocumentErrorCode.NOT_FOUND;
218
- case 'unavailable':
219
- return DocumentErrorCode.UNAVAILABLE;
220
- case 'deadline-exceeded':
221
- return DocumentErrorCode.TIMEOUT;
222
- case 'cancelled':
223
- return DocumentErrorCode.CANCELLED;
224
- default:
225
- return DocumentErrorCode.UNKNOWN;
226
- }
227
- }
228
- // ========================================
229
- // REACTIVE METHODS
230
- // ========================================
231
- /**
232
- * Reactive method: Automatically retry if error is retryable
233
- * @returns Promise that resolves when retry is complete
234
- */
235
- async retryIfNeeded() {
236
- if (this._computedState.canRetry) {
237
- await this.refresh();
238
- }
239
- }
240
- /**
241
- * Reactive method: Refresh if data is stale
242
- * @param maxAge Maximum age in milliseconds
243
- * @returns Promise that resolves when refresh is complete
244
- */
245
- async refreshIfStale(maxAge = 300000) {
246
- if (this._computedState.isStale) {
247
- await this.refresh();
248
- }
249
- }
250
- /**
251
- * Reactive method: Get fresh data if not ready
252
- * @returns Promise resolving to document data
253
- */
254
- async ensureReady() {
255
- if (!this._computedState.isReady) {
256
- await this.refresh();
257
- }
258
- return this._data;
259
- }
260
- // ========================================
261
- // STATE MANAGEMENT
262
- // ========================================
263
- /**
264
- * Update state atomically with partial updates
265
- * @param updates Partial state updates
266
- */
267
- updateState(updates) {
268
- if (updates.data !== undefined)
269
- this._data = updates.data;
270
- if (updates.loading !== undefined)
271
- this._loading = updates.loading;
272
- if (updates.error !== undefined)
273
- this._error = updates.error;
274
- if (updates.exists !== undefined)
275
- this._exists = updates.exists;
276
- }
277
- /**
278
- * Get human-readable status string
279
- * @returns Status description
280
- */
281
- getStatus() {
282
- if (this._loading)
283
- return 'loading';
284
- if (this._error)
285
- return 'error';
286
- if (this._exists)
287
- return 'exists';
288
- return 'not-found';
289
- }
290
- // ========================================
291
- // PUBLIC GETTERS (Reactive State)
292
- // ========================================
293
- /**
294
- * Get current document data
295
- * @returns Current document data or null
296
- */
297
- get data() {
298
- return this._data;
299
- }
300
- /**
301
- * Get document ID
302
- * @returns Document ID or empty string if not available
303
- */
304
- get id() {
305
- return this.docRef?.id ?? '';
306
- }
307
- /**
308
- * Get loading state
309
- * @returns True if document is currently loading
310
- */
311
- get loading() {
312
- return this._loading;
313
- }
314
- /**
315
- * Get error state
316
- * @returns Current error or null if no error
317
- */
318
- get error() {
319
- return this._error;
320
- }
321
- /**
322
- * Check if document exists
323
- * @returns True if document exists in Firestore
324
- */
325
- get exists() {
326
- return this._exists;
327
- }
328
- /**
329
- * Get document reference
330
- * @returns Firestore DocumentReference
331
- * @throws DocumentError if reference is not available
332
- */
333
- get ref() {
334
- if (!this.docRef) {
335
- throw new DocumentError(DocumentErrorCode.REFERENCE_UNAVAILABLE, 'Document reference is not available');
336
- }
337
- return this.docRef;
338
- }
339
- /**
340
- * Get current document state summary
341
- * @returns Complete document state object
342
- */
343
- get state() {
344
- return {
345
- data: this._data,
346
- exists: this._exists,
347
- loading: this._loading,
348
- error: this._error,
349
- id: this.id
350
- };
351
- }
352
- /**
353
- * Get enhanced computed state
354
- * @returns Computed state with additional reactive properties
355
- */
356
- get computedState() {
357
- return this._computedState;
358
- }
359
- /**
360
- * Check if document is in valid state for operations
361
- * @returns True if document can be operated on
362
- */
363
- get isValid() {
364
- return this._isValid;
365
- }
366
- /**
367
- * Check if document can be refreshed
368
- * @returns True if refresh operation is available
369
- */
370
- get canRefresh() {
371
- return this._canRefresh;
372
- }
373
- /**
374
- * Check if document has pending operations
375
- * @returns True if there are ongoing operations
376
- */
377
- get hasPendingOperations() {
378
- return this._hasPendingOperations;
379
- }
380
- // ========================================
381
- // PUBLIC METHODS
382
- // ========================================
383
- /**
384
- * Manually refresh document data
385
- * @returns Promise that resolves when refresh is complete
386
- */
117
+ const snap = await getDoc(this._ref);
118
+ this._handleSnapshot(snap);
119
+ }
120
+ catch (err) {
121
+ const fsErr = err;
122
+ this._error = mapFirestoreError(fsErr, this._path);
123
+ this._loading = false;
124
+ }
125
+ }
126
+ _handleSnapshot(snap) {
127
+ this._exists = snap.exists();
128
+ this._data = snap.exists() ? snap.data() : null;
129
+ this._id = snap.id;
130
+ this._fromCache = snap.metadata.fromCache;
131
+ this._hasPendingWrites = snap.metadata.hasPendingWrites;
132
+ this._error = null;
133
+ this._loading = false;
134
+ }
135
+ // ── Public methods ────────────────────────────────────────────────────────
136
+ /** Re-fetches the document from the local cache / server. */
387
137
  async refresh() {
388
- if (!this.docRef) {
389
- throw new DocumentError(DocumentErrorCode.REFERENCE_UNAVAILABLE, 'Cannot refresh: document reference not available');
390
- }
138
+ if (!this._ref)
139
+ return;
140
+ this._loading = true;
391
141
  try {
392
- this.updateState({ loading: true });
393
- const snapshot = await getDoc(this.docRef);
394
- this.processSnapshot(snapshot);
142
+ const snap = await getDoc(this._ref);
143
+ this._handleSnapshot(snap);
395
144
  }
396
- catch (error) {
397
- this.handleError(error);
398
- throw error;
145
+ catch (err) {
146
+ this._error = mapFirestoreError(err, this._path);
147
+ this._loading = false;
399
148
  }
400
149
  }
401
- /**
402
- * Get fresh data from server (bypassing cache)
403
- * @returns Promise resolving to fresh document data
404
- */
150
+ /** Forces a fetch directly from the Firestore server (bypasses cache). */
405
151
  async getFromServer() {
406
- if (!this.docRef) {
407
- throw new DocumentError(DocumentErrorCode.REFERENCE_UNAVAILABLE, 'Cannot fetch: document reference not available');
408
- }
152
+ if (!this._ref)
153
+ return;
154
+ this._loading = true;
409
155
  try {
410
- const snapshot = await getDoc(this.docRef);
411
- const data = snapshot.exists() ? snapshot.data() : null;
412
- return data ? { ...data, id: snapshot.id } : null;
156
+ const snap = await getDocFromServer(this._ref);
157
+ this._handleSnapshot(snap);
413
158
  }
414
- catch (error) {
415
- this.handleError(error);
416
- throw error;
159
+ catch (err) {
160
+ this._error = mapFirestoreError(err, this._path);
161
+ this._loading = false;
417
162
  }
418
163
  }
419
164
  /**
420
- * Switch between realtime and one-time fetch modes
421
- * @param realtime Whether to enable real-time updates
165
+ * Switches between real-time and one-time fetch mode.
166
+ * Unsubscribes existing listener if disabling real-time.
422
167
  */
423
- setRealtimeMode(realtime) {
424
- if (this.options.realtime === realtime)
168
+ setRealtimeMode(enabled) {
169
+ if (enabled === this._options.realtime)
425
170
  return;
426
- this.options.realtime = realtime;
427
- // Clean up existing listener
428
- if (this.unsubscribe) {
429
- this.unsubscribe();
430
- this.unsubscribe = null;
171
+ this._options.realtime = enabled;
172
+ if (!enabled) {
173
+ this._unsubscribe?.();
174
+ this._unsubscribe = null;
431
175
  }
432
- // Set up new mode
433
- if (realtime) {
434
- this.setupRealtimeListener();
176
+ else {
177
+ this._subscribe();
435
178
  }
436
179
  }
437
180
  /**
438
- * Check if document data is stale (for cache management)
439
- * @param maxAge Maximum age in milliseconds
440
- * @returns True if data is considered stale
441
- */
442
- isStale(maxAge = 300000) {
443
- // 5 minutes default
444
- if (!this._data || !('updatedAt' in this._data))
445
- return false;
446
- const updatedAt = this._data.updatedAt;
447
- if (!updatedAt?.toDate)
448
- return false;
449
- const now = new Date().getTime();
450
- const dataTime = updatedAt.toDate().getTime();
451
- return now - dataTime > maxAge;
181
+ * Changes the document path and re-subscribes (or re-fetches).
182
+ * Tears down any existing real-time listener before switching.
183
+ *
184
+ * @example
185
+ * ```ts
186
+ * const userDoc = firekitDoc<User>('users/alice');
187
+ * // User switches account:
188
+ * userDoc.setPath('users/bob');
189
+ * ```
190
+ */
191
+ setPath(newPath) {
192
+ this._unsubscribe?.();
193
+ this._unsubscribe = null;
194
+ this._path = newPath;
195
+ this._loading = true;
196
+ this._data = null;
197
+ this._exists = false;
198
+ this._error = null;
199
+ this._init();
200
+ }
201
+ /**
202
+ * Resolves when the document has finished its initial load.
203
+ * Useful for SSR / data-loading patterns.
204
+ */
205
+ waitForReady() {
206
+ if (!this._loading)
207
+ return Promise.resolve(this._data);
208
+ // $effect.root creates a reactive scope outside of component initialization,
209
+ // so this works safely whether called inside or outside a Svelte component.
210
+ return new Promise((resolve) => {
211
+ const stop = $effect.root(() => {
212
+ $effect(() => {
213
+ if (!this._loading) {
214
+ stop();
215
+ resolve(this._data);
216
+ }
217
+ });
218
+ });
219
+ });
452
220
  }
453
- /**
454
- * Clean up resources and unsubscribe from listeners
455
- */
221
+ /** Stops the real-time listener and frees resources. */
456
222
  dispose() {
457
- if (this.unsubscribe) {
458
- this.unsubscribe();
459
- this.unsubscribe = null;
460
- }
461
- // Reset state
462
- this.updateState({
463
- data: null,
464
- loading: false,
465
- error: null,
466
- exists: false
467
- });
468
- this.docRef = null;
223
+ this._unsubscribe?.();
224
+ this._unsubscribe = null;
469
225
  }
470
226
  }
471
- // ========================================
472
- // FACTORY FUNCTIONS
473
- // ========================================
227
+ // ── Factory functions ─────────────────────────────────────────────────────────
474
228
  /**
475
- * Creates a reactive document subscription with real-time updates
476
- *
477
- * @template T Document data type
478
- * @param ref Document path or DocumentReference
479
- * @param startWith Initial data to show while loading
480
- * @param options Configuration options
481
- * @returns FirekitDoc instance with reactive state
229
+ * Creates a reactive Firestore document with real-time updates.
482
230
  *
483
231
  * @example
484
- * ```typescript
485
- * interface User {
486
- * id: string;
487
- * name: string;
488
- * email: string;
489
- * }
490
- *
491
- * // Real-time document subscription
492
- * const userDoc = firekitDoc<User>('users/123', {
493
- * id: '123',
494
- * name: 'Loading...',
495
- * email: ''
496
- * });
497
- *
498
- * // One-time fetch
499
- * const userDoc = firekitDoc<User>('users/123', undefined, {
500
- * realtime: false
501
- * });
502
- *
503
- * // In Svelte component
504
- * $: if (userDoc.loading) {
505
- * // Show loading state
506
- * } else if (userDoc.error) {
507
- * // Handle error
508
- * } else if (userDoc.exists) {
509
- * // Use userDoc.data
510
- * }
511
- *
512
- * // Use reactive methods
513
- * $: if (userDoc.computedState.canRetry) {
514
- * userDoc.retryIfNeeded();
515
- * }
232
+ * ```svelte
233
+ * <script lang="ts">
234
+ * import { firekitDoc } from 'svelte-firekit';
235
+ * const post = firekitDoc<Post>('posts/abc123');
236
+ * </script>
516
237
  * ```
517
238
  */
518
- export function firekitDoc(ref, startWith, options) {
519
- return new FirekitDoc(ref, startWith, options);
239
+ export function firekitDoc(path, options) {
240
+ return new FirekitDoc(path, { ...options, realtime: true });
520
241
  }
521
242
  /**
522
- * Creates a one-time document fetch (no real-time updates)
523
- *
524
- * @template T Document data type
525
- * @param ref Document path or DocumentReference
526
- * @param startWith Initial data to show while loading
527
- * @returns FirekitDoc instance configured for one-time fetch
528
- *
529
- * @example
530
- * ```typescript
531
- * const userDoc = firekitDocOnce<User>('users/123');
532
- * ```
243
+ * Creates a one-time Firestore document fetch (no real-time listener).
533
244
  */
534
- export function firekitDocOnce(ref, startWith) {
535
- return new FirekitDoc(ref, startWith, { realtime: false });
245
+ export function firekitDocOnce(path, options) {
246
+ return new FirekitDoc(path, { ...options, realtime: false });
536
247
  }
537
248
  /**
538
- * Creates a document subscription with metadata changes included
539
- *
540
- * @template T Document data type
541
- * @param ref Document path or DocumentReference
542
- * @param startWith Initial data to show while loading
543
- * @returns FirekitDoc instance with metadata tracking
544
- *
545
- * @example
546
- * ```typescript
547
- * const userDoc = firekitDocWithMetadata<User>('users/123');
548
- * ```
249
+ * Creates a reactive Firestore document that also exposes metadata
250
+ * (fromCache, hasPendingWrites).
549
251
  */
550
- export function firekitDocWithMetadata(ref, startWith) {
551
- return new FirekitDoc(ref, startWith, {
552
- realtime: true,
553
- includeMetadata: true
554
- });
252
+ export function firekitDocWithMetadata(path) {
253
+ return new FirekitDoc(path, { realtime: true, includeMetadata: true });
555
254
  }