svelte-firekit 0.1.8 → 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 -708
- 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,287 +1,143 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview FirekitUser Store - Reactive user state management using Svelte 5 runes
|
|
3
|
-
* @module FirekitUserStore
|
|
4
|
-
* @version 1.0.0
|
|
5
|
-
*/
|
|
6
1
|
import { onAuthStateChanged, updateProfile, updateEmail, updatePassword, reload, sendEmailVerification, getIdToken } from 'firebase/auth';
|
|
7
2
|
import { doc, setDoc, getDoc, serverTimestamp } from 'firebase/firestore';
|
|
8
3
|
import { firebaseService } from '../firebase.js';
|
|
9
4
|
import { FirekitAuthError, AuthErrorCode } from '../types/auth.js';
|
|
10
5
|
import { mapFirebaseUserToProfile, updateUserInFirestore, createAuthError, validateCurrentUser } from '../utils/index.js';
|
|
11
6
|
/**
|
|
12
|
-
* Reactive user store
|
|
13
|
-
*
|
|
7
|
+
* Reactive user store — the single source of truth for auth state.
|
|
8
|
+
* Uses Svelte 5 `$state` / `$derived` runes so all getters are reactive
|
|
9
|
+
* and can be read directly in components without subscriptions.
|
|
14
10
|
*
|
|
15
|
-
* @class FirekitUserStore
|
|
16
11
|
* @example
|
|
17
|
-
* ```typescript
|
|
18
12
|
* import { firekitUser } from 'svelte-firekit';
|
|
19
13
|
*
|
|
20
|
-
* //
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* }
|
|
24
|
-
*
|
|
25
|
-
* // Update profile
|
|
26
|
-
* await firekitUser.updateDisplayName("John Doe");
|
|
27
|
-
*
|
|
28
|
-
* // Get extended user data
|
|
29
|
-
* const userData = await firekitUser.getExtendedUserData();
|
|
30
|
-
* ```
|
|
14
|
+
* // In a .svelte file — reactive, no subscription needed
|
|
15
|
+
* {#if firekitUser.isAuthenticated}
|
|
16
|
+
* <p>Hello {firekitUser.displayName}</p>
|
|
17
|
+
* {/if}
|
|
31
18
|
*/
|
|
32
19
|
class FirekitUserStore {
|
|
33
20
|
static instance;
|
|
34
21
|
auth = null;
|
|
35
22
|
firestore = null;
|
|
36
|
-
|
|
37
|
-
// ========================================
|
|
38
|
-
// REACTIVE STATE (Svelte 5 Runes)
|
|
39
|
-
// ========================================
|
|
40
|
-
/** Current user profile state */
|
|
23
|
+
// ── Reactive state ───────────────────────────────────────────────────────────
|
|
41
24
|
_user = $state(null);
|
|
42
|
-
/** Loading state indicator */
|
|
43
25
|
_loading = $state(true);
|
|
44
|
-
/** Authentication initialization state */
|
|
45
26
|
_initialized = $state(false);
|
|
46
|
-
/** Current error state */
|
|
47
27
|
_error = $state(null);
|
|
48
|
-
//
|
|
49
|
-
// DERIVED STATE
|
|
50
|
-
// ========================================
|
|
51
|
-
/** Derived: Whether user is authenticated (not anonymous) */
|
|
28
|
+
// ── Derived ──────────────────────────────────────────────────────────────────
|
|
52
29
|
_isAuthenticated = $derived(this._user !== null && !this._user.isAnonymous);
|
|
53
|
-
/** Derived: Whether user is anonymous */
|
|
54
30
|
_isAnonymous = $derived(this._user?.isAnonymous ?? false);
|
|
55
|
-
/** Derived: Whether user's email is verified */
|
|
56
31
|
_isEmailVerified = $derived(this._user?.emailVerified ?? false);
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
_userPhotoURL = $derived(this._user?.photoURL ?? null);
|
|
63
|
-
/** Derived: User's unique ID */
|
|
64
|
-
_userId = $derived(this._user?.uid ?? null);
|
|
65
|
-
/** Derived: User's phone number */
|
|
66
|
-
_userPhoneNumber = $derived(this._user?.phoneNumber ?? null);
|
|
32
|
+
_email = $derived(this._user?.email ?? null);
|
|
33
|
+
_displayName = $derived(this._user?.displayName ?? null);
|
|
34
|
+
_photoURL = $derived(this._user?.photoURL ?? null);
|
|
35
|
+
_uid = $derived(this._user?.uid ?? null);
|
|
36
|
+
_phoneNumber = $derived(this._user?.phoneNumber ?? null);
|
|
67
37
|
constructor() {
|
|
68
38
|
if (typeof window !== 'undefined') {
|
|
69
|
-
|
|
70
|
-
this.initializeServices();
|
|
39
|
+
this.bootstrap();
|
|
71
40
|
}
|
|
72
41
|
}
|
|
73
|
-
/**
|
|
74
|
-
* Gets singleton instance of FirekitUserStore
|
|
75
|
-
* @returns {FirekitUserStore} The FirekitUserStore instance
|
|
76
|
-
*/
|
|
77
42
|
static getInstance() {
|
|
78
43
|
if (!FirekitUserStore.instance) {
|
|
79
44
|
FirekitUserStore.instance = new FirekitUserStore();
|
|
80
45
|
}
|
|
81
46
|
return FirekitUserStore.instance;
|
|
82
47
|
}
|
|
83
|
-
|
|
84
|
-
* Initializes Firebase services and auth state listener
|
|
85
|
-
* @private
|
|
86
|
-
*/
|
|
87
|
-
initializeServices() {
|
|
88
|
-
if (this._servicesInitialized)
|
|
89
|
-
return;
|
|
48
|
+
bootstrap() {
|
|
90
49
|
try {
|
|
91
50
|
this.auth = firebaseService.getAuthInstance();
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
51
|
+
try {
|
|
52
|
+
this.firestore = firebaseService.getDbInstance();
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
this.firestore = null;
|
|
56
|
+
}
|
|
57
|
+
this.listenToAuthState();
|
|
95
58
|
}
|
|
96
|
-
catch (
|
|
97
|
-
|
|
98
|
-
this._error = error instanceof Error ? error : new Error(String(error));
|
|
59
|
+
catch (err) {
|
|
60
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
99
61
|
this._loading = false;
|
|
100
62
|
this._initialized = true;
|
|
101
63
|
}
|
|
102
64
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
* @private
|
|
106
|
-
*/
|
|
107
|
-
initializeAuthStateListener() {
|
|
108
|
-
if (!this.auth) {
|
|
109
|
-
console.error('Auth instance not available');
|
|
65
|
+
listenToAuthState() {
|
|
66
|
+
if (!this.auth)
|
|
110
67
|
return;
|
|
111
|
-
}
|
|
112
68
|
onAuthStateChanged(this.auth, (firebaseUser) => {
|
|
113
|
-
this._user = firebaseUser ?
|
|
69
|
+
this._user = firebaseUser ? mapFirebaseUserToProfile(firebaseUser) : null;
|
|
114
70
|
this._loading = false;
|
|
115
71
|
this._initialized = true;
|
|
116
72
|
this._error = null;
|
|
117
|
-
}, (
|
|
118
|
-
|
|
119
|
-
this._error = error;
|
|
73
|
+
}, (err) => {
|
|
74
|
+
this._error = err;
|
|
120
75
|
this._loading = false;
|
|
121
76
|
this._initialized = true;
|
|
122
77
|
});
|
|
123
78
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
*/
|
|
128
|
-
mapFirebaseUserToProfile(user) {
|
|
129
|
-
return mapFirebaseUserToProfile(user);
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Updates user data in Firestore
|
|
133
|
-
* @private
|
|
134
|
-
*/
|
|
135
|
-
async updateUserInFirestore(user) {
|
|
136
|
-
if (!this.firestore) {
|
|
137
|
-
throw new Error('Firestore instance not available');
|
|
138
|
-
}
|
|
79
|
+
async syncToFirestore(user) {
|
|
80
|
+
if (!this.firestore)
|
|
81
|
+
return;
|
|
139
82
|
await updateUserInFirestore(this.firestore, user);
|
|
140
83
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
get user() {
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
get
|
|
150
|
-
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
get
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
return this._error;
|
|
159
|
-
}
|
|
160
|
-
/** Whether user is authenticated (not anonymous) */
|
|
161
|
-
get isAuthenticated() {
|
|
162
|
-
return this._isAuthenticated;
|
|
163
|
-
}
|
|
164
|
-
/** Whether user is anonymous */
|
|
165
|
-
get isAnonymous() {
|
|
166
|
-
return this._isAnonymous;
|
|
167
|
-
}
|
|
168
|
-
/** Whether user's email is verified */
|
|
169
|
-
get isEmailVerified() {
|
|
170
|
-
return this._isEmailVerified;
|
|
171
|
-
}
|
|
172
|
-
/** User's email address */
|
|
173
|
-
get email() {
|
|
174
|
-
return this._userEmail;
|
|
175
|
-
}
|
|
176
|
-
/** User's display name */
|
|
177
|
-
get displayName() {
|
|
178
|
-
return this._userDisplayName;
|
|
179
|
-
}
|
|
180
|
-
/** User's photo URL */
|
|
181
|
-
get photoURL() {
|
|
182
|
-
return this._userPhotoURL;
|
|
183
|
-
}
|
|
184
|
-
/** User's unique ID */
|
|
185
|
-
get uid() {
|
|
186
|
-
return this._userId;
|
|
187
|
-
}
|
|
188
|
-
/** User's phone number */
|
|
189
|
-
get phoneNumber() {
|
|
190
|
-
return this._userPhoneNumber;
|
|
191
|
-
}
|
|
192
|
-
// ========================================
|
|
193
|
-
// PROFILE UPDATE METHODS
|
|
194
|
-
// ========================================
|
|
195
|
-
/**
|
|
196
|
-
* Updates user's display name
|
|
197
|
-
* @param {string} displayName New display name
|
|
198
|
-
* @returns {Promise<void>} Promise that resolves when update completes
|
|
199
|
-
* @throws {FirekitAuthError} If update fails
|
|
200
|
-
*
|
|
201
|
-
* @example
|
|
202
|
-
* ```typescript
|
|
203
|
-
* await firekitUser.updateDisplayName("John Doe");
|
|
204
|
-
* ```
|
|
205
|
-
*/
|
|
84
|
+
currentFirebaseUser() {
|
|
85
|
+
return validateCurrentUser(this.auth);
|
|
86
|
+
}
|
|
87
|
+
// ── Public getters (reactive) ────────────────────────────────────────────────
|
|
88
|
+
get user() { return this._user; }
|
|
89
|
+
get loading() { return this._loading; }
|
|
90
|
+
get initialized() { return this._initialized; }
|
|
91
|
+
get error() { return this._error; }
|
|
92
|
+
get isAuthenticated() { return this._isAuthenticated; }
|
|
93
|
+
get isAnonymous() { return this._isAnonymous; }
|
|
94
|
+
get isEmailVerified() { return this._isEmailVerified; }
|
|
95
|
+
get email() { return this._email; }
|
|
96
|
+
get displayName() { return this._displayName; }
|
|
97
|
+
get photoURL() { return this._photoURL; }
|
|
98
|
+
get uid() { return this._uid; }
|
|
99
|
+
get phoneNumber() { return this._phoneNumber; }
|
|
100
|
+
// ── Profile updates ──────────────────────────────────────────────────────────
|
|
206
101
|
async updateDisplayName(displayName) {
|
|
207
|
-
|
|
208
|
-
throw new Error('Auth instance not available');
|
|
209
|
-
}
|
|
210
|
-
const currentUser = validateCurrentUser(this.auth);
|
|
102
|
+
const user = this.currentFirebaseUser();
|
|
211
103
|
try {
|
|
212
104
|
this._loading = true;
|
|
213
|
-
await updateProfile(
|
|
214
|
-
await this.
|
|
215
|
-
|
|
216
|
-
if (this._user) {
|
|
105
|
+
await updateProfile(user, { displayName });
|
|
106
|
+
await this.syncToFirestore(user);
|
|
107
|
+
if (this._user)
|
|
217
108
|
this._user = { ...this._user, displayName };
|
|
218
|
-
}
|
|
219
109
|
}
|
|
220
|
-
catch (
|
|
221
|
-
this._error =
|
|
222
|
-
throw createAuthError(
|
|
110
|
+
catch (err) {
|
|
111
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
112
|
+
throw createAuthError(err, 'update display name');
|
|
223
113
|
}
|
|
224
114
|
finally {
|
|
225
115
|
this._loading = false;
|
|
226
116
|
}
|
|
227
117
|
}
|
|
228
|
-
/**
|
|
229
|
-
* Updates user's photo URL
|
|
230
|
-
* @param {string} photoURL New photo URL
|
|
231
|
-
* @returns {Promise<void>} Promise that resolves when update completes
|
|
232
|
-
* @throws {FirekitAuthError} If update fails
|
|
233
|
-
*
|
|
234
|
-
* @example
|
|
235
|
-
* ```typescript
|
|
236
|
-
* await firekitUser.updatePhotoURL("https://example.com/photo.jpg");
|
|
237
|
-
* ```
|
|
238
|
-
*/
|
|
239
118
|
async updatePhotoURL(photoURL) {
|
|
240
|
-
|
|
241
|
-
throw new Error('Auth instance not available');
|
|
242
|
-
}
|
|
243
|
-
const currentUser = validateCurrentUser(this.auth);
|
|
119
|
+
const user = this.currentFirebaseUser();
|
|
244
120
|
try {
|
|
245
121
|
this._loading = true;
|
|
246
|
-
await updateProfile(
|
|
247
|
-
await this.
|
|
248
|
-
|
|
249
|
-
if (this._user) {
|
|
122
|
+
await updateProfile(user, { photoURL });
|
|
123
|
+
await this.syncToFirestore(user);
|
|
124
|
+
if (this._user)
|
|
250
125
|
this._user = { ...this._user, photoURL };
|
|
251
|
-
}
|
|
252
126
|
}
|
|
253
|
-
catch (
|
|
254
|
-
this._error =
|
|
255
|
-
throw createAuthError(
|
|
127
|
+
catch (err) {
|
|
128
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
129
|
+
throw createAuthError(err, 'update photo URL');
|
|
256
130
|
}
|
|
257
131
|
finally {
|
|
258
132
|
this._loading = false;
|
|
259
133
|
}
|
|
260
134
|
}
|
|
261
|
-
/**
|
|
262
|
-
* Updates user's profile data
|
|
263
|
-
* @param {UserProfileUpdateData} profileData Profile data to update
|
|
264
|
-
* @returns {Promise<void>} Promise that resolves when update completes
|
|
265
|
-
* @throws {FirekitAuthError} If update fails
|
|
266
|
-
*
|
|
267
|
-
* @example
|
|
268
|
-
* ```typescript
|
|
269
|
-
* await firekitUser.updateProfile({
|
|
270
|
-
* displayName: "John Smith",
|
|
271
|
-
* photoURL: "https://example.com/new-photo.jpg"
|
|
272
|
-
* });
|
|
273
|
-
* ```
|
|
274
|
-
*/
|
|
275
135
|
async updateProfile(profileData) {
|
|
276
|
-
|
|
277
|
-
throw new Error('Auth instance not available');
|
|
278
|
-
}
|
|
279
|
-
const currentUser = validateCurrentUser(this.auth);
|
|
136
|
+
const user = this.currentFirebaseUser();
|
|
280
137
|
try {
|
|
281
138
|
this._loading = true;
|
|
282
|
-
await updateProfile(
|
|
283
|
-
await this.
|
|
284
|
-
// Update local state
|
|
139
|
+
await updateProfile(user, profileData);
|
|
140
|
+
await this.syncToFirestore(user);
|
|
285
141
|
if (this._user) {
|
|
286
142
|
this._user = {
|
|
287
143
|
...this._user,
|
|
@@ -290,299 +146,133 @@ class FirekitUserStore {
|
|
|
290
146
|
};
|
|
291
147
|
}
|
|
292
148
|
}
|
|
293
|
-
catch (
|
|
294
|
-
this._error =
|
|
295
|
-
throw createAuthError(
|
|
149
|
+
catch (err) {
|
|
150
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
151
|
+
throw createAuthError(err, 'update profile');
|
|
296
152
|
}
|
|
297
153
|
finally {
|
|
298
154
|
this._loading = false;
|
|
299
155
|
}
|
|
300
156
|
}
|
|
301
|
-
/**
|
|
302
|
-
* Updates user's email address
|
|
303
|
-
* @param {string} newEmail New email address
|
|
304
|
-
* @returns {Promise<void>} Promise that resolves when update completes
|
|
305
|
-
* @throws {FirekitAuthError} If update fails
|
|
306
|
-
*
|
|
307
|
-
* @example
|
|
308
|
-
* ```typescript
|
|
309
|
-
* await firekitUser.updateEmail("newemail@example.com");
|
|
310
|
-
* ```
|
|
311
|
-
*/
|
|
312
157
|
async updateEmail(newEmail) {
|
|
313
|
-
|
|
314
|
-
throw new Error('Auth instance not available');
|
|
315
|
-
}
|
|
316
|
-
const currentUser = validateCurrentUser(this.auth);
|
|
158
|
+
const user = this.currentFirebaseUser();
|
|
317
159
|
try {
|
|
318
160
|
this._loading = true;
|
|
319
|
-
await updateEmail(
|
|
320
|
-
await this.
|
|
321
|
-
|
|
322
|
-
if (this._user) {
|
|
161
|
+
await updateEmail(user, newEmail);
|
|
162
|
+
await this.syncToFirestore(user);
|
|
163
|
+
if (this._user)
|
|
323
164
|
this._user = { ...this._user, email: newEmail, emailVerified: false };
|
|
324
|
-
}
|
|
325
165
|
}
|
|
326
|
-
catch (
|
|
327
|
-
this._error =
|
|
328
|
-
throw createAuthError(
|
|
166
|
+
catch (err) {
|
|
167
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
168
|
+
throw createAuthError(err, 'update email');
|
|
329
169
|
}
|
|
330
170
|
finally {
|
|
331
171
|
this._loading = false;
|
|
332
172
|
}
|
|
333
173
|
}
|
|
334
|
-
/**
|
|
335
|
-
* Updates user's password
|
|
336
|
-
* @param {string} newPassword New password
|
|
337
|
-
* @returns {Promise<void>} Promise that resolves when update completes
|
|
338
|
-
* @throws {FirekitAuthError} If update fails
|
|
339
|
-
*
|
|
340
|
-
* @example
|
|
341
|
-
* ```typescript
|
|
342
|
-
* await firekitUser.updatePassword("newSecurePassword123");
|
|
343
|
-
* ```
|
|
344
|
-
*/
|
|
345
174
|
async updatePassword(newPassword) {
|
|
346
|
-
|
|
347
|
-
throw new Error('Auth instance not available');
|
|
348
|
-
}
|
|
349
|
-
const currentUser = validateCurrentUser(this.auth);
|
|
175
|
+
const user = this.currentFirebaseUser();
|
|
350
176
|
try {
|
|
351
177
|
this._loading = true;
|
|
352
|
-
await updatePassword(
|
|
178
|
+
await updatePassword(user, newPassword);
|
|
353
179
|
}
|
|
354
|
-
catch (
|
|
355
|
-
this._error =
|
|
356
|
-
throw createAuthError(
|
|
180
|
+
catch (err) {
|
|
181
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
182
|
+
throw createAuthError(err, 'update password');
|
|
357
183
|
}
|
|
358
184
|
finally {
|
|
359
185
|
this._loading = false;
|
|
360
186
|
}
|
|
361
187
|
}
|
|
362
|
-
//
|
|
363
|
-
// EMAIL VERIFICATION METHODS
|
|
364
|
-
// ========================================
|
|
365
|
-
/**
|
|
366
|
-
* Sends email verification to current user
|
|
367
|
-
* @returns {Promise<void>} Promise that resolves when verification email is sent
|
|
368
|
-
* @throws {FirekitAuthError} If sending fails
|
|
369
|
-
*
|
|
370
|
-
* @example
|
|
371
|
-
* ```typescript
|
|
372
|
-
* await firekitUser.sendEmailVerification();
|
|
373
|
-
* ```
|
|
374
|
-
*/
|
|
188
|
+
// ── Email verification ───────────────────────────────────────────────────────
|
|
375
189
|
async sendEmailVerification() {
|
|
376
|
-
|
|
377
|
-
throw new Error('Auth instance not available');
|
|
378
|
-
}
|
|
379
|
-
const currentUser = validateCurrentUser(this.auth);
|
|
190
|
+
const user = this.currentFirebaseUser();
|
|
380
191
|
try {
|
|
381
|
-
await sendEmailVerification(
|
|
192
|
+
await sendEmailVerification(user);
|
|
382
193
|
}
|
|
383
|
-
catch (
|
|
384
|
-
this._error =
|
|
385
|
-
throw createAuthError(
|
|
194
|
+
catch (err) {
|
|
195
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
196
|
+
throw createAuthError(err, 'send email verification');
|
|
386
197
|
}
|
|
387
198
|
}
|
|
388
|
-
/**
|
|
389
|
-
* Reloads user to get updated email verification status
|
|
390
|
-
* @returns {Promise<void>} Promise that resolves when user is reloaded
|
|
391
|
-
* @throws {FirekitAuthError} If reload fails
|
|
392
|
-
*
|
|
393
|
-
* @example
|
|
394
|
-
* ```typescript
|
|
395
|
-
* await firekitUser.reloadUser();
|
|
396
|
-
* ```
|
|
397
|
-
*/
|
|
398
199
|
async reloadUser() {
|
|
399
|
-
|
|
400
|
-
throw new Error('Auth instance not available');
|
|
401
|
-
}
|
|
402
|
-
const currentUser = validateCurrentUser(this.auth);
|
|
200
|
+
const user = this.currentFirebaseUser();
|
|
403
201
|
try {
|
|
404
202
|
this._loading = true;
|
|
405
|
-
await reload(
|
|
406
|
-
await this.
|
|
407
|
-
|
|
408
|
-
this._user = this.mapFirebaseUserToProfile(currentUser);
|
|
203
|
+
await reload(user);
|
|
204
|
+
await this.syncToFirestore(user);
|
|
205
|
+
this._user = mapFirebaseUserToProfile(user);
|
|
409
206
|
}
|
|
410
|
-
catch (
|
|
411
|
-
this._error =
|
|
412
|
-
throw createAuthError(
|
|
207
|
+
catch (err) {
|
|
208
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
209
|
+
throw createAuthError(err, 'reload user');
|
|
413
210
|
}
|
|
414
211
|
finally {
|
|
415
212
|
this._loading = false;
|
|
416
213
|
}
|
|
417
214
|
}
|
|
418
|
-
//
|
|
419
|
-
// TOKEN METHODS
|
|
420
|
-
// ========================================
|
|
421
|
-
/**
|
|
422
|
-
* Gets the current user's ID token
|
|
423
|
-
* @param {boolean} [forceRefresh=false] Whether to force token refresh
|
|
424
|
-
* @returns {Promise<string>} Promise resolving to ID token
|
|
425
|
-
* @throws {FirekitAuthError} If getting token fails
|
|
426
|
-
*
|
|
427
|
-
* @example
|
|
428
|
-
* ```typescript
|
|
429
|
-
* const token = await firekitUser.getIdToken();
|
|
430
|
-
* ```
|
|
431
|
-
*/
|
|
215
|
+
// ── Token ────────────────────────────────────────────────────────────────────
|
|
432
216
|
async getIdToken(forceRefresh = false) {
|
|
433
|
-
|
|
434
|
-
throw new Error('Auth instance not available');
|
|
435
|
-
}
|
|
436
|
-
const currentUser = validateCurrentUser(this.auth);
|
|
217
|
+
const user = this.currentFirebaseUser();
|
|
437
218
|
try {
|
|
438
|
-
return await getIdToken(
|
|
219
|
+
return await getIdToken(user, forceRefresh);
|
|
439
220
|
}
|
|
440
|
-
catch (
|
|
441
|
-
this._error =
|
|
442
|
-
throw createAuthError(
|
|
221
|
+
catch (err) {
|
|
222
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
223
|
+
throw createAuthError(err, 'get ID token');
|
|
443
224
|
}
|
|
444
225
|
}
|
|
445
|
-
//
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
/**
|
|
449
|
-
* Gets extended user data from Firestore
|
|
450
|
-
* @returns {Promise<ExtendedUserData | null>} Promise resolving to extended user data
|
|
451
|
-
*
|
|
452
|
-
* @example
|
|
453
|
-
* ```typescript
|
|
454
|
-
* const userData = await firekitUser.getExtendedUserData();
|
|
455
|
-
* console.log(userData?.preferences);
|
|
456
|
-
* ```
|
|
457
|
-
*/
|
|
458
|
-
async getExtendedUserData() {
|
|
459
|
-
if (!this._user?.uid || !this.firestore) {
|
|
226
|
+
// ── Extended Firestore data ──────────────────────────────────────────────────
|
|
227
|
+
async getExtendedData() {
|
|
228
|
+
if (!this._user?.uid || !this.firestore)
|
|
460
229
|
return null;
|
|
461
|
-
}
|
|
462
230
|
try {
|
|
463
|
-
const
|
|
464
|
-
|
|
465
|
-
if (userDoc.exists()) {
|
|
466
|
-
return userDoc.data();
|
|
467
|
-
}
|
|
468
|
-
return null;
|
|
231
|
+
const snap = await getDoc(doc(this.firestore, 'users', this._user.uid));
|
|
232
|
+
return snap.exists() ? snap.data() : null;
|
|
469
233
|
}
|
|
470
|
-
catch
|
|
471
|
-
console.error('Failed to get extended user data:', error);
|
|
472
|
-
this._error = error;
|
|
234
|
+
catch {
|
|
473
235
|
return null;
|
|
474
236
|
}
|
|
475
237
|
}
|
|
476
|
-
|
|
477
|
-
* Updates extended user data in Firestore
|
|
478
|
-
* @param {Partial<ExtendedUserData>} data Data to update
|
|
479
|
-
* @returns {Promise<void>} Promise that resolves when update completes
|
|
480
|
-
*
|
|
481
|
-
* @example
|
|
482
|
-
* ```typescript
|
|
483
|
-
* await firekitUser.updateExtendedUserData({
|
|
484
|
-
* preferences: { theme: 'dark', language: 'en' },
|
|
485
|
-
* settings: { notifications: true }
|
|
486
|
-
* });
|
|
487
|
-
* ```
|
|
488
|
-
*/
|
|
489
|
-
async updateExtendedUserData(data) {
|
|
238
|
+
async updateExtendedData(data) {
|
|
490
239
|
if (!this._user?.uid) {
|
|
491
240
|
throw new FirekitAuthError(AuthErrorCode.USER_NOT_FOUND, 'No authenticated user found.');
|
|
492
241
|
}
|
|
493
242
|
if (!this.firestore) {
|
|
494
|
-
throw new Error('Firestore instance not available');
|
|
243
|
+
throw new Error('Firestore instance not available.');
|
|
495
244
|
}
|
|
496
245
|
try {
|
|
497
|
-
|
|
498
|
-
await setDoc(userRef, {
|
|
499
|
-
...data,
|
|
500
|
-
updatedAt: serverTimestamp()
|
|
501
|
-
}, { merge: true });
|
|
246
|
+
await setDoc(doc(this.firestore, 'users', this._user.uid), { ...data, updatedAt: serverTimestamp() }, { merge: true });
|
|
502
247
|
}
|
|
503
|
-
catch (
|
|
504
|
-
this._error =
|
|
505
|
-
throw createAuthError(
|
|
248
|
+
catch (err) {
|
|
249
|
+
this._error = err instanceof Error ? err : new Error(String(err));
|
|
250
|
+
throw createAuthError(err, 'update user data');
|
|
506
251
|
}
|
|
507
252
|
}
|
|
508
|
-
//
|
|
509
|
-
// UTILITY METHODS
|
|
510
|
-
// ========================================
|
|
253
|
+
// ── Utility ──────────────────────────────────────────────────────────────────
|
|
511
254
|
/**
|
|
512
|
-
*
|
|
513
|
-
*
|
|
514
|
-
*
|
|
515
|
-
* @example
|
|
516
|
-
* ```typescript
|
|
517
|
-
* const user = await firekitUser.waitForAuth();
|
|
518
|
-
* if (user) {
|
|
519
|
-
* console.log("User is authenticated");
|
|
520
|
-
* }
|
|
521
|
-
* ```
|
|
255
|
+
* Resolves once Firebase Auth has initialized (first `onAuthStateChanged` callback).
|
|
256
|
+
* Safe to call server-side — will resolve immediately with null.
|
|
522
257
|
*/
|
|
523
|
-
|
|
258
|
+
waitForAuth() {
|
|
259
|
+
if (this._initialized)
|
|
260
|
+
return Promise.resolve(this._user);
|
|
261
|
+
// $effect.root creates a reactive scope outside of component initialization,
|
|
262
|
+
// so this works safely whether called inside or outside a Svelte component.
|
|
524
263
|
return new Promise((resolve) => {
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
// Check again in next tick
|
|
536
|
-
setTimeout(checkInitialized, 10);
|
|
537
|
-
}
|
|
538
|
-
};
|
|
539
|
-
checkInitialized();
|
|
264
|
+
const stop = $effect.root(() => {
|
|
265
|
+
$effect(() => {
|
|
266
|
+
if (this._initialized) {
|
|
267
|
+
stop();
|
|
268
|
+
resolve(this._user);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
});
|
|
540
272
|
});
|
|
541
273
|
}
|
|
542
|
-
/**
|
|
543
|
-
* Clears any error state
|
|
544
|
-
*/
|
|
545
274
|
clearError() {
|
|
546
275
|
this._error = null;
|
|
547
276
|
}
|
|
548
|
-
/**
|
|
549
|
-
* Manually sets loading state (use with caution)
|
|
550
|
-
* @param {boolean} loading Loading state
|
|
551
|
-
*/
|
|
552
|
-
setLoading(loading) {
|
|
553
|
-
this._loading = loading;
|
|
554
|
-
}
|
|
555
|
-
/**
|
|
556
|
-
* Resets the store to initial state
|
|
557
|
-
*/
|
|
558
|
-
reset() {
|
|
559
|
-
this._user = null;
|
|
560
|
-
this._loading = true;
|
|
561
|
-
this._initialized = false;
|
|
562
|
-
this._error = null;
|
|
563
|
-
this._servicesInitialized = false;
|
|
564
|
-
this.auth = null;
|
|
565
|
-
this.firestore = null;
|
|
566
|
-
}
|
|
567
277
|
}
|
|
568
|
-
/**
|
|
569
|
-
* Pre-initialized singleton instance of FirekitUserStore.
|
|
570
|
-
* Provides reactive user state management for Svelte applications.
|
|
571
|
-
*
|
|
572
|
-
* @example
|
|
573
|
-
* ```typescript
|
|
574
|
-
* import { firekitUser } from 'svelte-firekit';
|
|
575
|
-
*
|
|
576
|
-
* // In a Svelte component
|
|
577
|
-
* $: if (firekitUser.isAuthenticated) {
|
|
578
|
-
* console.log("Welcome:", firekitUser.displayName);
|
|
579
|
-
* }
|
|
580
|
-
*
|
|
581
|
-
* // Update profile
|
|
582
|
-
* await firekitUser.updateDisplayName("John Doe");
|
|
583
|
-
*
|
|
584
|
-
* // Get extended data
|
|
585
|
-
* const userData = await firekitUser.getExtendedUserData();
|
|
586
|
-
* ```
|
|
587
|
-
*/
|
|
588
278
|
export const firekitUser = FirekitUserStore.getInstance();
|