@tulip-systems/core 0.8.1 → 0.8.3
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/dist/components/common/icons.d.mts +1 -2
- package/dist/components/common/icons.mjs +1 -2
- package/dist/components/common/status.d.mts +1 -2
- package/dist/components/common/status.mjs +1 -2
- package/dist/components/editor/components/content.client.d.mts +1 -2
- package/dist/components/editor/components/content.client.mjs +1 -2
- package/dist/components/editor/components/editor.client.d.mts +1 -2
- package/dist/components/editor/components/editor.client.mjs +1 -2
- package/dist/components/editor/components/menu-nodes.client.mjs +1 -2
- package/dist/components/editor/components/menu.client.d.mts +1 -2
- package/dist/components/editor/components/menu.client.mjs +1 -2
- package/dist/components/editor/extensions/file-handler/extension.d.mts +1 -2
- package/dist/components/editor/extensions/file-handler/extension.mjs +1 -2
- package/dist/components/editor/extensions/file-handler/strategy.d.mts +1 -2
- package/dist/components/editor/extensions/file-handler/strategy.mjs +1 -2
- package/dist/components/editor/extensions/file-handler/utils.mjs +1 -2
- package/dist/components/editor/extensions/image/extension.d.mts +1 -2
- package/dist/components/editor/extensions/image/extension.mjs +1 -2
- package/dist/components/editor/extensions/skeleton/extension.mjs +1 -2
- package/dist/components/editor/extensions/skeleton/renderer.mjs +1 -2
- package/dist/components/editor/lib/constants.d.mts +1 -2
- package/dist/components/editor/lib/constants.mjs +1 -2
- package/dist/components/editor/lib/extensions.d.mts +1 -2
- package/dist/components/editor/lib/extensions.mjs +1 -2
- package/dist/components/editor/lib/helpers.d.mts +1 -2
- package/dist/components/editor/lib/helpers.mjs +1 -2
- package/dist/components/editor/lib/types.d.mts +1 -2
- package/dist/components/editor/lib/variants.mjs +1 -2
- package/dist/components/emails/forget-password-email.mjs +2 -3
- package/dist/components/header/back-button.client.d.mts +1 -2
- package/dist/components/header/back-button.client.mjs +1 -2
- package/dist/components/header/bottom-bar.client.d.mts +1 -2
- package/dist/components/header/bottom-bar.client.mjs +1 -2
- package/dist/components/header/breadcrumbs.client.d.mts +1 -2
- package/dist/components/header/breadcrumbs.client.mjs +1 -2
- package/dist/components/header/header.client.d.mts +1 -2
- package/dist/components/header/header.client.mjs +1 -2
- package/dist/components/header/indicator.client.mjs +1 -2
- package/dist/components/header/mobile-nav-switcher.client.d.mts +1 -2
- package/dist/components/header/mobile-nav-switcher.client.mjs +1 -2
- package/dist/components/header/top-bar.client.d.mts +1 -2
- package/dist/components/header/top-bar.client.mjs +1 -2
- package/dist/components/layouts/admin-content.client.d.mts +1 -2
- package/dist/components/layouts/admin-content.client.mjs +1 -2
- package/dist/components/layouts/admin-error-pages.d.mts +1 -2
- package/dist/components/layouts/admin-error-pages.mjs +1 -2
- package/dist/components/layouts/admin-layout.d.mts +1 -2
- package/dist/components/layouts/admin-layout.mjs +1 -2
- package/dist/components/layouts/admin-loading.d.mts +1 -2
- package/dist/components/layouts/admin-loading.mjs +1 -2
- package/dist/components/layouts/empty-page.d.mts +1 -2
- package/dist/components/layouts/empty-page.mjs +1 -2
- package/dist/components/layouts/error-page.d.mts +1 -2
- package/dist/components/layouts/error-page.mjs +1 -2
- package/dist/components/layouts/error-sections.d.mts +1 -2
- package/dist/components/layouts/error-sections.mjs +1 -2
- package/dist/components/layouts/list-layout.d.mts +1 -2
- package/dist/components/layouts/list-layout.mjs +1 -2
- package/dist/components/layouts/providers.client.d.mts +1 -2
- package/dist/components/layouts/providers.client.mjs +1 -2
- package/dist/components/layouts/root-error-pages.d.mts +1 -2
- package/dist/components/layouts/root-error-pages.mjs +1 -2
- package/dist/components/layouts/root-layout.server.d.mts +1 -2
- package/dist/components/layouts/root-layout.server.mjs +1 -2
- package/dist/components/layouts/root-loading.d.mts +1 -2
- package/dist/components/layouts/root-loading.mjs +1 -2
- package/dist/components/layouts/tab-layout.d.mts +1 -2
- package/dist/components/layouts/tab-layout.mjs +1 -2
- package/dist/components/lists/data-list.d.mts +1 -2
- package/dist/components/lists/data-list.mjs +1 -2
- package/dist/components/lists/data-stack.d.mts +1 -2
- package/dist/components/lists/data-stack.mjs +1 -2
- package/dist/components/navigation/admin-sidebar-header.client.mjs +1 -2
- package/dist/components/navigation/admin-sidebar-paths.client.d.mts +1 -2
- package/dist/components/navigation/admin-sidebar-paths.client.mjs +1 -2
- package/dist/components/navigation/admin-sidebar-skeleton.mjs +1 -2
- package/dist/components/ui/accordion.client.d.mts +1 -2
- package/dist/components/ui/accordion.client.mjs +1 -2
- package/dist/components/ui/alert-dialog.client.d.mts +1 -2
- package/dist/components/ui/alert-dialog.client.mjs +1 -2
- package/dist/components/ui/alert.d.mts +1 -2
- package/dist/components/ui/alert.mjs +1 -2
- package/dist/components/ui/aspect-ratio.client.d.mts +1 -2
- package/dist/components/ui/aspect-ratio.client.mjs +1 -2
- package/dist/components/ui/avatar.client.d.mts +1 -2
- package/dist/components/ui/avatar.client.mjs +1 -2
- package/dist/components/ui/badge.d.mts +2 -3
- package/dist/components/ui/badge.mjs +1 -2
- package/dist/components/ui/breadcrumb.d.mts +1 -2
- package/dist/components/ui/breadcrumb.mjs +1 -2
- package/dist/components/ui/button-group.d.mts +1 -2
- package/dist/components/ui/button-group.mjs +1 -2
- package/dist/components/ui/button.d.mts +2 -3
- package/dist/components/ui/button.mjs +1 -2
- package/dist/components/ui/calendar.client.d.mts +1 -2
- package/dist/components/ui/calendar.client.mjs +1 -2
- package/dist/components/ui/card.d.mts +1 -2
- package/dist/components/ui/card.mjs +1 -2
- package/dist/components/ui/carousel.client.d.mts +1 -2
- package/dist/components/ui/carousel.client.mjs +1 -2
- package/dist/components/ui/chart.client.d.mts +1 -2
- package/dist/components/ui/chart.client.mjs +1 -2
- package/dist/components/ui/checkbox.client.d.mts +1 -2
- package/dist/components/ui/checkbox.client.mjs +1 -2
- package/dist/components/ui/collapsible.client.d.mts +1 -2
- package/dist/components/ui/collapsible.client.mjs +1 -2
- package/dist/components/ui/color-picker.client.d.mts +1 -2
- package/dist/components/ui/color-picker.client.mjs +1 -2
- package/dist/components/ui/combobox-dropdown.client.d.mts +1 -2
- package/dist/components/ui/combobox-dropdown.client.mjs +1 -2
- package/dist/components/ui/combobox.client.d.mts +1 -2
- package/dist/components/ui/combobox.client.mjs +1 -2
- package/dist/components/ui/command.client.d.mts +1 -2
- package/dist/components/ui/command.client.mjs +1 -2
- package/dist/components/ui/context-menu.client.d.mts +1 -2
- package/dist/components/ui/context-menu.client.mjs +1 -2
- package/dist/components/ui/date-picker.client.d.mts +1 -2
- package/dist/components/ui/date-picker.client.mjs +1 -2
- package/dist/components/ui/dialog.client.d.mts +1 -2
- package/dist/components/ui/dialog.client.mjs +1 -2
- package/dist/components/ui/drawer.client.d.mts +1 -2
- package/dist/components/ui/drawer.client.mjs +1 -2
- package/dist/components/ui/dropdown-menu.client.d.mts +1 -2
- package/dist/components/ui/dropdown-menu.client.mjs +1 -2
- package/dist/components/ui/empty.d.mts +1 -2
- package/dist/components/ui/empty.mjs +1 -2
- package/dist/components/ui/field.client.d.mts +1 -2
- package/dist/components/ui/field.client.mjs +1 -2
- package/dist/components/ui/form.client.d.mts +1 -2
- package/dist/components/ui/form.client.mjs +1 -2
- package/dist/components/ui/hover-card.client.d.mts +1 -2
- package/dist/components/ui/hover-card.client.mjs +1 -2
- package/dist/components/ui/input-date-time.client.d.mts +1 -2
- package/dist/components/ui/input-date-time.client.mjs +1 -2
- package/dist/components/ui/input-date.d.mts +1 -2
- package/dist/components/ui/input-date.mjs +1 -2
- package/dist/components/ui/input-group.client.d.mts +1 -2
- package/dist/components/ui/input-group.client.mjs +1 -2
- package/dist/components/ui/input-recipient.d.mts +1 -2
- package/dist/components/ui/input-recipient.mjs +1 -2
- package/dist/components/ui/input-time.d.mts +1 -2
- package/dist/components/ui/input-time.mjs +1 -2
- package/dist/components/ui/input.d.mts +1 -2
- package/dist/components/ui/input.mjs +1 -2
- package/dist/components/ui/item.d.mts +2 -3
- package/dist/components/ui/item.mjs +1 -2
- package/dist/components/ui/kbd.d.mts +1 -2
- package/dist/components/ui/kbd.mjs +1 -2
- package/dist/components/ui/label.d.mts +1 -2
- package/dist/components/ui/label.mjs +1 -2
- package/dist/components/ui/loader.d.mts +1 -2
- package/dist/components/ui/loader.mjs +1 -2
- package/dist/components/ui/navigation-menu.d.mts +1 -2
- package/dist/components/ui/navigation-menu.mjs +1 -2
- package/dist/components/ui/pagination.d.mts +1 -2
- package/dist/components/ui/pagination.mjs +1 -2
- package/dist/components/ui/popover.client.d.mts +1 -2
- package/dist/components/ui/popover.client.mjs +1 -2
- package/dist/components/ui/progress.client.d.mts +1 -2
- package/dist/components/ui/progress.client.mjs +1 -2
- package/dist/components/ui/radio-group.d.mts +1 -2
- package/dist/components/ui/radio-group.mjs +1 -2
- package/dist/components/ui/resizable.client.d.mts +1 -2
- package/dist/components/ui/resizable.client.mjs +1 -2
- package/dist/components/ui/scroll-area.d.mts +1 -2
- package/dist/components/ui/scroll-area.mjs +1 -2
- package/dist/components/ui/select.client.d.mts +1 -2
- package/dist/components/ui/select.client.mjs +1 -2
- package/dist/components/ui/separator.d.mts +1 -2
- package/dist/components/ui/separator.mjs +1 -2
- package/dist/components/ui/sheet.client.d.mts +1 -2
- package/dist/components/ui/sheet.client.mjs +1 -2
- package/dist/components/ui/sidebar.client.d.mts +1 -2
- package/dist/components/ui/sidebar.client.mjs +1 -2
- package/dist/components/ui/skeleton.d.mts +1 -2
- package/dist/components/ui/skeleton.mjs +1 -2
- package/dist/components/ui/slider.d.mts +1 -2
- package/dist/components/ui/slider.mjs +1 -2
- package/dist/components/ui/sonner.client.d.mts +1 -2
- package/dist/components/ui/sonner.client.mjs +1 -2
- package/dist/components/ui/spinner.d.mts +1 -2
- package/dist/components/ui/spinner.mjs +1 -2
- package/dist/components/ui/switch.client.d.mts +1 -2
- package/dist/components/ui/switch.client.mjs +1 -2
- package/dist/components/ui/tabs.client.d.mts +1 -2
- package/dist/components/ui/tabs.client.mjs +1 -2
- package/dist/components/ui/textarea.d.mts +1 -2
- package/dist/components/ui/textarea.mjs +1 -2
- package/dist/components/ui/toggle-group.client.d.mts +1 -2
- package/dist/components/ui/toggle-group.client.mjs +1 -2
- package/dist/components/ui/toggle.client.d.mts +1 -2
- package/dist/components/ui/toggle.client.mjs +1 -2
- package/dist/components/ui/tooltip.client.d.mts +1 -2
- package/dist/components/ui/tooltip.client.mjs +1 -2
- package/dist/lib/hooks/use-action.d.mts +1 -2
- package/dist/lib/hooks/use-action.mjs +1 -2
- package/dist/lib/hooks/use-indicator.d.mts +1 -2
- package/dist/lib/hooks/use-indicator.mjs +1 -2
- package/dist/lib/hooks/use-mobile.client.d.mts +1 -2
- package/dist/lib/hooks/use-mobile.client.mjs +1 -2
- package/dist/lib/types/config.d.mts +1 -2
- package/dist/lib/utils/array-move.d.mts +1 -2
- package/dist/lib/utils/array-move.mjs +1 -2
- package/dist/lib/utils/cn.d.mts +1 -2
- package/dist/lib/utils/cn.mjs +1 -2
- package/dist/lib/utils/fonts.d.mts +1 -2
- package/dist/lib/utils/fonts.mjs +1 -2
- package/dist/lib/utils/format.d.mts +1 -2
- package/dist/lib/utils/format.mjs +1 -2
- package/dist/lib/utils/manifest.d.mts +1 -2
- package/dist/lib/utils/manifest.mjs +1 -2
- package/dist/lib/utils/markdown.d.mts +1 -2
- package/dist/lib/utils/markdown.mjs +1 -2
- package/dist/lib/utils/url.d.mts +1 -2
- package/dist/lib/utils/url.mjs +1 -2
- package/dist/lib/utils/user-agent.mjs +1 -2
- package/dist/modules/auth/components/allowed.client.d.mts +1 -2
- package/dist/modules/auth/components/allowed.client.mjs +1 -2
- package/dist/modules/auth/components/auth-layout.server.d.mts +1 -2
- package/dist/modules/auth/components/auth-layout.server.mjs +1 -2
- package/dist/modules/auth/components/auth-loading.d.mts +1 -2
- package/dist/modules/auth/components/auth-loading.mjs +1 -2
- package/dist/modules/auth/components/create-first-user-guard.server.d.mts +1 -2
- package/dist/modules/auth/components/create-first-user-guard.server.mjs +1 -2
- package/dist/modules/auth/components/create-first-user-page.client.d.mts +1 -2
- package/dist/modules/auth/components/create-first-user-page.client.mjs +1 -2
- package/dist/modules/auth/components/forget-password-page.client.d.mts +1 -2
- package/dist/modules/auth/components/forget-password-page.client.mjs +1 -2
- package/dist/modules/auth/components/guard.server.d.mts +1 -2
- package/dist/modules/auth/components/guard.server.mjs +1 -2
- package/dist/modules/auth/components/login-page.client.d.mts +1 -2
- package/dist/modules/auth/components/login-page.client.mjs +1 -2
- package/dist/modules/auth/components/reset-password-page.client.d.mts +1 -2
- package/dist/modules/auth/components/reset-password-page.client.mjs +1 -2
- package/dist/modules/auth/components/update-password-command.d.mts +1 -2
- package/dist/modules/auth/components/update-password-command.mjs +1 -2
- package/dist/modules/auth/db/schema.d.mts +1 -2
- package/dist/modules/auth/db/schema.mjs +1 -2
- package/dist/modules/auth/handler/create-client.client.d.mts +810 -572
- package/dist/modules/auth/handler/create-client.client.mjs +1 -2
- package/dist/modules/auth/handler/proxy.server.d.mts +1 -2
- package/dist/modules/auth/handler/proxy.server.mjs +1 -2
- package/dist/modules/auth/handler/route.server.d.mts +1 -2
- package/dist/modules/auth/handler/route.server.mjs +1 -2
- package/dist/modules/auth/handler/service.server.d.mts +121 -94
- package/dist/modules/auth/handler/service.server.mjs +1 -2
- package/dist/modules/auth/hooks/use-auth-client.d.mts +1 -2
- package/dist/modules/auth/hooks/use-auth-client.mjs +1 -2
- package/dist/modules/auth/hooks/use-permission.d.mts +1 -2
- package/dist/modules/auth/hooks/use-permission.mjs +1 -2
- package/dist/modules/auth/hooks/use-session.d.mts +1 -2
- package/dist/modules/auth/hooks/use-session.mjs +1 -2
- package/dist/modules/auth/lib/helpers.server.d.mts +2 -3
- package/dist/modules/auth/lib/helpers.server.mjs +1 -2
- package/dist/modules/auth/lib/permissions.d.mts +1 -2
- package/dist/modules/auth/lib/permissions.mjs +1 -2
- package/dist/modules/auth/lib/validators.d.mts +1 -2
- package/dist/modules/auth/lib/validators.mjs +1 -2
- package/dist/modules/commands/components/alert-dialog-command.client.d.mts +1 -2
- package/dist/modules/commands/components/alert-dialog-command.client.mjs +1 -2
- package/dist/modules/commands/components/click-command.client.d.mts +1 -2
- package/dist/modules/commands/components/click-command.client.mjs +1 -2
- package/dist/modules/commands/components/command-trigger.client.d.mts +1 -2
- package/dist/modules/commands/components/command-trigger.client.mjs +1 -2
- package/dist/modules/commands/components/dialog-command.client.d.mts +1 -2
- package/dist/modules/commands/components/dialog-command.client.mjs +1 -2
- package/dist/modules/commands/components/dropdown-command.client.d.mts +1 -2
- package/dist/modules/commands/components/dropdown-command.client.mjs +1 -2
- package/dist/modules/commands/components/empty-command.client.d.mts +1 -2
- package/dist/modules/commands/components/empty-command.client.mjs +1 -2
- package/dist/modules/commands/components/form-dialog-command.client.d.mts +1 -2
- package/dist/modules/commands/components/form-dialog-command.client.mjs +1 -2
- package/dist/modules/commands/components/render-command.mjs +1 -2
- package/dist/modules/commands/hooks/context.client.mjs +1 -2
- package/dist/modules/commands/hooks/use-command-menu.client.d.mts +1 -2
- package/dist/modules/commands/hooks/use-command-menu.client.mjs +1 -2
- package/dist/modules/commands/hooks/use-command-mutation.client.d.mts +1 -2
- package/dist/modules/commands/hooks/use-command-mutation.client.mjs +1 -2
- package/dist/modules/commands/lib/definitions.d.mts +1 -2
- package/dist/modules/commands/lib/factory.d.mts +1 -2
- package/dist/modules/commands/lib/factory.mjs +1 -2
- package/dist/modules/commands/menus/context-menu.client.d.mts +1 -2
- package/dist/modules/commands/menus/context-menu.client.mjs +1 -2
- package/dist/modules/commands/menus/dropdown-menu.client.d.mts +1 -2
- package/dist/modules/commands/menus/dropdown-menu.client.mjs +1 -2
- package/dist/modules/commands/menus/floating-menu.client.d.mts +1 -2
- package/dist/modules/commands/menus/floating-menu.client.mjs +1 -2
- package/dist/modules/commands/menus/inline-menu.client.d.mts +1 -2
- package/dist/modules/commands/menus/inline-menu.client.mjs +1 -2
- package/dist/modules/commands/menus/responsive-menu.client.d.mts +1 -2
- package/dist/modules/commands/menus/responsive-menu.client.mjs +1 -2
- package/dist/modules/commands/utils/archive-command.client.d.mts +1 -2
- package/dist/modules/commands/utils/archive-command.client.mjs +1 -2
- package/dist/modules/commands/utils/delete-command.client.d.mts +1 -2
- package/dist/modules/commands/utils/delete-command.client.mjs +1 -2
- package/dist/modules/config/lib/config.d.mts +1 -2
- package/dist/modules/config/lib/config.mjs +1 -2
- package/dist/modules/config/lib/context.d.mts +1 -2
- package/dist/modules/config/lib/context.mjs +1 -2
- package/dist/modules/config/paths/helpers.d.mts +1 -2
- package/dist/modules/config/paths/helpers.mjs +1 -2
- package/dist/modules/config/paths/types.d.mts +1 -2
- package/dist/modules/data-tables/components/cell/common.client.d.mts +1 -2
- package/dist/modules/data-tables/components/cell/common.client.mjs +1 -2
- package/dist/modules/data-tables/components/cell/index.client.d.mts +1 -2
- package/dist/modules/data-tables/components/cell/index.client.mjs +1 -2
- package/dist/modules/data-tables/components/cell/select.client.d.mts +1 -2
- package/dist/modules/data-tables/components/cell/select.client.mjs +1 -2
- package/dist/modules/data-tables/components/column-header.d.mts +1 -2
- package/dist/modules/data-tables/components/column-header.mjs +1 -2
- package/dist/modules/data-tables/components/filters/combobox.client.d.mts +1 -2
- package/dist/modules/data-tables/components/filters/combobox.client.mjs +1 -2
- package/dist/modules/data-tables/components/filters/slider.client.d.mts +1 -2
- package/dist/modules/data-tables/components/filters/slider.client.mjs +1 -2
- package/dist/modules/data-tables/components/footer.mjs +1 -2
- package/dist/modules/data-tables/components/header.d.mts +1 -2
- package/dist/modules/data-tables/components/header.mjs +1 -2
- package/dist/modules/data-tables/components/layout.d.mts +1 -2
- package/dist/modules/data-tables/components/layout.mjs +1 -2
- package/dist/modules/data-tables/components/search-input.client.d.mts +1 -2
- package/dist/modules/data-tables/components/search-input.client.mjs +1 -2
- package/dist/modules/data-tables/components/skeleton.d.mts +1 -2
- package/dist/modules/data-tables/components/skeleton.mjs +1 -2
- package/dist/modules/data-tables/components/table.d.mts +1 -2
- package/dist/modules/data-tables/components/table.mjs +1 -2
- package/dist/modules/data-tables/components/toolbar.d.mts +1 -2
- package/dist/modules/data-tables/components/toolbar.mjs +1 -2
- package/dist/modules/data-tables/hooks/use-context.client.d.mts +1 -2
- package/dist/modules/data-tables/hooks/use-context.client.mjs +1 -2
- package/dist/modules/data-tables/hooks/use-search.client.mjs +1 -2
- package/dist/modules/data-tables/hooks/use-selection.client.mjs +1 -2
- package/dist/modules/data-tables/hooks/use-table.client.d.mts +1 -2
- package/dist/modules/data-tables/hooks/use-table.client.mjs +1 -2
- package/dist/modules/data-tables/lib/converters/cursor.d.mts +1 -2
- package/dist/modules/data-tables/lib/converters/cursor.mjs +1 -2
- package/dist/modules/data-tables/lib/converters/dto.d.mts +1 -2
- package/dist/modules/data-tables/lib/converters/dto.mjs +1 -2
- package/dist/modules/data-tables/lib/converters/filter.d.mts +1 -2
- package/dist/modules/data-tables/lib/converters/filter.mjs +1 -2
- package/dist/modules/data-tables/lib/converters/search.d.mts +1 -2
- package/dist/modules/data-tables/lib/converters/search.mjs +1 -2
- package/dist/modules/data-tables/lib/converters/sorting.d.mts +1 -2
- package/dist/modules/data-tables/lib/converters/sorting.mjs +1 -2
- package/dist/modules/data-tables/lib/filters/config.d.mts +1 -2
- package/dist/modules/data-tables/lib/filters/config.mjs +1 -2
- package/dist/modules/data-tables/lib/filters/helpers.d.mts +1 -2
- package/dist/modules/data-tables/lib/filters/helpers.mjs +1 -2
- package/dist/modules/data-tables/lib/filters/parsers.d.mts +1 -2
- package/dist/modules/data-tables/lib/filters/parsers.mjs +1 -2
- package/dist/modules/data-tables/lib/filters/resolvers.d.mts +1 -2
- package/dist/modules/data-tables/lib/filters/resolvers.mjs +1 -2
- package/dist/modules/data-tables/lib/helpers/create-column.mjs +1 -2
- package/dist/modules/data-tables/lib/search-params.d.mts +1 -2
- package/dist/modules/data-tables/lib/search-params.mjs +1 -2
- package/dist/modules/data-tables/lib/types.d.mts +1 -2
- package/dist/modules/data-tables/lib/validators.d.mts +1 -2
- package/dist/modules/data-tables/lib/validators.mjs +1 -2
- package/dist/modules/data-tables/server/get-data.server.d.mts +2 -3
- package/dist/modules/data-tables/server/get-data.server.mjs +1 -2
- package/dist/modules/data-tables/strategies/helpers/sorting.mjs +1 -2
- package/dist/modules/data-tables/strategies/infinite/components.mjs +1 -2
- package/dist/modules/data-tables/strategies/infinite/strategy.d.mts +1 -2
- package/dist/modules/data-tables/strategies/infinite/strategy.mjs +1 -2
- package/dist/modules/data-tables/strategies/pagination/components.mjs +1 -2
- package/dist/modules/data-tables/strategies/pagination/strategy.d.mts +1 -2
- package/dist/modules/data-tables/strategies/pagination/strategy.mjs +1 -2
- package/dist/modules/data-tables/tables/data-table/components/body.mjs +1 -2
- package/dist/modules/data-tables/tables/data-table/components/header.mjs +1 -2
- package/dist/modules/data-tables/tables/data-table/components/row.mjs +1 -2
- package/dist/modules/data-tables/tables/data-table/components/table.d.mts +1 -2
- package/dist/modules/data-tables/tables/data-table/components/table.mjs +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/body.mjs +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/cells/common.d.mts +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/cells/common.mjs +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.d.mts +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.mjs +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/cells/read-only.d.mts +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/cells/read-only.mjs +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/header.mjs +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/row.client.mjs +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/table.d.mts +1 -2
- package/dist/modules/data-tables/tables/inline-table/components/table.mjs +1 -2
- package/dist/modules/data-tables/tables/inline-table/hooks/context.client.d.mts +1 -2
- package/dist/modules/data-tables/tables/inline-table/hooks/context.client.mjs +1 -2
- package/dist/modules/data-tables/tables/inline-table/hooks/use-hotkeys.client.d.mts +2 -3
- package/dist/modules/data-tables/tables/inline-table/hooks/use-hotkeys.client.mjs +1 -2
- package/dist/modules/database/lib/helpers.d.mts +1 -2
- package/dist/modules/database/lib/helpers.mjs +1 -2
- package/dist/modules/database/lib/service.server.d.mts +1 -2
- package/dist/modules/database/lib/service.server.mjs +1 -2
- package/dist/modules/database/lib/types.d.mts +1 -2
- package/dist/modules/emails/lib/service.server.d.mts +1 -2
- package/dist/modules/emails/lib/service.server.mjs +1 -2
- package/dist/modules/inline-edit/components/combobox-dropdown.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/combobox-dropdown.client.mjs +1 -2
- package/dist/modules/inline-edit/components/combobox.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/combobox.client.mjs +1 -2
- package/dist/modules/inline-edit/components/date-input.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/date-input.client.mjs +1 -2
- package/dist/modules/inline-edit/components/date-picker.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/date-picker.client.mjs +1 -2
- package/dist/modules/inline-edit/components/date-time.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/date-time.client.mjs +1 -2
- package/dist/modules/inline-edit/components/editor.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/editor.client.mjs +1 -2
- package/dist/modules/inline-edit/components/input-recipient.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/input-recipient.client.mjs +1 -2
- package/dist/modules/inline-edit/components/input-toggle.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/input-toggle.client.mjs +1 -2
- package/dist/modules/inline-edit/components/input.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/input.client.mjs +1 -2
- package/dist/modules/inline-edit/components/select.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/select.client.mjs +1 -2
- package/dist/modules/inline-edit/components/switch.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/switch.client.mjs +1 -2
- package/dist/modules/inline-edit/components/toggle.client.d.mts +1 -2
- package/dist/modules/inline-edit/components/toggle.client.mjs +1 -2
- package/dist/modules/inline-edit/hooks/context.client.d.mts +1 -2
- package/dist/modules/inline-edit/hooks/context.client.mjs +1 -2
- package/dist/modules/inline-edit/hooks/use-inline.client.d.mts +1 -2
- package/dist/modules/inline-edit/hooks/use-inline.client.mjs +1 -2
- package/dist/modules/inline-edit/lib/validators.d.mts +1 -2
- package/dist/modules/inline-edit/lib/validators.mjs +1 -2
- package/dist/modules/inline-edit/lib/variants.d.mts +2 -3
- package/dist/modules/inline-edit/lib/variants.mjs +1 -2
- package/dist/modules/router/handler/caller.client.d.mts +1 -2
- package/dist/modules/router/handler/caller.client.mjs +1 -2
- package/dist/modules/router/handler/caller.server.d.mts +1 -2
- package/dist/modules/router/handler/caller.server.mjs +1 -2
- package/dist/modules/router/handler/context.server.d.mts +2 -3
- package/dist/modules/router/handler/context.server.mjs +1 -2
- package/dist/modules/router/handler/init.server.d.mts +3 -31
- package/dist/modules/router/handler/init.server.mjs +8 -6
- package/dist/modules/router/handler/register.server.d.mts +1 -2
- package/dist/modules/router/handler/register.server.mjs +1 -2
- package/dist/modules/router/handler/route.server.d.mts +2 -3
- package/dist/modules/router/handler/route.server.mjs +1 -2
- package/dist/modules/router/lib/helpers.mjs +1 -2
- package/dist/modules/router/lib/query-client.d.mts +1 -2
- package/dist/modules/router/lib/query-client.mjs +1 -2
- package/dist/modules/router/lib/query-client.server.d.mts +1 -2
- package/dist/modules/router/lib/query-client.server.mjs +1 -2
- package/dist/modules/router/lib/validators.d.mts +1 -2
- package/dist/modules/router/lib/validators.mjs +1 -2
- package/dist/modules/storage/components/dropzone-context.client.d.mts +1 -2
- package/dist/modules/storage/components/dropzone-context.client.mjs +1 -2
- package/dist/modules/storage/components/dropzone.client.d.mts +1 -2
- package/dist/modules/storage/components/dropzone.client.mjs +1 -2
- package/dist/modules/storage/components/image-grid.client.d.mts +1 -2
- package/dist/modules/storage/components/image-grid.client.mjs +1 -2
- package/dist/modules/storage/components/image.client.d.mts +1 -2
- package/dist/modules/storage/components/image.client.mjs +1 -2
- package/dist/modules/storage/components/upload-button.client.d.mts +1 -2
- package/dist/modules/storage/components/upload-button.client.mjs +1 -2
- package/dist/modules/storage/components/upload-zone-context.client.d.mts +1 -2
- package/dist/modules/storage/components/upload-zone-context.client.mjs +1 -2
- package/dist/modules/storage/components/upload-zone.client.d.mts +1 -2
- package/dist/modules/storage/components/upload-zone.client.mjs +1 -2
- package/dist/modules/storage/lib/constants.d.mts +1 -2
- package/dist/modules/storage/lib/constants.mjs +1 -2
- package/dist/modules/storage/lib/helpers.d.mts +1 -2
- package/dist/modules/storage/lib/helpers.mjs +1 -2
- package/dist/modules/storage/lib/procedures.server.d.mts +2 -3
- package/dist/modules/storage/lib/procedures.server.mjs +1 -2
- package/dist/modules/storage/lib/router-handlers.server.d.mts +2 -3
- package/dist/modules/storage/lib/router-handlers.server.mjs +1 -2
- package/dist/modules/storage/lib/schema.d.mts +1 -2
- package/dist/modules/storage/lib/schema.mjs +1 -2
- package/dist/modules/storage/lib/service.server.d.mts +10 -11
- package/dist/modules/storage/lib/service.server.mjs +1 -2
- package/dist/modules/storage/lib/upload.client.d.mts +1 -2
- package/dist/modules/storage/lib/upload.client.mjs +1 -2
- package/dist/modules/storage/lib/validators.d.mts +1 -2
- package/dist/modules/storage/lib/validators.mjs +1 -2
- package/dist/modules/storage/providers/adapters/s3.server.d.mts +1 -2
- package/dist/modules/storage/providers/adapters/s3.server.mjs +1 -2
- package/dist/modules/storage/providers/lib/constants.d.mts +1 -2
- package/dist/modules/storage/providers/lib/constants.mjs +1 -2
- package/dist/modules/storage/providers/lib/errors.d.mts +1 -2
- package/dist/modules/storage/providers/lib/errors.mjs +1 -2
- package/dist/modules/storage/providers/lib/types.d.mts +1 -2
- package/dist/modules/storage/providers/lib/validators.d.mts +1 -2
- package/dist/modules/storage/providers/lib/validators.mjs +1 -2
- package/package.json +67 -63
- package/src/components/emails/forget-password-email.tsx +1 -1
- package/src/modules/auth/lib/helpers.server.ts +1 -1
- package/src/modules/data-tables/server/get-data.server.ts +1 -1
- package/src/modules/data-tables/tables/inline-table/hooks/use-hotkeys.client.ts +1 -2
- package/src/modules/router/handler/context.server.ts +1 -1
- package/src/modules/router/handler/init.server.ts +2 -1
- package/src/modules/router/handler/route.server.ts +1 -1
- package/src/modules/storage/lib/procedures.server.ts +1 -1
- package/src/modules/storage/lib/router-handlers.server.ts +1 -1
- package/dist/components/common/icons.d.mts.map +0 -1
- package/dist/components/common/icons.mjs.map +0 -1
- package/dist/components/common/status.d.mts.map +0 -1
- package/dist/components/common/status.mjs.map +0 -1
- package/dist/components/editor/components/content.client.d.mts.map +0 -1
- package/dist/components/editor/components/content.client.mjs.map +0 -1
- package/dist/components/editor/components/editor.client.d.mts.map +0 -1
- package/dist/components/editor/components/editor.client.mjs.map +0 -1
- package/dist/components/editor/components/menu-nodes.client.mjs.map +0 -1
- package/dist/components/editor/components/menu.client.d.mts.map +0 -1
- package/dist/components/editor/components/menu.client.mjs.map +0 -1
- package/dist/components/editor/extensions/file-handler/extension.d.mts.map +0 -1
- package/dist/components/editor/extensions/file-handler/extension.mjs.map +0 -1
- package/dist/components/editor/extensions/file-handler/strategy.d.mts.map +0 -1
- package/dist/components/editor/extensions/file-handler/strategy.mjs.map +0 -1
- package/dist/components/editor/extensions/file-handler/utils.mjs.map +0 -1
- package/dist/components/editor/extensions/image/extension.d.mts.map +0 -1
- package/dist/components/editor/extensions/image/extension.mjs.map +0 -1
- package/dist/components/editor/extensions/skeleton/extension.mjs.map +0 -1
- package/dist/components/editor/extensions/skeleton/renderer.mjs.map +0 -1
- package/dist/components/editor/lib/constants.d.mts.map +0 -1
- package/dist/components/editor/lib/constants.mjs.map +0 -1
- package/dist/components/editor/lib/extensions.d.mts.map +0 -1
- package/dist/components/editor/lib/extensions.mjs.map +0 -1
- package/dist/components/editor/lib/helpers.d.mts.map +0 -1
- package/dist/components/editor/lib/helpers.mjs.map +0 -1
- package/dist/components/editor/lib/types.d.mts.map +0 -1
- package/dist/components/editor/lib/variants.mjs.map +0 -1
- package/dist/components/emails/forget-password-email.mjs.map +0 -1
- package/dist/components/header/back-button.client.d.mts.map +0 -1
- package/dist/components/header/back-button.client.mjs.map +0 -1
- package/dist/components/header/bottom-bar.client.d.mts.map +0 -1
- package/dist/components/header/bottom-bar.client.mjs.map +0 -1
- package/dist/components/header/breadcrumbs.client.d.mts.map +0 -1
- package/dist/components/header/breadcrumbs.client.mjs.map +0 -1
- package/dist/components/header/header.client.d.mts.map +0 -1
- package/dist/components/header/header.client.mjs.map +0 -1
- package/dist/components/header/indicator.client.mjs.map +0 -1
- package/dist/components/header/mobile-nav-switcher.client.d.mts.map +0 -1
- package/dist/components/header/mobile-nav-switcher.client.mjs.map +0 -1
- package/dist/components/header/top-bar.client.d.mts.map +0 -1
- package/dist/components/header/top-bar.client.mjs.map +0 -1
- package/dist/components/layouts/admin-content.client.d.mts.map +0 -1
- package/dist/components/layouts/admin-content.client.mjs.map +0 -1
- package/dist/components/layouts/admin-error-pages.d.mts.map +0 -1
- package/dist/components/layouts/admin-error-pages.mjs.map +0 -1
- package/dist/components/layouts/admin-layout.d.mts.map +0 -1
- package/dist/components/layouts/admin-layout.mjs.map +0 -1
- package/dist/components/layouts/admin-loading.d.mts.map +0 -1
- package/dist/components/layouts/admin-loading.mjs.map +0 -1
- package/dist/components/layouts/empty-page.d.mts.map +0 -1
- package/dist/components/layouts/empty-page.mjs.map +0 -1
- package/dist/components/layouts/error-page.d.mts.map +0 -1
- package/dist/components/layouts/error-page.mjs.map +0 -1
- package/dist/components/layouts/error-sections.d.mts.map +0 -1
- package/dist/components/layouts/error-sections.mjs.map +0 -1
- package/dist/components/layouts/list-layout.d.mts.map +0 -1
- package/dist/components/layouts/list-layout.mjs.map +0 -1
- package/dist/components/layouts/providers.client.d.mts.map +0 -1
- package/dist/components/layouts/providers.client.mjs.map +0 -1
- package/dist/components/layouts/root-error-pages.d.mts.map +0 -1
- package/dist/components/layouts/root-error-pages.mjs.map +0 -1
- package/dist/components/layouts/root-layout.server.d.mts.map +0 -1
- package/dist/components/layouts/root-layout.server.mjs.map +0 -1
- package/dist/components/layouts/root-loading.d.mts.map +0 -1
- package/dist/components/layouts/root-loading.mjs.map +0 -1
- package/dist/components/layouts/tab-layout.d.mts.map +0 -1
- package/dist/components/layouts/tab-layout.mjs.map +0 -1
- package/dist/components/lists/data-list.d.mts.map +0 -1
- package/dist/components/lists/data-list.mjs.map +0 -1
- package/dist/components/lists/data-stack.d.mts.map +0 -1
- package/dist/components/lists/data-stack.mjs.map +0 -1
- package/dist/components/navigation/admin-sidebar-header.client.mjs.map +0 -1
- package/dist/components/navigation/admin-sidebar-paths.client.d.mts.map +0 -1
- package/dist/components/navigation/admin-sidebar-paths.client.mjs.map +0 -1
- package/dist/components/navigation/admin-sidebar-skeleton.mjs.map +0 -1
- package/dist/components/ui/accordion.client.d.mts.map +0 -1
- package/dist/components/ui/accordion.client.mjs.map +0 -1
- package/dist/components/ui/alert-dialog.client.d.mts.map +0 -1
- package/dist/components/ui/alert-dialog.client.mjs.map +0 -1
- package/dist/components/ui/alert.d.mts.map +0 -1
- package/dist/components/ui/alert.mjs.map +0 -1
- package/dist/components/ui/aspect-ratio.client.d.mts.map +0 -1
- package/dist/components/ui/aspect-ratio.client.mjs.map +0 -1
- package/dist/components/ui/avatar.client.d.mts.map +0 -1
- package/dist/components/ui/avatar.client.mjs.map +0 -1
- package/dist/components/ui/badge.d.mts.map +0 -1
- package/dist/components/ui/badge.mjs.map +0 -1
- package/dist/components/ui/breadcrumb.d.mts.map +0 -1
- package/dist/components/ui/breadcrumb.mjs.map +0 -1
- package/dist/components/ui/button-group.d.mts.map +0 -1
- package/dist/components/ui/button-group.mjs.map +0 -1
- package/dist/components/ui/button.d.mts.map +0 -1
- package/dist/components/ui/button.mjs.map +0 -1
- package/dist/components/ui/calendar.client.d.mts.map +0 -1
- package/dist/components/ui/calendar.client.mjs.map +0 -1
- package/dist/components/ui/card.d.mts.map +0 -1
- package/dist/components/ui/card.mjs.map +0 -1
- package/dist/components/ui/carousel.client.d.mts.map +0 -1
- package/dist/components/ui/carousel.client.mjs.map +0 -1
- package/dist/components/ui/chart.client.d.mts.map +0 -1
- package/dist/components/ui/chart.client.mjs.map +0 -1
- package/dist/components/ui/checkbox.client.d.mts.map +0 -1
- package/dist/components/ui/checkbox.client.mjs.map +0 -1
- package/dist/components/ui/collapsible.client.d.mts.map +0 -1
- package/dist/components/ui/collapsible.client.mjs.map +0 -1
- package/dist/components/ui/color-picker.client.d.mts.map +0 -1
- package/dist/components/ui/color-picker.client.mjs.map +0 -1
- package/dist/components/ui/combobox-dropdown.client.d.mts.map +0 -1
- package/dist/components/ui/combobox-dropdown.client.mjs.map +0 -1
- package/dist/components/ui/combobox.client.d.mts.map +0 -1
- package/dist/components/ui/combobox.client.mjs.map +0 -1
- package/dist/components/ui/command.client.d.mts.map +0 -1
- package/dist/components/ui/command.client.mjs.map +0 -1
- package/dist/components/ui/context-menu.client.d.mts.map +0 -1
- package/dist/components/ui/context-menu.client.mjs.map +0 -1
- package/dist/components/ui/date-picker.client.d.mts.map +0 -1
- package/dist/components/ui/date-picker.client.mjs.map +0 -1
- package/dist/components/ui/dialog.client.d.mts.map +0 -1
- package/dist/components/ui/dialog.client.mjs.map +0 -1
- package/dist/components/ui/drawer.client.d.mts.map +0 -1
- package/dist/components/ui/drawer.client.mjs.map +0 -1
- package/dist/components/ui/dropdown-menu.client.d.mts.map +0 -1
- package/dist/components/ui/dropdown-menu.client.mjs.map +0 -1
- package/dist/components/ui/empty.d.mts.map +0 -1
- package/dist/components/ui/empty.mjs.map +0 -1
- package/dist/components/ui/field.client.d.mts.map +0 -1
- package/dist/components/ui/field.client.mjs.map +0 -1
- package/dist/components/ui/form.client.d.mts.map +0 -1
- package/dist/components/ui/form.client.mjs.map +0 -1
- package/dist/components/ui/hover-card.client.d.mts.map +0 -1
- package/dist/components/ui/hover-card.client.mjs.map +0 -1
- package/dist/components/ui/input-date-time.client.d.mts.map +0 -1
- package/dist/components/ui/input-date-time.client.mjs.map +0 -1
- package/dist/components/ui/input-date.d.mts.map +0 -1
- package/dist/components/ui/input-date.mjs.map +0 -1
- package/dist/components/ui/input-group.client.d.mts.map +0 -1
- package/dist/components/ui/input-group.client.mjs.map +0 -1
- package/dist/components/ui/input-recipient.d.mts.map +0 -1
- package/dist/components/ui/input-recipient.mjs.map +0 -1
- package/dist/components/ui/input-time.d.mts.map +0 -1
- package/dist/components/ui/input-time.mjs.map +0 -1
- package/dist/components/ui/input.d.mts.map +0 -1
- package/dist/components/ui/input.mjs.map +0 -1
- package/dist/components/ui/item.d.mts.map +0 -1
- package/dist/components/ui/item.mjs.map +0 -1
- package/dist/components/ui/kbd.d.mts.map +0 -1
- package/dist/components/ui/kbd.mjs.map +0 -1
- package/dist/components/ui/label.d.mts.map +0 -1
- package/dist/components/ui/label.mjs.map +0 -1
- package/dist/components/ui/loader.d.mts.map +0 -1
- package/dist/components/ui/loader.mjs.map +0 -1
- package/dist/components/ui/navigation-menu.d.mts.map +0 -1
- package/dist/components/ui/navigation-menu.mjs.map +0 -1
- package/dist/components/ui/pagination.d.mts.map +0 -1
- package/dist/components/ui/pagination.mjs.map +0 -1
- package/dist/components/ui/popover.client.d.mts.map +0 -1
- package/dist/components/ui/popover.client.mjs.map +0 -1
- package/dist/components/ui/progress.client.d.mts.map +0 -1
- package/dist/components/ui/progress.client.mjs.map +0 -1
- package/dist/components/ui/radio-group.d.mts.map +0 -1
- package/dist/components/ui/radio-group.mjs.map +0 -1
- package/dist/components/ui/resizable.client.d.mts.map +0 -1
- package/dist/components/ui/resizable.client.mjs.map +0 -1
- package/dist/components/ui/scroll-area.d.mts.map +0 -1
- package/dist/components/ui/scroll-area.mjs.map +0 -1
- package/dist/components/ui/select.client.d.mts.map +0 -1
- package/dist/components/ui/select.client.mjs.map +0 -1
- package/dist/components/ui/separator.d.mts.map +0 -1
- package/dist/components/ui/separator.mjs.map +0 -1
- package/dist/components/ui/sheet.client.d.mts.map +0 -1
- package/dist/components/ui/sheet.client.mjs.map +0 -1
- package/dist/components/ui/sidebar.client.d.mts.map +0 -1
- package/dist/components/ui/sidebar.client.mjs.map +0 -1
- package/dist/components/ui/skeleton.d.mts.map +0 -1
- package/dist/components/ui/skeleton.mjs.map +0 -1
- package/dist/components/ui/slider.d.mts.map +0 -1
- package/dist/components/ui/slider.mjs.map +0 -1
- package/dist/components/ui/sonner.client.d.mts.map +0 -1
- package/dist/components/ui/sonner.client.mjs.map +0 -1
- package/dist/components/ui/spinner.d.mts.map +0 -1
- package/dist/components/ui/spinner.mjs.map +0 -1
- package/dist/components/ui/switch.client.d.mts.map +0 -1
- package/dist/components/ui/switch.client.mjs.map +0 -1
- package/dist/components/ui/tabs.client.d.mts.map +0 -1
- package/dist/components/ui/tabs.client.mjs.map +0 -1
- package/dist/components/ui/textarea.d.mts.map +0 -1
- package/dist/components/ui/textarea.mjs.map +0 -1
- package/dist/components/ui/toggle-group.client.d.mts.map +0 -1
- package/dist/components/ui/toggle-group.client.mjs.map +0 -1
- package/dist/components/ui/toggle.client.d.mts.map +0 -1
- package/dist/components/ui/toggle.client.mjs.map +0 -1
- package/dist/components/ui/tooltip.client.d.mts.map +0 -1
- package/dist/components/ui/tooltip.client.mjs.map +0 -1
- package/dist/lib/hooks/use-action.d.mts.map +0 -1
- package/dist/lib/hooks/use-action.mjs.map +0 -1
- package/dist/lib/hooks/use-indicator.d.mts.map +0 -1
- package/dist/lib/hooks/use-indicator.mjs.map +0 -1
- package/dist/lib/hooks/use-mobile.client.d.mts.map +0 -1
- package/dist/lib/hooks/use-mobile.client.mjs.map +0 -1
- package/dist/lib/types/config.d.mts.map +0 -1
- package/dist/lib/utils/array-move.d.mts.map +0 -1
- package/dist/lib/utils/array-move.mjs.map +0 -1
- package/dist/lib/utils/cn.d.mts.map +0 -1
- package/dist/lib/utils/cn.mjs.map +0 -1
- package/dist/lib/utils/fonts.d.mts.map +0 -1
- package/dist/lib/utils/fonts.mjs.map +0 -1
- package/dist/lib/utils/format.d.mts.map +0 -1
- package/dist/lib/utils/format.mjs.map +0 -1
- package/dist/lib/utils/manifest.d.mts.map +0 -1
- package/dist/lib/utils/manifest.mjs.map +0 -1
- package/dist/lib/utils/markdown.d.mts.map +0 -1
- package/dist/lib/utils/markdown.mjs.map +0 -1
- package/dist/lib/utils/url.d.mts.map +0 -1
- package/dist/lib/utils/url.mjs.map +0 -1
- package/dist/lib/utils/user-agent.mjs.map +0 -1
- package/dist/modules/auth/components/allowed.client.d.mts.map +0 -1
- package/dist/modules/auth/components/allowed.client.mjs.map +0 -1
- package/dist/modules/auth/components/auth-layout.server.d.mts.map +0 -1
- package/dist/modules/auth/components/auth-layout.server.mjs.map +0 -1
- package/dist/modules/auth/components/auth-loading.d.mts.map +0 -1
- package/dist/modules/auth/components/auth-loading.mjs.map +0 -1
- package/dist/modules/auth/components/create-first-user-guard.server.d.mts.map +0 -1
- package/dist/modules/auth/components/create-first-user-guard.server.mjs.map +0 -1
- package/dist/modules/auth/components/create-first-user-page.client.d.mts.map +0 -1
- package/dist/modules/auth/components/create-first-user-page.client.mjs.map +0 -1
- package/dist/modules/auth/components/forget-password-page.client.d.mts.map +0 -1
- package/dist/modules/auth/components/forget-password-page.client.mjs.map +0 -1
- package/dist/modules/auth/components/guard.server.d.mts.map +0 -1
- package/dist/modules/auth/components/guard.server.mjs.map +0 -1
- package/dist/modules/auth/components/login-page.client.d.mts.map +0 -1
- package/dist/modules/auth/components/login-page.client.mjs.map +0 -1
- package/dist/modules/auth/components/reset-password-page.client.d.mts.map +0 -1
- package/dist/modules/auth/components/reset-password-page.client.mjs.map +0 -1
- package/dist/modules/auth/components/update-password-command.d.mts.map +0 -1
- package/dist/modules/auth/components/update-password-command.mjs.map +0 -1
- package/dist/modules/auth/db/schema.d.mts.map +0 -1
- package/dist/modules/auth/db/schema.mjs.map +0 -1
- package/dist/modules/auth/handler/create-client.client.d.mts.map +0 -1
- package/dist/modules/auth/handler/create-client.client.mjs.map +0 -1
- package/dist/modules/auth/handler/proxy.server.d.mts.map +0 -1
- package/dist/modules/auth/handler/proxy.server.mjs.map +0 -1
- package/dist/modules/auth/handler/route.server.d.mts.map +0 -1
- package/dist/modules/auth/handler/route.server.mjs.map +0 -1
- package/dist/modules/auth/handler/service.server.d.mts.map +0 -1
- package/dist/modules/auth/handler/service.server.mjs.map +0 -1
- package/dist/modules/auth/hooks/use-auth-client.d.mts.map +0 -1
- package/dist/modules/auth/hooks/use-auth-client.mjs.map +0 -1
- package/dist/modules/auth/hooks/use-permission.d.mts.map +0 -1
- package/dist/modules/auth/hooks/use-permission.mjs.map +0 -1
- package/dist/modules/auth/hooks/use-session.d.mts.map +0 -1
- package/dist/modules/auth/hooks/use-session.mjs.map +0 -1
- package/dist/modules/auth/lib/helpers.server.d.mts.map +0 -1
- package/dist/modules/auth/lib/helpers.server.mjs.map +0 -1
- package/dist/modules/auth/lib/permissions.d.mts.map +0 -1
- package/dist/modules/auth/lib/permissions.mjs.map +0 -1
- package/dist/modules/auth/lib/validators.d.mts.map +0 -1
- package/dist/modules/auth/lib/validators.mjs.map +0 -1
- package/dist/modules/commands/components/alert-dialog-command.client.d.mts.map +0 -1
- package/dist/modules/commands/components/alert-dialog-command.client.mjs.map +0 -1
- package/dist/modules/commands/components/click-command.client.d.mts.map +0 -1
- package/dist/modules/commands/components/click-command.client.mjs.map +0 -1
- package/dist/modules/commands/components/command-trigger.client.d.mts.map +0 -1
- package/dist/modules/commands/components/command-trigger.client.mjs.map +0 -1
- package/dist/modules/commands/components/dialog-command.client.d.mts.map +0 -1
- package/dist/modules/commands/components/dialog-command.client.mjs.map +0 -1
- package/dist/modules/commands/components/dropdown-command.client.d.mts.map +0 -1
- package/dist/modules/commands/components/dropdown-command.client.mjs.map +0 -1
- package/dist/modules/commands/components/empty-command.client.d.mts.map +0 -1
- package/dist/modules/commands/components/empty-command.client.mjs.map +0 -1
- package/dist/modules/commands/components/form-dialog-command.client.d.mts.map +0 -1
- package/dist/modules/commands/components/form-dialog-command.client.mjs.map +0 -1
- package/dist/modules/commands/components/render-command.mjs.map +0 -1
- package/dist/modules/commands/hooks/context.client.mjs.map +0 -1
- package/dist/modules/commands/hooks/use-command-menu.client.d.mts.map +0 -1
- package/dist/modules/commands/hooks/use-command-menu.client.mjs.map +0 -1
- package/dist/modules/commands/hooks/use-command-mutation.client.d.mts.map +0 -1
- package/dist/modules/commands/hooks/use-command-mutation.client.mjs.map +0 -1
- package/dist/modules/commands/lib/definitions.d.mts.map +0 -1
- package/dist/modules/commands/lib/factory.d.mts.map +0 -1
- package/dist/modules/commands/lib/factory.mjs.map +0 -1
- package/dist/modules/commands/menus/context-menu.client.d.mts.map +0 -1
- package/dist/modules/commands/menus/context-menu.client.mjs.map +0 -1
- package/dist/modules/commands/menus/dropdown-menu.client.d.mts.map +0 -1
- package/dist/modules/commands/menus/dropdown-menu.client.mjs.map +0 -1
- package/dist/modules/commands/menus/floating-menu.client.d.mts.map +0 -1
- package/dist/modules/commands/menus/floating-menu.client.mjs.map +0 -1
- package/dist/modules/commands/menus/inline-menu.client.d.mts.map +0 -1
- package/dist/modules/commands/menus/inline-menu.client.mjs.map +0 -1
- package/dist/modules/commands/menus/responsive-menu.client.d.mts.map +0 -1
- package/dist/modules/commands/menus/responsive-menu.client.mjs.map +0 -1
- package/dist/modules/commands/utils/archive-command.client.d.mts.map +0 -1
- package/dist/modules/commands/utils/archive-command.client.mjs.map +0 -1
- package/dist/modules/commands/utils/delete-command.client.d.mts.map +0 -1
- package/dist/modules/commands/utils/delete-command.client.mjs.map +0 -1
- package/dist/modules/config/lib/config.d.mts.map +0 -1
- package/dist/modules/config/lib/config.mjs.map +0 -1
- package/dist/modules/config/lib/context.d.mts.map +0 -1
- package/dist/modules/config/lib/context.mjs.map +0 -1
- package/dist/modules/config/paths/helpers.d.mts.map +0 -1
- package/dist/modules/config/paths/helpers.mjs.map +0 -1
- package/dist/modules/config/paths/types.d.mts.map +0 -1
- package/dist/modules/data-tables/components/cell/common.client.d.mts.map +0 -1
- package/dist/modules/data-tables/components/cell/common.client.mjs.map +0 -1
- package/dist/modules/data-tables/components/cell/index.client.d.mts.map +0 -1
- package/dist/modules/data-tables/components/cell/index.client.mjs.map +0 -1
- package/dist/modules/data-tables/components/cell/select.client.d.mts.map +0 -1
- package/dist/modules/data-tables/components/cell/select.client.mjs.map +0 -1
- package/dist/modules/data-tables/components/column-header.d.mts.map +0 -1
- package/dist/modules/data-tables/components/column-header.mjs.map +0 -1
- package/dist/modules/data-tables/components/filters/combobox.client.d.mts.map +0 -1
- package/dist/modules/data-tables/components/filters/combobox.client.mjs.map +0 -1
- package/dist/modules/data-tables/components/filters/slider.client.d.mts.map +0 -1
- package/dist/modules/data-tables/components/filters/slider.client.mjs.map +0 -1
- package/dist/modules/data-tables/components/footer.mjs.map +0 -1
- package/dist/modules/data-tables/components/header.d.mts.map +0 -1
- package/dist/modules/data-tables/components/header.mjs.map +0 -1
- package/dist/modules/data-tables/components/layout.d.mts.map +0 -1
- package/dist/modules/data-tables/components/layout.mjs.map +0 -1
- package/dist/modules/data-tables/components/search-input.client.d.mts.map +0 -1
- package/dist/modules/data-tables/components/search-input.client.mjs.map +0 -1
- package/dist/modules/data-tables/components/skeleton.d.mts.map +0 -1
- package/dist/modules/data-tables/components/skeleton.mjs.map +0 -1
- package/dist/modules/data-tables/components/table.d.mts.map +0 -1
- package/dist/modules/data-tables/components/table.mjs.map +0 -1
- package/dist/modules/data-tables/components/toolbar.d.mts.map +0 -1
- package/dist/modules/data-tables/components/toolbar.mjs.map +0 -1
- package/dist/modules/data-tables/hooks/use-context.client.d.mts.map +0 -1
- package/dist/modules/data-tables/hooks/use-context.client.mjs.map +0 -1
- package/dist/modules/data-tables/hooks/use-search.client.mjs.map +0 -1
- package/dist/modules/data-tables/hooks/use-selection.client.mjs.map +0 -1
- package/dist/modules/data-tables/hooks/use-table.client.d.mts.map +0 -1
- package/dist/modules/data-tables/hooks/use-table.client.mjs.map +0 -1
- package/dist/modules/data-tables/lib/converters/cursor.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/converters/cursor.mjs.map +0 -1
- package/dist/modules/data-tables/lib/converters/dto.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/converters/dto.mjs.map +0 -1
- package/dist/modules/data-tables/lib/converters/filter.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/converters/filter.mjs.map +0 -1
- package/dist/modules/data-tables/lib/converters/search.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/converters/search.mjs.map +0 -1
- package/dist/modules/data-tables/lib/converters/sorting.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/converters/sorting.mjs.map +0 -1
- package/dist/modules/data-tables/lib/filters/config.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/filters/config.mjs.map +0 -1
- package/dist/modules/data-tables/lib/filters/helpers.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/filters/helpers.mjs.map +0 -1
- package/dist/modules/data-tables/lib/filters/parsers.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/filters/parsers.mjs.map +0 -1
- package/dist/modules/data-tables/lib/filters/resolvers.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/filters/resolvers.mjs.map +0 -1
- package/dist/modules/data-tables/lib/helpers/create-column.mjs.map +0 -1
- package/dist/modules/data-tables/lib/search-params.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/search-params.mjs.map +0 -1
- package/dist/modules/data-tables/lib/types.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/validators.d.mts.map +0 -1
- package/dist/modules/data-tables/lib/validators.mjs.map +0 -1
- package/dist/modules/data-tables/server/get-data.server.d.mts.map +0 -1
- package/dist/modules/data-tables/server/get-data.server.mjs.map +0 -1
- package/dist/modules/data-tables/strategies/helpers/sorting.mjs.map +0 -1
- package/dist/modules/data-tables/strategies/infinite/components.mjs.map +0 -1
- package/dist/modules/data-tables/strategies/infinite/strategy.d.mts.map +0 -1
- package/dist/modules/data-tables/strategies/infinite/strategy.mjs.map +0 -1
- package/dist/modules/data-tables/strategies/pagination/components.mjs.map +0 -1
- package/dist/modules/data-tables/strategies/pagination/strategy.d.mts.map +0 -1
- package/dist/modules/data-tables/strategies/pagination/strategy.mjs.map +0 -1
- package/dist/modules/data-tables/tables/data-table/components/body.mjs.map +0 -1
- package/dist/modules/data-tables/tables/data-table/components/header.mjs.map +0 -1
- package/dist/modules/data-tables/tables/data-table/components/row.mjs.map +0 -1
- package/dist/modules/data-tables/tables/data-table/components/table.d.mts.map +0 -1
- package/dist/modules/data-tables/tables/data-table/components/table.mjs.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/body.mjs.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/common.d.mts.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/common.mjs.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.d.mts.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/drag-handle.client.mjs.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/read-only.d.mts.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/cells/read-only.mjs.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/header.mjs.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/row.client.mjs.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/table.d.mts.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/components/table.mjs.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/hooks/context.client.d.mts.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/hooks/context.client.mjs.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/hooks/use-hotkeys.client.d.mts.map +0 -1
- package/dist/modules/data-tables/tables/inline-table/hooks/use-hotkeys.client.mjs.map +0 -1
- package/dist/modules/database/lib/helpers.d.mts.map +0 -1
- package/dist/modules/database/lib/helpers.mjs.map +0 -1
- package/dist/modules/database/lib/service.server.d.mts.map +0 -1
- package/dist/modules/database/lib/service.server.mjs.map +0 -1
- package/dist/modules/database/lib/types.d.mts.map +0 -1
- package/dist/modules/emails/lib/service.server.d.mts.map +0 -1
- package/dist/modules/emails/lib/service.server.mjs.map +0 -1
- package/dist/modules/inline-edit/components/combobox-dropdown.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/combobox-dropdown.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/combobox.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/combobox.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/date-input.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/date-input.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/date-picker.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/date-picker.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/date-time.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/date-time.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/editor.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/editor.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/input-recipient.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/input-recipient.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/input-toggle.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/input-toggle.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/input.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/input.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/select.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/select.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/switch.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/switch.client.mjs.map +0 -1
- package/dist/modules/inline-edit/components/toggle.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/components/toggle.client.mjs.map +0 -1
- package/dist/modules/inline-edit/hooks/context.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/hooks/context.client.mjs.map +0 -1
- package/dist/modules/inline-edit/hooks/use-inline.client.d.mts.map +0 -1
- package/dist/modules/inline-edit/hooks/use-inline.client.mjs.map +0 -1
- package/dist/modules/inline-edit/lib/validators.d.mts.map +0 -1
- package/dist/modules/inline-edit/lib/validators.mjs.map +0 -1
- package/dist/modules/inline-edit/lib/variants.d.mts.map +0 -1
- package/dist/modules/inline-edit/lib/variants.mjs.map +0 -1
- package/dist/modules/router/handler/caller.client.d.mts.map +0 -1
- package/dist/modules/router/handler/caller.client.mjs.map +0 -1
- package/dist/modules/router/handler/caller.server.d.mts.map +0 -1
- package/dist/modules/router/handler/caller.server.mjs.map +0 -1
- package/dist/modules/router/handler/context.server.d.mts.map +0 -1
- package/dist/modules/router/handler/context.server.mjs.map +0 -1
- package/dist/modules/router/handler/init.server.d.mts.map +0 -1
- package/dist/modules/router/handler/init.server.mjs.map +0 -1
- package/dist/modules/router/handler/register.server.d.mts.map +0 -1
- package/dist/modules/router/handler/register.server.mjs.map +0 -1
- package/dist/modules/router/handler/route.server.d.mts.map +0 -1
- package/dist/modules/router/handler/route.server.mjs.map +0 -1
- package/dist/modules/router/lib/helpers.mjs.map +0 -1
- package/dist/modules/router/lib/query-client.d.mts.map +0 -1
- package/dist/modules/router/lib/query-client.mjs.map +0 -1
- package/dist/modules/router/lib/query-client.server.d.mts.map +0 -1
- package/dist/modules/router/lib/query-client.server.mjs.map +0 -1
- package/dist/modules/router/lib/validators.d.mts.map +0 -1
- package/dist/modules/router/lib/validators.mjs.map +0 -1
- package/dist/modules/storage/components/dropzone-context.client.d.mts.map +0 -1
- package/dist/modules/storage/components/dropzone-context.client.mjs.map +0 -1
- package/dist/modules/storage/components/dropzone.client.d.mts.map +0 -1
- package/dist/modules/storage/components/dropzone.client.mjs.map +0 -1
- package/dist/modules/storage/components/image-grid.client.d.mts.map +0 -1
- package/dist/modules/storage/components/image-grid.client.mjs.map +0 -1
- package/dist/modules/storage/components/image.client.d.mts.map +0 -1
- package/dist/modules/storage/components/image.client.mjs.map +0 -1
- package/dist/modules/storage/components/upload-button.client.d.mts.map +0 -1
- package/dist/modules/storage/components/upload-button.client.mjs.map +0 -1
- package/dist/modules/storage/components/upload-zone-context.client.d.mts.map +0 -1
- package/dist/modules/storage/components/upload-zone-context.client.mjs.map +0 -1
- package/dist/modules/storage/components/upload-zone.client.d.mts.map +0 -1
- package/dist/modules/storage/components/upload-zone.client.mjs.map +0 -1
- package/dist/modules/storage/lib/constants.d.mts.map +0 -1
- package/dist/modules/storage/lib/constants.mjs.map +0 -1
- package/dist/modules/storage/lib/helpers.d.mts.map +0 -1
- package/dist/modules/storage/lib/helpers.mjs.map +0 -1
- package/dist/modules/storage/lib/procedures.server.d.mts.map +0 -1
- package/dist/modules/storage/lib/procedures.server.mjs.map +0 -1
- package/dist/modules/storage/lib/router-handlers.server.d.mts.map +0 -1
- package/dist/modules/storage/lib/router-handlers.server.mjs.map +0 -1
- package/dist/modules/storage/lib/schema.d.mts.map +0 -1
- package/dist/modules/storage/lib/schema.mjs.map +0 -1
- package/dist/modules/storage/lib/service.server.d.mts.map +0 -1
- package/dist/modules/storage/lib/service.server.mjs.map +0 -1
- package/dist/modules/storage/lib/upload.client.d.mts.map +0 -1
- package/dist/modules/storage/lib/upload.client.mjs.map +0 -1
- package/dist/modules/storage/lib/validators.d.mts.map +0 -1
- package/dist/modules/storage/lib/validators.mjs.map +0 -1
- package/dist/modules/storage/providers/adapters/s3.server.d.mts.map +0 -1
- package/dist/modules/storage/providers/adapters/s3.server.mjs.map +0 -1
- package/dist/modules/storage/providers/lib/constants.d.mts.map +0 -1
- package/dist/modules/storage/providers/lib/constants.mjs.map +0 -1
- package/dist/modules/storage/providers/lib/errors.d.mts.map +0 -1
- package/dist/modules/storage/providers/lib/errors.mjs.map +0 -1
- package/dist/modules/storage/providers/lib/types.d.mts.map +0 -1
- package/dist/modules/storage/providers/lib/validators.d.mts.map +0 -1
- package/dist/modules/storage/providers/lib/validators.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/components/input.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\nimport { type InlineEditVariantsProps, inlineEditVariants } from \"../lib/variants\";\n\ntype InlineEditInputProps<TValue, Required extends boolean = false> = Omit<\n ComponentProps<typeof Input>,\n \"type\"\n> &\n useInlineEditOptions<TValue, Required> &\n InlineEditVariantsProps;\n\n/**\n * The inline edit string input component.\n */\nexport function InlineStringInput<Required extends boolean = false>({\n initialValue,\n action,\n variant,\n className,\n permission,\n updateStrategy,\n isRequired,\n disabled,\n ...props\n}: InlineEditInputProps<string, Required>) {\n const { value, handleChange, handleBlur, isAllowed, status } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n parser: {\n decode: (value) => value,\n encode: (value) => value,\n },\n });\n\n return (\n <Input\n {...props}\n data-inline-input=\"string\"\n type=\"text\"\n value={value ?? undefined}\n disabled={disabled || !isAllowed}\n onChange={(e) => handleChange(e.target.value ? e.target.value : null)}\n onBlur={(e) => handleBlur(e.target.value ? e.target.value : null)}\n className={cn(\n \"w-full border-border/70 hover:border-border\",\n inlineEditVariants({ variant, status }),\n className,\n )}\n />\n );\n}\n\n/**\n * The inline edit number input component.\n */\nconst parseValueAsNumber = (valueAsNumber: number): number | null =>\n !Number.isNaN(Number(valueAsNumber)) ? valueAsNumber : null;\n\nexport function InlineNumberInput<Required extends boolean = false>({\n initialValue,\n action,\n variant,\n className,\n permission,\n updateStrategy,\n isRequired,\n disabled,\n ...props\n}: InlineEditInputProps<number, Required>) {\n const { value, handleChange, handleBlur, isAllowed, status } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n parser: {\n decode: (value) => value,\n encode: (value) => value,\n },\n });\n\n return (\n <Input\n {...props}\n data-inline-input=\"number\"\n type=\"number\"\n value={value ?? undefined}\n disabled={disabled || !isAllowed}\n onChange={(e) => handleChange(parseValueAsNumber(e.target.valueAsNumber))}\n onBlur={(e) => handleBlur(parseValueAsNumber(e.target.valueAsNumber))}\n className={cn(\n \"w-full border-border/70 hover:border-border\",\n inlineEditVariants({ variant, status }),\n className,\n )}\n />\n );\n}\n\n/**\n * The inline edit decimal input component.\n */\nexport function InlineDecimalInput({\n initialValue,\n action,\n variant,\n className,\n permission,\n updateStrategy,\n isRequired,\n disabled,\n ...props\n}: InlineEditInputProps<string>) {\n const { value, handleChange, handleBlur, isAllowed, status } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n parser: {\n decode: (value) => value,\n encode: (value) => value,\n },\n });\n\n return (\n <Input\n {...props}\n data-inline-input=\"decimal\"\n type=\"number\"\n value={value ?? undefined}\n disabled={disabled || !isAllowed}\n onChange={(e) => handleChange(e.target.value ? e.target.value : null)}\n onBlur={(e) => handleBlur(e.target.value ? e.target.value : null)}\n className={cn(\n \"w-full border-border/70 hover:border-border\",\n inlineEditVariants({ variant, status }),\n className,\n )}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,SAAgB,kBAAoD,EAClE,cACA,QACA,SACA,WACA,YACA,gBACA,YACA,UACA,GAAG,SACsC;CACzC,MAAM,EAAE,OAAO,cAAc,YAAY,WAAW,WAAW,cAAc;EAC3E;EACA;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,UAAU;GACnB,SAAS,UAAU;GACpB;EACF,CAAC;AAEF,QACE,oBAAC;EACC,GAAI;EACJ,qBAAkB;EAClB,MAAK;EACL,OAAO,SAAS;EAChB,UAAU,YAAY,CAAC;EACvB,WAAW,MAAM,aAAa,EAAE,OAAO,QAAQ,EAAE,OAAO,QAAQ,KAAK;EACrE,SAAS,MAAM,WAAW,EAAE,OAAO,QAAQ,EAAE,OAAO,QAAQ,KAAK;EACjE,WAAW,GACT,+CACA,mBAAmB;GAAE;GAAS;GAAQ,CAAC,EACvC,UACD;GACD;;;;;AAON,MAAM,sBAAsB,kBAC1B,CAAC,OAAO,MAAM,OAAO,cAAc,CAAC,GAAG,gBAAgB;AAEzD,SAAgB,kBAAoD,EAClE,cACA,QACA,SACA,WACA,YACA,gBACA,YACA,UACA,GAAG,SACsC;CACzC,MAAM,EAAE,OAAO,cAAc,YAAY,WAAW,WAAW,cAAc;EAC3E;EACA;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,UAAU;GACnB,SAAS,UAAU;GACpB;EACF,CAAC;AAEF,QACE,oBAAC;EACC,GAAI;EACJ,qBAAkB;EAClB,MAAK;EACL,OAAO,SAAS;EAChB,UAAU,YAAY,CAAC;EACvB,WAAW,MAAM,aAAa,mBAAmB,EAAE,OAAO,cAAc,CAAC;EACzE,SAAS,MAAM,WAAW,mBAAmB,EAAE,OAAO,cAAc,CAAC;EACrE,WAAW,GACT,+CACA,mBAAmB;GAAE;GAAS;GAAQ,CAAC,EACvC,UACD;GACD;;;;;AAON,SAAgB,mBAAmB,EACjC,cACA,QACA,SACA,WACA,YACA,gBACA,YACA,UACA,GAAG,SAC4B;CAC/B,MAAM,EAAE,OAAO,cAAc,YAAY,WAAW,WAAW,cAAc;EAC3E;EACA;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,UAAU;GACnB,SAAS,UAAU;GACpB;EACF,CAAC;AAEF,QACE,oBAAC;EACC,GAAI;EACJ,qBAAkB;EAClB,MAAK;EACL,OAAO,SAAS;EAChB,UAAU,YAAY,CAAC;EACvB,WAAW,MAAM,aAAa,EAAE,OAAO,QAAQ,EAAE,OAAO,QAAQ,KAAK;EACrE,SAAS,MAAM,WAAW,EAAE,OAAO,QAAQ,EAAE,OAAO,QAAQ,KAAK;EACjE,WAAW,GACT,+CACA,mBAAmB;GAAE;GAAS;GAAQ,CAAC,EACvC,UACD;GACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select.client.d.mts","names":[],"sources":["../../../../src/modules/inline-edit/components/select.client.tsx"],"mappings":";;;;;;;iBAegB,YAAA,kCAAA,CAAA;EACd,YAAA;EACA,MAAA;EACA,UAAA;EACA,cAAA;EACA,UAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,MAAA,IAAU,oBAAA,SAA6B,QAAA,IAAS,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA0BzD,mBAAA,CAAA;EACd,OAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,aAAA,IAAiB,uBAAA,GAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAYjD,mBAAA,CAAoB,KAAA,EAAO,cAAA,QAAsB,aAAA,IAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI/D,iBAAA,CAAkB,KAAA,EAAO,cAAA,QAAsB,WAAA,IAAY,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI3D,gBAAA,CAAiB,KAAA,EAAO,cAAA,QAAsB,UAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/components/select.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select.client\";\nimport { useIndicator } from \"@/lib/entry.client\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\nimport { type InlineEditVariantsProps, inlineEditVariants } from \"../lib/variants\";\n\nexport function InlineSelect<Required extends boolean = false>({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n disabled,\n ...props\n}: ComponentProps<typeof Select> & useInlineEditOptions<string, Required>) {\n const { value, handleChange, handleBlur, isAllowed } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n parser: {\n decode: (value) => value,\n encode: (value) => value,\n },\n });\n\n return (\n <Select\n {...props}\n disabled={disabled || !isAllowed}\n defaultValue={value ?? undefined}\n onValueChange={(value) => {\n handleChange(value ? value : null);\n handleBlur(value ? value : null);\n }}\n />\n );\n}\n\nexport function InlineSelectTrigger({\n variant,\n className,\n ...props\n}: ComponentProps<typeof SelectTrigger> & InlineEditVariantsProps) {\n const { status } = useIndicator();\n\n return (\n <SelectTrigger\n {...props}\n data-inline-input=\"select\"\n className={cn(inlineEditVariants({ variant, status }), className)}\n />\n );\n}\n\nexport function InlineSelectContent(props: ComponentProps<typeof SelectContent>) {\n return <SelectContent {...props} />;\n}\n\nexport function InlineSelectValue(props: ComponentProps<typeof SelectValue>) {\n return <SelectValue {...props} />;\n}\n\nexport function InlineSelectItem(props: ComponentProps<typeof SelectItem>) {\n return <SelectItem {...props} />;\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAgB,aAA+C,EAC7D,cACA,QACA,YACA,gBACA,YACA,UACA,GAAG,SACsE;CACzE,MAAM,EAAE,OAAO,cAAc,YAAY,cAAc,cAAc;EACnE;EACA;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,UAAU;GACnB,SAAS,UAAU;GACpB;EACF,CAAC;AAEF,QACE,oBAAC;EACC,GAAI;EACJ,UAAU,YAAY,CAAC;EACvB,cAAc,SAAS;EACvB,gBAAgB,UAAU;AACxB,gBAAa,QAAQ,QAAQ,KAAK;AAClC,cAAW,QAAQ,QAAQ,KAAK;;GAElC;;AAIN,SAAgB,oBAAoB,EAClC,SACA,WACA,GAAG,SAC8D;CACjE,MAAM,EAAE,WAAW,cAAc;AAEjC,QACE,oBAAC;EACC,GAAI;EACJ,qBAAkB;EAClB,WAAW,GAAG,mBAAmB;GAAE;GAAS;GAAQ,CAAC,EAAE,UAAU;GACjE;;AAIN,SAAgB,oBAAoB,OAA6C;AAC/E,QAAO,oBAAC,iBAAc,GAAI,QAAS;;AAGrC,SAAgB,kBAAkB,OAA2C;AAC3E,QAAO,oBAAC,eAAY,GAAI,QAAS;;AAGnC,SAAgB,iBAAiB,OAA0C;AACzE,QAAO,oBAAC,cAAW,GAAI,QAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"switch.client.d.mts","names":[],"sources":["../../../../src/modules/inline-edit/components/switch.client.tsx"],"mappings":";;;;;;iBAMgB,YAAA,kCAAA,CAAA;EACd,YAAA;EACA,MAAA;EACA,UAAA;EACA,cAAA;EACA,UAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,MAAA,IAAU,oBAAA,UAA8B,QAAA,IAAS,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"switch.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/components/switch.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { Switch } from \"@/components/ui/switch.client\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\n\nexport function InlineSwitch<Required extends boolean = false>({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n disabled,\n ...props\n}: ComponentProps<typeof Switch> & useInlineEditOptions<boolean, Required>) {\n const { value, handleChange, handleBlur, isAllowed } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n parser: {\n decode: (value) => value,\n encode: (value) => value,\n },\n });\n\n return (\n <Switch\n {...props}\n data-inline-input=\"switch\"\n disabled={disabled || !isAllowed}\n defaultChecked={value ?? undefined}\n onCheckedChange={(checked) => {\n handleChange(checked ?? null);\n handleBlur(checked ?? null);\n }}\n />\n );\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,aAA+C,EAC7D,cACA,QACA,YACA,gBACA,YACA,UACA,GAAG,SACuE;CAC1E,MAAM,EAAE,OAAO,cAAc,YAAY,cAAc,cAAc;EACnE;EACA;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,UAAU;GACnB,SAAS,UAAU;GACpB;EACF,CAAC;AAEF,QACE,oBAAC;EACC,GAAI;EACJ,qBAAkB;EAClB,UAAU,YAAY,CAAC;EACvB,gBAAgB,SAAS;EACzB,kBAAkB,YAAY;AAC5B,gBAAa,WAAW,KAAK;AAC7B,cAAW,WAAW,KAAK;;GAE7B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toggle.client.d.mts","names":[],"sources":["../../../../src/modules/inline-edit/components/toggle.client.tsx"],"mappings":";;;;;KAOY,qBAAA,qCACV,KAAA,CAAM,cAAA,CAAe,cAAA,IAAkB,oBAAA,UAA8B,QAAA;AAAA,iBAEvD,YAAA,kCAAA,CAAA;EACd,YAAA;EACA,MAAA;EACA,QAAA;EACA,UAAA;EACA,cAAA;EACA,UAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,qBAAA,CAAsB,QAAA,IAAS,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toggle.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/components/toggle.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport { Toggle } from \"@/components/ui/toggle.client\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useInlineEdit, type useInlineEditOptions } from \"../hooks/use-inline.client\";\n\nexport type InlineEditToggleProps<Required extends boolean = false> =\n React.HTMLAttributes<HTMLDivElement> & useInlineEditOptions<boolean, Required>;\n\nexport function InlineToggle<Required extends boolean = false>({\n initialValue,\n action,\n children,\n permission,\n updateStrategy,\n isRequired,\n className,\n ...props\n}: InlineEditToggleProps<Required>) {\n const { value, handleChange, handleBlur, isAllowed } = useInlineEdit({\n initialValue,\n action,\n permission,\n updateStrategy,\n isRequired,\n parser: {\n decode: (value) => value,\n encode: (value) => value,\n },\n });\n\n return (\n <div {...props} className={cn(\"flex flex-wrap items-center justify-start gap-1\", className)}>\n <Toggle\n data-inline-input=\"toggle\"\n disabled={!isAllowed}\n variant=\"outline\"\n pressed={value ?? undefined}\n defaultChecked={initialValue ?? undefined}\n onPressedChange={(value) => {\n handleChange(value);\n handleBlur(value);\n }}\n >\n {children}\n </Toggle>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,aAA+C,EAC7D,cACA,QACA,UACA,YACA,gBACA,YACA,WACA,GAAG,SAC+B;CAClC,MAAM,EAAE,OAAO,cAAc,YAAY,cAAc,cAAc;EACnE;EACA;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,UAAU;GACnB,SAAS,UAAU;GACpB;EACF,CAAC;AAEF,QACE,oBAAC;EAAI,GAAI;EAAO,WAAW,GAAG,mDAAmD,UAAU;YACzF,oBAAC;GACC,qBAAkB;GAClB,UAAU,CAAC;GACX,SAAQ;GACR,SAAS,SAAS;GAClB,gBAAgB,gBAAgB;GAChC,kBAAkB,UAAU;AAC1B,iBAAa,MAAM;AACnB,eAAW,MAAM;;GAGlB;IACM;GACL"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.client.d.mts","names":[],"sources":["../../../../src/modules/inline-edit/hooks/context.client.tsx"],"mappings":";;;;;;;;KASY,uBAAA;EAA4B,EAAA;EAAY,UAAA,GAAa,UAAA;AAAA;;;;iBAMjD,oBAAA,CAAA,GAAoB,uBAAA;;AAApC;;iBASgB,kBAAA,CAAA;EACd,QAAA;EAAA,GACG;AAAA,GACF,uBAAA;EAA4B,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/hooks/context.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { Permission } from \"@/modules/auth/lib/permissions\";\n\n/**\n * InlineEditContext\n */\nexport type InlineEditContextParams = { id: string; permission?: Permission };\nconst InlineEditContext = createContext<InlineEditContextParams | undefined>(undefined);\n\n/**\n * UseInlineEditContext\n */\nexport function useInlineEditContext() {\n const context = useContext(InlineEditContext);\n if (!context) throw new Error(\"InlineEditContext not found!\");\n return context;\n}\n\n/**\n * InlineEditContext Provider\n */\nexport function InlineEditProvider({\n children,\n ...value\n}: InlineEditContextParams & { children: React.ReactNode }) {\n return <InlineEditContext.Provider value={value}>{children}</InlineEditContext.Provider>;\n}\n"],"mappings":";;;;;;AAUA,MAAM,oBAAoB,cAAmD,OAAU;;;;AAKvF,SAAgB,uBAAuB;CACrC,MAAM,UAAU,WAAW,kBAAkB;AAC7C,KAAI,CAAC,QAAS,OAAM,IAAI,MAAM,+BAA+B;AAC7D,QAAO;;;;;AAMT,SAAgB,mBAAmB,EACjC,UACA,GAAG,SACuD;AAC1D,QAAO,oBAAC,kBAAkB;EAAgB;EAAQ;GAAsC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-inline.client.d.mts","names":[],"sources":["../../../../src/modules/inline-edit/hooks/use-inline.client.tsx"],"mappings":";;;;;;;;KAYK,cAAA;EAEC,IAAA;EACA,KAAA;AAAA;EAGA,IAAA;AAAA;AAAA,KAOD,UAAA,qCAA+C,QAAA,gBAAwB,MAAA,GAAS,MAAA;;;;KAKzE,oBAAA;EAfN;;;EAmBJ,YAAA,GAAe,UAAA,CAAW,OAAA,EAAS,QAAA;EAThC;;;EAaH,MAAA,GAAS,KAAA;IAAS,EAAA;IAAY,KAAA,EAAO,UAAA,CAAW,OAAA,EAAS,QAAA;EAAA,MAAgB,OAAA;EAbgB;;;EAiBzF,UAAA,GAAa,UAAA;EAjB6D;;;;AAK5E;;EAmBE,cAAA,GAAiB,cAAA;EAfS;;;;EAoB1B,UAAA,GAAa,QAAA;AAAA;;;;KAMH,kBAAA,kCACuB,IAAA,aAAiB,IAAA,GAAO,iBAAA,oCACvB,IAAA,aAAiB,IAAA,GAAO,iBAAA,sCAExD,oBAAA,CAAqB,OAAA,EAAS,QAAA;EAChC,MAAA;IAXqB;;;IAenB,MAAA,GAAS,KAAA,EAAO,OAAA,KAAY,MAAA;IAnCf;;;IAuCb,MAAA,GAAS,KAAA,EAAO,MAAA,KAAW,OAAA;EAAA;AAAA;;;;iBAOf,aAAA,kCACmB,IAAA,aAAiB,IAAA,GAAO,iBAAA,oCACvB,IAAA,aAAiB,IAAA,GAAO,iBAAA,GAAoB,MAAA,mCAAA,CAE9E,KAAA,EAAO,kBAAA,CAAmB,MAAA,EAAQ,OAAA,EAAS,QAAA;;;uBA8Ef,UAAA,CAAW,MAAA,EAAQ,QAAA;qBAsBrB,UAAA,CAAW,MAAA,EAAQ,QAAA;UAAT,eAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-inline.client.mjs","names":[],"sources":["../../../../src/modules/inline-edit/hooks/use-inline.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport type { EditorJSONContent } from \"@/components/entry\";\nimport { useLocalIndicator } from \"@/lib/entry.client\";\nimport { useAction } from \"@/lib/hooks/use-action\";\nimport { usePermission } from \"@/modules/auth/hooks/use-permission\";\nimport type { Permission } from \"@/modules/auth/lib/permissions\";\nimport { useInlineEditContext } from \"./context.client\";\n\ntype UpdateStrategy =\n | {\n mode: \"change\";\n delay?: number;\n }\n | {\n mode: \"blur\";\n };\n\nconst defaultUpdateStrategy: UpdateStrategy = {\n mode: \"blur\",\n};\n\ntype MaybeValue<TValue, Required extends boolean> = Required extends true ? TValue : TValue | null;\n\n/**\n * Use the inline edit hook options.\n */\nexport type useInlineEditOptions<TResult, Required extends boolean = false> = {\n /**\n * Initial value\n */\n initialValue?: MaybeValue<TResult, Required>;\n /**\n * Action to execute on update\n */\n action: (value: { id: string; value: MaybeValue<TResult, Required> }) => Promise<unknown>;\n /**\n * Permission required to edit\n */\n permission?: Permission;\n /**\n * Update strategy\n * - trigger: when to update the value (default: \"blur\")\n * - delay: delay in milliseconds before updating the value (only for \"change\" trigger)\n * @default { trigger: \"blur\" }\n */\n updateStrategy?: UpdateStrategy;\n /**\n * Is the value required\n * @default false\n */\n isRequired?: Required;\n};\n\n/**\n * Inline edit hook props\n */\nexport type UseInlineEditProps<\n TValue extends string | number | Date | boolean | JSON | EditorJSONContent,\n TResult extends string | number | Date | boolean | JSON | EditorJSONContent,\n Required extends boolean = false,\n> = useInlineEditOptions<TResult, Required> & {\n parser: {\n /**\n * Transform the value from the result type to the value type\n */\n decode: (value: TResult) => TValue;\n /**\n * Transform the value from the value type to the result type\n */\n encode: (value: TValue) => TResult;\n };\n};\n\n/**\n * Use the inline edit hook.\n */\nexport function useInlineEdit<\n TValue extends string | number | Date | boolean | JSON | EditorJSONContent,\n TResult extends string | number | Date | boolean | JSON | EditorJSONContent = TValue,\n Required extends boolean = false,\n>(props: UseInlineEditProps<TValue, TResult, Required>) {\n /**\n * The update strategy.\n */\n const strategy = props.updateStrategy ?? defaultUpdateStrategy;\n const delay = strategy.mode === \"change\" ? (strategy.delay ?? 0) : 0;\n const initialValue = props.parser.decode(props.initialValue as TResult) ?? undefined;\n\n /**\n * The inline edit context.\n */\n const context = useInlineEditContext();\n\n /**\n * The current value of the inline edit.\n */\n const [value, setValue] = useState<MaybeValue<TValue, Required> | undefined>(initialValue);\n\n /**\n * The indicator status.\n */\n const { status, setStatus } = useLocalIndicator();\n\n /**\n * Permission guard\n */\n const data = usePermission(props.permission ?? context.permission ?? {});\n const isAllowed = data?.success;\n\n /**\n * Execute the action to update the value.\n */\n const mutation = useAction({\n mutationFn: props.action,\n onMutate: () => {\n setStatus(\"pending\");\n },\n onSuccess: () => {\n setStatus(\"success\");\n },\n onError: (error) => {\n setValue(initialValue);\n toast.error(\"Er is iets misgegaan\", {\n description: error instanceof Error ? error.message : undefined,\n });\n },\n });\n\n /**\n * Handle instant mutate\n */\n const handleMutateInstant = useCallback(\n (input: TValue) => {\n // Permission guard\n if (!isAllowed) {\n toast.error(\"Je hebt geen toestemming om dit te bewerken\");\n return;\n }\n\n // If the value is the same as the initial value, do nothing\n if (input === initialValue) return;\n\n const value = props.parser.encode(input as TValue);\n\n // Update the value\n return mutation.mutate({ id: context.id, value });\n },\n [isAllowed, initialValue, mutation, context.id, props.parser],\n );\n\n /**\n * Handle mutate with debounce\n */\n const handleMutateDebounced = useDebouncedCallback(handleMutateInstant, delay);\n\n /**\n * Handle change updates\n */\n function handleChange(next: MaybeValue<TValue, Required> | null) {\n // Set value in state\n setValue(next ?? undefined);\n\n // If the strategy is not change, exit\n if (strategy.mode !== \"change\") return;\n\n // If it is required and the value is null or empty, reset to initial value\n if (props.isRequired && next === null) {\n setValue(initialValue ?? undefined);\n setStatus(\"error\");\n toast.error(\"Dit veld is verplicht\");\n return;\n }\n\n // If the strategy is change, update the value after the delay\n handleMutateDebounced(next as TValue);\n }\n\n /**\n * Handle blur updates\n */\n function handleBlur(next: MaybeValue<TValue, Required> | null) {\n // Set value in state\n setValue(next ?? undefined);\n\n // If the strategy is not blur, exit\n if (strategy.mode !== \"blur\") return;\n\n // If it is required and the value is null or empty, reset to initial value\n if (props.isRequired && next === null) {\n setValue(initialValue ?? undefined);\n setStatus(\"error\");\n toast.error(\"Dit veld is verplicht\");\n return;\n }\n\n // If the strategy is blur, update the value\n handleMutateInstant(next as TValue);\n }\n\n return { value, setValue, handleChange, handleBlur, status, isAllowed };\n}\n"],"mappings":";;;;;;;;;;;AAqBA,MAAM,wBAAwC,EAC5C,MAAM,QACP;;;;AAyDD,SAAgB,cAId,OAAsD;;;;CAItD,MAAM,WAAW,MAAM,kBAAkB;CACzC,MAAM,QAAQ,SAAS,SAAS,WAAY,SAAS,SAAS,IAAK;CACnE,MAAM,eAAe,MAAM,OAAO,OAAO,MAAM,aAAwB,IAAI;;;;CAK3E,MAAM,UAAU,sBAAsB;;;;CAKtC,MAAM,CAAC,OAAO,YAAY,SAAmD,aAAa;;;;CAK1F,MAAM,EAAE,QAAQ,cAAc,mBAAmB;CAMjD,MAAM,YADO,cAAc,MAAM,cAAc,QAAQ,cAAc,EAAE,CAAC,EAChD;;;;CAKxB,MAAM,WAAW,UAAU;EACzB,YAAY,MAAM;EAClB,gBAAgB;AACd,aAAU,UAAU;;EAEtB,iBAAiB;AACf,aAAU,UAAU;;EAEtB,UAAU,UAAU;AAClB,YAAS,aAAa;AACtB,SAAM,MAAM,wBAAwB,EAClC,aAAa,iBAAiB,QAAQ,MAAM,UAAU,QACvD,CAAC;;EAEL,CAAC;;;;CAKF,MAAM,sBAAsB,aACzB,UAAkB;AAEjB,MAAI,CAAC,WAAW;AACd,SAAM,MAAM,8CAA8C;AAC1D;;AAIF,MAAI,UAAU,aAAc;EAE5B,MAAM,QAAQ,MAAM,OAAO,OAAO,MAAgB;AAGlD,SAAO,SAAS,OAAO;GAAE,IAAI,QAAQ;GAAI;GAAO,CAAC;IAEnD;EAAC;EAAW;EAAc;EAAU,QAAQ;EAAI,MAAM;EAAO,CAC9D;;;;CAKD,MAAM,wBAAwB,qBAAqB,qBAAqB,MAAM;;;;CAK9E,SAAS,aAAa,MAA2C;AAE/D,WAAS,QAAQ,OAAU;AAG3B,MAAI,SAAS,SAAS,SAAU;AAGhC,MAAI,MAAM,cAAc,SAAS,MAAM;AACrC,YAAS,gBAAgB,OAAU;AACnC,aAAU,QAAQ;AAClB,SAAM,MAAM,wBAAwB;AACpC;;AAIF,wBAAsB,KAAe;;;;;CAMvC,SAAS,WAAW,MAA2C;AAE7D,WAAS,QAAQ,OAAU;AAG3B,MAAI,SAAS,SAAS,OAAQ;AAG9B,MAAI,MAAM,cAAc,SAAS,MAAM;AACrC,YAAS,gBAAgB,OAAU;AACnC,aAAU,QAAQ;AAClB,SAAM,MAAM,wBAAwB;AACpC;;AAIF,sBAAoB,KAAe;;AAGrC,QAAO;EAAE;EAAO;EAAU;EAAc;EAAY;EAAQ;EAAW"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.mts","names":[],"sources":["../../../../src/modules/inline-edit/lib/validators.ts"],"mappings":";;;;;AAAsC;cAKhC,gBAAA,EAAgB,GAAA,CAAA,SAAA;;;KAIV,gBAAA,WAA2B,GAAA,CAAE,KAAA,QAAa,gBAAA;EACpD,KAAA,EAAO,MAAA;AAAA;;;;cAMI,sBAAA,kBAAyC,OAAA,EAAS,KAAA,EAAO,MAAA,KAAM,GAAA,CAAA,SAAA;;;;;;;cAM/D,sBAAA,EAAsB,GAAA,CAAA,SAAA;;;;;;;cAKtB,sBAAA,EAAsB,GAAA,CAAA,SAAA;;;;;;;cAKtB,uBAAA,EAAuB,GAAA,CAAA,SAAA;;;;;;;cAKvB,oBAAA,EAAoB,GAAA,CAAA,SAAA;;;;;;;cAKpB,oBAAA,EAAoB,GAAA,CAAA,SAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validators.mjs","names":["z"],"sources":["../../../../src/modules/inline-edit/lib/validators.ts"],"sourcesContent":["import { type ZodType, z } from \"zod\";\n\n/**\n * Inline edit schema\n */\nconst inlineEditSchema = z.object({\n id: z.string(),\n});\n\nexport type InlineEditSchema<TValue> = z.infer<typeof inlineEditSchema> & {\n value: TValue;\n};\n\n/**\n * Create inline edit schema\n */\nexport const createInlineEditSchema = <TValue extends ZodType>(value: TValue) =>\n inlineEditSchema.extend({ value });\n\n/**\n * Inline edit string schema\n */\nexport const inlineEditStringSchema = createInlineEditSchema(z.string());\n\n/**\n * Inline edit number schema\n */\nexport const inlineEditNumberSchema = createInlineEditSchema(z.number());\n\n/**\n * Inline edit boolean schema\n */\nexport const inlineEditBooleanSchema = createInlineEditSchema(z.boolean());\n\n/**\n * Inline edit date schema\n */\nexport const inlineEditDateSchema = createInlineEditSchema(z.date());\n\n/**\n * Inline edit json schema\n */\nexport const inlineEditJsonSchema = createInlineEditSchema(z.any());\n"],"mappings":";;;;;;AAKA,MAAM,mBAAmBA,IAAE,OAAO,EAChC,IAAIA,IAAE,QAAQ,EACf,CAAC;;;;AASF,MAAa,0BAAkD,UAC7D,iBAAiB,OAAO,EAAE,OAAO,CAAC;;;;AAKpC,MAAa,yBAAyB,uBAAuBA,IAAE,QAAQ,CAAC;;;;AAKxE,MAAa,yBAAyB,uBAAuBA,IAAE,QAAQ,CAAC;;;;AAKxE,MAAa,0BAA0B,uBAAuBA,IAAE,SAAS,CAAC;;;;AAK1E,MAAa,uBAAuB,uBAAuBA,IAAE,MAAM,CAAC;;;;AAKpE,MAAa,uBAAuB,uBAAuBA,IAAE,KAAK,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"variants.d.mts","names":[],"sources":["../../../../src/modules/inline-edit/lib/variants.ts"],"mappings":";;;;cAEa,kBAAA,GAAkB,KAAA;;;IAkB7B,+BAAA,CAAA,SAAA;AAAA,KAEU,uBAAA,GAA0B,YAAA,QAAoB,kBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"variants.mjs","names":[],"sources":["../../../../src/modules/inline-edit/lib/variants.ts"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\n\nexport const inlineEditVariants = cva(\"\", {\n variants: {\n variant: {\n default: \"\",\n table:\n \"min-h-8 px-3 py-1 text-base md:text-sm rounded-none h-full w-full border-none outline-none ring-0 focus:border-0 focus:outline-none focus:ring-0 focus:ring-offset-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0\",\n },\n status: {\n idle: \"\",\n pending: \"opacity-70 animate-pulse\",\n success: \"\",\n error: \"border-destructive text-destructive\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n // status: \"idle\",\n },\n});\n\nexport type InlineEditVariantsProps = VariantProps<typeof inlineEditVariants>;\n"],"mappings":";;;AAEA,MAAa,qBAAqB,IAAI,IAAI;CACxC,UAAU;EACR,SAAS;GACP,SAAS;GACT,OACE;GACH;EACD,QAAQ;GACN,MAAM;GACN,SAAS;GACT,SAAS;GACT,OAAO;GACR;EACF;CACD,iBAAiB,EACf,SAAS,WAEV;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"caller.client.d.mts","names":[],"sources":["../../../../src/modules/router/handler/caller.client.tsx"],"mappings":";;;;;;AA6BA;iBAAgB,eAAA,iBAAgC,SAAA,CAAA,CAAA,GAAc,cAAA,CAAa,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"caller.client.mjs","names":[],"sources":["../../../../src/modules/router/handler/caller.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { createORPCClient } from \"@orpc/client\";\nimport { RPCLink } from \"@orpc/client/fetch\";\nimport type { AnyRouter, RouterClient as ORPCRouterClient } from \"@orpc/server\";\nimport { createTanstackQueryUtils } from \"@orpc/tanstack-query\";\nimport type { RouterClient } from \"./register.server\";\n\n/**\n * Create a new RPC link\n */\nconst link = new RPCLink({\n url: () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RPCLink is not allowed on the server side.\");\n }\n\n return `${window.location.origin}/api/rpc`;\n },\n});\n\n/**\n * Create a new RPC client\n */\nconst client: ORPCRouterClient<AnyRouter> = createORPCClient(link);\n\n/**\n * Create a new RPC client\n */\nexport function createRPCClient<TRouter extends AnyRouter>(): RouterClient<TRouter> {\n return createTanstackQueryUtils(client as ORPCRouterClient<TRouter>);\n}\n"],"mappings":";;;;;;;;;;AAwBA,MAAM,SAAsC,iBAb/B,IAAI,QAAQ,EACvB,WAAW;AACT,KAAI,OAAO,WAAW,YACpB,OAAM,IAAI,MAAM,6CAA6C;AAG/D,QAAO,GAAG,OAAO,SAAS,OAAO;GAEpC,CAAC,CAKgE;;;;AAKlE,SAAgB,kBAAoE;AAClF,QAAO,yBAAyB,OAAoC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"caller.server.d.mts","names":[],"sources":["../../../../src/modules/router/handler/caller.server.ts"],"mappings":";;;cAEa,eAAA,SAAe,kBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"caller.server.mjs","names":[],"sources":["../../../../src/modules/router/handler/caller.server.ts"],"sourcesContent":["import { createRouterClient } from \"@orpc/server\";\n\nexport const createRPCCaller = createRouterClient;\n"],"mappings":";;;AAEA,MAAa,kBAAkB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.server.d.mts","names":[],"sources":["../../../../src/modules/router/handler/context.server.ts"],"mappings":";;;;;;;;;;;;;;;;;;cAUa,gBAAA,mBACY,eAAA,EAAe,KAAA;EAAW,OAAA,EAAS,YAAA,CAAa,OAAA;AAAA,MAAU,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KASvE,UAAA,iBAA2B,eAAA,UAAyB,OAAA,CAC9D,UAAA,QAAkB,gBAAA,CAAiB,OAAA;AAAA,KAIzB,mBAAA,iBAAoC,eAAA,UAAyB,UAAA,CAAW,OAAA;EAClF,OAAA,EAAS,WAAA,CAAY,UAAA,CAAW,OAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.server.mjs","names":["headers","headersList"],"sources":["../../../../src/modules/router/handler/context.server.ts"],"sourcesContent":["import \"server-cli-only\";\n\nimport { headers as headersList } from \"next/headers\";\nimport { cache } from \"react\";\nimport type { TDatabaseSchema } from \"@/modules/config/db/types\";\nimport type { TulipContext } from \"@/modules/config/entry\";\n\n/**\n * Create the router context\n */\nexport const createRPCContext = cache(\n async <TSchema extends TDatabaseSchema>(props: { context: TulipContext<TSchema> }) => {\n const headers = await headersList();\n const session = await props.context.auth.api.getSession({ headers });\n\n return { ...props.context, session, headers };\n },\n);\n\n// biome-ignore lint/suspicious/noExplicitAny: This is needed to satisfy the system\nexport type RPCContext<TSchema extends TDatabaseSchema = any> = Awaited<\n ReturnType<typeof createRPCContext<TSchema>>\n>;\n\n// biome-ignore lint/suspicious/noExplicitAny: This is needed to satisfy the system\nexport type ProtectedRPCContext<TSchema extends TDatabaseSchema = any> = RPCContext<TSchema> & {\n session: NonNullable<RPCContext<TSchema>[\"session\"]>;\n};\n"],"mappings":";;;;;;;;AAUA,MAAa,mBAAmB,MAC9B,OAAwC,UAA8C;CACpF,MAAMA,YAAU,MAAMC,SAAa;CACnC,MAAM,UAAU,MAAM,MAAM,QAAQ,KAAK,IAAI,WAAW,EAAE,oBAAS,CAAC;AAEpE,QAAO;EAAE,GAAG,MAAM;EAAS;EAAS;EAAS;EAEhD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.server.d.mts","names":[],"sources":["../../../../src/modules/router/handler/init.server.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;iBAWgB,OAAA,iBAAwB,eAAA,CAAA,CAAA;;;;sCAwBK,UAAA,mBAAU,mBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.server.mjs","names":[],"sources":["../../../../src/modules/router/handler/init.server.ts"],"sourcesContent":["import \"server-cli-only\";\n\nimport { os } from \"@orpc/server\";\nimport type { Permission } from \"@/modules/auth/lib/permissions\";\nimport type { TDatabaseSchema } from \"@/modules/config/db/types\";\nimport { ServerError } from \"../lib/error.server\";\nimport type { ProtectedRPCContext, RPCContext } from \"./context.server\";\n\n/**\n * Initialize TRPC\n */\nexport function initRPC<TSchema extends TDatabaseSchema>() {\n /**\n * Create the router\n */\n const o = os.$context<RPCContext<TSchema>>();\n\n /**\n * Middleware function to check if the user is authenticated\n */\n const authMiddleware = o.middleware(async (opts) => {\n if (!opts.context.session) {\n throw new ServerError(\"UNAUTHORIZED\", {\n message: \"Jou hebt geen toegang om deze actie uit te voeren\",\n });\n }\n\n return opts.next({\n context: { ...opts.context, session: opts.context.session } as ProtectedRPCContext<TSchema>,\n });\n });\n\n /**\n * Middleware function to check if the user has the required permission\n */\n function permissionMiddleware(permissions: Permission) {\n /**\n * Middleware function to check if the user has the required permission\n */\n return os.$context<ProtectedRPCContext<TSchema>>().middleware(async (opts) => {\n const { success, error } = await opts.context.auth.api.userHasPermission({\n body: {\n userId: opts.context.session.user.id,\n permissions,\n },\n });\n\n if (error || !success) {\n throw new ServerError(\"UNAUTHORIZED\", {\n message: \"Jou hebt geen toegang om deze actie uit te voeren\",\n });\n }\n\n return opts.next({ context: { ...opts.context } as ProtectedRPCContext<TSchema> });\n });\n }\n\n /**\n * Public procedures\n */\n const publicProcedure = o;\n\n /**\n * Protected procedures\n */\n const protectedProcedure = o.use(authMiddleware);\n\n /**\n * Export\n */\n return {\n publicProcedure,\n protectedProcedure,\n authMiddleware,\n permissionMiddleware,\n };\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,UAA2C;;;;CAIzD,MAAM,IAAI,GAAG,UAA+B;;;;CAK5C,MAAM,iBAAiB,EAAE,WAAW,OAAO,SAAS;AAClD,MAAI,CAAC,KAAK,QAAQ,QAChB,OAAM,IAAI,YAAY,gBAAgB,EACpC,SAAS,qDACV,CAAC;AAGJ,SAAO,KAAK,KAAK,EACf,SAAS;GAAE,GAAG,KAAK;GAAS,SAAS,KAAK,QAAQ;GAAS,EAC5D,CAAC;GACF;;;;CAKF,SAAS,qBAAqB,aAAyB;;;;AAIrD,SAAO,GAAG,UAAwC,CAAC,WAAW,OAAO,SAAS;GAC5E,MAAM,EAAE,SAAS,UAAU,MAAM,KAAK,QAAQ,KAAK,IAAI,kBAAkB,EACvE,MAAM;IACJ,QAAQ,KAAK,QAAQ,QAAQ,KAAK;IAClC;IACD,EACF,CAAC;AAEF,OAAI,SAAS,CAAC,QACZ,OAAM,IAAI,YAAY,gBAAgB,EACpC,SAAS,qDACV,CAAC;AAGJ,UAAO,KAAK,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,SAAS,EAAkC,CAAC;IAClF;;;;;AAgBJ,QAAO;EACL,iBAXsB;EAYtB,oBAPyB,EAAE,IAAI,eAAe;EAQ9C;EACA;EACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"register.server.d.mts","names":[],"sources":["../../../../src/modules/router/handler/register.server.ts"],"mappings":";;;;KAKY,cAAA,iBAA6B,SAAA,IAAa,WAAA,CAAY,YAAA,CAAiB,OAAA;AAAA,iBAEnE,oBAAA,iBAAqC,SAAA,CAAA,CAAW,MAAA,EAAQ,YAAA,CAAiB,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"register.server.mjs","names":[],"sources":["../../../../src/modules/router/handler/register.server.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: This is needed to satisfy the system */\n\nimport type { AnyRouter, RouterClient as ORPCRouterClient } from \"@orpc/server\";\nimport { createTanstackQueryUtils, type RouterUtils } from \"@orpc/tanstack-query\";\n\nexport type RouterClient<TRouter extends AnyRouter> = RouterUtils<ORPCRouterClient<TRouter>>;\n\nexport function registerRouterClient<TRouter extends AnyRouter>(client: ORPCRouterClient<TRouter>) {\n if (!(globalThis as any).$client) {\n (globalThis as any).$client = createTanstackQueryUtils(client);\n }\n\n return (globalThis as any).$client;\n}\n"],"mappings":";;;AAOA,SAAgB,qBAAgD,QAAmC;AACjG,KAAI,CAAE,WAAmB,QACvB,CAAC,WAAmB,UAAU,yBAAyB,OAAO;AAGhE,QAAQ,WAAmB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"route.server.d.mts","names":[],"sources":["../../../../src/modules/router/handler/route.server.ts"],"mappings":";;;;;;;AAUA;iBAAgB,cAAA,iBAA+B,SAAA,kBAA2B,eAAA,CAAA,CAAiB,KAAA;EACzF,SAAA,EAAW,OAAA;EACX,OAAA,EAAS,YAAA,CAAa,OAAA;AAAA;kBAUgB,OAAA,KAAO,OAAA,CAAA,QAAA;iBAAP,OAAA,KAAO,OAAA,CAAA,QAAA;kBAAP,OAAA,KAAO,OAAA,CAAA,QAAA;iBAAP,OAAA,KAAO,OAAA,CAAA,QAAA;mBAAP,OAAA,KAAO,OAAA,CAAA,QAAA;oBAAP,OAAA,KAAO,OAAA,CAAA,QAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"route.server.mjs","names":[],"sources":["../../../../src/modules/router/handler/route.server.ts"],"sourcesContent":["import { onError } from \"@orpc/client\";\nimport type { AnyRouter } from \"@orpc/server\";\nimport { RPCHandler } from \"@orpc/server/fetch\";\nimport type { TDatabaseSchema } from \"@/modules/config/db/types\";\nimport type { TulipContext } from \"@/modules/config/lib/context\";\nimport { createRPCContext } from \"./context.server\";\n\n/**\n * RPC Route handler\n */\nexport function handleRPCRoute<TRouter extends AnyRouter, TSchema extends TDatabaseSchema>(props: {\n appRouter: TRouter;\n context: TulipContext<TSchema>;\n}) {\n const handler = new RPCHandler(props.appRouter, {\n interceptors: [\n onError((error) => {\n console.error(JSON.stringify(error));\n }),\n ],\n });\n\n async function handleRequest(request: Request) {\n const rpcContext = await createRPCContext({ context: props.context });\n const { response } = await handler.handle(request, {\n prefix: \"/api/rpc\",\n context: rpcContext,\n });\n\n return response ?? new Response(\"Not found\", { status: 404 });\n }\n\n return {\n HEAD: handleRequest,\n GET: handleRequest,\n POST: handleRequest,\n PUT: handleRequest,\n PATCH: handleRequest,\n DELETE: handleRequest,\n };\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,eAA2E,OAGxF;CACD,MAAM,UAAU,IAAI,WAAW,MAAM,WAAW,EAC9C,cAAc,CACZ,SAAS,UAAU;AACjB,UAAQ,MAAM,KAAK,UAAU,MAAM,CAAC;GACpC,CACH,EACF,CAAC;CAEF,eAAe,cAAc,SAAkB;EAC7C,MAAM,aAAa,MAAM,iBAAiB,EAAE,SAAS,MAAM,SAAS,CAAC;EACrE,MAAM,EAAE,aAAa,MAAM,QAAQ,OAAO,SAAS;GACjD,QAAQ;GACR,SAAS;GACV,CAAC;AAEF,SAAO,YAAY,IAAI,SAAS,aAAa,EAAE,QAAQ,KAAK,CAAC;;AAG/D,QAAO;EACL,MAAM;EACN,KAAK;EACL,MAAM;EACN,KAAK;EACL,OAAO;EACP,QAAQ;EACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","names":[],"sources":["../../../../src/modules/router/lib/helpers.ts"],"sourcesContent":["import { StandardRPCJsonSerializer } from \"@orpc/client/standard\";\n\nexport const serializer = new StandardRPCJsonSerializer();\n"],"mappings":";;;AAEA,MAAa,aAAa,IAAI,2BAA2B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query-client.d.mts","names":[],"sources":["../../../../src/modules/router/lib/query-client.ts"],"mappings":";;;;;AAMA;iBAAgB,iBAAA,CAAA,GAAiB,WAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query-client.mjs","names":[],"sources":["../../../../src/modules/router/lib/query-client.ts"],"sourcesContent":["import { isServer, MutationCache, QueryClient } from \"@tanstack/react-query\";\nimport { serializer } from \"./helpers\";\n\n/**\n * Create a new query client\n */\nexport function createQueryClient() {\n let queryClient: QueryClient;\n\n const mutationCache = new MutationCache({\n onSuccess: () => {\n // Invalidate all queries in the react-query cache:\n queryClient.invalidateQueries();\n },\n });\n\n queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n queryKeyHashFn(queryKey) {\n const [json, meta] = serializer.serialize(queryKey);\n return JSON.stringify({ json, meta });\n },\n staleTime: 60 * 1000, // > 0 to prevent immediate refetching on mount\n },\n dehydrate: {\n serializeData(data) {\n const [json, meta] = serializer.serialize(data);\n return { json, meta };\n },\n },\n hydrate: {\n deserializeData(data) {\n return serializer.deserialize(data.json, data.meta);\n },\n },\n },\n mutationCache,\n });\n\n return queryClient;\n}\n\n/**\n * Create a stable getter for the query client that will return the same client during the same request.\n */\nlet browserQueryClient: QueryClient;\n\nexport function getQueryClient() {\n if (isServer) {\n // Server: always make a new query client\n return createQueryClient();\n }\n\n // Browser: make a new query client if we don't already have one\n // This is very important, so we don't re-make a new client if React\n // suspends during the initial render. This may not be needed if we\n // have a suspense boundary BELOW the creation of the query client\n if (!browserQueryClient) browserQueryClient = createQueryClient();\n\n return browserQueryClient;\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,oBAAoB;CAClC,IAAI;AASJ,eAAc,IAAI,YAAY;EAC5B,gBAAgB;GACd,SAAS;IACP,eAAe,UAAU;KACvB,MAAM,CAAC,MAAM,QAAQ,WAAW,UAAU,SAAS;AACnD,YAAO,KAAK,UAAU;MAAE;MAAM;MAAM,CAAC;;IAEvC,WAAW,KAAK;IACjB;GACD,WAAW,EACT,cAAc,MAAM;IAClB,MAAM,CAAC,MAAM,QAAQ,WAAW,UAAU,KAAK;AAC/C,WAAO;KAAE;KAAM;KAAM;MAExB;GACD,SAAS,EACP,gBAAgB,MAAM;AACpB,WAAO,WAAW,YAAY,KAAK,MAAM,KAAK,KAAK;MAEtD;GACF;EACD,eA5BoB,IAAI,cAAc,EACtC,iBAAiB;AAEf,eAAY,mBAAmB;KAElC,CAAC;EAwBD,CAAC;AAEF,QAAO;;;;;AAMT,IAAI;AAEJ,SAAgB,iBAAiB;AAC/B,KAAI,SAEF,QAAO,mBAAmB;AAO5B,KAAI,CAAC,mBAAoB,sBAAqB,mBAAmB;AAEjE,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query-client.server.d.mts","names":[],"sources":["../../../../src/modules/router/lib/query-client.server.tsx"],"mappings":";;;;;;;;cASa,cAAA,SAAc,iBAAA;;;;iBAKX,aAAA,CAAc,KAAA;EAAS,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query-client.server.mjs","names":[],"sources":["../../../../src/modules/router/lib/query-client.server.tsx"],"sourcesContent":["import \"server-cli-only\";\n\nimport { dehydrate, HydrationBoundary } from \"@tanstack/react-query\";\nimport { cache } from \"react\";\nimport { createQueryClient } from \"./query-client\";\n\n/**\n * Create a stable getter for the query client that will return the same client during the same request.\n */\nexport const getQueryClient = cache(createQueryClient);\n\n/**\n * Hydrate the client with the data from the server\n */\nexport function HydrateClient(props: { children: React.ReactNode }) {\n const queryClient = getQueryClient();\n\n return <HydrationBoundary state={dehydrate(queryClient)}>{props.children}</HydrationBoundary>;\n}\n"],"mappings":";;;;;;;;;;AASA,MAAa,iBAAiB,MAAM,kBAAkB;;;;AAKtD,SAAgB,cAAc,OAAsC;AAGlE,QAAO,oBAAC;EAAkB,OAAO,UAFb,gBAAgB,CAEmB;YAAG,MAAM;GAA6B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.mts","names":[],"sources":["../../../../src/modules/router/lib/validators.ts"],"mappings":";;;;;AAKA;cAAa,gBAAA,EAAgB,GAAA,CAAA,SAAA;;;KAIjB,gBAAA,GAAmB,GAAA,CAAE,KAAA,QAAa,gBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validators.mjs","names":["z"],"sources":["../../../../src/modules/router/lib/validators.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Bulk action schema\n */\nexport const bulkActionSchema = z.object({\n ids: z.array(z.string()),\n});\n\nexport type BulkActionSchema = z.infer<typeof bulkActionSchema>;\n"],"mappings":";;;;;;AAKA,MAAa,mBAAmBA,IAAE,OAAO,EACvC,KAAKA,IAAE,MAAMA,IAAE,QAAQ,CAAC,EACzB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dropzone-context.client.d.mts","names":[],"sources":["../../../../src/modules/storage/components/dropzone-context.client.tsx"],"mappings":";;;;KAKK,mBAAA;EACH,GAAA,GAAM,IAAA;EACN,MAAA,GAAS,eAAA;EACT,OAAA,GAAU,eAAA;EACV,OAAA,GAAU,eAAA;EACV,QAAA,GAAW,eAAA;AAAA;AAAA,cAGA,eAAA,EAAe,KAAA,CAAA,OAAA,CAAA,mBAAA;;;;iBAKZ,kBAAA,CAAA,GAAkB,mBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dropzone-context.client.mjs","names":[],"sources":["../../../../src/modules/storage/components/dropzone-context.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, use } from \"react\";\nimport type { DropzoneOptions } from \"react-dropzone\";\n\ntype DropzoneContextType = {\n src?: File[];\n accept?: DropzoneOptions[\"accept\"];\n maxSize?: DropzoneOptions[\"maxSize\"];\n minSize?: DropzoneOptions[\"minSize\"];\n maxFiles?: DropzoneOptions[\"maxFiles\"];\n};\n\nexport const DropzoneContext = createContext<DropzoneContextType | undefined>(undefined);\n\n/**\n * Dropzone context hook\n */\nexport function useDropzoneContext() {\n const context = use(DropzoneContext);\n if (!context) throw new Error(\"useDropzoneContext must be used within a Dropzone\");\n return context;\n}\n"],"mappings":";;;;;AAaA,MAAa,kBAAkB,cAA+C,OAAU;;;;AAKxF,SAAgB,qBAAqB;CACnC,MAAM,UAAU,IAAI,gBAAgB;AACpC,KAAI,CAAC,QAAS,OAAM,IAAI,MAAM,oDAAoD;AAClF,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dropzone.client.d.mts","names":[],"sources":["../../../../src/modules/storage/components/dropzone.client.tsx"],"mappings":";;;;;;;;;KAcY,aAAA,GAAgB,IAAA,CAAK,eAAA;EAC/B,GAAA,GAAM,IAAA;EACN,SAAA;EACA,MAAA,IAAU,aAAA,EAAe,IAAA,IAAQ,cAAA,EAAgB,aAAA,IAAiB,KAAA,EAAO,SAAA;EACzE,QAAA,GAAW,SAAA;AAAA;AAAA,iBAGG,QAAA,CAAA;EACd,MAAA;EACA,QAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,GAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,aAAA,GAAa,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;KA0CJ,oBAAA;EACV,QAAA,GAAW,SAAA;EACX,SAAA;AAAA;AAAA,iBAKc,eAAA,CAAA;EAAkB,QAAA;EAAU;AAAA,GAAa,oBAAA,qCAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,KAAA,CAAA,WAAA,GAAA,KAAA,CAAA,YAAA,mBAAA,KAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,SAAA;;;;KA8BjE,uBAAA;EACV,QAAA,GAAW,SAAA;EACX,SAAA;AAAA;AAAA,iBAGc,kBAAA,CAAA;EAAqB,QAAA;EAAU;AAAA,GAAa,uBAAA,qCAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,KAAA,CAAA,WAAA,GAAA,KAAA,CAAA,YAAA,mBAAA,KAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,SAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dropzone.client.mjs","names":[],"sources":["../../../../src/modules/storage/components/dropzone.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { UploadIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport type { DropEvent, DropzoneOptions, FileRejection } from \"react-dropzone\";\nimport { useDropzone } from \"react-dropzone\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { renderBytes } from \"../lib/helpers\";\nimport { DropzoneContext, useDropzoneContext } from \"./dropzone-context.client\";\n\n/**\n * Dropzone\n */\nexport type DropzoneProps = Omit<DropzoneOptions, \"onDrop\"> & {\n src?: File[];\n className?: string;\n onDrop?: (acceptedFiles: File[], fileRejections: FileRejection[], event: DropEvent) => void;\n children?: ReactNode;\n};\n\nexport function Dropzone({\n accept,\n maxFiles = 1,\n maxSize,\n minSize,\n onDrop,\n onError,\n disabled,\n src,\n className,\n children,\n ...props\n}: DropzoneProps) {\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n accept,\n maxFiles,\n maxSize,\n minSize,\n onError,\n disabled,\n onDrop: (acceptedFiles, fileRejections, event) => {\n if (fileRejections.length > 0) {\n const message = fileRejections.at(0)?.errors.at(0)?.message;\n onError?.(new Error(message));\n return;\n }\n onDrop?.(acceptedFiles, fileRejections, event);\n },\n ...props,\n });\n\n return (\n <DropzoneContext key={JSON.stringify(src)} value={{ src, accept, maxSize, minSize, maxFiles }}>\n <Button\n className={cn(\n \"relative h-auto w-full flex-col overflow-hidden p-8\",\n isDragActive && \"outline-none ring-1 ring-ring\",\n className,\n )}\n disabled={disabled}\n type=\"button\"\n variant=\"outline\"\n {...getRootProps()}\n >\n <input {...getInputProps()} disabled={disabled} />\n {children}\n </Button>\n </DropzoneContext>\n );\n}\n\n/**\n * DropzoneContent\n */\nexport type DropzoneContentProps = {\n children?: ReactNode;\n className?: string;\n};\n\nconst maxLabelItems = 3;\n\nexport function DropzoneContent({ children, className }: DropzoneContentProps) {\n const { src } = useDropzoneContext();\n if (!src) return null;\n\n if (children) return children;\n\n return (\n <div className={cn(\"flex flex-col items-center justify-center\", className)}>\n <div className=\"flex size-8 items-center justify-center rounded-md bg-muted text-muted-foreground\">\n <UploadIcon size={16} />\n </div>\n\n <p className=\"my-2 w-full truncate font-medium text-sm\">\n {src.length > maxLabelItems\n ? `${new Intl.ListFormat(\"en\").format(\n src.slice(0, maxLabelItems).map((file) => file.name),\n )} and ${src.length - maxLabelItems} more`\n : new Intl.ListFormat(\"en\").format(src.map((file) => file.name))}\n </p>\n\n <p className=\"w-full text-wrap text-muted-foreground text-xs\">\n Drag and drop or click to replace\n </p>\n </div>\n );\n}\n\n/**\n * DropzoneEmptyState\n */\nexport type DropzoneEmptyStateProps = {\n children?: ReactNode;\n className?: string;\n};\n\nexport function DropzoneEmptyState({ children, className }: DropzoneEmptyStateProps) {\n const { src, accept, maxSize, minSize, maxFiles } = useDropzoneContext();\n if (src) {\n return null;\n }\n if (children) {\n return children;\n }\n let caption = \"\";\n if (accept) {\n caption += \"Accepts \";\n caption += new Intl.ListFormat(\"en\").format(Object.keys(accept));\n }\n if (minSize && maxSize) {\n caption += ` between ${renderBytes(minSize)} and ${renderBytes(maxSize)}`;\n } else if (minSize) {\n caption += ` at least ${renderBytes(minSize)}`;\n } else if (maxSize) {\n caption += ` less than ${renderBytes(maxSize)}`;\n }\n return (\n <div className={cn(\"flex flex-col items-center justify-center\", className)}>\n <div className=\"flex size-8 items-center justify-center rounded-md bg-muted text-muted-foreground\">\n <UploadIcon size={16} />\n </div>\n <p className=\"my-2 w-full truncate text-wrap font-medium text-sm\">\n Upload {maxFiles === 1 ? \"a file\" : \"files\"}\n </p>\n <p className=\"w-full truncate text-wrap text-muted-foreground text-xs\">\n Drag and drop or click to upload\n </p>\n {caption && <p className=\"text-wrap text-muted-foreground text-xs\">{caption}.</p>}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAqBA,SAAgB,SAAS,EACvB,QACA,WAAW,GACX,SACA,SACA,QACA,SACA,UACA,KACA,WACA,UACA,GAAG,SACa;CAChB,MAAM,EAAE,cAAc,eAAe,iBAAiB,YAAY;EAChE;EACA;EACA;EACA;EACA;EACA;EACA,SAAS,eAAe,gBAAgB,UAAU;AAChD,OAAI,eAAe,SAAS,GAAG;IAC7B,MAAM,UAAU,eAAe,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE;AACpD,cAAU,IAAI,MAAM,QAAQ,CAAC;AAC7B;;AAEF,YAAS,eAAe,gBAAgB,MAAM;;EAEhD,GAAG;EACJ,CAAC;AAEF,QACE,oBAAC;EAA0C,OAAO;GAAE;GAAK;GAAQ;GAAS;GAAS;GAAU;YAC3F,qBAAC;GACC,WAAW,GACT,uDACA,gBAAgB,iCAChB,UACD;GACS;GACV,MAAK;GACL,SAAQ;GACR,GAAI,cAAc;cAElB,oBAAC;IAAM,GAAI,eAAe;IAAY;KAAY,EACjD;IACM;IAdW,KAAK,UAAU,IAAI,CAevB;;AAYtB,MAAM,gBAAgB;AAEtB,SAAgB,gBAAgB,EAAE,UAAU,aAAmC;CAC7E,MAAM,EAAE,QAAQ,oBAAoB;AACpC,KAAI,CAAC,IAAK,QAAO;AAEjB,KAAI,SAAU,QAAO;AAErB,QACE,qBAAC;EAAI,WAAW,GAAG,6CAA6C,UAAU;;GACxE,oBAAC;IAAI,WAAU;cACb,oBAAC,cAAW,MAAM,KAAM;KACpB;GAEN,oBAAC;IAAE,WAAU;cACV,IAAI,SAAS,gBACV,GAAG,IAAI,KAAK,WAAW,KAAK,CAAC,OAC3B,IAAI,MAAM,GAAG,cAAc,CAAC,KAAK,SAAS,KAAK,KAAK,CACrD,CAAC,OAAO,IAAI,SAAS,cAAc,SACpC,IAAI,KAAK,WAAW,KAAK,CAAC,OAAO,IAAI,KAAK,SAAS,KAAK,KAAK,CAAC;KAChE;GAEJ,oBAAC;IAAE,WAAU;cAAiD;KAE1D;;GACA;;AAYV,SAAgB,mBAAmB,EAAE,UAAU,aAAsC;CACnF,MAAM,EAAE,KAAK,QAAQ,SAAS,SAAS,aAAa,oBAAoB;AACxE,KAAI,IACF,QAAO;AAET,KAAI,SACF,QAAO;CAET,IAAI,UAAU;AACd,KAAI,QAAQ;AACV,aAAW;AACX,aAAW,IAAI,KAAK,WAAW,KAAK,CAAC,OAAO,OAAO,KAAK,OAAO,CAAC;;AAElE,KAAI,WAAW,QACb,YAAW,YAAY,YAAY,QAAQ,CAAC,OAAO,YAAY,QAAQ;UAC9D,QACT,YAAW,aAAa,YAAY,QAAQ;UACnC,QACT,YAAW,cAAc,YAAY,QAAQ;AAE/C,QACE,qBAAC;EAAI,WAAW,GAAG,6CAA6C,UAAU;;GACxE,oBAAC;IAAI,WAAU;cACb,oBAAC,cAAW,MAAM,KAAM;KACpB;GACN,qBAAC;IAAE,WAAU;eAAqD,WACxD,aAAa,IAAI,WAAW;KAClC;GACJ,oBAAC;IAAE,WAAU;cAA0D;KAEnE;GACH,WAAW,qBAAC;IAAE,WAAU;eAA2C,SAAQ;KAAK;;GAC7E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image-grid.client.d.mts","names":[],"sources":["../../../../src/modules/storage/components/image-grid.client.tsx"],"mappings":";;;;;;;;KA4CK,cAAA,GAAiB,cAAA;EACpB,MAAA,EAAQ,YAAA;EACR,QAAA;EACA,UAAA,GAAa,MAAA;IAAU,SAAA;IAAmB,OAAA;EAAA,MAAsB,OAAA;EAChE,UAAA;IACE,IAAA,IAAQ,MAAA;MAAU,SAAA;MAAmB,OAAA;IAAA,MAAsB,OAAA;EAAA;AAAA;AAAA,iBAI/C,SAAA,CAAA;EAAY,MAAA;EAAQ,UAAA;EAAY,UAAA;EAAY,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAyKhF,iBAAA,CAAkB,KAAA,EAAO,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image-grid.client.mjs","names":[],"sources":["../../../../src/modules/storage/components/image-grid.client.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useDroppable,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n rectSortingStrategy,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { GripIcon, UploadIcon } from \"lucide-react\";\nimport React, { type ComponentProps } from \"react\";\nimport { Icons } from \"@/components/common/icons\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card } from \"@/components/ui/card\";\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/components/ui/carousel.client\";\nimport { Dialog, DialogContent, DialogTrigger } from \"@/components/ui/dialog.client\";\nimport { Input } from \"@/components/ui/input\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { useAction } from \"@/lib/entry.client\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { getAssetURL } from \"../lib/helpers\";\nimport type { StorageAsset } from \"../lib/validators\";\nimport { StorageImage } from \"./image.client\";\nimport { useUploadZone } from \"./upload-zone-context.client\";\n\n/**\n * Image Grid\n */\ntype ImageGridProps = ComponentProps<\"div\"> & {\n assets: StorageAsset[];\n disabled?: boolean;\n moveAction: (params: { fromIndex: number; toIndex: number }) => Promise<void>;\n optimistic?: {\n move?: (params: { fromIndex: number; toIndex: number }) => Promise<void> | void;\n };\n};\n\nexport function ImageGrid({ assets, moveAction, optimistic, disabled, ...props }: ImageGridProps) {\n const uploadZone = useUploadZone();\n\n const images = assets.flatMap((asset) => ({ ...asset, url: getAssetURL(asset.id) }));\n\n const [current, setCurrent] = React.useState<number>(0);\n\n const { setNodeRef } = useDroppable({ id: \"image-grid\" });\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n\n const moveMuration = useAction({\n mutationFn: async ({ active, over }: DragEndEvent) => {\n if (!moveAction) return Promise.resolve();\n\n const activeId = active.id;\n const overId = over?.id;\n if (!activeId || !overId || activeId === overId) return Promise.resolve();\n\n const fromIndex = images.findIndex((image) => image.id === activeId);\n const toIndex = images.findIndex((image) => image.id === overId);\n\n await optimistic?.move?.({ fromIndex, toIndex });\n await moveAction({ fromIndex, toIndex });\n },\n onSuccess: async () => {\n setCurrent(0);\n await uploadZone.optimistic?.invalidate?.();\n },\n onError: (error) => {\n console.error(\"Error moving image:\", error);\n },\n });\n\n return (\n <Dialog {...props}>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={moveMuration.mutate}\n >\n <div\n ref={setNodeRef}\n className=\"grid grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] gap-5\"\n >\n <SortableContext items={images.map((image) => image.id)} strategy={rectSortingStrategy}>\n {images.map((asset, index) => (\n <ImageGridItem key={asset.id} asset={asset} index={index} setCurrent={setCurrent} />\n ))}\n\n {!disabled && (\n <label\n htmlFor=\"file-upload\"\n className=\"relative flex aspect-square w-full cursor-pointer flex-col items-center justify-center rounded-lg border border-muted-foreground border-dashed bg-muted hover:border-primary\"\n >\n <UploadIcon className=\"h-8 w-8\" />\n <Input\n id=\"file-upload\"\n type=\"file\"\n accept=\"image/jpeg, image/png, image/webp, image/gif\"\n className=\"absolute inset-0 z-10 h-full w-full cursor-pointer opacity-0\"\n multiple\n onChange={(e) => {\n if (!e.target.files) return;\n return Array.from(e.target.files).map(uploadZone.onUpload);\n }}\n />\n </label>\n )}\n </SortableContext>\n </div>\n </DndContext>\n\n <Carousel className=\"w-full\" opts={{ startIndex: current }}>\n <DialogContent className=\"border-none bg-transparent p-0 shadow-none md:max-w-[80vw] xl:max-w-[60vw]\">\n <CarouselContent className=\"md:max-h-[80vh]\">\n {images.map(({ id, url }) => (\n <CarouselItem key={id} className=\"overflow-hidden rounded-xl\">\n <StorageImage\n src={url}\n alt=\"Image Preview\"\n width={1920}\n height={1080}\n className=\"h-full w-full rounded-xl object-contain\"\n />\n </CarouselItem>\n ))}\n </CarouselContent>\n <CarouselPrevious />\n <CarouselNext />\n </DialogContent>\n </Carousel>\n </Dialog>\n );\n}\n\n/**\n * Image Grid Item\n */\ntype ImageGridItemProps = {\n asset: StorageAsset & { url: string };\n index: number;\n setCurrent: React.Dispatch<React.SetStateAction<number>>;\n};\n\nfunction ImageGridItem({ asset, index, setCurrent }: ImageGridItemProps) {\n const uploadZone = useUploadZone();\n\n const { attributes, listeners, setNodeRef, transform, transition } = useSortable({\n id: asset.id,\n });\n\n return (\n <Card\n id={asset.id}\n ref={setNodeRef}\n style={{\n transform: CSS.Transform.toString(transform),\n transition,\n }}\n className={cn(\n \"group relative aspect-square w-full\",\n asset.status === \"pending\" && \"opacity-30\",\n )}\n >\n {asset.status === \"ready\" ? (\n <>\n <DialogTrigger onClick={() => setCurrent(index)}>\n <StorageImage\n src={asset.url}\n alt=\"Image Preview\"\n width={100}\n height={100}\n className=\"absolute inset-0 h-full w-full cursor-pointer rounded-lg bg-muted object-contain\"\n />\n </DialogTrigger>\n\n <Button\n {...attributes}\n {...listeners}\n type=\"button\"\n variant=\"secondary\"\n size=\"icon\"\n className=\"absolute top-2 right-2 hidden p-1 group-hover:flex\"\n >\n <GripIcon className=\"size-4\" />\n </Button>\n\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"icon\"\n onClick={() => uploadZone.onRemove([asset.id])}\n className=\"absolute top-2 left-2 hidden p-1 group-hover:flex\"\n >\n <Icons.trash className=\"size-4\" />\n </Button>\n </>\n ) : (\n <Skeleton className=\"absolute inset-0 h-full w-full rounded-lg\" />\n )}\n </Card>\n );\n}\n\nexport function ImageGridSkeleton(props: ComponentProps<\"div\">) {\n return (\n <div\n {...props}\n className={cn(\"grid grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] gap-5\", props.className)}\n >\n {Array.from({ length: 12 }).map((_, index) => (\n <Skeleton key={index} className=\"aspect-square w-full rounded-lg\" />\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image.client.d.mts","names":[],"sources":["../../../../src/modules/storage/components/image.client.tsx"],"mappings":";;;;iBAKgB,YAAA,CAAa,KAAA,EAAO,IAAA,CAAK,UAAA,cAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image.client.mjs","names":[],"sources":["../../../../src/modules/storage/components/image.client.tsx"],"sourcesContent":["\"use client\";\n\nimport Image, { type ImageProps } from \"next/image\";\nimport { imageLoader } from \"../lib/helpers\";\n\nexport function StorageImage(props: Omit<ImageProps, \"loader\">) {\n return <Image {...props} loader={imageLoader} />;\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,aAAa,OAAmC;AAC9D,QAAO,oBAAC;EAAM,GAAI;EAAO,QAAQ;GAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-button.client.d.mts","names":[],"sources":["../../../../src/modules/storage/components/upload-button.client.tsx"],"mappings":";;;;;iBASgB,YAAA,CAAA;EAAe,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,QAAsB,MAAA,IAAO,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-button.client.mjs","names":[],"sources":["../../../../src/modules/storage/components/upload-button.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { UploadIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { useUploadZone } from \"./upload-zone-context.client\";\n\nexport function UploadButton({ className, ...props }: ComponentProps<typeof Button>) {\n const { onUpload } = useUploadZone();\n\n return (\n <Button {...props} className={cn(\"relative gap-2\", className)}>\n <UploadIcon className=\"h-3 w-3\" />\n <span>Upload</span>\n\n <Input\n type=\"file\"\n className=\"absolute inset-0 z-10 h-full w-full cursor-pointer opacity-0\"\n multiple\n onChange={(e) => {\n if (!e.target.files) return;\n Array.from(e.target.files).forEach(onUpload);\n }}\n />\n </Button>\n );\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,aAAa,EAAE,WAAW,GAAG,SAAwC;CACnF,MAAM,EAAE,aAAa,eAAe;AAEpC,QACE,qBAAC;EAAO,GAAI;EAAO,WAAW,GAAG,kBAAkB,UAAU;;GAC3D,oBAAC,cAAW,WAAU,YAAY;GAClC,oBAAC,oBAAK,WAAa;GAEnB,oBAAC;IACC,MAAK;IACL,WAAU;IACV;IACA,WAAW,MAAM;AACf,SAAI,CAAC,EAAE,OAAO,MAAO;AACrB,WAAM,KAAK,EAAE,OAAO,MAAM,CAAC,QAAQ,SAAS;;KAE9C;;GACK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-zone-context.client.d.mts","names":[],"sources":["../../../../src/modules/storage/components/upload-zone-context.client.tsx"],"mappings":";;;;;;;AASA;KAAY,sBAAA;EACV,YAAA,EAAc,YAAA;EACd,QAAA,GAAW,IAAA,EAAM,IAAA,KAAS,OAAA,CAAQ,YAAA;EAClC,QAAA,GAAW,GAAA,eAAkB,OAAA;EAC7B,UAAA;IACE,GAAA,IACE,QAAA,EAAU,IAAA,CACR,YAAA,wEAGC,OAAA;IACL,MAAA,IAAU,GAAA,eAAkB,OAAA;IAC5B,UAAA,SAAmB,OAAA;IACnB,MAAA,SAAe,OAAA;EAAA;EAEjB,QAAA;AAAA;;;;cAMW,iBAAA,EAAiB,KAAA,CAAA,OAAA,CAAA,sBAAA;;;;iBAKd,aAAA,CAAA,GAAa,sBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-zone-context.client.mjs","names":[],"sources":["../../../../src/modules/storage/components/upload-zone-context.client.tsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport type { UploadClient } from \"../lib/upload.client\";\nimport type { StorageAsset } from \"../lib/validators\";\n\n/**\n * Upload Zone Context Value\n */\nexport type UploadZoneContextValue = {\n uploadClient: UploadClient;\n onUpload: (file: File) => Promise<StorageAsset>;\n onRemove: (ids: string[]) => Promise<void>;\n optimistic?: {\n add?: (\n newValue: Omit<\n StorageAsset,\n \"id\" | \"key\" | \"bucket\" | \"provider\" | \"createdAt\" | \"updatedAt\"\n >,\n ) => Promise<void> | void;\n remove?: (ids: string[]) => Promise<void> | void;\n invalidate?: () => Promise<void> | void;\n cancel?: () => Promise<void> | void;\n };\n disabled?: boolean;\n};\n\n/**\n * Upload Zone Context\n */\nexport const UploadZoneContext = React.createContext<UploadZoneContextValue | null>(null);\n\n/**\n * Upload Zone Hook\n */\nexport function useUploadZone() {\n const context = React.useContext(UploadZoneContext);\n if (!context) {\n throw new Error(\"useUploadZone must be used within an UploadZoneContext provider\");\n }\n return context;\n}\n"],"mappings":";;;;;;;;AA8BA,MAAa,oBAAoB,MAAM,cAA6C,KAAK;;;;AAKzF,SAAgB,gBAAgB;CAC9B,MAAM,UAAU,MAAM,WAAW,kBAAkB;AACnD,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,kEAAkE;AAEpF,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-zone.client.d.mts","names":[],"sources":["../../../../src/modules/storage/components/upload-zone.client.tsx"],"mappings":";;;;;;;KAWY,eAAA,GAAkB,cAAA,UAC5B,IAAA,CAAK,sBAAA;EACH,SAAA,EAAW,IAAA,CAAK,WAAA;EAChB,WAAA,GAAc,WAAA;EAEd,iBAAA,IAAqB,KAAA,EAAO,YAAA,KAAiB,OAAA;EAC7C,cAAA,IAAkB,KAAA,cAAmB,OAAA;AAAA;AAAA,iBAGzB,UAAA,CAAA;EACd,SAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,iBAAA;EACA,cAAA;EACA,QAAA;EACA,QAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,eAAA,GAAe,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload-zone.client.mjs","names":[],"sources":["../../../../src/modules/storage/components/upload-zone.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { type ComponentProps, useCallback } from \"react\";\nimport { useDropzone } from \"react-dropzone\";\nimport { toast } from \"@/components/ui/sonner.client\";\nimport { useAction } from \"@/lib/hooks/use-action\";\nimport { cn } from \"@/lib/utils/cn\";\nimport type { UploadFileRequest, UploadHooks } from \"../lib/upload.client\";\nimport type { StorageAsset, UploadInput } from \"../lib/validators\";\nimport { UploadZoneContext, type UploadZoneContextValue } from \"./upload-zone-context.client\";\n\nexport type UploadZoneProps = ComponentProps<\"div\"> &\n Pick<UploadZoneContextValue, \"optimistic\" | \"uploadClient\" | \"disabled\"> & {\n variables: Pick<UploadInput, \"visibility\">;\n uploadHooks?: UploadHooks;\n\n onUploadCompleted?: (asset: StorageAsset) => Promise<void> | void;\n onUploadFailed?: (error: unknown) => Promise<void> | void;\n };\n\nexport function UploadZone({\n variables,\n optimistic,\n uploadClient,\n uploadHooks,\n onUploadCompleted,\n onUploadFailed,\n disabled = false,\n children,\n className,\n ...props\n}: UploadZoneProps) {\n /**\n * Delete mutation\n */\n const deleteMutation = useAction({\n mutationFn: async (ids: string[]) => {\n await uploadClient.deleteAssets(ids);\n },\n onMutate: async (ids) => {\n await optimistic?.cancel?.();\n await optimistic?.remove?.(ids);\n },\n onError: async (error) => {\n console.error(\"Delete failed upload error: \", error);\n await onUploadFailed?.(error);\n },\n onSettled: () => {\n optimistic?.invalidate?.();\n },\n });\n\n /**\n * Upload mutation\n */\n const uploadMutation = useAction({\n mutationFn: async (params: UploadFileRequest) => uploadClient.upload(params, uploadHooks),\n onMutate: async (variables) => {\n await optimistic?.cancel?.();\n\n const newAsset = {\n ...variables,\n visibility: variables.visibility ?? \"private\",\n status: \"pending\",\n name: variables.file.name,\n size: variables.file.size,\n contentType: variables.file.type || \"application/octet-stream\",\n etag: null,\n metadata: null,\n uploadedAt: new Date(),\n deletedAt: null,\n } as Omit<StorageAsset, \"id\" | \"key\" | \"bucket\" | \"provider\" | \"createdAt\" | \"updatedAt\">;\n\n await optimistic?.add?.(newAsset);\n },\n onSuccess: async (data) => {\n await onUploadCompleted?.(data);\n toast.success(`Succesvol geupload: ${data.name}`);\n },\n onError: async (error) => {\n await onUploadFailed?.(error);\n\n console.error(\"Upload error: \", error);\n toast.error(\"Bestand uploaden mislukt\", {\n description: error instanceof Error ? error.message : undefined,\n });\n },\n onSettled: () => {\n optimistic?.invalidate?.();\n },\n });\n\n /**\n * Upload file handler\n */\n const onUpload = useCallback(\n async (file: File) => {\n console.info(\"Uploading file\", file);\n const req = uploadClient.prepareUpload({ ...variables, file });\n return await uploadMutation.mutateAsync(req);\n },\n [uploadClient, variables, uploadMutation],\n );\n\n /**\n * Drop handler\n */\n const onDrop = useCallback(\n async (acceptedFiles: File[]) => {\n if (acceptedFiles.length === 0) return;\n await Promise.allSettled(acceptedFiles.map(onUpload));\n },\n [onUpload],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n noClick: true,\n disabled,\n });\n\n return (\n <div {...props} {...getRootProps()} className={cn(\"relative z-0\", className)}>\n <input {...getInputProps()} />\n\n {/* Show drag overlay when drag is active */}\n {isDragActive && (\n <div className=\"absolute inset-0 z-10 rounded-md bg-primary/20 opacity-70 backdrop-blur-3xl\" />\n )}\n\n <UploadZoneContext\n value={{\n uploadClient,\n onUpload,\n onRemove: deleteMutation.mutateAsync,\n optimistic,\n disabled,\n }}\n >\n {children}\n </UploadZoneContext>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAoBA,SAAgB,WAAW,EACzB,WACA,YACA,cACA,aACA,mBACA,gBACA,WAAW,OACX,UACA,WACA,GAAG,SACe;;;;CAIlB,MAAM,iBAAiB,UAAU;EAC/B,YAAY,OAAO,QAAkB;AACnC,SAAM,aAAa,aAAa,IAAI;;EAEtC,UAAU,OAAO,QAAQ;AACvB,SAAM,YAAY,UAAU;AAC5B,SAAM,YAAY,SAAS,IAAI;;EAEjC,SAAS,OAAO,UAAU;AACxB,WAAQ,MAAM,gCAAgC,MAAM;AACpD,SAAM,iBAAiB,MAAM;;EAE/B,iBAAiB;AACf,eAAY,cAAc;;EAE7B,CAAC;;;;CAKF,MAAM,iBAAiB,UAAU;EAC/B,YAAY,OAAO,WAA8B,aAAa,OAAO,QAAQ,YAAY;EACzF,UAAU,OAAO,cAAc;AAC7B,SAAM,YAAY,UAAU;GAE5B,MAAM,WAAW;IACf,GAAG;IACH,YAAY,UAAU,cAAc;IACpC,QAAQ;IACR,MAAM,UAAU,KAAK;IACrB,MAAM,UAAU,KAAK;IACrB,aAAa,UAAU,KAAK,QAAQ;IACpC,MAAM;IACN,UAAU;IACV,4BAAY,IAAI,MAAM;IACtB,WAAW;IACZ;AAED,SAAM,YAAY,MAAM,SAAS;;EAEnC,WAAW,OAAO,SAAS;AACzB,SAAM,oBAAoB,KAAK;AAC/B,SAAM,QAAQ,uBAAuB,KAAK,OAAO;;EAEnD,SAAS,OAAO,UAAU;AACxB,SAAM,iBAAiB,MAAM;AAE7B,WAAQ,MAAM,kBAAkB,MAAM;AACtC,SAAM,MAAM,4BAA4B,EACtC,aAAa,iBAAiB,QAAQ,MAAM,UAAU,QACvD,CAAC;;EAEJ,iBAAiB;AACf,eAAY,cAAc;;EAE7B,CAAC;;;;CAKF,MAAM,WAAW,YACf,OAAO,SAAe;AACpB,UAAQ,KAAK,kBAAkB,KAAK;EACpC,MAAM,MAAM,aAAa,cAAc;GAAE,GAAG;GAAW;GAAM,CAAC;AAC9D,SAAO,MAAM,eAAe,YAAY,IAAI;IAE9C;EAAC;EAAc;EAAW;EAAe,CAC1C;CAaD,MAAM,EAAE,cAAc,eAAe,iBAAiB,YAAY;EAChE,QATa,YACb,OAAO,kBAA0B;AAC/B,OAAI,cAAc,WAAW,EAAG;AAChC,SAAM,QAAQ,WAAW,cAAc,IAAI,SAAS,CAAC;KAEvD,CAAC,SAAS,CACX;EAIC,SAAS;EACT;EACD,CAAC;AAEF,QACE,qBAAC;EAAI,GAAI;EAAO,GAAI,cAAc;EAAE,WAAW,GAAG,gBAAgB,UAAU;;GAC1E,oBAAC,WAAM,GAAI,eAAe,GAAI;GAG7B,gBACC,oBAAC,SAAI,WAAU,gFAAgF;GAGjG,oBAAC;IACC,OAAO;KACL;KACA;KACA,UAAU,eAAe;KACzB;KACA;KACD;IAEA;KACiB;;GAChB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.mts","names":[],"sources":["../../../../src/modules/storage/lib/constants.ts"],"mappings":";cACa,iBAAA;AAAA,KACD,gBAAA,WAA2B,iBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","names":[],"sources":["../../../../src/modules/storage/lib/constants.ts"],"sourcesContent":["// Image dispositions\nexport const imageDispositions = [\"inline\", \"attachment\"] as const;\nexport type ImageDisposition = (typeof imageDispositions)[number];\n"],"mappings":";AACA,MAAa,oBAAoB,CAAC,UAAU,aAAa"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.mts","names":[],"sources":["../../../../src/modules/storage/lib/helpers.ts"],"mappings":";;;;;;AAgBA;;;;;;;;;;iBAAgB,WAAA,CAAY,EAAA,UAAY,OAAA,GAAS,OAAA,CAAQ,gBAAA;;;;iBAYzC,WAAA,CAAA;EAAc;AAAA,GAAO,gBAAA;;;;iBAUrB,WAAA,CAAY,KAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","names":[],"sources":["../../../../src/modules/storage/lib/helpers.ts"],"sourcesContent":["import type { ImageLoaderProps } from \"next/image\";\nimport type { GetAssetURLInput } from \"../lib/validators\";\n\n/**\n * Builds the public API route URL for a storage file proxy request.\n *\n * Use this helper when you need a stable file URL in the client/UI\n * without manually composing the route path.\n *\n * @param id - Storage asset id\n * @returns File proxy URL for the storage route handler\n * @example\n * const url = getAssetURL(\"019d0051-2c0d-741e-9e3c-e5a5bc4d16a2\", { disposition: \"attachment\" });\n * // /api/storage/files/019d0051-2c0d-741e-9e3c-e5a5bc4d16a2?disposition=attachment\n */\n\nexport function getAssetURL(id: string, options: Partial<GetAssetURLInput> = {}) {\n const searchParams = new URLSearchParams();\n if (options?.disposition) searchParams.set(\"disposition\", options.disposition);\n\n const queryString = searchParams.toString();\n\n return `/api/storage/files/${id}${queryString ? `?${queryString}` : \"\"}`;\n}\n\n/**\n * Image loader\n */\nexport function imageLoader({ src }: ImageLoaderProps) {\n if (typeof window === \"undefined\") return src;\n\n const url = new URL(src, window.location.origin);\n return url.toString();\n}\n\n/**\n * Render bytes\n */\nexport function renderBytes(bytes: number) {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(2)}${units[unitIndex]}`;\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,SAAgB,YAAY,IAAY,UAAqC,EAAE,EAAE;CAC/E,MAAM,eAAe,IAAI,iBAAiB;AAC1C,KAAI,SAAS,YAAa,cAAa,IAAI,eAAe,QAAQ,YAAY;CAE9E,MAAM,cAAc,aAAa,UAAU;AAE3C,QAAO,sBAAsB,KAAK,cAAc,IAAI,gBAAgB;;;;;AAMtE,SAAgB,YAAY,EAAE,OAAyB;AACrD,KAAI,OAAO,WAAW,YAAa,QAAO;AAG1C,QADY,IAAI,IAAI,KAAK,OAAO,SAAS,OAAO,CACrC,UAAU;;;;;AAMvB,SAAgB,YAAY,OAAe;CACzC,MAAM,QAAQ;EAAC;EAAK;EAAM;EAAM;EAAM;EAAM;EAAK;CAEjD,IAAI,OAAO;CACX,IAAI,YAAY;AAEhB,QAAO,QAAQ,QAAQ,YAAY,MAAM,SAAS,GAAG;AACnD,UAAQ;AACR;;AAGF,QAAO,GAAG,KAAK,QAAQ,EAAE,GAAG,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"procedures.server.d.mts","names":[],"sources":["../../../../src/modules/storage/lib/procedures.server.ts"],"mappings":";;;;;;;;;;iBAWgB,uBAAA,iBAAwC,eAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8C5C,aAAA,GAAgB,UAAA,QAAkB,uBAAA;AAAA,KAClC,oBAAA,GAAuB,kBAAA,CAAmB,aAAA;AAAA,KAC1C,mBAAA,GAAsB,iBAAA,CAAkB,aAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"procedures.server.mjs","names":["z"],"sources":["../../../../src/modules/storage/lib/procedures.server.ts"],"sourcesContent":["import type { InferRouterInputs, InferRouterOutputs } from \"@orpc/server\";\nimport { z } from \"zod\";\nimport type { TDatabaseSchema } from \"@/modules/config/db/types\";\nimport { initRPC } from \"@/modules/router/handler/init.server\";\nimport {\n confirmUploadInputSchema,\n presignUploadInputSchema,\n presignUploadOutputSchema,\n selectStorageAssetSchema,\n} from \"./validators\";\n\nexport function createStorageProcedures<TSchema extends TDatabaseSchema>() {\n const { protectedProcedure } = initRPC<TSchema>();\n\n return {\n presign: protectedProcedure\n .input(presignUploadInputSchema)\n .output(presignUploadOutputSchema)\n .handler(async ({ context, input }) => context.storage.presignUpload(input)),\n\n confirm: protectedProcedure\n .input(confirmUploadInputSchema)\n .output(selectStorageAssetSchema)\n .handler(async ({ context, input }) => context.storage.confirmUpload(input)),\n\n deleteAsset: protectedProcedure\n .input(z.uuid())\n .output(selectStorageAssetSchema.nullable())\n .handler(async ({ context, input }) => context.storage.deleteAsset(input)),\n\n deleteAssets: protectedProcedure\n .input(z.string().array())\n .output(z.array(selectStorageAssetSchema))\n .handler(async ({ context, input }) => context.storage.deleteAssets(input)),\n\n restoreAsset: protectedProcedure\n .input(z.uuid())\n .output(selectStorageAssetSchema.nullable())\n .handler(async ({ context, input }) => context.storage.restoreAsset(input)),\n\n restoreAssets: protectedProcedure\n .input(z.string().array())\n .output(z.array(selectStorageAssetSchema))\n .handler(async ({ context, input }) => context.storage.restoreAssets(input)),\n\n purgeAsset: protectedProcedure\n .input(z.uuid())\n .output(selectStorageAssetSchema.nullable())\n .handler(async ({ context, input }) => context.storage.purgeAsset(input)),\n\n purgeAssets: protectedProcedure\n .input(z.string().array())\n .output(z.array(selectStorageAssetSchema))\n .handler(async ({ context, input }) => context.storage.purgeAssets(input)),\n };\n}\n\nexport type StorageRouter = ReturnType<typeof createStorageProcedures>;\nexport type StorageRouterOutputs = InferRouterOutputs<StorageRouter>;\nexport type StorageRouterInputs = InferRouterInputs<StorageRouter>;\n"],"mappings":";;;;;AAWA,SAAgB,0BAA2D;CACzE,MAAM,EAAE,uBAAuB,SAAkB;AAEjD,QAAO;EACL,SAAS,mBACN,MAAM,yBAAyB,CAC/B,OAAO,0BAA0B,CACjC,QAAQ,OAAO,EAAE,SAAS,YAAY,QAAQ,QAAQ,cAAc,MAAM,CAAC;EAE9E,SAAS,mBACN,MAAM,yBAAyB,CAC/B,OAAO,yBAAyB,CAChC,QAAQ,OAAO,EAAE,SAAS,YAAY,QAAQ,QAAQ,cAAc,MAAM,CAAC;EAE9E,aAAa,mBACV,MAAMA,IAAE,MAAM,CAAC,CACf,OAAO,yBAAyB,UAAU,CAAC,CAC3C,QAAQ,OAAO,EAAE,SAAS,YAAY,QAAQ,QAAQ,YAAY,MAAM,CAAC;EAE5E,cAAc,mBACX,MAAMA,IAAE,QAAQ,CAAC,OAAO,CAAC,CACzB,OAAOA,IAAE,MAAM,yBAAyB,CAAC,CACzC,QAAQ,OAAO,EAAE,SAAS,YAAY,QAAQ,QAAQ,aAAa,MAAM,CAAC;EAE7E,cAAc,mBACX,MAAMA,IAAE,MAAM,CAAC,CACf,OAAO,yBAAyB,UAAU,CAAC,CAC3C,QAAQ,OAAO,EAAE,SAAS,YAAY,QAAQ,QAAQ,aAAa,MAAM,CAAC;EAE7E,eAAe,mBACZ,MAAMA,IAAE,QAAQ,CAAC,OAAO,CAAC,CACzB,OAAOA,IAAE,MAAM,yBAAyB,CAAC,CACzC,QAAQ,OAAO,EAAE,SAAS,YAAY,QAAQ,QAAQ,cAAc,MAAM,CAAC;EAE9E,YAAY,mBACT,MAAMA,IAAE,MAAM,CAAC,CACf,OAAO,yBAAyB,UAAU,CAAC,CAC3C,QAAQ,OAAO,EAAE,SAAS,YAAY,QAAQ,QAAQ,WAAW,MAAM,CAAC;EAE3E,aAAa,mBACV,MAAMA,IAAE,QAAQ,CAAC,OAAO,CAAC,CACzB,OAAOA,IAAE,MAAM,yBAAyB,CAAC,CACzC,QAAQ,OAAO,EAAE,SAAS,YAAY,QAAQ,QAAQ,YAAY,MAAM,CAAC;EAC7E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router-handlers.server.d.mts","names":[],"sources":["../../../../src/modules/storage/lib/router-handlers.server.ts"],"mappings":";;;;;KAQK,QAAA;EACH,MAAA,EAAQ,OAAA;IAAU,IAAA;EAAA;AAAA;AAAA,KAGf,8BAAA,iBAA+C,eAAA;EAClD,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,OAAA;AAAA;;;;AAJL;;;;;;;;;;;;;iBAwBR,yBAAA,iBAA0C,eAAA,CAAA,CAAA;EACxD;AAAA,GACC,8BAAA,CAA+B,OAAA;iBAUJ,WAAA,EAAW,GAAA,EAAO,QAAA,KAAQ,OAAA,CAAA,QAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router-handlers.server.mjs","names":[],"sources":["../../../../src/modules/storage/lib/router-handlers.server.ts"],"sourcesContent":["import { connection, type NextRequest } from \"next/server\";\nimport z from \"zod\";\nimport { getSession } from \"@/modules/auth/lib/helpers.server\";\nimport type { TDatabaseSchema } from \"@/modules/config/db/types\";\nimport type { TulipContext } from \"@/modules/config/lib/context\";\nimport { ServerError } from \"@/modules/router/lib/error.server\";\nimport { getAssetURLSchema } from \"../entry\";\n\ntype RouteCtx = {\n params: Promise<{ rest?: string[] }>;\n};\n\ntype CreateStorageRouteHandlerProps<TSchema extends TDatabaseSchema> = {\n context: Pick<TulipContext<TSchema>, \"auth\" | \"storage\">;\n};\n\n/**\n * Creates a catch-all storage route handler for `/api/storage/[[...rest]]`.\n *\n * Current support:\n * - `GET /api/storage/files/:id`:\n * resolves a storage asset, enforces visibility checks, and redirects\n * to a short-lived signed read URL.\n *\n * Reserved for future extension:\n * - `POST /api/storage/assets/presign`\n * - `POST /api/storage/assets/confirm`\n * - additional storage endpoints under the same catch-all route.\n *\n * @param props - Route handler dependencies (application context)\n * @returns Next.js route handlers for GET, POST, PUT, PATCH, and DELETE\n */\n\nexport function createStorageRouteHandler<TSchema extends TDatabaseSchema>({\n context,\n}: CreateStorageRouteHandlerProps<TSchema>) {\n /**\n * GET /api/storage/[[...rest]]\n *\n * Current route support:\n * - /api/storage/files/:id\n *\n * The file route resolves an asset by id, enforces visibility rules,\n * and redirects to a short-lived signed object URL.\n */\n async function GET(request: NextRequest, ctx: RouteCtx) {\n // Get the params\n const { rest = [] } = await ctx.params;\n const resource = rest[0];\n\n /**\n * Proxy file request\n * GET /api/storage/files/:id\n */\n if (resource === \"files\") {\n const id = rest[1];\n\n // Guard required path segment: /api/storage/files/:id\n if (!id) {\n return Response.json(\n { error: { code: \"BAD_REQUEST\", message: \"Missing id\" } },\n { status: 400 },\n );\n }\n\n console.info(\"Proxying file: \", id);\n\n try {\n // Resolve storage asset record by id\n const asset = await context.storage.getAssetById(id);\n\n if (!asset) {\n return Response.json(\n { error: { code: \"NOT_FOUND\", message: \"Asset not found\" } },\n { status: 404 },\n );\n }\n\n // Enforce private visibility with session auth\n if (asset.visibility === \"private\") {\n const session = await getSession(context);\n if (!session) {\n return Response.json(\n { error: { code: \"UNAUTHORIZED\", message: \"Unauthorized\" } },\n { status: 401 },\n );\n }\n }\n\n // Handle searchParams for disposition\n const searchParams = request.nextUrl.searchParams;\n const disposition = searchParams.get(\"disposition\") ?? undefined;\n\n // Parse the options\n const options = getAssetURLSchema.parse({ disposition });\n\n // Resolve signed read URL and redirect to object storage\n const url = await context.storage.getObjectURL(asset.id, options);\n\n // Return the file\n return Response.redirect(url, 307);\n } catch (error) {\n if (error instanceof z.ZodError) {\n return Response.json(\n { error: { code: \"BAD_REQUEST\", message: \"Invalid request input\" } },\n { status: 400 },\n );\n }\n\n if (error instanceof ServerError) {\n const code = error.code;\n\n if (code === \"BAD_REQUEST\") {\n return Response.json(\n { error: { code: \"BAD_REQUEST\", message: error.message } },\n { status: 400 },\n );\n }\n\n if (code === \"NOT_FOUND\") {\n return Response.json(\n { error: { code: \"NOT_FOUND\", message: error.message } },\n { status: 404 },\n );\n }\n\n if (code === \"UNAUTHORIZED\") {\n return Response.json(\n { error: { code: \"UNAUTHORIZED\", message: error.message } },\n { status: 401 },\n );\n }\n }\n\n if (error instanceof Error && error.message === \"Storage asset not found\") {\n return Response.json(\n { error: { code: \"NOT_FOUND\", message: \"Asset not found\" } },\n { status: 404 },\n );\n }\n\n console.error(\"Storage route error\", error);\n\n return Response.json(\n { error: { code: \"INTERNAL_SERVER_ERROR\", message: \"Something went wrong\" } },\n { status: 500 },\n );\n }\n }\n\n return Response.json(\n { error: { code: \"NOT_FOUND\", message: \"Route not found\" } },\n { status: 404 },\n );\n }\n\n /**\n * POST, PUT, PATCH, DELETE /api/storage/[[...rest]]\n *\n * Reserved for future extension, for example:\n * - POST /api/storage/assets/presign\n * - POST /api/storage/assets/confirm\n */\n async function POST() {\n // Make endpoint dynamic\n await connection();\n\n // future:\n // POST /api/storage/assets/presign\n // POST /api/storage/assets/confirm\n return Response.json(\n { error: { code: \"NOT_FOUND\", message: \"Route not found\" } },\n { status: 404 },\n );\n }\n\n return { GET, POST, PUT: POST, PATCH: POST, DELETE: POST };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAiCA,SAAgB,0BAA2D,EACzE,WAC0C;;;;;;;;;;CAU1C,eAAe,IAAI,SAAsB,KAAe;EAEtD,MAAM,EAAE,OAAO,EAAE,KAAK,MAAM,IAAI;;;;;AAOhC,MANiB,KAAK,OAML,SAAS;GACxB,MAAM,KAAK,KAAK;AAGhB,OAAI,CAAC,GACH,QAAO,SAAS,KACd,EAAE,OAAO;IAAE,MAAM;IAAe,SAAS;IAAc,EAAE,EACzD,EAAE,QAAQ,KAAK,CAChB;AAGH,WAAQ,KAAK,mBAAmB,GAAG;AAEnC,OAAI;IAEF,MAAM,QAAQ,MAAM,QAAQ,QAAQ,aAAa,GAAG;AAEpD,QAAI,CAAC,MACH,QAAO,SAAS,KACd,EAAE,OAAO;KAAE,MAAM;KAAa,SAAS;KAAmB,EAAE,EAC5D,EAAE,QAAQ,KAAK,CAChB;AAIH,QAAI,MAAM,eAAe,WAEvB;SAAI,CADY,MAAM,WAAW,QAAQ,CAEvC,QAAO,SAAS,KACd,EAAE,OAAO;MAAE,MAAM;MAAgB,SAAS;MAAgB,EAAE,EAC5D,EAAE,QAAQ,KAAK,CAChB;;IAML,MAAM,cADe,QAAQ,QAAQ,aACJ,IAAI,cAAc,IAAI;IAGvD,MAAM,UAAU,kBAAkB,MAAM,EAAE,aAAa,CAAC;IAGxD,MAAM,MAAM,MAAM,QAAQ,QAAQ,aAAa,MAAM,IAAI,QAAQ;AAGjE,WAAO,SAAS,SAAS,KAAK,IAAI;YAC3B,OAAO;AACd,QAAI,iBAAiB,EAAE,SACrB,QAAO,SAAS,KACd,EAAE,OAAO;KAAE,MAAM;KAAe,SAAS;KAAyB,EAAE,EACpE,EAAE,QAAQ,KAAK,CAChB;AAGH,QAAI,iBAAiB,aAAa;KAChC,MAAM,OAAO,MAAM;AAEnB,SAAI,SAAS,cACX,QAAO,SAAS,KACd,EAAE,OAAO;MAAE,MAAM;MAAe,SAAS,MAAM;MAAS,EAAE,EAC1D,EAAE,QAAQ,KAAK,CAChB;AAGH,SAAI,SAAS,YACX,QAAO,SAAS,KACd,EAAE,OAAO;MAAE,MAAM;MAAa,SAAS,MAAM;MAAS,EAAE,EACxD,EAAE,QAAQ,KAAK,CAChB;AAGH,SAAI,SAAS,eACX,QAAO,SAAS,KACd,EAAE,OAAO;MAAE,MAAM;MAAgB,SAAS,MAAM;MAAS,EAAE,EAC3D,EAAE,QAAQ,KAAK,CAChB;;AAIL,QAAI,iBAAiB,SAAS,MAAM,YAAY,0BAC9C,QAAO,SAAS,KACd,EAAE,OAAO;KAAE,MAAM;KAAa,SAAS;KAAmB,EAAE,EAC5D,EAAE,QAAQ,KAAK,CAChB;AAGH,YAAQ,MAAM,uBAAuB,MAAM;AAE3C,WAAO,SAAS,KACd,EAAE,OAAO;KAAE,MAAM;KAAyB,SAAS;KAAwB,EAAE,EAC7E,EAAE,QAAQ,KAAK,CAChB;;;AAIL,SAAO,SAAS,KACd,EAAE,OAAO;GAAE,MAAM;GAAa,SAAS;GAAmB,EAAE,EAC5D,EAAE,QAAQ,KAAK,CAChB;;;;;;;;;CAUH,eAAe,OAAO;AAEpB,QAAM,YAAY;AAKlB,SAAO,SAAS,KACd,EAAE,OAAO;GAAE,MAAM;GAAa,SAAS;GAAmB,EAAE,EAC5D,EAAE,QAAQ,KAAK,CAChB;;AAGH,QAAO;EAAE;EAAK;EAAM,KAAK;EAAM,OAAO;EAAM,QAAQ;EAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.mts","names":[],"sources":["../../../../src/modules/storage/lib/schema.ts"],"mappings":";;;cAIa,sBAAA,EAAsF,oBAAA,CAAhE,MAAA;AAAA,cACtB,0BAAA,EAAsF,oBAAA,CAA5D,MAAA;;AADvC;;cAMa,aAAA,uBAAa,kBAAA;;;;cAuBzB,oBAAA,CAAA,QAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.mjs","names":[],"sources":["../../../../src/modules/storage/lib/schema.ts"],"sourcesContent":["import { index, pgEnum, pgTable, unique } from \"drizzle-orm/pg-core\";\nimport { baseColumns } from \"@/modules/database/lib/helpers\";\nimport { storageProviders } from \"../providers/lib/constants\";\n\nexport const storageAssetStatusEnum = pgEnum(\"storage_asset_status\", [\"pending\", \"ready\", \"error\"]);\nexport const storageAssetVisibilityEnum = pgEnum(\"storage_asset_visibility\", [\"private\", \"public\"]);\n\n/**\n * Storage objects table\n */\nexport const storageAssets = pgTable(\n \"storage_assets\",\n (t) => ({\n ...baseColumns,\n provider: t.text({ enum: storageProviders }).notNull(),\n bucket: t.text().notNull(),\n key: t.text().notNull(),\n status: storageAssetStatusEnum().notNull(),\n visibility: storageAssetVisibilityEnum().notNull().default(\"private\"),\n size: t.integer().default(0),\n contentType: t.varchar({ length: 255 }),\n uploadId: t.uuid().notNull().defaultRandom(),\n name: t.text(),\n metadata: t.jsonb(),\n etag: t.text(),\n uploadedAt: t.timestamp().defaultNow().notNull(),\n deletedAt: t.timestamp(),\n }),\n (t) => [\n unique(\"storage_assets_provider_bucket_key_unique\").on(t.provider, t.bucket, t.key),\n index(\"storage_assets_status_idx\").on(t.status),\n index(\"storage_assets_bucket_key_idx\").on(t.bucket, t.key),\n ],\n);\n"],"mappings":";;;;;AAIA,MAAa,yBAAyB,OAAO,wBAAwB;CAAC;CAAW;CAAS;CAAQ,CAAC;AACnG,MAAa,6BAA6B,OAAO,4BAA4B,CAAC,WAAW,SAAS,CAAC;;;;AAKnG,MAAa,gBAAgB,QAC3B,mBACC,OAAO;CACN,GAAG;CACH,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC,CAAC,SAAS;CACtD,QAAQ,EAAE,MAAM,CAAC,SAAS;CAC1B,KAAK,EAAE,MAAM,CAAC,SAAS;CACvB,QAAQ,wBAAwB,CAAC,SAAS;CAC1C,YAAY,4BAA4B,CAAC,SAAS,CAAC,QAAQ,UAAU;CACrE,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE;CAC5B,aAAa,EAAE,QAAQ,EAAE,QAAQ,KAAK,CAAC;CACvC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,eAAe;CAC5C,MAAM,EAAE,MAAM;CACd,UAAU,EAAE,OAAO;CACnB,MAAM,EAAE,MAAM;CACd,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,SAAS;CAChD,WAAW,EAAE,WAAW;CACzB,IACA,MAAM;CACL,OAAO,4CAA4C,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI;CACnF,MAAM,4BAA4B,CAAC,GAAG,EAAE,OAAO;CAC/C,MAAM,gCAAgC,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI;CAC3D,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.server.d.mts","names":[],"sources":["../../../../src/modules/storage/lib/service.server.ts"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.server.mjs","names":["#db","#adapter","#generateKey","#parseError"],"sources":["../../../../src/modules/storage/lib/service.server.ts"],"sourcesContent":["import { and, desc, eq, inArray, isNotNull, isNull } from \"drizzle-orm\";\nimport z from \"zod\";\nimport { generateDefaultUUID } from \"@/modules/database/lib/helpers\";\nimport type { Database } from \"@/modules/database/lib/service.server\";\nimport type { TDatabaseSchema } from \"@/modules/database/lib/types\";\nimport { ServerError } from \"@/modules/router/lib/error.server\";\nimport { StorageAdapterError } from \"../providers/lib/errors\";\nimport type { StorageAdapter } from \"../providers/lib/types\";\nimport type { GetObjectURLOptions } from \"../providers/lib/validators\";\nimport { storageAssets } from \"./schema\";\nimport {\n type ConfirmUploadInput,\n confirmUploadInputSchema,\n type PresignUploadInput,\n presignUploadInputSchema,\n type UploadInput,\n uploadInputSchema,\n} from \"./validators\";\n\nexport type StorageConfig<TSchema extends TDatabaseSchema> = {\n db: Database<TSchema>;\n adapter: StorageAdapter;\n prefix?: string;\n};\n\n/**\n * Storage service for working with asset metadata and object storage.\n *\n * Use `Storage.init()` to create a fully configured instance in app code.\n *\n * @param props - Storage configuration, including `db` and `adapter`\n * @returns A ready-to-use `Storage` instance\n * @example\n * const storage = Storage.init({\n * db: drizzle(dbConnection),\n * adapter: new StorageS3Adapter({\n * bucketName: \"my-app-uploads\",\n * region: \"us-east-1\",\n * credentials: {\n * accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n * secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n * },\n * }),\n * });\n */\n\nexport class Storage<TSchema extends TDatabaseSchema> {\n #adapter: StorageAdapter;\n #db: Database<TSchema>;\n prefix: string;\n\n private constructor({ db, adapter, prefix }: StorageConfig<TSchema>) {\n this.#db = db;\n this.#adapter = adapter;\n this.prefix = prefix ?? \"uploads\";\n }\n\n /**\n * Create a storage service instance.\n *\n * This keeps the public API aligned with other Tulip services such as\n * `Database.init()`, `Email.init()`, and `Auth.init()`.\n *\n * @param props - Storage configuration, including `db` and `adapter`\n * @returns A new `Storage` instance\n * @example\n * const storage = Storage.init({\n * db: drizzle(dbConnection),\n * adapter: new StorageS3Adapter({\n * bucketName: \"my-app-uploads\",\n * region: \"us-east-1\",\n * credentials: {\n * accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n * secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n * },\n * }),\n * });\n */\n static init<TSchema extends TDatabaseSchema>(props: StorageConfig<TSchema>) {\n return new Storage(props);\n }\n\n /**\n * Generates the canonical object key for a storage asset id.\n *\n * This keeps bucket key structure internal to the storage service,\n * so callers only work with asset ids and do not manage object paths.\n *\n * @param input - Storage asset id (UUID)\n * @returns Canonical storage key (e.g. `uploads/<id>`)\n * @example\n * const key = this.#generateKey(\"019d0051-2c0d-741e-9e3c-e5a5bc4d16a2\");\n * // key => \"uploads/019d0051-2c0d-741e-9e3c-e5a5bc4d16a2\"\n */\n #generateKey(input: string) {\n const id = z.uuid().parse(input);\n return `${this.prefix}/${id}`;\n }\n\n /**\n * Builds a query to fetch a storage asset by its ID and the current adapter's provider.\n * @param id - The asset ID to search for\n * @returns A dynamic Drizzle query for fetching a single asset\n * @example\n * let query = storageService.getAssetByIdQuery(\"asset-123\");\n * query = query.where(eq(storageAssets.contentType, \"image/png\")); // Add additional conditions if needed\n * const [asset] = await query;\n */\n getAssetByIdQuery(id: string) {\n return this.#db\n .select()\n .from(storageAssets)\n .where(\n and(\n eq(storageAssets.id, id),\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n isNull(storageAssets.deletedAt),\n ),\n )\n .limit(1)\n .$dynamic();\n }\n\n /**\n * Fetches a storage asset by its ID.\n * @param id - The asset ID to retrieve\n * @returns The asset object if found, otherwise null\n * @example\n * const asset = await storageService.getAssetById(\"asset-123\");\n * if (asset) {\n * console.log(asset.key, asset.contentType);\n * }\n */\n async getAssetById(id: string) {\n const parsedId = z.uuid().parse(id);\n const [asset] = await this.getAssetByIdQuery(parsedId);\n return asset ?? null;\n }\n\n /**\n * Builds a query to fetch a single ready storage asset by key\n * within the current adapter provider scope.\n *\n * Notes:\n * - Scoped to `this.#adapter.key` to avoid cross-provider leakage.\n * - Targets ready assets by default.\n * - Uniqueness is expected on `(provider, bucket, key)`.\n *\n * @param key - The object key stored in `storage_assets.key`\n * @returns A dynamic Drizzle query returning max 1 row\n * @example\n * let query = storageService.getAssetByKeyQuery(\"uploads/abc/main\");\n * query = query.leftJoin(otherTable, eq(otherTable.assetId, storageAssets.id));\n * const [asset] = await query;\n */\n getAssetByKeyQuery(key: string) {\n return this.#db\n .select()\n .from(storageAssets)\n .where(\n and(\n eq(storageAssets.key, key),\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n eq(storageAssets.status, \"ready\"),\n isNull(storageAssets.deletedAt),\n ),\n )\n .limit(1)\n .$dynamic();\n }\n\n /**\n * Fetches a single ready storage asset by key.\n *\n * This is the convenience wrapper around `getAssetByKeyQuery`.\n * Use this when you only need the result, not query composition.\n *\n * @param key - Asset key to look up\n * @returns The matching asset or `null` if none is found\n * @example\n * const asset = await storageService.getAssetByKey(\"uploads/abc/main\");\n * if (!asset) return;\n */\n async getAssetByKey(key: string) {\n const [result] = await this.getAssetByKeyQuery(key);\n return result ?? null;\n }\n\n /**\n * Builds a base query for listing storage assets.\n *\n * Scope and defaults:\n * - Scoped to the current adapter provider (`this.#adapter.key`)\n * - Orders by newest first (`createdAt DESC`)\n *\n * This method returns a dynamic query so callers can extend it with\n * custom filters, joins, pagination, and limits.\n *\n * @returns A dynamic Drizzle query for listing assets\n * @example\n * const query = storageService\n * .listAssetsQuery()\n * .limit(50);\n * const assets = await query;\n */\n listAssetsQuery() {\n return this.#db\n .select()\n .from(storageAssets)\n .where(\n and(\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n isNull(storageAssets.deletedAt),\n ),\n )\n .orderBy(desc(storageAssets.createdAt))\n .$dynamic();\n }\n\n /**\n * Lists storage assets using safe default pagination.\n *\n * This is the convenience wrapper around `listAssetsQuery`.\n * Use `listAssetsQuery()` directly when you need custom query composition.\n *\n * @returns Up to 100 storage assets sorted by newest first\n * @example\n * const assets = await storageService.listAssets();\n */\n async listAssets() {\n const assets = await this.listAssetsQuery().limit(100);\n return assets ?? [];\n }\n\n /**\n * Creates a pending storage asset record and generates a presigned upload URL.\n *\n * Flow:\n * - Validates the input payload\n * - Inserts a `pending` asset in the catalog (`storage_assets`)\n * - Requests a presigned PUT URL from the storage adapter\n * - Marks the asset as `error` if URL generation fails\n *\n * This method is intended for direct-to-storage browser uploads.\n * The upload should be finalized later via a confirm step.\n *\n * @param props - Presign upload input (contentType, size, metadata)\n * @returns The created asset id, key, and presigned URL\n * @throws {ServerError} If intent creation or URL generation fails\n * @example\n * const result = await storageService.presignUpload({\n * contentType: \"image/png\",\n * size: 120_000,\n * metadata: { uploadToken: crypto.randomUUID() },\n * });\n * // result => { id, uploadId, key, presignedUrl }\n */\n async presignUpload(props: PresignUploadInput) {\n const input = presignUploadInputSchema.parse(props);\n\n const id = generateDefaultUUID();\n const uploadId = input.uploadId ?? generateDefaultUUID();\n const key = this.#generateKey(id);\n\n const { contentType, size, metadata, name, visibility } = input;\n\n const [record] = await this.#db\n .insert(storageAssets)\n .values({\n id,\n uploadId,\n key,\n size,\n contentType,\n name,\n visibility,\n provider: this.#adapter.key,\n bucket: this.#adapter.bucketName,\n status: \"pending\",\n metadata,\n })\n .returning();\n\n if (!record) {\n throw new ServerError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Failed to create upload intent\",\n });\n }\n\n try {\n const presignedUrl = await this.#adapter.putObjectURL({ key, contentType, size, metadata });\n\n return { ...record, presignedUrl };\n } catch (error) {\n await this.#db\n .update(storageAssets)\n .set({ status: \"error\" })\n .where(eq(storageAssets.id, record.id));\n\n throw this.#parseError(error, {\n fallbackMessage: \"Failed to generate upload URL\",\n });\n }\n }\n\n /**\n * Confirms a direct-to-storage upload by verifying object existence\n * and transitioning the asset from `pending` to `ready`.\n *\n * Flow:\n * - Validates confirm input\n * - Loads the asset record scoped to the current adapter provider\n * - Returns early if asset is already `ready` (idempotent behavior)\n * - Verifies object existence/metadata via `adapter.headObject`\n * - Marks asset as `error` if verification fails\n * - Updates status to `ready` and stores upload metadata\n *\n * @param props - Confirm upload payload containing the asset uploadId\n * @returns The updated storage asset record\n * @throws {ServerError} If the asset is missing, verification fails, or update fails\n * @example\n * const asset = await storageService.confirmUpload(\"019d0051-2c0d-741e-9e3c-e5a5bc4d16a2\");\n * // asset.status === \"ready\"\n */\n async confirmUpload(props: ConfirmUploadInput) {\n const uploadId = confirmUploadInputSchema.parse(props);\n\n const [record] = await this.#db\n .select()\n .from(storageAssets)\n .where(\n and(\n eq(storageAssets.uploadId, uploadId),\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n isNull(storageAssets.deletedAt),\n ),\n )\n .limit(1);\n\n if (!record) {\n throw new ServerError(\"NOT_FOUND\", { message: \"Storage asset not found\" });\n }\n\n if (record.status === \"ready\") return record;\n\n let head: Awaited<ReturnType<StorageAdapter[\"headObject\"]>>;\n\n try {\n head = await this.#adapter.headObject({ key: record.key });\n } catch (error) {\n await this.#db\n .update(storageAssets)\n .set({ status: \"error\" })\n .where(eq(storageAssets.id, record.id));\n\n throw this.#parseError(error, {\n fallbackMessage: \"Failed to verify uploaded object\",\n });\n }\n\n const [updated] = await this.#db\n .update(storageAssets)\n .set({\n status: \"ready\",\n uploadedAt: new Date(),\n size: head.size ?? record.size,\n contentType: head.contentType ?? record.contentType,\n })\n .where(and(eq(storageAssets.id, record.id), eq(storageAssets.status, \"pending\")))\n .returning();\n\n if (!updated) {\n throw new ServerError(\"INTERNAL_SERVER_ERROR\", { message: \"Failed to confirm upload\" });\n }\n\n return updated;\n }\n\n /**\n * Uploads an asset directly from the server and persists its catalog record.\n *\n * Flow:\n * - Validates upload input\n * - Creates a `pending` asset record in `storage_assets`\n * - Uploads the object bytes through the storage adapter\n * - Marks the record as `ready` and stores upload metadata\n * - Marks the record as `error` if upload fails\n *\n * This method is intended for server-side uploads (non-presigned flow).\n * For browser direct uploads, use `presignUpload` + `confirmUpload`.\n *\n * @param props - Upload payload (body, contentType, size)\n * @returns The finalized storage asset record\n * @throws {ServerError} If record creation, upload, or finalization fails\n * @example\n * const asset = await storageService.upload({\n * body: fileBuffer,\n * contentType: \"application/pdf\",\n * size: fileBuffer.byteLength,\n * });\n */\n async upload(props: UploadInput) {\n const { body, contentType, size, metadata, name, visibility } = uploadInputSchema.parse(props);\n\n const id = generateDefaultUUID();\n const key = this.#generateKey(id);\n\n const [record] = await this.#db\n .insert(storageAssets)\n .values({\n id,\n key,\n size,\n contentType,\n name,\n visibility,\n provider: this.#adapter.key,\n bucket: this.#adapter.bucketName,\n status: \"pending\",\n metadata,\n })\n .returning();\n\n if (!record) {\n throw new ServerError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Failed to create upload record\",\n });\n }\n\n try {\n const uploaded = await this.#adapter.putObject({ key, body, contentType, size, metadata });\n\n const [updated] = await this.#db\n .update(storageAssets)\n .set({\n status: \"ready\",\n uploadedAt: new Date(),\n size: uploaded.size ?? size ?? record.size,\n contentType: uploaded.contentType ?? contentType ?? record.contentType,\n })\n .where(and(eq(storageAssets.id, record.id), eq(storageAssets.status, \"pending\")))\n .returning();\n\n if (!updated) {\n throw new ServerError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Failed to finalize upload\",\n });\n }\n\n return updated;\n } catch (error) {\n await this.#db\n .update(storageAssets)\n .set({ status: \"error\" })\n .where(and(eq(storageAssets.id, record.id), eq(storageAssets.status, \"pending\")));\n\n throw this.#parseError(error, {\n fallbackMessage: \"Failed to upload object\",\n });\n }\n }\n\n /**\n * Retrieves the object content for a ready storage asset.\n *\n * Flow:\n * - Looks up the asset record by id, scoped to the current adapter provider\n * - Ensures the asset is in `ready` status\n * - Fetches object content from the storage adapter using the stored key\n *\n * @param id - The storage asset id\n * @returns The adapter object response (stream/body + metadata)\n * @throws {ServerError} If the asset does not exist or is not ready\n * @example\n * const object = await storageService.getObject(\"asset-123\");\n * // object.body can be streamed/consumed by caller\n */\n async getObject(input: string) {\n const id = z.uuid().parse(input);\n\n const [record] = await this.#db\n .select()\n .from(storageAssets)\n .where(\n and(\n eq(storageAssets.id, id),\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n eq(storageAssets.status, \"ready\"),\n isNull(storageAssets.deletedAt),\n ),\n )\n .limit(1);\n\n if (!record) {\n throw new ServerError(\"NOT_FOUND\", { message: \"Storage asset not found\" });\n }\n\n return this.#adapter.getObject(record.key).catch((error) => {\n throw this.#parseError(error, {\n fallbackMessage: \"Failed to retrieve object\",\n });\n });\n }\n\n /**\n * Generates a presigned read URL for a ready storage asset.\n *\n * Flow:\n * - Validates the asset id\n * - Resolves the asset record scoped to the current adapter provider\n * - Ensures the asset is in `ready` status\n * - Delegates URL signing to the storage adapter using the stored key\n *\n * @param input - Storage asset id (UUID)\n * @param options - Optional URL options (for example expiration/disposition)\n * @returns A presigned URL for reading the object\n * @throws {ServerError} If the asset does not exist or is not ready\n * @example\n * const url = await storageService.getObjectURL(\"019d0051-2c0d-741e-9e3c-e5a5bc4d16a2\", {\n * expiresIn: 3600,\n * });\n */\n\n async getObjectURL(input: string, options?: GetObjectURLOptions) {\n const id = z.uuid().parse(input);\n\n const [record] = await this.#db\n .select()\n .from(storageAssets)\n .where(\n and(\n eq(storageAssets.id, id),\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n eq(storageAssets.status, \"ready\"),\n isNull(storageAssets.deletedAt),\n ),\n )\n .limit(1);\n\n if (!record) {\n throw new ServerError(\"NOT_FOUND\", { message: \"Storage asset not found\" });\n }\n\n return this.#adapter.getObjectURL(record.key, options).catch((error) => {\n throw this.#parseError(error, {\n fallbackMessage: \"Failed to generate object URL\",\n });\n });\n }\n\n /**\n * Soft deletes a single storage asset by id.\n *\n * This is a convenience wrapper around `deleteAssets`.\n *\n * @param input - Storage asset id (UUID)\n * @returns The soft-deleted asset record, or null if not found/already deleted\n */\n async deleteAsset(input: string) {\n const id = z.uuid().parse(input);\n const [deleted] = await this.deleteAssets([id]);\n return deleted ?? null;\n }\n\n /**\n * Soft deletes multiple storage assets by setting `deletedAt`.\n *\n * Flow:\n * - Validates and de-duplicates ids\n * - Resolves provider-scoped active records\n * - Marks matching rows as deleted by setting `deletedAt`\n *\n * @param input - Storage asset ids (UUID[])\n * @returns Soft-deleted asset records\n */\n async deleteAssets(input: string[]) {\n const ids = [...new Set(z.array(z.uuid()).parse(input))];\n if (ids.length === 0) return [];\n\n return this.#db\n .update(storageAssets)\n .set({ deletedAt: new Date() })\n .where(\n and(\n inArray(storageAssets.id, ids),\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n isNull(storageAssets.deletedAt),\n ),\n )\n .returning();\n }\n\n /**\n * Restores a single soft-deleted storage asset.\n *\n * This is a convenience wrapper around `restoreAssets`.\n *\n * @param input - Storage asset id (UUID)\n * @returns The restored asset record, or null if not found/not deleted\n */\n async restoreAsset(input: string) {\n const id = z.uuid().parse(input);\n const [restored] = await this.restoreAssets([id]);\n return restored ?? null;\n }\n\n /**\n * Restores multiple soft-deleted storage assets by clearing `deletedAt`.\n *\n * @param input - Storage asset ids (UUID[])\n * @returns Restored asset records\n */\n async restoreAssets(input: string[]) {\n const ids = [...new Set(z.array(z.uuid()).parse(input))];\n if (ids.length === 0) return [];\n\n return this.#db\n .update(storageAssets)\n .set({ deletedAt: null })\n .where(\n and(\n inArray(storageAssets.id, ids),\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n isNotNull(storageAssets.deletedAt),\n ),\n )\n .returning();\n }\n\n /**\n * Hard deletes a single storage asset.\n *\n * This is a convenience wrapper around `purgeAssets`.\n *\n * @param input - Storage asset id (UUID)\n * @returns The purged asset record, or null if not found\n */\n async purgeAsset(input: string) {\n const id = z.uuid().parse(input);\n const [deleted] = await this.purgeAssets([id]);\n return deleted ?? null;\n }\n\n /**\n * Hard deletes multiple storage assets.\n *\n * Flow:\n * - Validates and de-duplicates ids\n * - Resolves provider-scoped records\n * - Deletes physical objects from the adapter by key\n * - Hard deletes DB records\n *\n * @param input - Storage asset ids (UUID[])\n * @returns Purged asset records\n * @throws {ServerError} If provider deletion fails\n */\n async purgeAssets(input: string[]) {\n const ids = [...new Set(z.array(z.uuid()).parse(input))];\n if (ids.length === 0) return [];\n\n const records = await this.#db\n .select({\n id: storageAssets.id,\n key: storageAssets.key,\n })\n .from(storageAssets)\n .where(\n and(\n inArray(storageAssets.id, ids),\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n ),\n );\n\n if (records.length === 0) return [];\n\n const keys = records.map((r) => r.key);\n\n try {\n await this.#adapter.deleteObjects(keys);\n } catch (error) {\n throw this.#parseError(error, {\n fallbackMessage: \"Failed to delete storage objects\",\n });\n }\n\n const deletedIds = records.map((r) => r.id);\n\n const deleted = await this.#db\n .delete(storageAssets)\n .where(\n and(\n inArray(storageAssets.id, deletedIds),\n eq(storageAssets.provider, this.#adapter.key),\n eq(storageAssets.bucket, this.#adapter.bucketName),\n ),\n )\n .returning();\n\n return deleted;\n }\n\n /**\n * Normalizes unknown adapter/service errors into a consistent `ServerError`.\n *\n * Behavior:\n * - Returns existing `ServerError` instances unchanged\n * - Maps known storage adapter errors to application-level server errors\n * - Falls back to a generic internal server error for unknown failures\n *\n * This keeps adapter-specific errors inside the storage layer while exposing\n * a stable error contract to route handlers and RPC procedures.\n *\n * @param error - The unknown error to normalize\n * @param options - Optional fallback message for non-specific failures\n * @returns A normalized `ServerError`\n */\n\n #parseError(error: unknown, options?: { fallbackMessage: string }) {\n // If it's already a ServerError, return as-is to avoid double-wrapping\n if (error instanceof ServerError) return error;\n\n // Handle known storage adapter errors and convert to appropriate ServerError\n if (error instanceof StorageAdapterError) {\n if (error.code === \"OBJECT_NOT_FOUND\") {\n return new ServerError(\"NOT_FOUND\", {\n message: \"Storage asset not found\",\n cause: error,\n });\n }\n\n return new ServerError(\"INTERNAL_SERVER_ERROR\", {\n message: options?.fallbackMessage ?? \"Storage adapter error\",\n cause: error,\n });\n }\n\n // For unknown errors, return a generic server error with limited information to avoid leaking details\n return new ServerError(\"INTERNAL_SERVER_ERROR\", {\n message: options?.fallbackMessage ?? \"Unknown storage error\",\n cause: error instanceof Error ? error : undefined,\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload.client.d.mts","names":[],"sources":["../../../../src/modules/storage/lib/upload.client.ts"],"mappings":";;;;;;AAUA;KAAY,iBAAA,GAAoB,kBAAA;EAAuB,IAAA,EAAM,IAAA;AAAA;AAAA,KACjD,kBAAA,GAAqB,IAAA,CAAK,iBAAA;AAAA,KAC1B,WAAA;EACV,aAAA,IAAiB,KAAA,EAAO,iBAAA,KAAsB,OAAA;EAC9C,YAAA,IAAgB,aAAA,EAAe,mBAAA,KAAwB,OAAA;EACvD,aAAA,IAAiB,aAAA,EAAe,mBAAA,KAAwB,OAAA;EACxD,YAAA,IAAgB,KAAA,EAAO,wBAAA,KAA6B,OAAA;AAAA;;;;KAM1C,YAAA;EACV,aAAA,GAAgB,KAAA,EAAO,kBAAA,KAAuB,iBAAA;EAC9C,MAAA,GAAS,KAAA,EAAO,iBAAA,EAAmB,KAAA,GAAQ,WAAA,KAAgB,OAAA,CAAQ,wBAAA;EACnE,WAAA,GAAc,EAAA,aAAe,OAAA,CAAQ,wBAAA;EACrC,YAAA,GAAe,GAAA,eAAkB,OAAA,CAAQ,wBAAA;EACzC,YAAA,GAAe,EAAA,aAAe,OAAA,CAAQ,wBAAA;EACtC,aAAA,GAAgB,GAAA,eAAkB,OAAA,CAAQ,wBAAA;EAC1C,UAAA,GAAa,EAAA,aAAe,OAAA,CAAQ,wBAAA;EACpC,WAAA,GAAc,GAAA,eAAkB,OAAA,CAAQ,wBAAA;AAAA;;;;KAMrC,wBAAA;EACH,SAAA;IACE,OAAA,GAAU,KAAA,EAAO,mBAAA,gBAAmC,OAAA,CAAQ,oBAAA;IAC5D,OAAA,GAAU,QAAA,EAAU,mBAAA,gBAAmC,OAAA,CAAQ,oBAAA;IAC/D,YAAA,GACE,GAAA,EAAK,mBAAA,qBACF,OAAA,CAAQ,oBAAA;IACb,WAAA,GACE,EAAA,EAAI,mBAAA,oBACD,OAAA,CAAQ,oBAAA;IACb,YAAA,GACE,EAAA,EAAI,mBAAA,qBACD,OAAA,CAAQ,oBAAA;IACb,aAAA,GACE,GAAA,EAAK,mBAAA,sBACF,OAAA,CAAQ,oBAAA;IACb,UAAA,GACE,EAAA,EAAI,mBAAA,mBACD,OAAA,CAAQ,oBAAA;IACb,WAAA,GACE,GAAA,EAAK,mBAAA,oBACF,OAAA,CAAQ,oBAAA;EAAA;AAAA;;;;;;;AAnCjB;;;iBAgDgB,kBAAA,CAAmB,KAAA,EAAO,wBAAA,GAA2B,YAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload.client.mjs","names":[],"sources":["../../../../src/modules/storage/lib/upload.client.ts"],"sourcesContent":["import type { StorageRouterInputs, StorageRouterOutputs } from \"./procedures.server\";\nimport type {\n PresignUploadInput,\n PresignUploadOutput,\n SelectStorageAssetSchema,\n} from \"./validators\";\n\n/**\n * Upload request\n */\nexport type UploadFileRequest = PresignUploadInput & { file: File };\nexport type PrepareUploadInput = Omit<UploadFileRequest, \"name\" | \"contentType\" | \"size\">;\nexport type UploadHooks = {\n beforePresign?: (input: UploadFileRequest) => Promise<void> | void;\n afterPresign?: (presignResult: PresignUploadOutput) => Promise<void> | void;\n beforeConfirm?: (presignResult: PresignUploadOutput) => Promise<void> | void;\n afterConfirm?: (asset: SelectStorageAssetSchema) => Promise<void> | void;\n};\n\n/**\n * Upload client\n */\nexport type UploadClient = {\n prepareUpload: (input: PrepareUploadInput) => UploadFileRequest;\n upload: (input: UploadFileRequest, hooks?: UploadHooks) => Promise<SelectStorageAssetSchema>;\n deleteAsset: (id: string) => Promise<SelectStorageAssetSchema | null>;\n deleteAssets: (ids: string[]) => Promise<SelectStorageAssetSchema[]>;\n restoreAsset: (id: string) => Promise<SelectStorageAssetSchema | null>;\n restoreAssets: (ids: string[]) => Promise<SelectStorageAssetSchema[]>;\n purgeAsset: (id: string) => Promise<SelectStorageAssetSchema | null>;\n purgeAssets: (ids: string[]) => Promise<SelectStorageAssetSchema[]>;\n};\n\n/**\n * Create upload client props\n */\ntype CreateStorageClientProps = {\n endpoints: {\n presign: (input: StorageRouterInputs[\"presign\"]) => Promise<StorageRouterOutputs[\"presign\"]>;\n confirm: (uploadId: StorageRouterInputs[\"confirm\"]) => Promise<StorageRouterOutputs[\"confirm\"]>;\n deleteAssets: (\n ids: StorageRouterInputs[\"deleteAssets\"],\n ) => Promise<StorageRouterOutputs[\"deleteAssets\"]>;\n deleteAsset: (\n id: StorageRouterInputs[\"deleteAsset\"],\n ) => Promise<StorageRouterOutputs[\"deleteAsset\"]>;\n restoreAsset: (\n id: StorageRouterInputs[\"restoreAsset\"],\n ) => Promise<StorageRouterOutputs[\"restoreAsset\"]>;\n restoreAssets: (\n ids: StorageRouterInputs[\"restoreAssets\"],\n ) => Promise<StorageRouterOutputs[\"restoreAssets\"]>;\n purgeAsset: (\n id: StorageRouterInputs[\"purgeAsset\"],\n ) => Promise<StorageRouterOutputs[\"purgeAsset\"]>;\n purgeAssets: (\n ids: StorageRouterInputs[\"purgeAssets\"],\n ) => Promise<StorageRouterOutputs[\"purgeAssets\"]>;\n };\n};\n\n/**\n * Creates an upload client for the storage module.\n *\n * Flow:\n * - Prepare upload payload with generated id and resolved key\n * - Request presigned upload URL from server\n * - Upload file bytes directly to object storage\n * - Confirm upload and receive finalized storage asset\n */\nexport function createUploadClient(props: CreateStorageClientProps): UploadClient {\n /**\n * Create input schema for the upload method\n * @param {PrepareUploadInput} input\n * @returns {UploadFileRequest}\n */\n function prepareUpload(input: PrepareUploadInput): UploadFileRequest {\n return {\n ...input,\n uploadId: input.uploadId ?? crypto.randomUUID(),\n name: input.file.name,\n size: input.file.size,\n contentType: input.file.type || \"application/octet-stream\",\n };\n }\n\n /**\n * Upload file to the server\n * @param {UploadFileRequest} input\n * @returns {Promise<SelectStorageAssetSchema>}\n */\n async function upload(\n input: UploadFileRequest,\n hooks?: UploadHooks,\n ): Promise<SelectStorageAssetSchema> {\n let presignResult: PresignUploadOutput | null = null;\n\n try {\n /**\n * Presign\n */\n await hooks?.beforePresign?.(input);\n presignResult = await props.endpoints.presign(input);\n await hooks?.afterPresign?.(presignResult);\n\n /**\n * Upload the file\n */\n const uploadResponse = await fetch(presignResult.presignedUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": input.contentType || \"application/octet-stream\" },\n body: input.file,\n });\n\n if (!uploadResponse.ok) {\n const message = await uploadResponse.text();\n throw new Error(`Upload failed: ${message}`);\n }\n\n /**\n * Confirm\n */\n await hooks?.beforeConfirm?.(presignResult);\n const asset = await props.endpoints.confirm(presignResult.uploadId);\n await hooks?.afterConfirm?.(asset);\n /**\n * Return\n */\n return asset;\n } catch (err) {\n console.error(\"Upload error: \", err);\n\n /**\n * Delete if upload failed\n * */\n if (presignResult) {\n await props.endpoints.deleteAsset(presignResult.id).catch((deleteErr) => {\n console.error(\"Failed to delete asset after upload error: \", deleteErr);\n });\n }\n\n throw err;\n }\n }\n\n return {\n prepareUpload,\n upload,\n deleteAsset: props.endpoints.deleteAsset,\n deleteAssets: props.endpoints.deleteAssets,\n restoreAsset: props.endpoints.restoreAsset,\n restoreAssets: props.endpoints.restoreAssets,\n purgeAsset: props.endpoints.purgeAsset,\n purgeAssets: props.endpoints.purgeAssets,\n };\n}\n"],"mappings":";;;;;;;;;;AAsEA,SAAgB,mBAAmB,OAA+C;;;;;;CAMhF,SAAS,cAAc,OAA8C;AACnE,SAAO;GACL,GAAG;GACH,UAAU,MAAM,YAAY,OAAO,YAAY;GAC/C,MAAM,MAAM,KAAK;GACjB,MAAM,MAAM,KAAK;GACjB,aAAa,MAAM,KAAK,QAAQ;GACjC;;;;;;;CAQH,eAAe,OACb,OACA,OACmC;EACnC,IAAI,gBAA4C;AAEhD,MAAI;;;;AAIF,SAAM,OAAO,gBAAgB,MAAM;AACnC,mBAAgB,MAAM,MAAM,UAAU,QAAQ,MAAM;AACpD,SAAM,OAAO,eAAe,cAAc;;;;GAK1C,MAAM,iBAAiB,MAAM,MAAM,cAAc,cAAc;IAC7D,QAAQ;IACR,SAAS,EAAE,gBAAgB,MAAM,eAAe,4BAA4B;IAC5E,MAAM,MAAM;IACb,CAAC;AAEF,OAAI,CAAC,eAAe,IAAI;IACtB,MAAM,UAAU,MAAM,eAAe,MAAM;AAC3C,UAAM,IAAI,MAAM,kBAAkB,UAAU;;;;;AAM9C,SAAM,OAAO,gBAAgB,cAAc;GAC3C,MAAM,QAAQ,MAAM,MAAM,UAAU,QAAQ,cAAc,SAAS;AACnE,SAAM,OAAO,eAAe,MAAM;;;;AAIlC,UAAO;WACA,KAAK;AACZ,WAAQ,MAAM,kBAAkB,IAAI;;;;AAKpC,OAAI,cACF,OAAM,MAAM,UAAU,YAAY,cAAc,GAAG,CAAC,OAAO,cAAc;AACvE,YAAQ,MAAM,+CAA+C,UAAU;KACvE;AAGJ,SAAM;;;AAIV,QAAO;EACL;EACA;EACA,aAAa,MAAM,UAAU;EAC7B,cAAc,MAAM,UAAU;EAC9B,cAAc,MAAM,UAAU;EAC9B,eAAe,MAAM,UAAU;EAC/B,YAAY,MAAM,UAAU;EAC5B,aAAa,MAAM,UAAU;EAC9B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.mts","names":[],"sources":["../../../../src/modules/storage/lib/validators.ts"],"mappings":";;;;;;;;;;KASY,YAAA,UAAsB,aAAA,CAAc,YAAA;;AAAhD;;cAKa,4BAAA,EAA4B,GAAA,CAAA,OAAA;;;;KAC7B,sBAAA,GAAyB,GAAA,CAAE,KAAA,QAAa,4BAAA;;;;cAKvC,wBAAA,eAAwB,WAAA;YAAoC,oBAAA,CAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAE7D,uBAAA,GAA0B,GAAA,CAAE,KAAA,QAAa,wBAAA;AAAA,KACzC,wBAAA,GAA2B,GAAA,CAAE,KAAA,QAAa,wBAAA;;;;cAKzC,wBAAA,eAAwB,WAAA;YAAoC,oBAAA,CAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAE7D,uBAAA,GAA0B,GAAA,CAAE,KAAA,QAAa,wBAAA;AAAA,KACzC,wBAAA,GAA2B,GAAA,CAAE,KAAA,QAAa,wBAAA;;;;cAKzC,wBAAA,eAAwB,WAAA;YAAoC,oBAAA,CAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAE7D,wBAAA,GAA2B,GAAA,CAAE,KAAA,QAAa,wBAAA;;;;cAOzC,iBAAA,EAAiB,GAAA,CAAA,SAAA;;;;;;;;;;;cASjB,wBAAA,EAAwB,GAAA,CAAA,SAAA;;;;;;;;;;;cASxB,yBAAA,EAAyB,GAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAIzB,wBAAA,EAAwB,GAAA,CAAA,OAAA;AAAA,KAIzB,WAAA,GAAc,GAAA,CAAE,KAAA,QAAa,iBAAA;AAAA,KAC7B,kBAAA,GAAqB,GAAA,CAAE,KAAA,QAAa,wBAAA;AAAA,KACpC,mBAAA,GAAsB,GAAA,CAAE,KAAA,QAAa,yBAAA;AAAA,KACrC,kBAAA,GAAqB,GAAA,CAAE,KAAA,QAAa,wBAAA;;;;cAKnC,iBAAA,EAAiB,GAAA,CAAA,SAAA;;;;;;KAIlB,gBAAA,GAAmB,GAAA,CAAE,KAAA,QAAa,iBAAA;AAAA,KAClC,iBAAA,GAAoB,GAAA,CAAE,KAAA,QAAa,iBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validators.mjs","names":["z"],"sources":["../../../../src/modules/storage/lib/validators.ts"],"sourcesContent":["import { createInsertSchema, createSelectSchema, createUpdateSchema } from \"drizzle-zod\";\nimport { z } from \"zod\";\nimport { getObjectOptionsDefaults, objectBodyInputSchema } from \"../providers/lib/validators\";\nimport { imageDispositions } from \"./constants\";\nimport { storageAssets, storageAssetVisibilityEnum } from \"./schema\";\n\n/**\n * StorageAssets\n */\nexport type StorageAsset = typeof storageAssets.$inferSelect;\n\n/**\n * StorageAsset visibility enum\n */\nexport const storageAssetVisibilitySchema = z.enum(storageAssetVisibilityEnum.enumValues);\nexport type StorageAssetVisibility = z.infer<typeof storageAssetVisibilitySchema>;\n\n/**\n * Create storageAsset\n */\nexport const createStorageAssetSchema = createInsertSchema(storageAssets);\n\nexport type CreateStorageAssetInput = z.input<typeof createStorageAssetSchema>;\nexport type CreateStorageAssetSchema = z.infer<typeof createStorageAssetSchema>;\n\n/**\n * Update storageAsset\n */\nexport const updateStorageAssetSchema = createUpdateSchema(storageAssets);\n\nexport type UpdateStorageAssetInput = z.input<typeof updateStorageAssetSchema>;\nexport type UpdateStorageAssetSchema = z.infer<typeof updateStorageAssetSchema>;\n\n/**\n * Select storageAsset\n */\nexport const selectStorageAssetSchema = createSelectSchema(storageAssets);\n\nexport type SelectStorageAssetSchema = z.infer<typeof selectStorageAssetSchema>;\n\nconst assetMetadataSchema = z.record(z.string(), z.string()).optional();\n\n/**\n * Upload schema\n */\nexport const uploadInputSchema = z.object({\n name: z.string().min(1),\n visibility: storageAssetVisibilitySchema.optional().default(\"private\"),\n size: z.number().int().nonnegative().nullable().optional(),\n contentType: z.string().nullable().optional(),\n metadata: assetMetadataSchema,\n body: objectBodyInputSchema,\n});\n\nexport const presignUploadInputSchema = z.object({\n uploadId: z.uuid().optional(),\n name: z.string().min(1),\n visibility: storageAssetVisibilitySchema.optional().default(\"private\"),\n size: z.number().int().nonnegative().nullable().optional(),\n contentType: z.string().nullable().optional(),\n metadata: assetMetadataSchema,\n});\n\nexport const presignUploadOutputSchema = selectStorageAssetSchema.extend({\n presignedUrl: z.string(),\n});\n\nexport const confirmUploadInputSchema = z\n .uuid()\n .describe(\"The upload id of the pending upload to confirm, returned from the presign endpoint\");\n\nexport type UploadInput = z.input<typeof uploadInputSchema>;\nexport type PresignUploadInput = z.input<typeof presignUploadInputSchema>;\nexport type PresignUploadOutput = z.infer<typeof presignUploadOutputSchema>;\nexport type ConfirmUploadInput = z.input<typeof confirmUploadInputSchema>;\n\n/**\n * Get file url schema\n */\nexport const getAssetURLSchema = z.object({\n disposition: z.enum(imageDispositions).optional().default(getObjectOptionsDefaults.disposition),\n});\n\nexport type GetAssetURLInput = z.input<typeof getAssetURLSchema>;\nexport type GetAssetURLSchema = z.infer<typeof getAssetURLSchema>;\n"],"mappings":";;;;;;;;;;AAcA,MAAa,+BAA+BA,IAAE,KAAK,2BAA2B,WAAW;;;;AAMzF,MAAa,2BAA2B,mBAAmB,cAAc;;;;AAQzE,MAAa,2BAA2B,mBAAmB,cAAc;;;;AAQzE,MAAa,2BAA2B,mBAAmB,cAAc;AAIzE,MAAM,sBAAsBA,IAAE,OAAOA,IAAE,QAAQ,EAAEA,IAAE,QAAQ,CAAC,CAAC,UAAU;;;;AAKvE,MAAa,oBAAoBA,IAAE,OAAO;CACxC,MAAMA,IAAE,QAAQ,CAAC,IAAI,EAAE;CACvB,YAAY,6BAA6B,UAAU,CAAC,QAAQ,UAAU;CACtE,MAAMA,IAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU;CAC1D,aAAaA,IAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC7C,UAAU;CACV,MAAM;CACP,CAAC;AAEF,MAAa,2BAA2BA,IAAE,OAAO;CAC/C,UAAUA,IAAE,MAAM,CAAC,UAAU;CAC7B,MAAMA,IAAE,QAAQ,CAAC,IAAI,EAAE;CACvB,YAAY,6BAA6B,UAAU,CAAC,QAAQ,UAAU;CACtE,MAAMA,IAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU;CAC1D,aAAaA,IAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC7C,UAAU;CACX,CAAC;AAEF,MAAa,4BAA4B,yBAAyB,OAAO,EACvE,cAAcA,IAAE,QAAQ,EACzB,CAAC;AAEF,MAAa,2BAA2BA,IACrC,MAAM,CACN,SAAS,qFAAqF;;;;AAUjG,MAAa,oBAAoBA,IAAE,OAAO,EACxC,aAAaA,IAAE,KAAK,kBAAkB,CAAC,UAAU,CAAC,QAAQ,yBAAyB,YAAY,EAChG,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3.server.d.mts","names":[],"sources":["../../../../../src/modules/storage/providers/adapters/s3.server.ts"],"mappings":";;;;KAwCY,sBAAA,GAAyB,cAAA;EACnC,UAAA;AAAA;;;;;AA6OF;;;;iBAAgB,gBAAA,CAAiB,MAAA,EAAQ,sBAAA,GAAyB,cAAA"}
|