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