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.
- package/README.md +550 -354
- package/dist/components/AuthGuard.svelte +64 -0
- package/dist/components/AuthGuard.svelte.d.ts +15 -0
- package/dist/components/Collection.svelte +62 -0
- package/dist/components/Collection.svelte.d.ts +39 -0
- package/dist/components/CustomGuard.svelte +87 -0
- package/dist/components/CustomGuard.svelte.d.ts +13 -0
- package/dist/components/Doc.svelte +56 -0
- package/dist/components/Doc.svelte.d.ts +36 -0
- package/dist/components/DownloadURL.svelte +48 -0
- package/dist/components/DownloadURL.svelte.d.ts +14 -0
- package/dist/components/FirebaseApp.svelte +81 -0
- package/dist/components/FirebaseApp.svelte.d.ts +12 -0
- package/dist/components/Node.svelte +54 -0
- package/dist/components/Node.svelte.d.ts +36 -0
- package/dist/components/SignedIn.svelte +22 -0
- package/dist/components/{firekit/signed-in.svelte.d.ts → SignedIn.svelte.d.ts} +1 -4
- package/dist/components/SignedOut.svelte +32 -0
- package/dist/components/{firekit/signed-out.svelte.d.ts → SignedOut.svelte.d.ts} +3 -5
- package/dist/components/UploadTask.svelte +75 -0
- package/dist/components/UploadTask.svelte.d.ts +33 -0
- package/dist/config.d.ts +29 -6
- package/dist/config.js +37 -74
- package/dist/context.d.ts +46 -0
- package/dist/context.js +56 -0
- package/dist/firebase.d.ts +25 -84
- package/dist/firebase.js +75 -125
- package/dist/index.d.ts +32 -20
- package/dist/index.js +49 -30
- package/dist/services/ai.svelte.d.ts +152 -0
- package/dist/services/ai.svelte.js +302 -0
- package/dist/services/analytics.d.ts +39 -231
- package/dist/services/analytics.js +89 -421
- package/dist/services/app-check.svelte.d.ts +82 -0
- package/dist/services/app-check.svelte.js +159 -0
- package/dist/services/auth.d.ts +63 -352
- package/dist/services/auth.js +353 -718
- package/dist/services/bundles.d.ts +42 -0
- package/dist/services/bundles.js +57 -0
- package/dist/services/callable.d.ts +57 -0
- package/dist/services/callable.js +115 -0
- package/dist/services/collection.svelte.d.ts +154 -221
- package/dist/services/collection.svelte.js +357 -663
- package/dist/services/document.svelte.d.ts +73 -254
- package/dist/services/document.svelte.js +196 -497
- package/dist/services/in-app-messaging.d.ts +46 -0
- package/dist/services/in-app-messaging.js +88 -0
- package/dist/services/messaging.svelte.d.ts +75 -0
- package/dist/services/messaging.svelte.js +190 -0
- package/dist/services/mutations.d.ts +59 -282
- package/dist/services/mutations.js +202 -951
- package/dist/services/performance.d.ts +60 -0
- package/dist/services/performance.js +118 -0
- package/dist/services/presence.svelte.d.ts +21 -89
- package/dist/services/presence.svelte.js +232 -469
- package/dist/services/realtime.svelte.d.ts +54 -125
- package/dist/services/realtime.svelte.js +111 -175
- package/dist/services/remote-config.svelte.d.ts +73 -0
- package/dist/services/remote-config.svelte.js +204 -0
- package/dist/services/storage.svelte.d.ts +81 -208
- package/dist/services/storage.svelte.js +190 -305
- package/dist/services/user.svelte.d.ts +23 -244
- package/dist/services/user.svelte.js +129 -439
- package/dist/types/analytics.d.ts +2 -36
- package/dist/types/analytics.js +0 -5
- package/dist/types/auth.d.ts +15 -85
- package/dist/types/auth.js +0 -17
- package/dist/types/collection.d.ts +31 -225
- package/dist/types/collection.js +5 -51
- package/dist/types/document.d.ts +11 -236
- package/dist/types/document.js +2 -47
- package/dist/types/firebase.d.ts +10 -13
- package/dist/types/firebase.js +3 -9
- package/dist/types/index.d.ts +5 -5
- package/dist/types/index.js +5 -4
- package/dist/types/mutations.d.ts +11 -225
- package/dist/types/mutations.js +6 -51
- package/dist/types/presence.d.ts +5 -158
- package/dist/types/presence.js +0 -20
- package/dist/utils/errors.d.ts +10 -14
- package/dist/utils/errors.js +11 -16
- package/dist/utils/firestore.d.ts +3 -4
- package/dist/utils/firestore.js +7 -10
- package/dist/utils/index.d.ts +4 -4
- package/dist/utils/index.js +4 -8
- package/dist/utils/providers.d.ts +4 -13
- package/dist/utils/providers.js +14 -13
- package/dist/utils/user.d.ts +1 -3
- package/dist/utils/user.js +1 -3
- package/package.json +41 -55
- package/dist/components/docs/doc-content.svelte +0 -19
- package/dist/components/docs/doc-content.svelte.d.ts +0 -6
- package/dist/components/docs/doc-header.svelte +0 -24
- package/dist/components/docs/doc-header.svelte.d.ts +0 -13
- package/dist/components/docs/doc-renderer.svelte +0 -27
- package/dist/components/docs/doc-renderer.svelte.d.ts +0 -8
- package/dist/components/docs/mobile-table-of-contents.svelte +0 -42
- package/dist/components/docs/mobile-table-of-contents.svelte.d.ts +0 -3
- package/dist/components/docs/table-of-contents.svelte +0 -33
- package/dist/components/docs/table-of-contents.svelte.d.ts +0 -4
- package/dist/components/docs/toc.svelte.d.ts +0 -16
- package/dist/components/docs/toc.svelte.js +0 -59
- package/dist/components/firekit/Collection.svelte +0 -122
- package/dist/components/firekit/Collection.svelte.d.ts +0 -27
- package/dist/components/firekit/Doc.svelte +0 -140
- package/dist/components/firekit/Doc.svelte.d.ts +0 -28
- package/dist/components/firekit/Node.svelte +0 -97
- package/dist/components/firekit/Node.svelte.d.ts +0 -23
- package/dist/components/firekit/auth-guard.svelte +0 -120
- package/dist/components/firekit/auth-guard.svelte.d.ts +0 -26
- package/dist/components/firekit/custom-guard.svelte +0 -163
- package/dist/components/firekit/custom-guard.svelte.d.ts +0 -31
- package/dist/components/firekit/download-url.svelte +0 -92
- package/dist/components/firekit/download-url.svelte.d.ts +0 -19
- package/dist/components/firekit/firebase-app.svelte +0 -33
- package/dist/components/firekit/firebase-app.svelte.d.ts +0 -7
- package/dist/components/firekit/node-list.svelte +0 -102
- package/dist/components/firekit/node-list.svelte.d.ts +0 -27
- package/dist/components/firekit/signed-in.svelte +0 -42
- package/dist/components/firekit/signed-out.svelte +0 -42
- package/dist/components/firekit/storage-list.svelte +0 -97
- package/dist/components/firekit/storage-list.svelte.d.ts +0 -26
- package/dist/components/firekit/upload-task.svelte +0 -108
- package/dist/components/firekit/upload-task.svelte.d.ts +0 -24
- package/dist/components/nav/app-sidebar.svelte +0 -175
- package/dist/components/nav/app-sidebar.svelte.d.ts +0 -9
- package/dist/components/nav/auto-breadcrumb.svelte +0 -41
- package/dist/components/nav/auto-breadcrumb.svelte.d.ts +0 -3
- package/dist/components/nav/dark-mode-toggle.svelte +0 -17
- package/dist/components/nav/dark-mode-toggle.svelte.d.ts +0 -18
- package/dist/components/nav/nav-components.svelte +0 -24
- package/dist/components/nav/nav-components.svelte.d.ts +0 -11
- package/dist/components/nav/nav-main.svelte +0 -45
- package/dist/components/nav/nav-main.svelte.d.ts +0 -11
- package/dist/components/nav/nav-secondary.svelte +0 -32
- package/dist/components/nav/nav-secondary.svelte.d.ts +0 -14
- package/dist/components/nav/site-header.svelte +0 -32
- package/dist/components/nav/site-header.svelte.d.ts +0 -18
- package/dist/components/ui/avatar/avatar-fallback.svelte +0 -17
- package/dist/components/ui/avatar/avatar-fallback.svelte.d.ts +0 -4
- package/dist/components/ui/avatar/avatar-image.svelte +0 -17
- package/dist/components/ui/avatar/avatar-image.svelte.d.ts +0 -4
- package/dist/components/ui/avatar/avatar.svelte +0 -19
- package/dist/components/ui/avatar/avatar.svelte.d.ts +0 -4
- package/dist/components/ui/avatar/index.d.ts +0 -4
- package/dist/components/ui/avatar/index.js +0 -6
- package/dist/components/ui/badge/badge.svelte +0 -50
- package/dist/components/ui/badge/badge.svelte.d.ts +0 -32
- package/dist/components/ui/badge/index.d.ts +0 -2
- package/dist/components/ui/badge/index.js +0 -2
- package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +0 -23
- package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte.d.ts +0 -5
- package/dist/components/ui/breadcrumb/breadcrumb-item.svelte +0 -20
- package/dist/components/ui/breadcrumb/breadcrumb-item.svelte.d.ts +0 -5
- package/dist/components/ui/breadcrumb/breadcrumb-link.svelte +0 -31
- package/dist/components/ui/breadcrumb/breadcrumb-link.svelte.d.ts +0 -11
- package/dist/components/ui/breadcrumb/breadcrumb-list.svelte +0 -23
- package/dist/components/ui/breadcrumb/breadcrumb-list.svelte.d.ts +0 -5
- package/dist/components/ui/breadcrumb/breadcrumb-page.svelte +0 -23
- package/dist/components/ui/breadcrumb/breadcrumb-page.svelte.d.ts +0 -5
- package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte +0 -27
- package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte.d.ts +0 -5
- package/dist/components/ui/breadcrumb/breadcrumb.svelte +0 -21
- package/dist/components/ui/breadcrumb/breadcrumb.svelte.d.ts +0 -5
- package/dist/components/ui/breadcrumb/index.d.ts +0 -8
- package/dist/components/ui/breadcrumb/index.js +0 -10
- package/dist/components/ui/button/button.svelte +0 -80
- package/dist/components/ui/button/button.svelte.d.ts +0 -58
- package/dist/components/ui/button/index.d.ts +0 -2
- package/dist/components/ui/button/index.js +0 -4
- package/dist/components/ui/card/card-action.svelte +0 -20
- package/dist/components/ui/card/card-action.svelte.d.ts +0 -5
- package/dist/components/ui/card/card-content.svelte +0 -15
- package/dist/components/ui/card/card-content.svelte.d.ts +0 -5
- package/dist/components/ui/card/card-description.svelte +0 -20
- package/dist/components/ui/card/card-description.svelte.d.ts +0 -5
- package/dist/components/ui/card/card-footer.svelte +0 -20
- package/dist/components/ui/card/card-footer.svelte.d.ts +0 -5
- package/dist/components/ui/card/card-header.svelte +0 -23
- package/dist/components/ui/card/card-header.svelte.d.ts +0 -5
- package/dist/components/ui/card/card-title.svelte +0 -20
- package/dist/components/ui/card/card-title.svelte.d.ts +0 -5
- package/dist/components/ui/card/card.svelte +0 -23
- package/dist/components/ui/card/card.svelte.d.ts +0 -5
- package/dist/components/ui/card/index.d.ts +0 -8
- package/dist/components/ui/card/index.js +0 -10
- package/dist/components/ui/chart/chart-container.svelte +0 -80
- package/dist/components/ui/chart/chart-container.svelte.d.ts +0 -9
- package/dist/components/ui/chart/chart-style.svelte +0 -36
- package/dist/components/ui/chart/chart-style.svelte.d.ts +0 -8
- package/dist/components/ui/chart/chart-tooltip.svelte +0 -159
- package/dist/components/ui/chart/chart-tooltip.svelte.d.ts +0 -27
- package/dist/components/ui/chart/chart-utils.d.ts +0 -36
- package/dist/components/ui/chart/chart-utils.js +0 -33
- package/dist/components/ui/chart/index.d.ts +0 -4
- package/dist/components/ui/chart/index.js +0 -4
- package/dist/components/ui/checkbox/checkbox.svelte +0 -36
- package/dist/components/ui/checkbox/checkbox.svelte.d.ts +0 -4
- package/dist/components/ui/checkbox/index.d.ts +0 -2
- package/dist/components/ui/checkbox/index.js +0 -4
- package/dist/components/ui/data-table/data-table.svelte.d.ts +0 -40
- package/dist/components/ui/data-table/data-table.svelte.js +0 -110
- package/dist/components/ui/data-table/flex-render.svelte +0 -36
- package/dist/components/ui/data-table/flex-render.svelte.d.ts +0 -30
- package/dist/components/ui/data-table/index.d.ts +0 -3
- package/dist/components/ui/data-table/index.js +0 -3
- package/dist/components/ui/data-table/render-helpers.d.ts +0 -90
- package/dist/components/ui/data-table/render-helpers.js +0 -99
- package/dist/components/ui/dialog/dialog-close.svelte +0 -7
- package/dist/components/ui/dialog/dialog-close.svelte.d.ts +0 -4
- package/dist/components/ui/dialog/dialog-content.svelte +0 -43
- package/dist/components/ui/dialog/dialog-content.svelte.d.ts +0 -11
- package/dist/components/ui/dialog/dialog-description.svelte +0 -17
- package/dist/components/ui/dialog/dialog-description.svelte.d.ts +0 -4
- package/dist/components/ui/dialog/dialog-footer.svelte +0 -20
- package/dist/components/ui/dialog/dialog-footer.svelte.d.ts +0 -5
- package/dist/components/ui/dialog/dialog-header.svelte +0 -20
- package/dist/components/ui/dialog/dialog-header.svelte.d.ts +0 -5
- package/dist/components/ui/dialog/dialog-overlay.svelte +0 -20
- package/dist/components/ui/dialog/dialog-overlay.svelte.d.ts +0 -4
- package/dist/components/ui/dialog/dialog-title.svelte +0 -17
- package/dist/components/ui/dialog/dialog-title.svelte.d.ts +0 -4
- package/dist/components/ui/dialog/dialog-trigger.svelte +0 -7
- package/dist/components/ui/dialog/dialog-trigger.svelte.d.ts +0 -4
- package/dist/components/ui/dialog/index.d.ts +0 -11
- package/dist/components/ui/dialog/index.js +0 -14
- package/dist/components/ui/drawer/drawer-close.svelte +0 -7
- package/dist/components/ui/drawer/drawer-close.svelte.d.ts +0 -4
- package/dist/components/ui/drawer/drawer-content.svelte +0 -37
- package/dist/components/ui/drawer/drawer-content.svelte.d.ts +0 -7
- package/dist/components/ui/drawer/drawer-description.svelte +0 -17
- package/dist/components/ui/drawer/drawer-description.svelte.d.ts +0 -4
- package/dist/components/ui/drawer/drawer-footer.svelte +0 -20
- package/dist/components/ui/drawer/drawer-footer.svelte.d.ts +0 -5
- package/dist/components/ui/drawer/drawer-header.svelte +0 -20
- package/dist/components/ui/drawer/drawer-header.svelte.d.ts +0 -5
- package/dist/components/ui/drawer/drawer-nested.svelte +0 -12
- package/dist/components/ui/drawer/drawer-nested.svelte.d.ts +0 -3
- package/dist/components/ui/drawer/drawer-overlay.svelte +0 -20
- package/dist/components/ui/drawer/drawer-overlay.svelte.d.ts +0 -4
- package/dist/components/ui/drawer/drawer-title.svelte +0 -17
- package/dist/components/ui/drawer/drawer-title.svelte.d.ts +0 -4
- package/dist/components/ui/drawer/drawer-trigger.svelte +0 -7
- package/dist/components/ui/drawer/drawer-trigger.svelte.d.ts +0 -4
- package/dist/components/ui/drawer/drawer.svelte +0 -12
- package/dist/components/ui/drawer/drawer.svelte.d.ts +0 -3
- package/dist/components/ui/drawer/index.d.ts +0 -13
- package/dist/components/ui/drawer/index.js +0 -15
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +0 -41
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +0 -9
- package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +0 -27
- package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte.d.ts +0 -7
- package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +0 -22
- package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte.d.ts +0 -8
- package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte +0 -7
- package/dist/components/ui/dropdown-menu/dropdown-menu-group.svelte.d.ts +0 -4
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +0 -27
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +0 -8
- package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte +0 -24
- package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte.d.ts +0 -8
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +0 -16
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +0 -4
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +0 -31
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte.d.ts +0 -4
- package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +0 -17
- package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte.d.ts +0 -4
- package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +0 -20
- package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte.d.ts +0 -5
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +0 -20
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte.d.ts +0 -4
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +0 -29
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte.d.ts +0 -7
- package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -7
- package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte.d.ts +0 -4
- package/dist/components/ui/dropdown-menu/index.d.ts +0 -25
- package/dist/components/ui/dropdown-menu/index.js +0 -17
- package/dist/components/ui/input/index.d.ts +0 -2
- package/dist/components/ui/input/index.js +0 -4
- package/dist/components/ui/input/input.svelte +0 -51
- package/dist/components/ui/input/input.svelte.d.ts +0 -13
- package/dist/components/ui/label/index.d.ts +0 -2
- package/dist/components/ui/label/index.js +0 -4
- package/dist/components/ui/label/label.svelte +0 -20
- package/dist/components/ui/label/label.svelte.d.ts +0 -4
- package/dist/components/ui/scroll-area/index.d.ts +0 -3
- package/dist/components/ui/scroll-area/index.js +0 -5
- package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte +0 -31
- package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte.d.ts +0 -4
- package/dist/components/ui/scroll-area/scroll-area.svelte +0 -40
- package/dist/components/ui/scroll-area/scroll-area.svelte.d.ts +0 -10
- package/dist/components/ui/select/index.d.ts +0 -11
- package/dist/components/ui/select/index.js +0 -14
- package/dist/components/ui/select/select-content.svelte +0 -40
- package/dist/components/ui/select/select-content.svelte.d.ts +0 -8
- package/dist/components/ui/select/select-group-heading.svelte +0 -21
- package/dist/components/ui/select/select-group-heading.svelte.d.ts +0 -10
- package/dist/components/ui/select/select-group.svelte +0 -7
- package/dist/components/ui/select/select-group.svelte.d.ts +0 -4
- package/dist/components/ui/select/select-item.svelte +0 -38
- package/dist/components/ui/select/select-item.svelte.d.ts +0 -4
- package/dist/components/ui/select/select-label.svelte +0 -20
- package/dist/components/ui/select/select-label.svelte.d.ts +0 -6
- package/dist/components/ui/select/select-scroll-down-button.svelte +0 -20
- package/dist/components/ui/select/select-scroll-down-button.svelte.d.ts +0 -4
- package/dist/components/ui/select/select-scroll-up-button.svelte +0 -20
- package/dist/components/ui/select/select-scroll-up-button.svelte.d.ts +0 -4
- package/dist/components/ui/select/select-separator.svelte +0 -18
- package/dist/components/ui/select/select-separator.svelte.d.ts +0 -4
- package/dist/components/ui/select/select-trigger.svelte +0 -29
- package/dist/components/ui/select/select-trigger.svelte.d.ts +0 -8
- package/dist/components/ui/separator/index.d.ts +0 -2
- package/dist/components/ui/separator/index.js +0 -4
- package/dist/components/ui/separator/separator.svelte +0 -20
- package/dist/components/ui/separator/separator.svelte.d.ts +0 -4
- package/dist/components/ui/sheet/index.d.ts +0 -11
- package/dist/components/ui/sheet/index.js +0 -14
- package/dist/components/ui/sheet/sheet-close.svelte +0 -7
- package/dist/components/ui/sheet/sheet-close.svelte.d.ts +0 -4
- package/dist/components/ui/sheet/sheet-content.svelte +0 -58
- package/dist/components/ui/sheet/sheet-content.svelte.d.ts +0 -35
- package/dist/components/ui/sheet/sheet-description.svelte +0 -17
- package/dist/components/ui/sheet/sheet-description.svelte.d.ts +0 -4
- package/dist/components/ui/sheet/sheet-footer.svelte +0 -20
- package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +0 -5
- package/dist/components/ui/sheet/sheet-header.svelte +0 -20
- package/dist/components/ui/sheet/sheet-header.svelte.d.ts +0 -5
- package/dist/components/ui/sheet/sheet-overlay.svelte +0 -20
- package/dist/components/ui/sheet/sheet-overlay.svelte.d.ts +0 -4
- package/dist/components/ui/sheet/sheet-title.svelte +0 -17
- package/dist/components/ui/sheet/sheet-title.svelte.d.ts +0 -4
- package/dist/components/ui/sheet/sheet-trigger.svelte +0 -7
- package/dist/components/ui/sheet/sheet-trigger.svelte.d.ts +0 -4
- package/dist/components/ui/sidebar/constants.d.ts +0 -6
- package/dist/components/ui/sidebar/constants.js +0 -6
- package/dist/components/ui/sidebar/context.svelte.d.ts +0 -42
- package/dist/components/ui/sidebar/context.svelte.js +0 -54
- package/dist/components/ui/sidebar/index.d.ts +0 -25
- package/dist/components/ui/sidebar/index.js +0 -27
- package/dist/components/ui/sidebar/sidebar-content.svelte +0 -24
- package/dist/components/ui/sidebar/sidebar-content.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-footer.svelte +0 -21
- package/dist/components/ui/sidebar/sidebar-footer.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-group-action.svelte +0 -36
- package/dist/components/ui/sidebar/sidebar-group-action.svelte.d.ts +0 -11
- package/dist/components/ui/sidebar/sidebar-group-content.svelte +0 -21
- package/dist/components/ui/sidebar/sidebar-group-content.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-group-label.svelte +0 -34
- package/dist/components/ui/sidebar/sidebar-group-label.svelte.d.ts +0 -11
- package/dist/components/ui/sidebar/sidebar-group.svelte +0 -21
- package/dist/components/ui/sidebar/sidebar-group.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-header.svelte +0 -21
- package/dist/components/ui/sidebar/sidebar-header.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-input.svelte +0 -21
- package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +0 -11
- package/dist/components/ui/sidebar/sidebar-inset.svelte +0 -24
- package/dist/components/ui/sidebar/sidebar-inset.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-menu-action.svelte +0 -43
- package/dist/components/ui/sidebar/sidebar-menu-action.svelte.d.ts +0 -12
- package/dist/components/ui/sidebar/sidebar-menu-badge.svelte +0 -29
- package/dist/components/ui/sidebar/sidebar-menu-badge.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte +0 -103
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte.d.ts +0 -51
- package/dist/components/ui/sidebar/sidebar-menu-item.svelte +0 -21
- package/dist/components/ui/sidebar/sidebar-menu-item.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-menu-skeleton.svelte +0 -36
- package/dist/components/ui/sidebar/sidebar-menu-skeleton.svelte.d.ts +0 -8
- package/dist/components/ui/sidebar/sidebar-menu-sub-button.svelte +0 -43
- package/dist/components/ui/sidebar/sidebar-menu-sub-button.svelte.d.ts +0 -13
- package/dist/components/ui/sidebar/sidebar-menu-sub-item.svelte +0 -21
- package/dist/components/ui/sidebar/sidebar-menu-sub-item.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-menu-sub.svelte +0 -25
- package/dist/components/ui/sidebar/sidebar-menu-sub.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-menu.svelte +0 -21
- package/dist/components/ui/sidebar/sidebar-menu.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-provider.svelte +0 -53
- package/dist/components/ui/sidebar/sidebar-provider.svelte.d.ts +0 -9
- package/dist/components/ui/sidebar/sidebar-rail.svelte +0 -36
- package/dist/components/ui/sidebar/sidebar-rail.svelte.d.ts +0 -5
- package/dist/components/ui/sidebar/sidebar-separator.svelte +0 -19
- package/dist/components/ui/sidebar/sidebar-separator.svelte.d.ts +0 -13
- package/dist/components/ui/sidebar/sidebar-trigger.svelte +0 -35
- package/dist/components/ui/sidebar/sidebar-trigger.svelte.d.ts +0 -8
- package/dist/components/ui/sidebar/sidebar.svelte +0 -104
- package/dist/components/ui/sidebar/sidebar.svelte.d.ts +0 -10
- package/dist/components/ui/skeleton/index.d.ts +0 -2
- package/dist/components/ui/skeleton/index.js +0 -4
- package/dist/components/ui/skeleton/skeleton.svelte +0 -17
- package/dist/components/ui/skeleton/skeleton.svelte.d.ts +0 -5
- package/dist/components/ui/table/index.d.ts +0 -9
- package/dist/components/ui/table/index.js +0 -11
- package/dist/components/ui/table/table-body.svelte +0 -20
- package/dist/components/ui/table/table-body.svelte.d.ts +0 -5
- package/dist/components/ui/table/table-caption.svelte +0 -20
- package/dist/components/ui/table/table-caption.svelte.d.ts +0 -5
- package/dist/components/ui/table/table-cell.svelte +0 -20
- package/dist/components/ui/table/table-cell.svelte.d.ts +0 -5
- package/dist/components/ui/table/table-footer.svelte +0 -20
- package/dist/components/ui/table/table-footer.svelte.d.ts +0 -5
- package/dist/components/ui/table/table-head.svelte +0 -23
- package/dist/components/ui/table/table-head.svelte.d.ts +0 -5
- package/dist/components/ui/table/table-header.svelte +0 -20
- package/dist/components/ui/table/table-header.svelte.d.ts +0 -5
- package/dist/components/ui/table/table-row.svelte +0 -23
- package/dist/components/ui/table/table-row.svelte.d.ts +0 -5
- package/dist/components/ui/table/table.svelte +0 -22
- package/dist/components/ui/table/table.svelte.d.ts +0 -5
- package/dist/components/ui/tabs/index.d.ts +0 -5
- package/dist/components/ui/tabs/index.js +0 -7
- package/dist/components/ui/tabs/tabs-content.svelte +0 -17
- package/dist/components/ui/tabs/tabs-content.svelte.d.ts +0 -4
- package/dist/components/ui/tabs/tabs-list.svelte +0 -20
- package/dist/components/ui/tabs/tabs-list.svelte.d.ts +0 -4
- package/dist/components/ui/tabs/tabs-trigger.svelte +0 -20
- package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +0 -4
- package/dist/components/ui/tabs/tabs.svelte +0 -19
- package/dist/components/ui/tabs/tabs.svelte.d.ts +0 -4
- package/dist/components/ui/toggle/index.d.ts +0 -3
- package/dist/components/ui/toggle/index.js +0 -5
- package/dist/components/ui/toggle/toggle.svelte +0 -52
- package/dist/components/ui/toggle/toggle.svelte.d.ts +0 -43
- package/dist/components/ui/toggle-group/index.d.ts +0 -3
- package/dist/components/ui/toggle-group/index.js +0 -5
- package/dist/components/ui/toggle-group/toggle-group-item.svelte +0 -34
- package/dist/components/ui/toggle-group/toggle-group-item.svelte.d.ts +0 -6
- package/dist/components/ui/toggle-group/toggle-group.svelte +0 -47
- package/dist/components/ui/toggle-group/toggle-group.svelte.d.ts +0 -8
- package/dist/components/ui/tooltip/index.d.ts +0 -7
- package/dist/components/ui/tooltip/index.js +0 -9
- package/dist/components/ui/tooltip/tooltip-content.svelte +0 -47
- package/dist/components/ui/tooltip/tooltip-content.svelte.d.ts +0 -7
- package/dist/components/ui/tooltip/tooltip-trigger.svelte +0 -7
- package/dist/components/ui/tooltip/tooltip-trigger.svelte.d.ts +0 -4
- package/dist/hooks/is-mobile.svelte.d.ts +0 -4
- package/dist/hooks/is-mobile.svelte.js +0 -7
- package/dist/services/index.d.ts +0 -9
- package/dist/services/index.js +0 -10
- package/dist/types/docs.d.ts +0 -67
- package/dist/types/docs.js +0 -1
- package/dist/utils.d.ts +0 -15
- 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 {
|
|
9
|
-
|
|
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
|
-
*
|
|
12
|
-
* Uses Svelte 5 runes for optimal reactivity and performance.
|
|
31
|
+
* Reactive Firestore document subscription.
|
|
13
32
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
-
* ```
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
94
|
+
this._fetchOnce();
|
|
128
95
|
}
|
|
129
96
|
}
|
|
130
|
-
catch (
|
|
131
|
-
this.
|
|
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
|
-
|
|
136
|
-
*/
|
|
137
|
-
setupRealtimeListener() {
|
|
138
|
-
if (!this.docRef)
|
|
102
|
+
_subscribe() {
|
|
103
|
+
if (!this._ref)
|
|
139
104
|
return;
|
|
140
|
-
const
|
|
141
|
-
includeMetadataChanges: this.
|
|
105
|
+
const listenOptions = {
|
|
106
|
+
includeMetadataChanges: this._options.includeMetadata
|
|
142
107
|
};
|
|
143
|
-
this.
|
|
144
|
-
this.
|
|
145
|
-
|
|
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
|
-
|
|
151
|
-
*/
|
|
152
|
-
async fetchOnce() {
|
|
153
|
-
if (!this.docRef)
|
|
113
|
+
async _fetchOnce() {
|
|
114
|
+
if (!this._ref)
|
|
154
115
|
return;
|
|
155
116
|
try {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
this.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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.
|
|
389
|
-
|
|
390
|
-
|
|
138
|
+
if (!this._ref)
|
|
139
|
+
return;
|
|
140
|
+
this._loading = true;
|
|
391
141
|
try {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
this.processSnapshot(snapshot);
|
|
142
|
+
const snap = await getDoc(this._ref);
|
|
143
|
+
this._handleSnapshot(snap);
|
|
395
144
|
}
|
|
396
|
-
catch (
|
|
397
|
-
this.
|
|
398
|
-
|
|
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.
|
|
407
|
-
|
|
408
|
-
|
|
152
|
+
if (!this._ref)
|
|
153
|
+
return;
|
|
154
|
+
this._loading = true;
|
|
409
155
|
try {
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
return data ? { ...data, id: snapshot.id } : null;
|
|
156
|
+
const snap = await getDocFromServer(this._ref);
|
|
157
|
+
this._handleSnapshot(snap);
|
|
413
158
|
}
|
|
414
|
-
catch (
|
|
415
|
-
this.
|
|
416
|
-
|
|
159
|
+
catch (err) {
|
|
160
|
+
this._error = mapFirestoreError(err, this._path);
|
|
161
|
+
this._loading = false;
|
|
417
162
|
}
|
|
418
163
|
}
|
|
419
164
|
/**
|
|
420
|
-
*
|
|
421
|
-
*
|
|
165
|
+
* Switches between real-time and one-time fetch mode.
|
|
166
|
+
* Unsubscribes existing listener if disabling real-time.
|
|
422
167
|
*/
|
|
423
|
-
setRealtimeMode(
|
|
424
|
-
if (this.
|
|
168
|
+
setRealtimeMode(enabled) {
|
|
169
|
+
if (enabled === this._options.realtime)
|
|
425
170
|
return;
|
|
426
|
-
this.
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
this.
|
|
430
|
-
this.unsubscribe = null;
|
|
171
|
+
this._options.realtime = enabled;
|
|
172
|
+
if (!enabled) {
|
|
173
|
+
this._unsubscribe?.();
|
|
174
|
+
this._unsubscribe = null;
|
|
431
175
|
}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
this.setupRealtimeListener();
|
|
176
|
+
else {
|
|
177
|
+
this._subscribe();
|
|
435
178
|
}
|
|
436
179
|
}
|
|
437
180
|
/**
|
|
438
|
-
*
|
|
439
|
-
*
|
|
440
|
-
*
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
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
|
-
|
|
458
|
-
|
|
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
|
|
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
|
-
* ```
|
|
485
|
-
*
|
|
486
|
-
*
|
|
487
|
-
*
|
|
488
|
-
*
|
|
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(
|
|
519
|
-
return new FirekitDoc(
|
|
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
|
|
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(
|
|
535
|
-
return new FirekitDoc(
|
|
245
|
+
export function firekitDocOnce(path, options) {
|
|
246
|
+
return new FirekitDoc(path, { ...options, realtime: false });
|
|
536
247
|
}
|
|
537
248
|
/**
|
|
538
|
-
* Creates a document
|
|
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(
|
|
551
|
-
return new FirekitDoc(
|
|
552
|
-
realtime: true,
|
|
553
|
-
includeMetadata: true
|
|
554
|
-
});
|
|
252
|
+
export function firekitDocWithMetadata(path) {
|
|
253
|
+
return new FirekitDoc(path, { realtime: true, includeMetadata: true });
|
|
555
254
|
}
|