@vitnode/core 2.0.0-canary.4 → 2.0.0-canary.5
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/src/api/adapters/search/postgres.d.ts.map +1 -1
- package/dist/src/api/adapters/search/postgres.js +1 -1
- package/dist/src/api/adapters/sso/discord.d.ts.map +1 -1
- package/dist/src/api/adapters/sso/discord.js +1 -1
- package/dist/src/api/config.d.ts.map +1 -1
- package/dist/src/api/config.js +1 -1
- package/dist/src/api/lib/auth-cookie.d.ts.map +1 -1
- package/dist/src/api/lib/auth-cookie.js +1 -1
- package/dist/src/api/lib/client-ip.d.ts +4 -0
- package/dist/src/api/lib/client-ip.d.ts.map +1 -0
- package/dist/src/api/lib/client-ip.js +1 -0
- package/dist/src/api/lib/pagination-cursor.d.ts +7 -3
- package/dist/src/api/lib/pagination-cursor.d.ts.map +1 -1
- package/dist/src/api/lib/pagination-cursor.js +1 -1
- package/dist/src/api/lib/user-email-lookup.d.ts +6 -0
- package/dist/src/api/lib/user-email-lookup.d.ts.map +1 -0
- package/dist/src/api/lib/user-email-lookup.js +1 -0
- package/dist/src/api/lib/with-pagination.d.ts +4 -2
- package/dist/src/api/lib/with-pagination.d.ts.map +1 -1
- package/dist/src/api/lib/with-pagination.js +1 -1
- package/dist/src/api/middlewares/captcha.middleware.d.ts.map +1 -1
- package/dist/src/api/middlewares/captcha.middleware.js +1 -1
- package/dist/src/api/middlewares/cron-auth.middleware.d.ts.map +1 -1
- package/dist/src/api/middlewares/cron-auth.middleware.js +1 -1
- package/dist/src/api/middlewares/global.middleware.d.ts.map +1 -1
- package/dist/src/api/middlewares/global.middleware.js +1 -1
- package/dist/src/api/middlewares/storage-static.middleware.d.ts +3 -0
- package/dist/src/api/middlewares/storage-static.middleware.d.ts.map +1 -0
- package/dist/src/api/middlewares/storage-static.middleware.js +1 -0
- package/dist/src/api/middlewares/websocket-origin.middleware.d.ts +5 -0
- package/dist/src/api/middlewares/websocket-origin.middleware.d.ts.map +1 -0
- package/dist/src/api/middlewares/websocket-origin.middleware.js +1 -0
- package/dist/src/api/models/device.d.ts +5 -1
- package/dist/src/api/models/device.d.ts.map +1 -1
- package/dist/src/api/models/device.js +1 -1
- package/dist/src/api/models/password.d.ts +1 -0
- package/dist/src/api/models/password.d.ts.map +1 -1
- package/dist/src/api/models/password.js +1 -1
- package/dist/src/api/models/session-admin.d.ts.map +1 -1
- package/dist/src/api/models/session-admin.js +1 -1
- package/dist/src/api/models/session-revoke.d.ts +4 -0
- package/dist/src/api/models/session-revoke.d.ts.map +1 -0
- package/dist/src/api/models/session-revoke.js +1 -0
- package/dist/src/api/models/session.js +1 -1
- package/dist/src/api/models/sso.d.ts.map +1 -1
- package/dist/src/api/models/sso.js +1 -1
- package/dist/src/api/models/storage.d.ts.map +1 -1
- package/dist/src/api/models/storage.js +1 -1
- package/dist/src/api/models/user/sign-in-with-passwords.d.ts.map +1 -1
- package/dist/src/api/models/user/sign-in-with-passwords.js +1 -1
- package/dist/src/api/models/user/sign-up.d.ts +1 -1
- package/dist/src/api/models/user/sign-up.d.ts.map +1 -1
- package/dist/src/api/models/user/sign-up.js +1 -1
- package/dist/src/api/models/user.d.ts +1 -1
- package/dist/src/api/models/user.d.ts.map +1 -1
- package/dist/src/api/modules/admin/advanced/queue/routes/get.route.d.ts.map +1 -1
- package/dist/src/api/modules/admin/advanced/queue/routes/get.route.js +1 -1
- package/dist/src/api/modules/admin/roles/routes/show.route.d.ts.map +1 -1
- package/dist/src/api/modules/admin/roles/routes/show.route.js +1 -1
- package/dist/src/api/modules/admin/routes/notifications.route.d.ts.map +1 -1
- package/dist/src/api/modules/admin/routes/notifications.route.js +1 -1
- package/dist/src/api/modules/admin/users/lib/assert-edit-user-permission.d.ts +1 -0
- package/dist/src/api/modules/admin/users/lib/assert-edit-user-permission.d.ts.map +1 -1
- package/dist/src/api/modules/admin/users/lib/assert-edit-user-permission.js +1 -1
- package/dist/src/api/modules/admin/users/routes/update.route.d.ts.map +1 -1
- package/dist/src/api/modules/admin/users/routes/update.route.js +1 -1
- package/dist/src/api/modules/search/routes/search.route.d.ts.map +1 -1
- package/dist/src/api/modules/search/routes/search.route.js +1 -1
- package/dist/src/api/modules/users/routes/change-password.route.d.ts.map +1 -1
- package/dist/src/api/modules/users/routes/change-password.route.js +1 -1
- package/dist/src/api/modules/users/routes/reset-passowrd.route.d.ts.map +1 -1
- package/dist/src/api/modules/users/routes/reset-passowrd.route.js +1 -1
- package/dist/src/api/modules/users/users.module.d.ts +0 -24
- package/dist/src/api/modules/users/users.module.d.ts.map +1 -1
- package/dist/src/api/modules/users/users.module.js +1 -1
- package/dist/src/api/modules.client.d.ts +0 -24
- package/dist/src/api/modules.client.d.ts.map +1 -1
- package/dist/src/components/confirm-action/confirm-action-alert-dialog.d.ts.map +1 -1
- package/dist/src/components/confirm-action/confirm-action-alert-dialog.js +1 -1
- package/dist/src/components/date-format.d.ts.map +1 -1
- package/dist/src/components/date-format.js +1 -1
- package/dist/src/components/editor-provider.d.ts +19 -0
- package/dist/src/components/editor-provider.d.ts.map +1 -0
- package/dist/src/components/editor-provider.js +1 -0
- package/dist/src/components/files/file-preview.d.ts.map +1 -1
- package/dist/src/components/files/file-preview.js +1 -1
- package/dist/src/components/files/metadata-cell.d.ts.map +1 -1
- package/dist/src/components/files/metadata-cell.js +1 -1
- package/dist/src/components/form/auto-form.d.ts.map +1 -1
- package/dist/src/components/form/auto-form.js +1 -1
- package/dist/src/components/form/common/async-picker.d.ts.map +1 -1
- package/dist/src/components/form/common/async-picker.js +1 -1
- package/dist/src/components/form/fields/array.d.ts.map +1 -1
- package/dist/src/components/form/fields/array.js +1 -1
- package/dist/src/components/form/fields/file-gallery.d.ts.map +1 -1
- package/dist/src/components/form/fields/file-gallery.js +1 -1
- package/dist/src/components/form/fields/file-shared.d.ts.map +1 -1
- package/dist/src/components/form/fields/file-shared.js +1 -1
- package/dist/src/components/form/fields/file.d.ts.map +1 -1
- package/dist/src/components/form/fields/file.js +1 -1
- package/dist/src/components/form/fields/files.d.ts.map +1 -1
- package/dist/src/components/form/fields/files.js +1 -1
- package/dist/src/components/form/fields/input-roles.d.ts.map +1 -1
- package/dist/src/components/form/fields/input-roles.js +1 -1
- package/dist/src/components/form/fields/input-users.d.ts.map +1 -1
- package/dist/src/components/form/fields/input-users.js +1 -1
- package/dist/src/components/form/fields/multi-lang.d.ts.map +1 -1
- package/dist/src/components/form/fields/multi-lang.js +1 -1
- package/dist/src/components/languages-provider.d.ts.map +1 -1
- package/dist/src/components/languages-provider.js +1 -1
- package/dist/src/components/role-format-content.d.ts.map +1 -1
- package/dist/src/components/role-format-content.js +1 -1
- package/dist/src/components/staff-permission/provider.d.ts.map +1 -1
- package/dist/src/components/staff-permission/provider.js +1 -1
- package/dist/src/components/switchers/langs/language-switcher-content.d.ts.map +1 -1
- package/dist/src/components/switchers/langs/language-switcher-content.js +1 -1
- package/dist/src/components/switchers/themes/theme-switcher.d.ts.map +1 -1
- package/dist/src/components/switchers/themes/theme-switcher.js +1 -1
- package/dist/src/components/table/content.js +1 -1
- package/dist/src/components/table/data-table-content.js +1 -1
- package/dist/src/components/table/filters.d.ts.map +1 -1
- package/dist/src/components/table/filters.js +1 -1
- package/dist/src/components/table/navigation.d.ts.map +1 -1
- package/dist/src/components/table/navigation.js +1 -1
- package/dist/src/components/table/no-results.d.ts.map +1 -1
- package/dist/src/components/table/no-results.js +1 -1
- package/dist/src/components/table/order-table-head.d.ts.map +1 -1
- package/dist/src/components/table/order-table-head.js +1 -1
- package/dist/src/components/table/pagination.d.ts.map +1 -1
- package/dist/src/components/table/pagination.js +1 -1
- package/dist/src/components/table/search.d.ts.map +1 -1
- package/dist/src/components/table/search.js +1 -1
- package/dist/src/components/table/selection.d.ts.map +1 -1
- package/dist/src/components/table/selection.js +1 -1
- package/dist/src/components/theme-provider.d.ts.map +1 -1
- package/dist/src/components/theme-provider.js +1 -1
- package/dist/src/components/theme-script.d.ts.map +1 -1
- package/dist/src/components/tiptap/drag-handle.d.ts +5 -0
- package/dist/src/components/tiptap/drag-handle.d.ts.map +1 -0
- package/dist/src/components/tiptap/drag-handle.js +1 -0
- package/dist/src/components/tiptap/emoji/custom-emoji.d.ts +7 -0
- package/dist/src/components/tiptap/emoji/custom-emoji.d.ts.map +1 -0
- package/dist/src/components/tiptap/emoji/custom-emoji.js +1 -0
- package/dist/src/components/tiptap/emoji/emoji-suggestion-list.d.ts +10 -0
- package/dist/src/components/tiptap/emoji/emoji-suggestion-list.d.ts.map +1 -0
- package/dist/src/components/tiptap/emoji/emoji-suggestion-list.js +1 -0
- package/dist/src/components/tiptap/emoji/emoji-suggestion.d.ts +6 -0
- package/dist/src/components/tiptap/emoji/emoji-suggestion.d.ts.map +1 -0
- package/dist/src/components/tiptap/emoji/emoji-suggestion.js +1 -0
- package/dist/src/components/tiptap/emoji/match-emojis.d.ts +4 -0
- package/dist/src/components/tiptap/emoji/match-emojis.d.ts.map +1 -0
- package/dist/src/components/tiptap/emoji/match-emojis.js +1 -0
- package/dist/src/components/tiptap/extension.d.ts +6 -1
- package/dist/src/components/tiptap/extension.d.ts.map +1 -1
- package/dist/src/components/tiptap/extension.js +1 -1
- package/dist/src/components/tiptap/tiptap-editor.d.ts +8 -0
- package/dist/src/components/tiptap/tiptap-editor.d.ts.map +1 -0
- package/dist/src/components/tiptap/tiptap-editor.js +1 -0
- package/dist/src/components/tiptap/toolbar/actions/audio/audio-form.d.ts +2 -0
- package/dist/src/components/tiptap/toolbar/actions/audio/audio-form.d.ts.map +1 -0
- package/dist/src/components/tiptap/toolbar/actions/audio/audio-form.js +1 -0
- package/dist/src/components/tiptap/toolbar/actions/audio-action.d.ts +3 -0
- package/dist/src/components/tiptap/toolbar/actions/audio-action.d.ts.map +1 -0
- package/dist/src/components/tiptap/toolbar/actions/audio-action.js +1 -0
- package/dist/src/components/tiptap/toolbar/actions/blocks-action.d.ts +2 -0
- package/dist/src/components/tiptap/toolbar/actions/blocks-action.d.ts.map +1 -0
- package/dist/src/components/tiptap/toolbar/actions/blocks-action.js +1 -0
- package/dist/src/components/tiptap/toolbar/actions/color-action.d.ts +3 -0
- package/dist/src/components/tiptap/toolbar/actions/color-action.d.ts.map +1 -0
- package/dist/src/components/tiptap/toolbar/actions/color-action.js +1 -0
- package/dist/src/components/tiptap/toolbar/actions/emoji/emoji-picker.d.ts +5 -0
- package/dist/src/components/tiptap/toolbar/actions/emoji/emoji-picker.d.ts.map +1 -0
- package/dist/src/components/tiptap/toolbar/actions/emoji/emoji-picker.js +1 -0
- package/dist/src/components/tiptap/toolbar/actions/emoji-action.d.ts +3 -0
- package/dist/src/components/tiptap/toolbar/actions/emoji-action.d.ts.map +1 -0
- package/dist/src/components/tiptap/toolbar/actions/emoji-action.js +1 -0
- package/dist/src/components/tiptap/toolbar/actions/font-size-action.d.ts +2 -0
- package/dist/src/components/tiptap/toolbar/actions/font-size-action.d.ts.map +1 -0
- package/dist/src/components/tiptap/toolbar/actions/font-size-action.js +1 -0
- package/dist/src/components/tiptap/toolbar/actions/table-action.d.ts +2 -0
- package/dist/src/components/tiptap/toolbar/actions/table-action.d.ts.map +1 -0
- package/dist/src/components/tiptap/toolbar/actions/table-action.js +1 -0
- package/dist/src/components/tiptap/toolbar/actions/text-format-more/text-format-more.d.ts.map +1 -1
- package/dist/src/components/tiptap/toolbar/actions/text-format-more/text-format-more.js +1 -1
- package/dist/src/components/tiptap/toolbar/tiptap-toolbar.d.ts.map +1 -1
- package/dist/src/components/tiptap/toolbar/tiptap-toolbar.js +1 -1
- package/dist/src/components/ui/accordion.d.ts.map +1 -1
- package/dist/src/components/ui/accordion.js +1 -1
- package/dist/src/components/ui/alert-dialog.d.ts.map +1 -1
- package/dist/src/components/ui/alert-dialog.js +1 -1
- package/dist/src/components/ui/avatar.d.ts.map +1 -1
- package/dist/src/components/ui/avatar.js +1 -1
- package/dist/src/components/ui/button-client.d.ts.map +1 -1
- package/dist/src/components/ui/button-client.js +1 -1
- package/dist/src/components/ui/button.js +1 -1
- package/dist/src/components/ui/carousel.d.ts.map +1 -1
- package/dist/src/components/ui/carousel.js +1 -1
- package/dist/src/components/ui/chart.d.ts.map +1 -1
- package/dist/src/components/ui/chart.js +1 -1
- package/dist/src/components/ui/checkbox.d.ts.map +1 -1
- package/dist/src/components/ui/checkbox.js +1 -1
- package/dist/src/components/ui/collapsible.d.ts.map +1 -1
- package/dist/src/components/ui/collapsible.js +1 -1
- package/dist/src/components/ui/color-picker.d.ts.map +1 -1
- package/dist/src/components/ui/color-picker.js +1 -1
- package/dist/src/components/ui/combobox.d.ts.map +1 -1
- package/dist/src/components/ui/combobox.js +1 -1
- package/dist/src/components/ui/command.d.ts.map +1 -1
- package/dist/src/components/ui/command.js +1 -1
- package/dist/src/components/ui/context-menu.d.ts.map +1 -1
- package/dist/src/components/ui/context-menu.js +1 -1
- package/dist/src/components/ui/dialog.d.ts.map +1 -1
- package/dist/src/components/ui/dialog.js +1 -1
- package/dist/src/components/ui/direction.d.ts.map +1 -1
- package/dist/src/components/ui/direction.js +1 -1
- package/dist/src/components/ui/drawer.d.ts.map +1 -1
- package/dist/src/components/ui/drawer.js +1 -1
- package/dist/src/components/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/src/components/ui/dropdown-menu.js +1 -1
- package/dist/src/components/ui/editor.d.ts +2 -7
- package/dist/src/components/ui/editor.d.ts.map +1 -1
- package/dist/src/components/ui/editor.js +1 -1
- package/dist/src/components/ui/field.d.ts.map +1 -1
- package/dist/src/components/ui/field.js +1 -1
- package/dist/src/components/ui/form.d.ts.map +1 -1
- package/dist/src/components/ui/form.js +1 -1
- package/dist/src/components/ui/hover-card.d.ts.map +1 -1
- package/dist/src/components/ui/hover-card.js +1 -1
- package/dist/src/components/ui/input-group.d.ts.map +1 -1
- package/dist/src/components/ui/input-group.js +1 -1
- package/dist/src/components/ui/input-otp.d.ts.map +1 -1
- package/dist/src/components/ui/input-otp.js +1 -1
- package/dist/src/components/ui/input.js +1 -1
- package/dist/src/components/ui/kbd.js +1 -1
- package/dist/src/components/ui/menubar.d.ts.map +1 -1
- package/dist/src/components/ui/menubar.js +1 -1
- package/dist/src/components/ui/native-select.js +1 -1
- package/dist/src/components/ui/navigation-menu.d.ts.map +1 -1
- package/dist/src/components/ui/navigation-menu.js +1 -1
- package/dist/src/components/ui/popover.d.ts.map +1 -1
- package/dist/src/components/ui/popover.js +1 -1
- package/dist/src/components/ui/progress.d.ts.map +1 -1
- package/dist/src/components/ui/progress.js +1 -1
- package/dist/src/components/ui/radio-group.d.ts.map +1 -1
- package/dist/src/components/ui/radio-group.js +1 -1
- package/dist/src/components/ui/resizable.d.ts.map +1 -1
- package/dist/src/components/ui/resizable.js +1 -1
- package/dist/src/components/ui/scroll-area.d.ts.map +1 -1
- package/dist/src/components/ui/scroll-area.js +1 -1
- package/dist/src/components/ui/select.d.ts.map +1 -1
- package/dist/src/components/ui/select.js +1 -1
- package/dist/src/components/ui/separator.d.ts.map +1 -1
- package/dist/src/components/ui/separator.js +1 -1
- package/dist/src/components/ui/sheet.d.ts.map +1 -1
- package/dist/src/components/ui/sheet.js +1 -1
- package/dist/src/components/ui/sidebar.d.ts.map +1 -1
- package/dist/src/components/ui/sidebar.js +1 -1
- package/dist/src/components/ui/slider.d.ts.map +1 -1
- package/dist/src/components/ui/slider.js +1 -1
- package/dist/src/components/ui/sonner.d.ts.map +1 -1
- package/dist/src/components/ui/sonner.js +1 -1
- package/dist/src/components/ui/switch.d.ts.map +1 -1
- package/dist/src/components/ui/switch.js +1 -1
- package/dist/src/components/ui/table.d.ts.map +1 -1
- package/dist/src/components/ui/table.js +1 -1
- package/dist/src/components/ui/tabs.d.ts.map +1 -1
- package/dist/src/components/ui/tabs.js +1 -1
- package/dist/src/components/ui/textarea.js +1 -1
- package/dist/src/components/ui/toggle-group.d.ts.map +1 -1
- package/dist/src/components/ui/toggle-group.js +1 -1
- package/dist/src/components/ui/toggle.d.ts.map +1 -1
- package/dist/src/components/ui/toggle.js +1 -1
- package/dist/src/components/ui/tooltip.d.ts.map +1 -1
- package/dist/src/components/ui/tooltip.js +1 -1
- package/dist/src/config.js +1 -1
- package/dist/src/content/admin/upload.d.ts.map +1 -1
- package/dist/src/content/registry.d.ts.map +1 -1
- package/dist/src/content/server/preview-config.js +1 -1
- package/dist/src/content/server/routes.d.ts.map +1 -1
- package/dist/src/emoji-picker.css +104 -0
- package/dist/src/framework/vite/env.js +1 -1
- package/dist/src/framework/vite/optimize-deps.d.ts +1 -1
- package/dist/src/framework/vite/optimize-deps.d.ts.map +1 -1
- package/dist/src/framework/vite/optimize-deps.js +1 -1
- package/dist/src/lib/api/upload.d.ts +2 -1
- package/dist/src/lib/api/upload.d.ts.map +1 -1
- package/dist/src/lib/api/upload.js +1 -1
- package/dist/src/lib/config.d.ts +1 -0
- package/dist/src/lib/config.d.ts.map +1 -1
- package/dist/src/lib/config.js +1 -1
- package/dist/src/lib/email-canonical.d.ts +3 -0
- package/dist/src/lib/email-canonical.d.ts.map +1 -0
- package/dist/src/lib/email-canonical.js +1 -0
- package/dist/src/lib/fetcher-client.d.ts +5 -0
- package/dist/src/lib/fetcher-client.d.ts.map +1 -1
- package/dist/src/lib/fetcher-client.js +1 -1
- package/dist/src/lib/i18n/provider.d.ts.map +1 -1
- package/dist/src/lib/i18n/provider.js +1 -1
- package/dist/src/lib/plugin.d.ts +3 -0
- package/dist/src/lib/plugin.d.ts.map +1 -1
- package/dist/src/locales/en.json +45 -2
- package/dist/src/locales/pl.json +44 -1
- package/dist/src/routing/path.js +1 -1
- package/dist/src/tanstack/admin/breadcrumb.d.ts.map +1 -1
- package/dist/src/tanstack/admin/breadcrumb.js +1 -1
- package/dist/src/tanstack/admin/content/breadcrumb.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/breadcrumb.js +1 -1
- package/dist/src/tanstack/admin/content/create-action.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/create-action.js +1 -1
- package/dist/src/tanstack/admin/content/editorial/host.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/editorial/host.js +1 -1
- package/dist/src/tanstack/admin/content/editorial/panels.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/editorial/panels.js +1 -1
- package/dist/src/tanstack/admin/content/form/dialog.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/form/dialog.js +1 -1
- package/dist/src/tanstack/admin/content/form/form-body.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/form/form-body.js +1 -1
- package/dist/src/tanstack/admin/content/form/host.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/form/host.js +1 -1
- package/dist/src/tanstack/admin/content/form/page-body.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/form/page-body.js +1 -1
- package/dist/src/tanstack/admin/content/form/page-skeleton.d.ts +9 -0
- package/dist/src/tanstack/admin/content/form/page-skeleton.d.ts.map +1 -0
- package/dist/src/tanstack/admin/content/form/page-skeleton.js +1 -0
- package/dist/src/tanstack/admin/content/form/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/form/screen.js +1 -1
- package/dist/src/tanstack/admin/content/form/spec.d.ts +2 -0
- package/dist/src/tanstack/admin/content/form/spec.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/form/spec.js +1 -1
- package/dist/src/tanstack/admin/content/form/transport.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/form/transport.js +1 -1
- package/dist/src/tanstack/admin/content/list.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/list.js +1 -1
- package/dist/src/tanstack/admin/content/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/query.js +1 -1
- package/dist/src/tanstack/admin/content/route-screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/route-screen.js +1 -1
- package/dist/src/tanstack/admin/content/route.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/row-actions.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/row-actions.js +1 -1
- package/dist/src/tanstack/admin/content/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/content/screen.js +1 -1
- package/dist/src/tanstack/admin/content/transport.d.ts +3 -0
- package/dist/src/tanstack/admin/content/transport.d.ts.map +1 -0
- package/dist/src/tanstack/admin/content/transport.js +1 -0
- package/dist/src/tanstack/admin/cron/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/cron/query.js +1 -1
- package/dist/src/tanstack/admin/cron/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/cron/screen.js +1 -1
- package/dist/src/tanstack/admin/dashboard/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/dashboard/query.js +1 -1
- package/dist/src/tanstack/admin/dashboard/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/dashboard/screen.js +1 -1
- package/dist/src/tanstack/admin/dashboard/widgets.d.ts.map +1 -1
- package/dist/src/tanstack/admin/dashboard/widgets.js +1 -1
- package/dist/src/tanstack/admin/debug/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/debug/query.js +1 -1
- package/dist/src/tanstack/admin/debug/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/debug/screen.js +1 -1
- package/dist/src/tanstack/admin/files/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/files/query.js +1 -1
- package/dist/src/tanstack/admin/files/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/files/screen.js +1 -1
- package/dist/src/tanstack/admin/index.d.ts +0 -1
- package/dist/src/tanstack/admin/index.d.ts.map +1 -1
- package/dist/src/tanstack/admin/index.js +1 -1
- package/dist/src/tanstack/admin/integrations/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/integrations/query.js +1 -1
- package/dist/src/tanstack/admin/integrations/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/integrations/screen.js +1 -1
- package/dist/src/tanstack/admin/nav.d.ts.map +1 -1
- package/dist/src/tanstack/admin/nav.js +1 -1
- package/dist/src/tanstack/admin/permissions.d.ts.map +1 -1
- package/dist/src/tanstack/admin/permissions.js +1 -1
- package/dist/src/tanstack/admin/queue/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/queue/query.js +1 -1
- package/dist/src/tanstack/admin/queue/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/queue/screen.js +1 -1
- package/dist/src/tanstack/admin/roles/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/roles/query.js +1 -1
- package/dist/src/tanstack/admin/roles/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/roles/screen.js +1 -1
- package/dist/src/tanstack/admin/search-index/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/search-index/query.js +1 -1
- package/dist/src/tanstack/admin/search-index/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/search-index/screen.js +1 -1
- package/dist/src/tanstack/admin/search.d.ts.map +1 -1
- package/dist/src/tanstack/admin/search.js +1 -1
- package/dist/src/tanstack/admin/shell.d.ts.map +1 -1
- package/dist/src/tanstack/admin/shell.js +1 -1
- package/dist/src/tanstack/admin/sign-in-screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/sign-in-screen.js +1 -1
- package/dist/src/tanstack/admin/staff/breadcrumbs.d.ts.map +1 -1
- package/dist/src/tanstack/admin/staff/breadcrumbs.js +1 -1
- package/dist/src/tanstack/admin/staff/create-screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/staff/create-screen.js +1 -1
- package/dist/src/tanstack/admin/staff/edit-screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/staff/edit-screen.js +1 -1
- package/dist/src/tanstack/admin/staff/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/staff/query.js +1 -1
- package/dist/src/tanstack/admin/staff/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/staff/screen.js +1 -1
- package/dist/src/tanstack/admin/user-bar.d.ts.map +1 -1
- package/dist/src/tanstack/admin/user-bar.js +1 -1
- package/dist/src/tanstack/admin/users/detail-breadcrumb.d.ts.map +1 -1
- package/dist/src/tanstack/admin/users/detail-breadcrumb.js +1 -1
- package/dist/src/tanstack/admin/users/detail-screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/users/detail-screen.js +1 -1
- package/dist/src/tanstack/admin/users/query.d.ts.map +1 -1
- package/dist/src/tanstack/admin/users/query.js +1 -1
- package/dist/src/tanstack/admin/users/screen.d.ts.map +1 -1
- package/dist/src/tanstack/admin/users/screen.js +1 -1
- package/dist/src/tanstack/auth/login-screen.d.ts.map +1 -1
- package/dist/src/tanstack/auth/login-screen.js +1 -1
- package/dist/src/tanstack/auth/middleware-config.d.ts.map +1 -1
- package/dist/src/tanstack/auth/middleware-config.js +1 -1
- package/dist/src/tanstack/auth/recovery-screen.d.ts.map +1 -1
- package/dist/src/tanstack/auth/recovery-screen.js +1 -1
- package/dist/src/tanstack/auth/register-screen.d.ts.map +1 -1
- package/dist/src/tanstack/auth/register-screen.js +1 -1
- package/dist/src/tanstack/auth/sso-screen.d.ts.map +1 -1
- package/dist/src/tanstack/auth/sso-screen.js +1 -1
- package/dist/src/tanstack/breadcrumb/main-breadcrumb.d.ts.map +1 -1
- package/dist/src/tanstack/breadcrumb/main-breadcrumb.js +1 -1
- package/dist/src/tanstack/devices/panel.d.ts.map +1 -1
- package/dist/src/tanstack/devices/panel.js +1 -1
- package/dist/src/tanstack/devices/query.d.ts.map +1 -1
- package/dist/src/tanstack/devices/query.js +1 -1
- package/dist/src/tanstack/fetcher/index.d.ts +15 -0
- package/dist/src/tanstack/fetcher/index.d.ts.map +1 -0
- package/dist/src/tanstack/fetcher/index.js +1 -0
- package/dist/src/tanstack/fetcher/server.js +1 -1
- package/dist/src/tanstack/files/query.d.ts.map +1 -1
- package/dist/src/tanstack/files/query.js +1 -1
- package/dist/src/tanstack/files/screen.d.ts.map +1 -1
- package/dist/src/tanstack/files/screen.js +1 -1
- package/dist/src/tanstack/i18n/request.d.ts.map +1 -1
- package/dist/src/tanstack/i18n/request.js +1 -1
- package/dist/src/tanstack/i18n/route-messages.d.ts.map +1 -1
- package/dist/src/tanstack/i18n/route-messages.js +1 -1
- package/dist/src/tanstack/layout/error-actions.d.ts.map +1 -1
- package/dist/src/tanstack/layout/error-actions.js +1 -1
- package/dist/src/tanstack/layout/header.d.ts.map +1 -1
- package/dist/src/tanstack/layout/header.js +1 -1
- package/dist/src/tanstack/layout/index.d.ts +1 -1
- package/dist/src/tanstack/layout/index.d.ts.map +1 -1
- package/dist/src/tanstack/layout/index.js +1 -1
- package/dist/src/tanstack/layout/language-switcher.d.ts.map +1 -1
- package/dist/src/tanstack/layout/language-switcher.js +1 -1
- package/dist/src/tanstack/layout/main-header.d.ts.map +1 -1
- package/dist/src/tanstack/layout/main-header.js +1 -1
- package/dist/src/tanstack/layout/not-found.d.ts +3 -0
- package/dist/src/tanstack/layout/not-found.d.ts.map +1 -1
- package/dist/src/tanstack/layout/not-found.js +1 -1
- package/dist/src/tanstack/layout/root-providers.d.ts.map +1 -1
- package/dist/src/tanstack/layout/root-providers.js +1 -1
- package/dist/src/tanstack/layout/router-link.d.ts.map +1 -1
- package/dist/src/tanstack/layout/router-link.js +1 -1
- package/dist/src/tanstack/layout/user-header.d.ts.map +1 -1
- package/dist/src/tanstack/layout/user-header.js +1 -1
- package/dist/src/tanstack/pending/guard-pending.d.ts.map +1 -1
- package/dist/src/tanstack/pending/guard-pending.js +1 -1
- package/dist/src/tanstack/pending/navigation-pending.d.ts.map +1 -1
- package/dist/src/tanstack/pending/navigation-pending.js +1 -1
- package/dist/src/tanstack/pending/route-pending-skeleton.d.ts.map +1 -1
- package/dist/src/tanstack/pending/route-pending-skeleton.js +1 -1
- package/dist/src/tanstack/pending/shapes.d.ts.map +1 -1
- package/dist/src/tanstack/pending/shapes.js +1 -1
- package/dist/src/tanstack/plugin-routes/components.d.ts.map +1 -1
- package/dist/src/tanstack/plugin-routes/components.js +1 -1
- package/dist/src/tanstack/realtime/realtime-listeners.d.ts.map +1 -1
- package/dist/src/tanstack/realtime/realtime-listeners.js +1 -1
- package/dist/src/tanstack/routes/main/index.d.ts.map +1 -1
- package/dist/src/tanstack/routes/main/index.js +1 -1
- package/dist/src/tanstack/search/discover-screen.d.ts.map +1 -1
- package/dist/src/tanstack/search/discover-screen.js +1 -1
- package/dist/src/tanstack/search/feed.d.ts.map +1 -1
- package/dist/src/tanstack/search/feed.js +1 -1
- package/dist/src/tanstack/search/search-screen.d.ts.map +1 -1
- package/dist/src/tanstack/search/search-screen.js +1 -1
- package/dist/src/tanstack/settings/layout.d.ts.map +1 -1
- package/dist/src/tanstack/settings/layout.js +1 -1
- package/dist/src/tiptap.css +103 -6
- package/dist/src/views/admin/layouts/search/search-content.d.ts.map +1 -1
- package/dist/src/views/admin/layouts/search/search-content.js +1 -1
- package/dist/src/views/admin/layouts/search/search-dialog-content.d.ts.map +1 -1
- package/dist/src/views/admin/layouts/search/search-dialog-content.js +1 -1
- package/dist/src/views/admin/layouts/sidebar/nav/item-content.d.ts.map +1 -1
- package/dist/src/views/admin/layouts/sidebar/nav/item-content.js +1 -1
- package/dist/src/views/admin/layouts/sidebar/nav/nav-model.d.ts.map +1 -1
- package/dist/src/views/admin/layouts/user-bar/user-bar-content.d.ts.map +1 -1
- package/dist/src/views/admin/layouts/user-bar/user-bar-content.js +1 -1
- package/dist/src/views/admin/views/content/actions/conflict-notice.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/content-form.d.ts +3 -1
- package/dist/src/views/admin/views/content/actions/content-form.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/content-form.js +1 -1
- package/dist/src/views/admin/views/content/actions/content-panel.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/content-panel.js +1 -1
- package/dist/src/views/admin/views/content/actions/delivery/delivery-panel.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/delivery-action.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/delivery-action.js +1 -1
- package/dist/src/views/admin/views/content/actions/editorial-transport.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/form-dialog.d.ts +2 -1
- package/dist/src/views/admin/views/content/actions/form-dialog.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/form-dialog.js +1 -1
- package/dist/src/views/admin/views/content/actions/history/revision-actor.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/history/revision-diff.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/history/revision-history.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/history/revision-row.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/history-action.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/history-action.js +1 -1
- package/dist/src/views/admin/views/content/actions/preview-action.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/preview-action.js +1 -1
- package/dist/src/views/admin/views/content/actions/schedule/schedule-panel.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/schedule-action.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/actions/schedule-action.js +1 -1
- package/dist/src/views/admin/views/content/content-request.d.ts +4 -1
- package/dist/src/views/admin/views/content/content-request.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/content-request.js +1 -1
- package/dist/src/views/admin/views/content/form/context.d.ts +1 -0
- package/dist/src/views/admin/views/content/form/context.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/form/context.js +1 -1
- package/dist/src/views/admin/views/content/form/index.d.ts +3 -1
- package/dist/src/views/admin/views/content/form/index.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/form/index.js +1 -1
- package/dist/src/views/admin/views/content/form/item-query.d.ts +3 -1
- package/dist/src/views/admin/views/content/form/item-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/form/item-query.js +1 -1
- package/dist/src/views/admin/views/content/form/layout-primitives.d.ts +13 -0
- package/dist/src/views/admin/views/content/form/layout-primitives.d.ts.map +1 -0
- package/dist/src/views/admin/views/content/form/layout-primitives.js +1 -0
- package/dist/src/views/admin/views/content/form/navigation.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/form/primitives.d.ts +0 -11
- package/dist/src/views/admin/views/content/form/primitives.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/form/primitives.js +1 -1
- package/dist/src/views/admin/views/content/form/publication-status.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/form/sections.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/form/sections.js +1 -1
- package/dist/src/views/admin/views/content/form/skeleton.d.ts +46 -0
- package/dist/src/views/admin/views/content/form/skeleton.d.ts.map +1 -0
- package/dist/src/views/admin/views/content/form/skeleton.js +1 -0
- package/dist/src/views/admin/views/content/form/transport.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/page/content-form-page.d.ts +2 -0
- package/dist/src/views/admin/views/content/page/content-form-page.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/page/content-form-page.js +1 -1
- package/dist/src/views/admin/views/content/table/list-query.d.ts +2 -1
- package/dist/src/views/admin/views/content/table/list-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/content/table/list-query.js +1 -1
- package/dist/src/views/admin/views/core/advanced/cron/cron-query.d.ts +2 -0
- package/dist/src/views/admin/views/core/advanced/cron/cron-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/cron/cron-query.js +1 -1
- package/dist/src/views/admin/views/core/advanced/cron/cron-table-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/cron/cron-table-content.js +1 -1
- package/dist/src/views/admin/views/core/advanced/cron/run-action/run-action.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/cron/run-action/run-action.js +1 -1
- package/dist/src/views/admin/views/core/advanced/queue/queue-query.d.ts +2 -0
- package/dist/src/views/admin/views/core/advanced/queue/queue-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/queue/queue-query.js +1 -1
- package/dist/src/views/admin/views/core/advanced/queue/queue-table-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/queue/queue-table-content.js +1 -1
- package/dist/src/views/admin/views/core/advanced/search/collections-table-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/search/collections-table-content.js +1 -1
- package/dist/src/views/admin/views/core/advanced/search/cron-warning.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/search/cron-warning.js +1 -1
- package/dist/src/views/admin/views/core/advanced/search/reindex-action.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/search/reindex-action.js +1 -1
- package/dist/src/views/admin/views/core/advanced/search/remove-documents-action.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/search/remove-documents-action.js +1 -1
- package/dist/src/views/admin/views/core/advanced/search/search-header-actions.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/search/search-header-actions.js +1 -1
- package/dist/src/views/admin/views/core/advanced/search/search-index-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/search/search-index-content.js +1 -1
- package/dist/src/views/admin/views/core/advanced/search/search-index-query.d.ts +2 -0
- package/dist/src/views/admin/views/core/advanced/search/search-index-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/search/search-index-query.js +1 -1
- package/dist/src/views/admin/views/core/advanced/search/sync-errors-card-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/advanced/search/sync-errors-card-content.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/board-provider.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/board-provider.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/dashboard-grid.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/dashboard-grid.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/drop-placeholder.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/drop-placeholder.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/edit-actions.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/edit-actions.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/widget-card.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/widget-card.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/widget-panel.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/widget-panel.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/widget-settings-dialog.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/widget-settings-dialog.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/widget-skeleton.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/grid/widget-skeleton.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/widgets/layout-query.d.ts +2 -0
- package/dist/src/views/admin/views/core/dashboard/widgets/layout-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/widgets/layout-query.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/widgets/notes/notes-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/widgets/notes/notes-content.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/widgets/send-notification/send-notification-settings-form.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/widgets/send-notification/send-notification-settings-form.js +1 -1
- package/dist/src/views/admin/views/core/dashboard/widgets/send-notification/send-notification.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/dashboard/widgets/send-notification/send-notification.js +1 -1
- package/dist/src/views/admin/views/core/debug/actions/clear-cache/clear-cache.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/debug/actions/clear-cache/clear-cache.js +1 -1
- package/dist/src/views/admin/views/core/debug/debug-query.d.ts +3 -0
- package/dist/src/views/admin/views/core/debug/debug-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/debug/debug-query.js +1 -1
- package/dist/src/views/admin/views/core/debug/queue/queue-view-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/debug/queue/queue-view-content.js +1 -1
- package/dist/src/views/admin/views/core/debug/system-logs/actions/more/more.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/debug/system-logs/actions/more/more.js +1 -1
- package/dist/src/views/admin/views/core/debug/system-logs/system-logs-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/debug/system-logs/system-logs-content.js +1 -1
- package/dist/src/views/admin/views/core/staff/create/create-staff-form-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/staff/create/create-staff-form-content.js +1 -1
- package/dist/src/views/admin/views/core/staff/edit/edit-staff-form-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/staff/edit/edit-staff-form-content.js +1 -1
- package/dist/src/views/admin/views/core/staff/selectable-card.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/staff/selectable-card.js +1 -1
- package/dist/src/views/admin/views/core/staff/staff-query.d.ts +4 -0
- package/dist/src/views/admin/views/core/staff/staff-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/staff/staff-query.js +1 -1
- package/dist/src/views/admin/views/core/staff/table/staff-table-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/staff/table/staff-table-content.js +1 -1
- package/dist/src/views/admin/views/core/staff/table/staff-user-format-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/staff/table/staff-user-format-content.js +1 -1
- package/dist/src/views/admin/views/core/system/files/actions/file-row-actions.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/files/actions/file-row-actions.js +1 -1
- package/dist/src/views/admin/views/core/system/files/actions/files-bulk-actions.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/files/actions/files-bulk-actions.js +1 -1
- package/dist/src/views/admin/views/core/system/files/files-query.d.ts +2 -0
- package/dist/src/views/admin/views/core/system/files/files-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/files/files-query.js +1 -1
- package/dist/src/views/admin/views/core/system/files/files-table-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/files/files-table-content.js +1 -1
- package/dist/src/views/admin/views/core/system/integrations/integrations-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/integrations/integrations-content.js +1 -1
- package/dist/src/views/admin/views/core/system/integrations/integrations-query.d.ts +2 -0
- package/dist/src/views/admin/views/core/system/integrations/integrations-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/integrations/integrations-query.js +1 -1
- package/dist/src/views/admin/views/core/system/integrations/send-test-email/content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/integrations/send-test-email/content.js +1 -1
- package/dist/src/views/admin/views/core/system/integrations/send-test-email/send-test-email.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/integrations/send-test-email/send-test-email.js +1 -1
- package/dist/src/views/admin/views/core/system/integrations/test-ai/content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/integrations/test-ai/content.js +1 -1
- package/dist/src/views/admin/views/core/system/integrations/test-ai/test-ai.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/integrations/test-ai/test-ai.js +1 -1
- package/dist/src/views/admin/views/core/system/integrations/test-storage/content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/integrations/test-storage/content.js +1 -1
- package/dist/src/views/admin/views/core/system/integrations/test-storage/test-storage.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/system/integrations/test-storage/test-storage.js +1 -1
- package/dist/src/views/admin/views/core/test.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/test.js +1 -1
- package/dist/src/views/admin/views/core/users/detail/user-detail-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/detail/user-detail-content.js +1 -1
- package/dist/src/views/admin/views/core/users/detail/user-fields-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/detail/user-fields-content.js +1 -1
- package/dist/src/views/admin/views/core/users/detail/user-query.d.ts +2 -0
- package/dist/src/views/admin/views/core/users/detail/user-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/detail/user-query.js +1 -1
- package/dist/src/views/admin/views/core/users/detail/user-roles-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/detail/user-roles-content.js +1 -1
- package/dist/src/views/admin/views/core/users/list/create-user-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/list/create-user-content.js +1 -1
- package/dist/src/views/admin/views/core/users/list/create-user-form.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/list/create-user-form.js +1 -1
- package/dist/src/views/admin/views/core/users/list/users-query.d.ts +2 -0
- package/dist/src/views/admin/views/core/users/list/users-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/list/users-query.js +1 -1
- package/dist/src/views/admin/views/core/users/list/users-table-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/list/users-table-content.js +1 -1
- package/dist/src/views/admin/views/core/users/roles/role-form-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/roles/role-form-content.js +1 -1
- package/dist/src/views/admin/views/core/users/roles/roles-query.d.ts +2 -0
- package/dist/src/views/admin/views/core/users/roles/roles-query.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/roles/roles-query.js +1 -1
- package/dist/src/views/admin/views/core/users/roles/roles-table-content.d.ts.map +1 -1
- package/dist/src/views/admin/views/core/users/roles/roles-table-content.js +1 -1
- package/dist/src/views/auth/password-reset/change-password-form/change-password-form-content.d.ts.map +1 -1
- package/dist/src/views/auth/password-reset/change-password-form/change-password-form-content.js +1 -1
- package/dist/src/views/auth/password-reset/change-password-form/use-change-password-form.d.ts.map +1 -1
- package/dist/src/views/auth/password-reset/change-password-form/use-change-password-form.js +1 -1
- package/dist/src/views/auth/password-reset/form/password-reset-form-content.d.ts.map +1 -1
- package/dist/src/views/auth/password-reset/form/password-reset-form-content.js +1 -1
- package/dist/src/views/auth/password-reset/form/use-password-reset-form.d.ts.map +1 -1
- package/dist/src/views/auth/password-reset/form/use-password-reset-form.js +1 -1
- package/dist/src/views/auth/settings/devices/device-item.d.ts.map +1 -1
- package/dist/src/views/auth/settings/devices/device-item.js +1 -1
- package/dist/src/views/auth/settings/devices/devices-content.d.ts.map +1 -1
- package/dist/src/views/auth/settings/devices/devices-content.js +1 -1
- package/dist/src/views/auth/settings/devices/devices-query.d.ts +2 -24
- package/dist/src/views/auth/settings/devices/devices-query.d.ts.map +1 -1
- package/dist/src/views/auth/settings/devices/devices-query.js +1 -1
- package/dist/src/views/auth/settings/devices/revoke-device-button.d.ts.map +1 -1
- package/dist/src/views/auth/settings/devices/revoke-device-button.js +1 -1
- package/dist/src/views/auth/settings/nav-content.d.ts.map +1 -1
- package/dist/src/views/auth/settings/nav-content.js +1 -1
- package/dist/src/views/auth/settings/overview/overview.d.ts.map +1 -1
- package/dist/src/views/auth/settings/overview/overview.js +1 -1
- package/dist/src/views/auth/settings/security/security.d.ts.map +1 -1
- package/dist/src/views/auth/settings/security/security.js +1 -1
- package/dist/src/views/auth/settings/shell-content.d.ts.map +1 -1
- package/dist/src/views/auth/settings/shell-content.js +1 -1
- package/dist/src/views/auth/sign-in/form/sign-in-form-content.d.ts.map +1 -1
- package/dist/src/views/auth/sign-in/form/sign-in-form-content.js +1 -1
- package/dist/src/views/auth/sign-in/form/use-sign-in-form.d.ts.map +1 -1
- package/dist/src/views/auth/sign-in/form/use-sign-in-form.js +1 -1
- package/dist/src/views/auth/sign-in/sign-in-content.d.ts.map +1 -1
- package/dist/src/views/auth/sign-in/sign-in-content.js +1 -1
- package/dist/src/views/auth/sign-up/form/sign-up-form-content.d.ts.map +1 -1
- package/dist/src/views/auth/sign-up/form/sign-up-form-content.js +1 -1
- package/dist/src/views/auth/sign-up/form/use-sign-up-form.d.ts.map +1 -1
- package/dist/src/views/auth/sign-up/form/use-sign-up-form.js +1 -1
- package/dist/src/views/auth/sign-up/sign-up-content.d.ts.map +1 -1
- package/dist/src/views/auth/sign-up/sign-up-content.js +1 -1
- package/dist/src/views/auth/sign-up/wrapper.d.ts.map +1 -1
- package/dist/src/views/auth/sign-up/wrapper.js +1 -1
- package/dist/src/views/auth/sso/buttons/sso-buttons-content.d.ts.map +1 -1
- package/dist/src/views/auth/sso/buttons/sso-buttons-content.js +1 -1
- package/dist/src/views/auth/sso/callback/sso-callback-content.d.ts.map +1 -1
- package/dist/src/views/auth/sso/callback/sso-callback-content.js +1 -1
- package/dist/src/views/auth/sso/callback/use-sso-callback.d.ts.map +1 -1
- package/dist/src/views/auth/sso/callback/use-sso-callback.js +1 -1
- package/dist/src/views/files/actions/file-row-actions.d.ts.map +1 -1
- package/dist/src/views/files/actions/file-row-actions.js +1 -1
- package/dist/src/views/files/actions/files-bulk-actions.d.ts.map +1 -1
- package/dist/src/views/files/actions/files-bulk-actions.js +1 -1
- package/dist/src/views/files/my-files-query.d.ts +2 -0
- package/dist/src/views/files/my-files-query.d.ts.map +1 -1
- package/dist/src/views/files/my-files-query.js +1 -1
- package/dist/src/views/files/my-files-table-content.d.ts.map +1 -1
- package/dist/src/views/files/my-files-table-content.js +1 -1
- package/dist/src/views/layouts/providers.d.ts +2 -2
- package/dist/src/views/layouts/providers.d.ts.map +1 -1
- package/dist/src/views/layouts/providers.js +1 -1
- package/dist/src/views/layouts/rate-limit-listener.d.ts.map +1 -1
- package/dist/src/views/layouts/rate-limit-listener.js +1 -1
- package/dist/src/views/layouts/theme/header/header-content.d.ts.map +1 -1
- package/dist/src/views/layouts/theme/header/header-content.js +1 -1
- package/dist/src/views/layouts/theme/header/user/user-header-content.d.ts.map +1 -1
- package/dist/src/views/layouts/theme/header/user/user-header-content.js +1 -1
- package/dist/src/views/layouts/theme/notification-listener.d.ts.map +1 -1
- package/dist/src/views/layouts/theme/notification-listener.js +1 -1
- package/dist/src/views/layouts/theme/web-socket-auth-sync.d.ts.map +1 -1
- package/dist/src/views/layouts/theme/web-socket-auth-sync.js +1 -1
- package/dist/src/views/search/search-controls-content.d.ts.map +1 -1
- package/dist/src/views/search/search-controls-content.js +1 -1
- package/dist/src/views/search/search-feed-content.d.ts.map +1 -1
- package/dist/src/views/search/search-feed-content.js +1 -1
- package/dist/src/views/search/search-feed-query.d.ts +2 -0
- package/dist/src/views/search/search-feed-query.d.ts.map +1 -1
- package/dist/src/views/search/search-feed-query.js +1 -1
- package/dist/src/vitnode.config.d.ts +6 -0
- package/dist/src/vitnode.config.d.ts.map +1 -1
- package/dist/src/ws/provider.d.ts.map +1 -1
- package/dist/src/ws/provider.js +1 -1
- package/dist/src/ws/use-websocket.d.ts.map +1 -1
- package/dist/src/ws/use-websocket.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/eslint.config.mjs +4 -11
- package/package.json +12 -2
- package/src/locales/en.json +45 -2
- package/src/locales/pl.json +44 -1
- package/src/tiptap.css +103 -6
- package/dist/src/api/modules/users/routes/test.route.d.ts +0 -27
- package/dist/src/api/modules/users/routes/test.route.d.ts.map +0 -1
- package/dist/src/api/modules/users/routes/test.route.js +0 -1
- package/dist/src/tanstack/admin/content/form/server.d.ts +0 -10
- package/dist/src/tanstack/admin/content/form/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/content/form/server.js +0 -1
- package/dist/src/tanstack/admin/content/server.d.ts +0 -26
- package/dist/src/tanstack/admin/content/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/content/server.js +0 -1
- package/dist/src/tanstack/admin/cron/server.d.ts +0 -24
- package/dist/src/tanstack/admin/cron/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/cron/server.js +0 -1
- package/dist/src/tanstack/admin/dashboard/server.d.ts +0 -9
- package/dist/src/tanstack/admin/dashboard/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/dashboard/server.js +0 -1
- package/dist/src/tanstack/admin/debug/server.d.ts +0 -49
- package/dist/src/tanstack/admin/debug/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/debug/server.js +0 -1
- package/dist/src/tanstack/admin/files/server.d.ts +0 -40
- package/dist/src/tanstack/admin/files/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/files/server.js +0 -1
- package/dist/src/tanstack/admin/integrations/server.d.ts +0 -47
- package/dist/src/tanstack/admin/integrations/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/integrations/server.js +0 -1
- package/dist/src/tanstack/admin/not-found.d.ts +0 -4
- package/dist/src/tanstack/admin/not-found.d.ts.map +0 -1
- package/dist/src/tanstack/admin/not-found.js +0 -1
- package/dist/src/tanstack/admin/queue/server.d.ts +0 -28
- package/dist/src/tanstack/admin/queue/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/queue/server.js +0 -1
- package/dist/src/tanstack/admin/roles/server.d.ts +0 -32
- package/dist/src/tanstack/admin/roles/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/roles/server.js +0 -1
- package/dist/src/tanstack/admin/search-index/server.d.ts +0 -29
- package/dist/src/tanstack/admin/search-index/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/search-index/server.js +0 -1
- package/dist/src/tanstack/admin/staff/server.d.ts +0 -90
- package/dist/src/tanstack/admin/staff/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/staff/server.js +0 -1
- package/dist/src/tanstack/admin/users/server.d.ts +0 -72
- package/dist/src/tanstack/admin/users/server.d.ts.map +0 -1
- package/dist/src/tanstack/admin/users/server.js +0 -1
- package/dist/src/tanstack/auth/middleware-config-server.d.ts +0 -4
- package/dist/src/tanstack/auth/middleware-config-server.d.ts.map +0 -1
- package/dist/src/tanstack/auth/middleware-config-server.js +0 -1
- package/dist/src/tanstack/devices/server.d.ts +0 -14
- package/dist/src/tanstack/devices/server.d.ts.map +0 -1
- package/dist/src/tanstack/devices/server.js +0 -1
- package/dist/src/tanstack/files/server.d.ts +0 -27
- package/dist/src/tanstack/files/server.d.ts.map +0 -1
- package/dist/src/tanstack/files/server.js +0 -1
- package/dist/src/tanstack/routes/main/not-found.d.ts +0 -3
- package/dist/src/tanstack/routes/main/not-found.d.ts.map +0 -1
- package/dist/src/tanstack/routes/main/not-found.js +0 -1
- package/dist/src/tanstack/search/server.d.ts +0 -35
- package/dist/src/tanstack/search/server.d.ts.map +0 -1
- package/dist/src/tanstack/search/server.js +0 -1
- package/test-fixtures/next-specimen/entry.ts +0 -2
- package/test-fixtures/next-specimen/hop.ts +0 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../../../src/api/adapters/search/postgres.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../../../src/api/adapters/search/postgres.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,qBAAqB,CAAC;AA8D7B,eAAO,MAAM,qBAAqB,QAAO,uBA6JvC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{and,asc,count,desc,eq,gt,gte,inArray,lt,lte,or,sql}from"drizzle-orm";import{core_search_index,resolveSearchTextConfig}from"../../../database/search.js";import{core_users}from"../../../database/users.js";const DEFAULT_PAGE_SIZE=20;const MAX_PAGE_SIZE=100;const buildFilters=params=>{const conditions=[];const term=params.term?.trim();if(term){const config=resolveSearchTextConfig(params.languageCode);conditions.push(sql`"core_search_index"."search_vector" @@ websearch_to_tsquery(${config}::regconfig, ${term})`)}if(params.languageCode){const languageCondition=or(eq(core_search_index.languageCode,params.languageCode),eq(core_search_index.languageCode,""));if(languageCondition){conditions.push(languageCondition)}}if(params.itemTypes?.length){conditions.push(inArray(core_search_index.itemType,params.itemTypes))}if(params.authorId!==undefined){conditions.push(eq(core_search_index.authorId,params.authorId))}if(params.containerId!==undefined){conditions.push(eq(core_search_index.containerId,params.containerId))}if(params.dateFrom){conditions.push(gte(core_search_index.createdAt,params.dateFrom))}if(params.dateTo){conditions.push(lte(core_search_index.createdAt,params.dateTo))}if(!params.includePrivate){conditions.push(eq(core_search_index.isPublic,true))}return conditions.length?and(...conditions):undefined};export const PostgresSearchAdapter=()=>({name:"postgres",capabilities:{authorBoost:false,canonicalStorage:true,facets:false,languageScopedDelete:true,timeDecay:false},index:async()=>{},bulkIndex:async()=>{},delete:async()=>{},clear:async()=>{},ping:async c=>{try{await c.get("db").execute(sql`select 1`);return true}catch{return false}},search:async(c,params)=>{const db=c.get("db");const term=params.term?.trim();const useRelevance=params.sort==="relevance"&&!!term;const size=Math.min(params.first??DEFAULT_PAGE_SIZE,MAX_PAGE_SIZE);const filters=buildFilters(params);const[{total}]=await db.select({total:count()}).from(core_search_index).where(filters);const config=resolveSearchTextConfig(params.languageCode);const rankExpr=term?sql`ts_rank("core_search_index"."search_vector", websearch_to_tsquery(${config}::regconfig, ${term}))`:sql`NULL`;const
|
|
1
|
+
import{and,asc,count,desc,eq,gt,gte,inArray,lt,lte,or,sql}from"drizzle-orm";import{core_search_index,resolveSearchTextConfig}from"../../../database/search.js";import{core_users}from"../../../database/users.js";const DEFAULT_PAGE_SIZE=20;const MAX_PAGE_SIZE=100;const buildFilters=params=>{const conditions=[];const term=params.term?.trim();if(term){const config=resolveSearchTextConfig(params.languageCode);conditions.push(sql`"core_search_index"."search_vector" @@ websearch_to_tsquery(${config}::regconfig, ${term})`)}if(params.languageCode){const languageCondition=or(eq(core_search_index.languageCode,params.languageCode),eq(core_search_index.languageCode,""));if(languageCondition){conditions.push(languageCondition)}}if(params.itemTypes?.length){conditions.push(inArray(core_search_index.itemType,params.itemTypes))}if(params.authorId!==undefined){conditions.push(eq(core_search_index.authorId,params.authorId))}if(params.containerId!==undefined){conditions.push(eq(core_search_index.containerId,params.containerId))}if(params.dateFrom){conditions.push(gte(core_search_index.createdAt,params.dateFrom))}if(params.dateTo){conditions.push(lte(core_search_index.createdAt,params.dateTo))}if(!params.includePrivate){conditions.push(eq(core_search_index.isPublic,true))}return conditions.length?and(...conditions):undefined};const MAX_SEARCH_OFFSET=1e4;export const PostgresSearchAdapter=()=>({name:"postgres",capabilities:{authorBoost:false,canonicalStorage:true,facets:false,languageScopedDelete:true,timeDecay:false},index:async()=>{},bulkIndex:async()=>{},delete:async()=>{},clear:async()=>{},ping:async c=>{try{await c.get("db").execute(sql`select 1`);return true}catch{return false}},search:async(c,params)=>{const db=c.get("db");const term=params.term?.trim();const useRelevance=params.sort==="relevance"&&!!term;const size=Math.min(params.first??DEFAULT_PAGE_SIZE,MAX_PAGE_SIZE);const filters=buildFilters(params);const[{total}]=await db.select({total:count()}).from(core_search_index).where(filters);const config=resolveSearchTextConfig(params.languageCode);const rankExpr=term?sql`ts_rank("core_search_index"."search_vector", websearch_to_tsquery(${config}::regconfig, ${term}))`:sql`NULL`;const parsedCursor=params.cursor?Number(params.cursor):undefined;const cursorValue=parsedCursor!==undefined&&Number.isSafeInteger(parsedCursor)&&parsedCursor>=0?Math.min(parsedCursor,MAX_SEARCH_OFFSET):undefined;const orderBy=[];let where=filters;let offset=0;if(useRelevance){orderBy.push(sql`${rankExpr} DESC`,desc(core_search_index.id));offset=cursorValue??0}else if(params.sort==="oldest"){orderBy.push(asc(core_search_index.createdAt),asc(core_search_index.id));if(cursorValue){const cond=gt(core_search_index.id,cursorValue);where=where?and(where,cond):cond}}else{orderBy.push(desc(core_search_index.createdAt),desc(core_search_index.id));if(cursorValue){const cond=lt(core_search_index.id,cursorValue);where=where?and(where,cond):cond}}const rows=await db.select({id:core_search_index.id,pluginId:core_search_index.pluginId,itemType:core_search_index.itemType,itemId:core_search_index.itemId,languageCode:core_search_index.languageCode,authorId:core_search_index.authorId,title:core_search_index.title,content:core_search_index.content,containerType:core_search_index.containerType,containerId:core_search_index.containerId,url:core_search_index.url,metadata:core_search_index.metadata,createdAt:core_search_index.createdAt,score:rankExpr,author:{id:core_users.id,name:core_users.name,nameCode:core_users.nameCode,avatarColor:core_users.avatarColor}}).from(core_search_index).leftJoin(core_users,eq(core_users.id,core_search_index.authorId)).where(where).orderBy(...orderBy).limit(size+1).offset(useRelevance?offset:0);const hasNextPage=rows.length>size;const sliced=rows.slice(0,size);const edges=sliced.map(row=>({id:row.id,pluginId:row.pluginId,itemType:row.itemType,itemId:row.itemId,languageCode:row.languageCode,authorId:row.authorId,title:row.title,content:row.content,containerType:row.containerType,containerId:row.containerId,url:row.url,metadata:row.metadata,createdAt:row.createdAt,score:row.score,author:row.author?.id?row.author:null}));const startCursor=useRelevance?offset:edges[0]?.id??null;const endCursor=useRelevance?offset+edges.length:edges.at(-1)?.id??null;return{edges,pageInfo:{totalCount:total,count:edges.length,hasNextPage,hasPreviousPage:useRelevance?offset>0:!!cursorValue,startCursor,endCursor}}}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../../../../src/api/adapters/sso/discord.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,eAAO,MAAM,mBAAmB,GAAI,6BAGjC;IACD,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,KAAG,
|
|
1
|
+
{"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../../../../src/api/adapters/sso/discord.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,eAAO,MAAM,mBAAmB,GAAI,6BAGjC;IACD,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,KAAG,YA+FH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{HTTPException}from"hono/http-exception";import{z}from"zod";import{getRedirectUri}from"../../models/sso.js";export const DiscordSSOApiPlugin=({clientId="",clientSecret=""})=>{const id="discord";const redirectUri=getRedirectUri(id);const userSchema=z.object({id:z.string(),email:z.string(),username:z.string()});const tokenSchema=z.object({access_token:z.string(),token_type:z.string()});return{fetchToken:async code=>{if(!(clientId&&clientSecret)){throw new Error("Missing Discord client ID or secret")}const res=await fetch("https://discord.com/api/oauth2/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:new URLSearchParams({code,redirect_uri:redirectUri,grant_type:"authorization_code",client_id:clientId,client_secret:clientSecret})});if(!res.ok){throw new HTTPException(+res.status.toString(),{message:"Internal error requesting token"})}const{data,error}=tokenSchema.safeParse(await res.json());if(error||!data){throw new HTTPException(400,{message:"Invalid token response"})}return data},fetchUser:async({token_type,access_token})=>{const res=await fetch("https://discord.com/api/users/@me",{headers:{Authorization:`${token_type} ${access_token}`}});const{data,error}=userSchema.safeParse(await res.json());if(error||!data){throw new HTTPException(400,{message:"Invalid user response"})}return data},getUrl:({state})=>{if(!clientId){throw new Error("Missing Discord client ID")}const url=new URL("https://discord.com/oauth2/authorize");url.searchParams.set("client_id",clientId);url.searchParams.set("redirect_uri",redirectUri);url.searchParams.set("response_type","code");url.searchParams.set("scope","identify email");url.searchParams.set("state",state);return url.toString()},id,name:"Discord"}};
|
|
1
|
+
import{HTTPException}from"hono/http-exception";import{z}from"zod";import{getRedirectUri}from"../../models/sso.js";export const DiscordSSOApiPlugin=({clientId="",clientSecret=""})=>{const id="discord";const redirectUri=getRedirectUri(id);const userSchema=z.object({id:z.string(),email:z.string(),username:z.string(),verified:z.boolean()});const tokenSchema=z.object({access_token:z.string(),token_type:z.string()});return{fetchToken:async code=>{if(!(clientId&&clientSecret)){throw new Error("Missing Discord client ID or secret")}const res=await fetch("https://discord.com/api/oauth2/token",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:new URLSearchParams({code,redirect_uri:redirectUri,grant_type:"authorization_code",client_id:clientId,client_secret:clientSecret})});if(!res.ok){throw new HTTPException(+res.status.toString(),{message:"Internal error requesting token"})}const{data,error}=tokenSchema.safeParse(await res.json());if(error||!data){throw new HTTPException(400,{message:"Invalid token response"})}return data},fetchUser:async({token_type,access_token})=>{const res=await fetch("https://discord.com/api/users/@me",{headers:{Authorization:`${token_type} ${access_token}`}});const{data,error}=userSchema.safeParse(await res.json());if(error||!data){throw new HTTPException(400,{message:"Invalid user response"})}if(!data.verified){throw new HTTPException(400,{message:"Email not verified"})}return data},getUrl:({state})=>{if(!clientId){throw new Error("Missing Discord client ID")}const url=new URL("https://discord.com/oauth2/authorize");url.searchParams.set("client_id",clientId);url.searchParams.set("redirect_uri",redirectUri);url.searchParams.set("response_type","code");url.searchParams.set("scope","identify email");url.searchParams.set("state",state);return url.toString()},id,name:"Discord"}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/api/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/api/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAqBzD,UAAU,WAAW;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EACF,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC,GAC3D,MAAM,GACN,MAAM,EAAE,CAAC;CACd;AAED,KAAK,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;AAC5E,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,sBAAsB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;CACrD;AAED,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,EACjB,gBAAgB,GACjB,EAAE;IACD,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,oCA8HA"}
|
package/dist/src/api/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{swaggerUI}from"@hono/swagger-ui";import{cors}from"hono/cors";import{csrf}from"hono/csrf";import{HTTPException}from"hono/http-exception";import{createCacheClient}from"./lib/cache-client.js";import{collectCronJobs}from"./lib/cron.js";import{describeError}from"./lib/error-details.js";import{newBuildPluginApiCore}from"./plugin.js";import{CONFIG_PLUGIN}from"../config.js";import{initRealtimePubSub}from"../ws/registry.js";import{globalAdminMiddleware,globalMiddleware}from"./middlewares/global.middleware.js";import{rateLimiterMiddleware}from"./middlewares/rate-limiter.middleware.js";import{registerCronJobs}from"./modules/cron/helpers/register-cron-jobs.js";export function VitNodeAPI({app,cors:corsOptions,csrf:csrfOptions,vitNodeApiConfig}){const redisClient=createCacheClient(vitNodeApiConfig.redis);initRealtimePubSub(redisClient);const plugins=[newBuildPluginApiCore,...vitNodeApiConfig.plugins];app.doc("/swagger/doc",{openapi:"3.0.0",info:{version:CONFIG_PLUGIN.version,title:"VitNode API"},tags:plugins.flatMap(plugin=>plugin.openApiTags?.map(name=>({name}))??[])})
|
|
1
|
+
import{swaggerUI}from"@hono/swagger-ui";import{bodyLimit}from"hono/body-limit";import{cors}from"hono/cors";import{csrf}from"hono/csrf";import{HTTPException}from"hono/http-exception";import{createCacheClient}from"./lib/cache-client.js";import{clientIpMiddleware}from"./lib/client-ip.js";import{collectCronJobs}from"./lib/cron.js";import{describeError}from"./lib/error-details.js";import{newBuildPluginApiCore}from"./plugin.js";import{CONFIG_PLUGIN}from"../config.js";import{CONFIG}from"../lib/config.js";import{initRealtimePubSub}from"../ws/registry.js";import{globalAdminMiddleware,globalMiddleware}from"./middlewares/global.middleware.js";import{rateLimiterMiddleware}from"./middlewares/rate-limiter.middleware.js";import{registerCronJobs}from"./modules/cron/helpers/register-cron-jobs.js";const DEFAULT_MAX_BODY_SIZE=25*1024*1024;export function VitNodeAPI({app,cors:corsOptions,csrf:csrfOptions,vitNodeApiConfig}){const redisClient=createCacheClient(vitNodeApiConfig.redis);initRealtimePubSub(redisClient);const plugins=[newBuildPluginApiCore,...vitNodeApiConfig.plugins];const docsEnabled=vitNodeApiConfig.docs?.enabled??CONFIG.node_development;if(docsEnabled){app.doc("/swagger/doc",{openapi:"3.0.0",info:{version:CONFIG_PLUGIN.version,title:"VitNode API"},tags:plugins.flatMap(plugin=>plugin.openApiTags?.map(name=>({name}))??[])})}app.use(cors(corsOptions));app.use(csrf(csrfOptions));app.use("*",clientIpMiddleware);app.use("*",bodyLimit({maxSize:vitNodeApiConfig.maxBodySize??DEFAULT_MAX_BODY_SIZE,onError:c=>c.json({error:"Payload Too Large"},413)}));app.use("*",rateLimiterMiddleware(vitNodeApiConfig.rateLimiter,redisClient));if(docsEnabled){app.get("/swagger",swaggerUI({url:"/api/swagger/doc"}))}app.use("*",globalMiddleware({ai:vitNodeApiConfig.ai,i18n:vitNodeApiConfig.i18n,email:vitNodeApiConfig.email,metadata:vitNodeApiConfig.metadata,authorization:vitNodeApiConfig.authorization,dbProvider:vitNodeApiConfig.dbProvider,captcha:vitNodeApiConfig.captcha,content:vitNodeApiConfig.content,cron:vitNodeApiConfig.cron,events:vitNodeApiConfig.events,search:vitNodeApiConfig.search,storage:vitNodeApiConfig.storage,plugins,cacheClient:redisClient}));app.use(async(c,next)=>{if(c.req.path.includes("/admin/")){return await globalAdminMiddleware()(c,next)}return next()});if(vitNodeApiConfig.cron){vitNodeApiConfig.cron.schedule()}plugins.map(root=>{app.route(`/${root.pluginId}`,root.hono)});registerCronJobs(vitNodeApiConfig.dbProvider,collectCronJobs(plugins)).catch(error=>{console.warn(`\x1b[34m[VitNode]\x1b[0m \x1b[33mFailed to register cron jobs:\x1b[0m ${describeError(error)}`)});app.onError(async(error,c)=>{if(error instanceof HTTPException){return error.getResponse()}const errorMessage=describeError(error);try{const logger=c.get("log");if(logger){await logger.error(`Unhandled error: ${errorMessage}`)}}catch{}return new Response(process.env.NODE_ENV==="development"?errorMessage:"Internal Server Error",{status:500})});return app}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-cookie.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/auth-cookie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-cookie.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/auth-cookie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AA0BpC,eAAO,MAAM,aAAa,GACxB,GAAG,OAAO,EACV,MAAM,MAAM,EACZ,OAAO,MAAM,EACb,cAAa;IAAE,OAAO,CAAC,EAAE,IAAI,CAAA;CAAO,KACnC,IAEF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,GAAG,OAAO,EAAE,MAAM,MAAM,KAAG,IAE3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{deleteCookie,setCookie}from"hono/cookie";const authCookieOptions=c=>{const{cookieDomain,cookieSecure}=c.get("core").authorization;return{domain:cookieDomain,httpOnly:true,path:"/",secure:cookieSecure}};export const setAuthCookie=(c,name,value,{expires}={})=>{setCookie(c,name,value,{...authCookieOptions(c),expires})};export const deleteAuthCookie=(c,name)=>{deleteCookie(c,name,authCookieOptions(c))};
|
|
1
|
+
import{deleteCookie,setCookie}from"hono/cookie";const authCookieOptions=c=>{const{cookieDomain,cookieSecure}=c.get("core").authorization;return{domain:cookieDomain,httpOnly:true,path:"/",sameSite:"Lax",secure:cookieSecure}};export const setAuthCookie=(c,name,value,{expires}={})=>{setCookie(c,name,value,{...authCookieOptions(c),expires})};export const deleteAuthCookie=(c,name)=>{deleteCookie(c,name,authCookieOptions(c))};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-ip.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/client-ip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAwDpC,eAAO,MAAM,eAAe,GAAI,GAAG,OAAO,KAAG,MACN,CAAC;AAExC,eAAO,MAAM,kBAAkB,GAC7B,GAAG,OAAO,EACV,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,kBAK1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const UNKNOWN_CLIENT_IP="127.0.0.1";const isRecord=value=>typeof value==="object"&&value!==null;const nonEmptyString=value=>typeof value==="string"&&value.length>0?value:undefined;const nodeSocketAddress=env=>{const incoming=env.incoming;if(!isRecord(incoming))return undefined;const socket=incoming.socket;if(!isRecord(socket))return undefined;return nonEmptyString(socket.remoteAddress)};const bunSocketAddress=(env,request)=>{const server=env.server;if(!isRecord(server))return undefined;const requestIP=server.requestIP;if(typeof requestIP!=="function")return undefined;const info=requestIP(request);return isRecord(info)?nonEmptyString(info.address):undefined};const denoSocketAddress=env=>{const remoteAddr=env.remoteAddr;return isRecord(remoteAddr)?nonEmptyString(remoteAddr.hostname):undefined};const socketAddress=c=>{const env=c.env;if(!isRecord(env))return undefined;return nodeSocketAddress(env)??bunSocketAddress(env,c.req.raw)??denoSocketAddress(env)};export const resolveClientIp=c=>socketAddress(c)??UNKNOWN_CLIENT_IP;export const clientIpMiddleware=async(c,next)=>{c.set("ipAddress",resolveClientIp(c));await next()};
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import type { PgColumn } from "drizzle-orm/pg-core";
|
|
2
2
|
export type PaginationCursorValue = boolean | null | number | string;
|
|
3
|
+
export type PaginationCursorIdentifier = number | string;
|
|
3
4
|
export interface PaginationCursor {
|
|
4
5
|
column: string;
|
|
5
|
-
id:
|
|
6
|
+
id: PaginationCursorIdentifier;
|
|
6
7
|
value: PaginationCursorValue;
|
|
7
8
|
}
|
|
8
9
|
export declare const isCursorSortableColumn: (column: PgColumn) => boolean;
|
|
9
10
|
export declare const cursorValueOf: (column: PgColumn, value: unknown) => PaginationCursorValue;
|
|
10
11
|
export declare const cursorValueForColumn: (column: PgColumn, value: PaginationCursorValue) => unknown;
|
|
11
12
|
export declare const cursorValueIsCanonicalText: (column: PgColumn) => boolean;
|
|
13
|
+
export declare const isPaginationIdentifierColumn: (column: PgColumn) => boolean;
|
|
14
|
+
export declare const cursorIdentifierOf: (column: PgColumn, value: unknown) => PaginationCursorIdentifier;
|
|
15
|
+
export declare const cursorIdentifierForColumn: (column: PgColumn, value: PaginationCursorIdentifier) => bigint | number | string;
|
|
12
16
|
export declare const encodePaginationCursor: (cursor: PaginationCursor) => string;
|
|
13
|
-
export declare const decodePaginationCursor: (raw: string, { column,
|
|
17
|
+
export declare const decodePaginationCursor: (raw: string, { column, primary }: {
|
|
14
18
|
column: string;
|
|
15
|
-
|
|
19
|
+
primary: PgColumn;
|
|
16
20
|
}) => PaginationCursor;
|
|
17
21
|
//# sourceMappingURL=pagination-cursor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination-cursor.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/pagination-cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAKpD,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pagination-cursor.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/pagination-cursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAKpD,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAGrE,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAE/B,MAAM,EAAE,MAAM,CAAC;IAEf,EAAE,EAAE,0BAA0B,CAAC;IAE/B,KAAK,EAAE,qBAAqB,CAAC;CAC9B;AA2CD,eAAO,MAAM,sBAAsB,GAAI,QAAQ,QAAQ,KAAG,OAGV,CAAC;AAsJjD,eAAO,MAAM,aAAa,GACxB,QAAQ,QAAQ,EAChB,OAAO,OAAO,KACb,qBA0CF,CAAC;AAoBF,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,QAAQ,EAChB,OAAO,qBAAqB,KAC3B,OAuDF,CAAC;AAWF,eAAO,MAAM,0BAA0B,GAAI,QAAQ,QAAQ,KAAG,OAC/B,CAAC;AAgBhC,eAAO,MAAM,4BAA4B,GAAI,QAAQ,QAAQ,KAAG,OACxB,CAAC;AAEzC,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,QAAQ,EAChB,OAAO,OAAO,KACb,0BAsBF,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,QAAQ,QAAQ,EAChB,OAAO,0BAA0B,KAChC,MAAM,GAAG,MAAM,GAAG,MAuBpB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,QAAQ,gBAAgB,KAAG,MACC,CAAC;AA6BpE,eAAO,MAAM,sBAAsB,GACjC,KAAK,MAAM,EACX,qBAAqB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,KACzD,gBAgDF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{HTTPException}from"hono/http-exception";const KIND_BY_DATA_TYPE={bigint:"bigint",boolean:"boolean",date:"temporal",number:"number",string:"string"};const baseDataTypeOf=column=>column.dataType.split(" ")[0];const isArrayColumn=column=>column.dimensions>0;const badRequest=message=>new HTTPException(400,{message});const INVALID_CURSOR="Invalid pagination cursor.";const temporalTypeOf=column=>{const sqlType=column.getSQLType().toLowerCase();if(sqlType.startsWith("timestamp"))return"timestamp";if(sqlType.startsWith("time"))return"time";if(sqlType.startsWith("date"))return"date";return null};const hasTimeZone=column=>column.getSQLType().toLowerCase().includes("with time zone");export const isCursorSortableColumn=column=>!isArrayColumn(column)&&(temporalTypeOf(column)!==null||baseDataTypeOf(column)in KIND_BY_DATA_TYPE);const kindOf=column=>{if(!isArrayColumn(column)&&temporalTypeOf(column))return"temporal";const kind=isArrayColumn(column)?undefined:KIND_BY_DATA_TYPE[baseDataTypeOf(column)];if(!kind){throw badRequest(`The "${column.name}" column cannot be used as a pagination cursor.`)}return kind};const TEMPORAL_GRAMMAR={date:/^(?<year>\d{4,6})-(?<month>\d{2})-(?<day>\d{2})$/,time:/^(?<hour>\d{2}):(?<minute>\d{2}):(?<second>\d{2})(?:\.\d{1,6})?(?<zone>.*)$/,timestamp:/^(?<year>\d{4,6})-(?<month>\d{2})-(?<day>\d{2})(?:[ T](?<hour>\d{2}):(?<minute>\d{2}):(?<second>\d{2})(?:\.\d{1,6})?(?<zone>.*))?$/};const ZONE=/^([+-])(\d{2})(?::?(\d{2}))?(?::?(\d{2}))?$/;const DAYS_IN_MONTH=[31,28,31,30,31,30,31,31,30,31,30,31];const isLeapYear=year=>year%4===0&&year%100!==0||year%400===0;const isRealZone=(raw,allowed)=>{if(raw==="")return true;if(!allowed)return false;if(raw==="Z")return true;const match=ZONE.exec(raw);if(!match)return false;const[,,hours,minutes="0",seconds="0"]=match;return Number(hours)<=15&&Number(minutes)<=59&&Number(seconds)<=59};const isRealTemporal=(column,temporal,value)=>{const match=TEMPORAL_GRAMMAR[temporal].exec(value);if(!match)return false;const{day,hour,minute,month,second,year,zone}=match.groups??{};if(year!==undefined){const[y,m,d]=[Number(year),Number(month),Number(day)];if(y<1||y>294276||m<1||m>12)return false;const limit=m===2&&isLeapYear(y)?29:DAYS_IN_MONTH[m-1];if(d<1||d>limit)return false}if(hour===undefined)return true;if(Number(hour)>23||Number(minute)>59||Number(second)>59){return false}return isRealZone(zone??"",temporal==="timestamp"||hasTimeZone(column))};const DECIMAL_INTEGER=/^-?\d+$/;const pad=(value,width=2)=>String(value).padStart(width,"0");const canonicalFromDate=(column,value)=>{const time=value.getTime();if(!Number.isFinite(time)){throw new Error(`Cannot build a pagination cursor from an invalid date on "${column.name}".`)}const zone=hasTimeZone(column)?"+00":"";const date=`${pad(value.getUTCFullYear(),4)}-${pad(value.getUTCMonth()+1)}-${pad(value.getUTCDate())}`;const clock=`${pad(value.getUTCHours())}:${pad(value.getUTCMinutes())}:${pad(value.getUTCSeconds())}.${pad(value.getUTCMilliseconds(),3)}`;switch(temporalTypeOf(column)){case"date":return date;case"time":return`${clock}${zone}`;default:return`${date} ${clock}${zone}`}};export const cursorValueOf=(column,value)=>{if(value===null||value===undefined)return null;switch(kindOf(column)){case"bigint":{if(typeof value==="bigint")return value.toString();if(typeof value==="number")return String(value);break}case"boolean":{if(typeof value==="boolean")return value;break}case"number":{if(typeof value==="number")return value;break}case"temporal":{if(value instanceof Date)return canonicalFromDate(column,value);if(typeof value==="string")return value;break}default:{if(typeof value==="string")return value;break}}throw new Error(`Cannot build a pagination cursor from a ${typeof value} value of "${column.name}".`)};export const cursorValueForColumn=(column,value)=>{if(value===null)return null;switch(kindOf(column)){case"bigint":{if(typeof value!=="string"||!DECIMAL_INTEGER.test(value)){throw badRequest(INVALID_CURSOR)}
|
|
1
|
+
import{HTTPException}from"hono/http-exception";const KIND_BY_DATA_TYPE={bigint:"bigint",boolean:"boolean",date:"temporal",number:"number",string:"string"};const baseDataTypeOf=column=>column.dataType.split(" ")[0];const isUuidColumn=column=>column.getSQLType().toLowerCase()==="uuid";const isArrayColumn=column=>column.dimensions>0;const badRequest=message=>new HTTPException(400,{message});const INVALID_CURSOR="Invalid pagination cursor.";const temporalTypeOf=column=>{const sqlType=column.getSQLType().toLowerCase();if(sqlType.startsWith("timestamp"))return"timestamp";if(sqlType.startsWith("time"))return"time";if(sqlType.startsWith("date"))return"date";return null};const hasTimeZone=column=>column.getSQLType().toLowerCase().includes("with time zone");export const isCursorSortableColumn=column=>!isArrayColumn(column)&&(temporalTypeOf(column)!==null||baseDataTypeOf(column)in KIND_BY_DATA_TYPE);const kindOf=column=>{if(!isArrayColumn(column)&&temporalTypeOf(column))return"temporal";if(!isArrayColumn(column)&&isUuidColumn(column))return"uuid";const kind=isArrayColumn(column)?undefined:KIND_BY_DATA_TYPE[baseDataTypeOf(column)];if(!kind){throw badRequest(`The "${column.name}" column cannot be used as a pagination cursor.`)}return kind};const TEMPORAL_GRAMMAR={date:/^(?<year>\d{4,6})-(?<month>\d{2})-(?<day>\d{2})$/,time:/^(?<hour>\d{2}):(?<minute>\d{2}):(?<second>\d{2})(?:\.\d{1,6})?(?<zone>.*)$/,timestamp:/^(?<year>\d{4,6})-(?<month>\d{2})-(?<day>\d{2})(?:[ T](?<hour>\d{2}):(?<minute>\d{2}):(?<second>\d{2})(?:\.\d{1,6})?(?<zone>.*))?$/};const ZONE=/^([+-])(\d{2})(?::?(\d{2}))?(?::?(\d{2}))?$/;const DAYS_IN_MONTH=[31,28,31,30,31,30,31,31,30,31,30,31];const isLeapYear=year=>year%4===0&&year%100!==0||year%400===0;const isRealZone=(raw,allowed)=>{if(raw==="")return true;if(!allowed)return false;if(raw==="Z")return true;const match=ZONE.exec(raw);if(!match)return false;const[,,hours,minutes="0",seconds="0"]=match;return Number(hours)<=15&&Number(minutes)<=59&&Number(seconds)<=59};const isRealTemporal=(column,temporal,value)=>{const match=TEMPORAL_GRAMMAR[temporal].exec(value);if(!match)return false;const{day,hour,minute,month,second,year,zone}=match.groups??{};if(year!==undefined){const[y,m,d]=[Number(year),Number(month),Number(day)];if(y<1||y>294276||m<1||m>12)return false;const limit=m===2&&isLeapYear(y)?29:DAYS_IN_MONTH[m-1];if(d<1||d>limit)return false}if(hour===undefined)return true;if(Number(hour)>23||Number(minute)>59||Number(second)>59){return false}return isRealZone(zone??"",temporal==="timestamp"||hasTimeZone(column))};const DECIMAL_INTEGER=/^-?\d+$/;const POSITIVE_DECIMAL_INTEGER=/^[1-9]\d*$/;const UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;const PG_BIGINT_MIN=-0x8000000000000000n;const PG_BIGINT_MAX=0x7fffffffffffffffn;const postgresBigint=value=>{const parsed=BigInt(value);return parsed>=PG_BIGINT_MIN&&parsed<=PG_BIGINT_MAX?parsed:undefined};const pad=(value,width=2)=>String(value).padStart(width,"0");const canonicalFromDate=(column,value)=>{const time=value.getTime();if(!Number.isFinite(time)){throw new Error(`Cannot build a pagination cursor from an invalid date on "${column.name}".`)}const zone=hasTimeZone(column)?"+00":"";const date=`${pad(value.getUTCFullYear(),4)}-${pad(value.getUTCMonth()+1)}-${pad(value.getUTCDate())}`;const clock=`${pad(value.getUTCHours())}:${pad(value.getUTCMinutes())}:${pad(value.getUTCSeconds())}.${pad(value.getUTCMilliseconds(),3)}`;switch(temporalTypeOf(column)){case"date":return date;case"time":return`${clock}${zone}`;default:return`${date} ${clock}${zone}`}};export const cursorValueOf=(column,value)=>{if(value===null||value===undefined)return null;switch(kindOf(column)){case"bigint":{if(typeof value==="bigint")return value.toString();if(typeof value==="number")return String(value);break}case"boolean":{if(typeof value==="boolean")return value;break}case"number":{if(typeof value==="number")return value;break}case"temporal":{if(value instanceof Date)return canonicalFromDate(column,value);if(typeof value==="string")return value;break}case"uuid":{if(typeof value==="string"&&UUID.test(value))return value;break}default:{if(typeof value==="string")return value;break}}throw new Error(`Cannot build a pagination cursor from a ${typeof value} value of "${column.name}".`)};export const cursorValueForColumn=(column,value)=>{if(value===null)return null;switch(kindOf(column)){case"bigint":{if(typeof value!=="string"||!DECIMAL_INTEGER.test(value)){throw badRequest(INVALID_CURSOR)}const parsed=postgresBigint(value);if(parsed===undefined)throw badRequest(INVALID_CURSOR);return parsed}case"boolean":{if(typeof value!=="boolean")throw badRequest(INVALID_CURSOR);return value}case"number":{if(typeof value!=="number"||!Number.isFinite(value)){throw badRequest(INVALID_CURSOR)}return value}case"temporal":{const temporal=temporalTypeOf(column);if(typeof value!=="string"||!temporal||!isRealTemporal(column,temporal,value)){throw badRequest(INVALID_CURSOR)}return value}case"uuid":{if(typeof value!=="string"||!UUID.test(value)){throw badRequest(INVALID_CURSOR)}return value}default:{if(typeof value!=="string")throw badRequest(INVALID_CURSOR);return value}}};export const cursorValueIsCanonicalText=column=>kindOf(column)==="temporal";const identifierKindOf=column=>{if(isArrayColumn(column))return undefined;if(isUuidColumn(column))return"uuid";const baseDataType=baseDataTypeOf(column);if(baseDataType==="bigint"||baseDataType==="number"){return baseDataType}return undefined};export const isPaginationIdentifierColumn=column=>identifierKindOf(column)!==undefined;export const cursorIdentifierOf=(column,value)=>{switch(identifierKindOf(column)){case"bigint":if(typeof value==="bigint"&&value>0n)return value.toString();break;case"number":if(typeof value==="number"&&Number.isSafeInteger(value)&&value>0){return value}break;case"uuid":if(typeof value==="string"&&UUID.test(value))return value;break}throw new Error(`Cannot build a pagination cursor from the identifier on "${column.name}".`)};export const cursorIdentifierForColumn=(column,value)=>{switch(identifierKindOf(column)){case"bigint":if(typeof value==="string"&&POSITIVE_DECIMAL_INTEGER.test(value)){const parsed=postgresBigint(value);if(parsed!==undefined)return parsed}break;case"number":if(typeof value==="number"&&Number.isSafeInteger(value)&&value>0){return value}break;case"uuid":if(typeof value==="string"&&UUID.test(value))return value;break}throw badRequest(INVALID_CURSOR)};export const encodePaginationCursor=cursor=>Buffer.from(JSON.stringify(cursor),"utf8").toString("base64url");const LEGACY_CURSOR=/^[1-9]\d{0,14}$/;const isCursorValue=value=>value===null||typeof value==="boolean"||typeof value==="number"||typeof value==="string";export const decodePaginationCursor=(raw,{column,primary})=>{const trimmed=raw.trim();if(trimmed==="")throw badRequest(INVALID_CURSOR);if(LEGACY_CURSOR.test(trimmed)){if(column!==primary.name){throw badRequest(`This cursor cannot be used with the "${column}" ordering. Start from the first page.`)}const id=Number(trimmed);cursorIdentifierForColumn(primary,id);return{column,id,value:id}}let parsed;try{parsed=JSON.parse(Buffer.from(trimmed,"base64url").toString("utf8"))}catch{throw badRequest(INVALID_CURSOR)}if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed)){throw badRequest(INVALID_CURSOR)}const candidate=parsed;const id=candidate.id;if(typeof candidate.column!=="string"||typeof id!=="number"&&typeof id!=="string"||!isCursorValue(candidate.value)){throw badRequest(INVALID_CURSOR)}cursorIdentifierForColumn(primary,id);if(candidate.column!==column){throw badRequest(`This cursor was issued for a different ordering. Start from the first page.`)}return{column,id,value:candidate.value}};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const emailAliases: (email: string) => string[];
|
|
2
|
+
export declare const matchesEmail: (email: string) => import("drizzle-orm").SQL<unknown>;
|
|
3
|
+
export declare const pickAccountForEmail: <T extends {
|
|
4
|
+
email: string;
|
|
5
|
+
}>(rows: T[], email: string) => T | undefined;
|
|
6
|
+
//# sourceMappingURL=user-email-lookup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-email-lookup.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/user-email-lookup.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,MAAM,EAKlD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,uCACM,CAAC;AAEjD,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAC7D,MAAM,CAAC,EAAE,EACT,OAAO,MAAM,KACZ,CAAC,GAAG,SAIN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{inArray}from"drizzle-orm";import{core_users}from"../../database/users.js";import{canonicalizeEmail,normalizeEmailAddress}from"../../lib/email-canonical.js";export const emailAliases=email=>{const normalized=normalizeEmailAddress(email);const canonical=canonicalizeEmail(normalized);return canonical===normalized?[normalized]:[normalized,canonical]};export const matchesEmail=email=>inArray(core_users.email,emailAliases(email));export const pickAccountForEmail=(rows,email)=>{const normalized=normalizeEmailAddress(email);return rows.find(row=>row.email===normalized)??rows[0]};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { ColumnDataNumberConstraint, Placeholder, SQL } from "drizzle-orm";
|
|
1
|
+
import type { ColumnDataBigIntConstraint, ColumnDataNumberConstraint, Placeholder, SQL } from "drizzle-orm";
|
|
2
2
|
import type { PgColumn, PgColumnBaseConfig, PgTableWithColumns, TableConfig } from "drizzle-orm/pg-core";
|
|
3
3
|
import type { Context } from "hono";
|
|
4
4
|
import { z } from "@hono/zod-openapi";
|
|
5
5
|
export declare const PAGINATION_CURSOR_FIELD = "__cursorValue";
|
|
6
6
|
export type PaginationCursorSelection = Record<typeof PAGINATION_CURSOR_FIELD, PgColumn | SQL<string>>;
|
|
7
|
-
|
|
7
|
+
type PaginationIdentifierDataType = "bigint" | "number" | "string uuid" | `bigint ${ColumnDataBigIntConstraint}` | `number ${ColumnDataNumberConstraint}`;
|
|
8
|
+
export type PaginationCursorColumn = PgColumn<any, PgColumnBaseConfig<PaginationIdentifierDataType>>;
|
|
8
9
|
export declare function withPagination<QueryMin extends Record<string, unknown>, T extends TableConfig>({ query, table, params, search, where: whereFromParams, primaryCursor, orderBy: orderByFromParams, c, }: {
|
|
9
10
|
c: Context;
|
|
10
11
|
orderBy: {
|
|
@@ -53,4 +54,5 @@ export declare const zodPaginationQuery: z.ZodObject<{
|
|
|
53
54
|
first: z.ZodOptional<z.ZodString>;
|
|
54
55
|
last: z.ZodOptional<z.ZodString>;
|
|
55
56
|
}, z.core.$strip>;
|
|
57
|
+
export {};
|
|
56
58
|
//# sourceMappingURL=with-pagination.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-pagination.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/with-pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"with-pagination.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/with-pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,WAAW,EACX,GAAG,EACJ,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAElB,kBAAkB,EAClB,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAkCtC,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AAGvD,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAC5C,OAAO,uBAAuB,EAC9B,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CACvB,CAAC;AAkJF,KAAK,4BAA4B,GAC7B,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,UAAU,0BAA0B,EAAE,GACtC,UAAU,0BAA0B,EAAE,CAAC;AAE3C,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAE3C,GAAG,EACH,kBAAkB,CAAC,4BAA4B,CAAC,CACjD,CAAC;AAEF,wBAAsB,cAAc,CAClC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,CAAC,SAAS,WAAW,EACrB,EACA,KAAK,EACL,KAAK,EACL,MAAM,EACN,MAAM,EACN,KAAK,EAAE,eAAe,EACtB,aAAa,EACb,OAAO,EAAE,iBAAiB,EAC1B,CAAC,GACF,EAAE;IACD,CAAC,EAAE,OAAO,CAAC;IACX,OAAO,EAAE;QACP,MAAM,EAAE,QAAQ,CAAC;QACjB,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;KACvB,CAAC;IACF,MAAM,EAAE;QACN,KAAK,EAAE;YACL,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF,aAAa,EAAE,sBAAsB,CAAC;IACtC,KAAK,EAAE,CAAC,IAAI,EAAE;QAQZ,eAAe,EAAE,yBAAyB,CAAC;QAC3C,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,EAAE,GAAG,CAAC;QACb,KAAK,EAAE,GAAG,GAAG,SAAS,CAAC;KACxB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IAC5C,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,GAAG,CAAC;CACb,GAAG,OAAO,CAAC;IACV,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,uBAAuB,CAAC,EAAE,CAAC;IACxD,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QAEd,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;QACzB,WAAW,EAAE,OAAO,CAAC;QACrB,eAAe,EAAE,OAAO,CAAC;QACzB,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC,CAmHD;AA6FD,eAAO,MAAM,qBAAqB;;;;;;;iBAWhC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;iBAe5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z}from"@hono/zod-openapi";import{and,asc,count,desc,eq,gt,ilike,isNotNull,isNull,lt,or,sql}from"drizzle-orm";import{HTTPException}from"hono/http-exception";import{cursorValueForColumn,cursorValueIsCanonicalText,cursorValueOf,decodePaginationCursor,encodePaginationCursor,isCursorSortableColumn}from"./pagination-cursor.js";const MAX_PAGE_SIZE=100;export const PAGINATION_CURSOR_FIELD="__cursorValue";function parsePaginationParams(params){const size=(raw,name)=>{if(raw===undefined||raw==="")return undefined;const parsed=Number(raw);if(!Number.isSafeInteger(parsed)||parsed<1){throw new HTTPException(400,{message:`"${name}" must be a whole number greater than zero.`})}return Math.min(parsed,MAX_PAGE_SIZE)};const first=size(params.query.first,"first");const last=size(params.query.last,"last");if(first!==undefined&&last!==undefined){throw new HTTPException(400,{message:'Use either "first" or "last", not both.'})}const cursor=params.query.cursor?.trim();return{cursor:cursor===""?undefined:cursor,first,last}}function effectiveDirection(isForward,order){if(isForward)return order;return order==="asc"?"desc":"asc"}function required(value){if(!value)throw new Error("Expected a pagination condition.");return value}function buildCursorCondition({column,cursor,direction,isPrimaryOrder,primary}){const after=direction==="asc"?gt:lt;if(isPrimaryOrder)return after(primary,
|
|
1
|
+
import{z}from"@hono/zod-openapi";import{and,asc,count,desc,eq,gt,ilike,isNotNull,isNull,lt,or,sql}from"drizzle-orm";import{HTTPException}from"hono/http-exception";import{cursorIdentifierForColumn,cursorIdentifierOf,cursorValueForColumn,cursorValueIsCanonicalText,cursorValueOf,decodePaginationCursor,encodePaginationCursor,isCursorSortableColumn,isPaginationIdentifierColumn}from"./pagination-cursor.js";const MAX_PAGE_SIZE=100;export const PAGINATION_CURSOR_FIELD="__cursorValue";function parsePaginationParams(params){const size=(raw,name)=>{if(raw===undefined||raw==="")return undefined;const parsed=Number(raw);if(!Number.isSafeInteger(parsed)||parsed<1){throw new HTTPException(400,{message:`"${name}" must be a whole number greater than zero.`})}return Math.min(parsed,MAX_PAGE_SIZE)};const first=size(params.query.first,"first");const last=size(params.query.last,"last");if(first!==undefined&&last!==undefined){throw new HTTPException(400,{message:'Use either "first" or "last", not both.'})}const cursor=params.query.cursor?.trim();return{cursor:cursor===""?undefined:cursor,first,last}}function effectiveDirection(isForward,order){if(isForward)return order;return order==="asc"?"desc":"asc"}function required(value){if(!value)throw new Error("Expected a pagination condition.");return value}function buildCursorCondition({column,cursor,direction,isPrimaryOrder,primary}){const after=direction==="asc"?gt:lt;const identifier=sql`${sql.param(cursorIdentifierForColumn(primary,cursor.id),primary)}`;if(isPrimaryOrder)return after(primary,identifier);const boundary=boundaryValue(column,cursor);if(direction==="asc"){if(cursor.value===null){return required(and(isNull(column),gt(primary,identifier)))}return required(or(gt(column,boundary),and(eq(column,boundary),gt(primary,identifier)),isNull(column)))}if(cursor.value===null){return required(or(and(isNull(column),lt(primary,identifier)),isNotNull(column)))}return required(or(lt(column,boundary),and(eq(column,boundary),lt(primary,identifier))))}function boundaryValue(column,cursor){const value=cursorValueForColumn(column,cursor.value);if(cursorValueIsCanonicalText(column)){return sql`${String(value)}::${sql.raw(column.getSQLType())}`}return sql`${sql.param(value,column)}`}function buildSearchWhere(search,term){const trimmed=term?.trim();if(!search?.length||!trimmed)return undefined;return or(...search.map(column=>ilike(column,`%${trimmed}%`)))}async function fetchTotalCount(c,table,where){const[{count:totalCount}]=await c.get("db").select({count:count()}).from(table).where(where);return totalCount}export async function withPagination({query,table,params,search,where:whereFromParams,primaryCursor,orderBy:orderByFromParams,c}){const{cursor:rawCursor,first,last}=parsePaginationParams(params);const isForward=last===undefined;const direction=effectiveDirection(isForward,orderByFromParams.order);const orderFn=direction==="asc"?asc:desc;const primary=table[primaryCursor.name];const orderName=orderByFromParams.column.name;const orderColumn=table[orderName];const isPrimaryOrder=orderName===primaryCursor.name;if(!isPaginationIdentifierColumn(primary)){throw new HTTPException(400,{message:`The "${primaryCursor.name}" primary cursor must be an integer, bigint or UUID column.`})}if(!isCursorSortableColumn(orderColumn)){throw new HTTPException(400,{message:`Results cannot be ordered by "${orderName}".`})}const orderBy=isPrimaryOrder?orderFn(primary):sql`${orderFn(orderColumn)}, ${orderFn(primary)}`;const cursor=rawCursor===undefined?undefined:decodePaginationCursor(rawCursor,{column:orderName,primary});const searchWhere=buildSearchWhere(search,params.query.search);const baseWhere=whereFromParams&&searchWhere?and(whereFromParams,searchWhere):whereFromParams??searchWhere;const cursorWhere=cursor?buildCursorCondition({column:orderColumn,cursor,direction,isPrimaryOrder,primary}):undefined;const where=baseWhere&&cursorWhere?and(baseWhere,cursorWhere):baseWhere??cursorWhere;const totalCount=await fetchTotalCount(c,table,baseWhere);const cursorSelection={[PAGINATION_CURSOR_FIELD]:cursorValueIsCanonicalText(orderColumn)?sql`${orderColumn}::text`:orderColumn};const limit=(first??last??50)+1;const edges=await query({cursorSelection,limit,where,orderBy});const requested=first??last??edges.length;const hasMore=edges.length>requested;const slicedEdges=edges.slice(0,requested);const finalEdges=isForward?slicedEdges:slicedEdges.reverse();const boundaries=cursorsFrom({edges:finalEdges,orderColumn,orderName,primaryColumn:primary,primaryName:primaryCursor.name});return{pageInfo:{totalCount,count:finalEdges.length,hasNextPage:finalEdges.length===0?false:isForward?hasMore:Boolean(cursor),hasPreviousPage:finalEdges.length===0?false:isForward?Boolean(cursor):hasMore,...boundaries},edges:finalEdges.map(withoutCursorField)}}function withoutCursorField(row){if(!(PAGINATION_CURSOR_FIELD in row))return row;const rest={...row};delete rest[PAGINATION_CURSOR_FIELD];return rest}function cursorsFrom({edges,orderColumn,orderName,primaryColumn,primaryName}){const first=edges[0];const last=edges.at(-1);if(!first||!last)return{endCursor:null,startCursor:null};const valueOf=row=>{if(PAGINATION_CURSOR_FIELD in row)return row[PAGINATION_CURSOR_FIELD];if(!cursorValueIsCanonicalText(orderColumn)&&orderName in row){return row[orderName]}throw new Error(`The page query for "${orderName}" must spread \`cursorSelection\` into its projection, so the cursor value is read from the same statement as the row.`)};const mint=row=>encodePaginationCursor({column:orderName,id:cursorIdentifierOf(primaryColumn,row[primaryName]),value:cursorValueOf(orderColumn,valueOf(row))});return{endCursor:mint(last),startCursor:mint(first)}}const zodPageSize=z.string().regex(/^\d+$/,"Must be a whole number.").refine(value=>Number(value)>=1,"Must be greater than zero.").refine(value=>Number.isSafeInteger(Number(value)),"Too large.");export const zodPaginationPageInfo=z.object({totalCount:z.number(),count:z.number(),hasNextPage:z.boolean(),hasPreviousPage:z.boolean(),startCursor:z.string().nullable(),endCursor:z.string().nullable()});export const zodPaginationQuery=z.object({cursor:z.string().min(1).max(512).regex(/^[A-Za-z0-9_-]+$/,"Invalid cursor.").optional(),first:zodPageSize.optional(),last:zodPageSize.optional()}).refine(query=>query.first===undefined||query.last===undefined,'Use either "first" or "last", not both.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captcha.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/captcha.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"captcha.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/captcha.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAwF1C,eAAO,MAAM,iBAAiB,SACd,GAAG,OAAO,EAAE,MAAM,IAAI,kBA6BrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{HTTPException}from"hono/http-exception";const getResFromReCaptcha=async({token,userIp,captchaConfig})=>{if(captchaConfig.type==="cloudflare_turnstile"){const res=await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify",{method:"POST",body:JSON.stringify({secret:
|
|
1
|
+
import{HTTPException}from"hono/http-exception";const getResFromReCaptcha=async({token,userIp,captchaConfig})=>{const{secretKey}=captchaConfig;if(!secretKey){return{success:false,score:0,"error-codes":["missing-secret-key"]}}if(captchaConfig.type==="cloudflare_turnstile"){const res=await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify",{method:"POST",body:JSON.stringify({secret:secretKey,response:token,remoteip:userIp}),headers:{"Content-Type":"application/json"}});const data=await res.json();return{success:data.success,score:data.success?1:0,"error-codes":data["error-codes"]}}if(captchaConfig.type==="recaptcha_v3"){const res=await fetch("https://www.google.com/recaptcha/api/siteverify",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({secret:secretKey,response:token,remoteip:userIp})});const data=await res.json();return{success:data.success,score:data.score??0,"error-codes":data["error-codes"]}}return{success:false,score:0}};export const captchaMiddleware=()=>{return async(c,next)=>{const token=c.req.header("x-vitnode-captcha-token");const captchaConfig=c.get("core").captcha;if(!captchaConfig){await next();return}if(!token){throw new HTTPException(400,{message:"Captcha token is required"})}const res=await getResFromReCaptcha({token,userIp:c.get("ipAddress"),captchaConfig});if(!res.success||res.score<.5){throw new HTTPException(400,{message:"Captcha validation failed"})}await next()}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cron-auth.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/cron-auth.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cron-auth.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/cron-auth.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA0C1C,eAAO,MAAM,kBAAkB,SACf,GAAG,OAAO,EAAE,MAAM,IAAI,kBA8BrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{HTTPException}from"hono/http-exception";export const cronAuthMiddleware=()=>{return async(c,next)=>{const cronSecret=c.get("core").cronSecret;if(!cronSecret){throw new HTTPException(403,{message:"Cron access not configured"})}
|
|
1
|
+
import{HTTPException}from"hono/http-exception";import{timingSafeEqual}from"node:crypto";import{CONFIG,INSECURE_CRON_SECRETS}from"../../lib/config.js";const secretsMatch=(provided,expected)=>{const a=Buffer.from(provided,"utf8");const b=Buffer.from(expected,"utf8");if(a.length!==b.length){timingSafeEqual(b,b);return false}return timingSafeEqual(a,b)};const bearerToken=header=>{if(!header)return undefined;const match=/^Bearer (.+)$/.exec(header);return match?.[1]};export const cronAuthMiddleware=()=>{return async(c,next)=>{const cronSecret=c.get("core").cronSecret;if(!cronSecret){throw new HTTPException(403,{message:"Cron access not configured"})}if(INSECURE_CRON_SECRETS.includes(cronSecret)&&!CONFIG.node_development){throw new HTTPException(403,{message:"Cron access is disabled because CRON_SECRET is still the built-in default. Set CRON_SECRET to a random value."})}const providedSecret=bearerToken(c.req.header("authorization"));if(!providedSecret||!secretsMatch(providedSecret,cronSecret)){throw new HTTPException(403,{message:"Invalid cron authorization"})}await next()}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/global.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAEL,WAAW,EAEZ,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAUpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"global.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/global.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAEL,WAAW,EAEZ,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAUpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,QAAQ,MAAM,CAAC;IAEpB,UAAU,kBAAmB,SAAQ,mBAAmB;KAAG;CAC5D;AAED,MAAM,WAAW,UAAW,SAAQ,GAAG;IACrC,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,IAAI,GAAG;QACZ,IAAI,EAAE;YACJ,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;YACtB,SAAS,EAAE,IAAI,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,aAAa,EAAE,OAAO,CAAC;YACvB,EAAE,EAAE,MAAM,CAAC;YACX,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,UAAU,EAAE,OAAO,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE;QACJ,EAAE,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5B,aAAa,EAAE;YACb,kBAAkB,EAAE,MAAM,CAAC;YAC3B,eAAe,EAAE,MAAM,CAAC;YACxB,cAAc,EAAE,MAAM,CAAC;YAEvB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;YACjC,UAAU,EAAE,MAAM,CAAC;YACnB,YAAY,EAAE,OAAO,CAAC;YACtB,mBAAmB,EAAE,MAAM,CAAC;YAC5B,gBAAgB,EAAE,MAAM,CAAC;YACzB,WAAW,EAAE,YAAY,EAAE,CAAC;SAC7B,CAAC;QACF,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;QAEvD,aAAa,EAAE,sBAAsB,EAAE,CAAC;QAExC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAE9B,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;QACpC,YAAY,EAAE,qBAAqB,EAAE,CAAC;QACtC,IAAI,EAAE,CAAC,eAAe,GAAG;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,EAAE,CAAC;QACjE,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,EAAE;YAAE,OAAO,EAAE,eAAe,CAAC;YAAC,SAAS,EAAE,mBAAmB,EAAE,CAAA;SAAE,CAAC;QAIvE,cAAc,EAAE,OAAO,CAAC;QACxB,IAAI,EAAE;YACJ,aAAa,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,YAAY,EAAE,CAAC;YACxB,OAAO,EAAE,cAAc,EAAE,CAAC;SAC3B,CAAC;QACF,QAAQ,EAAE;YACR,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;QACF,eAAe,EAAE,2BAA2B,EAAE,CAAC;QAC/C,OAAO,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC1B,KAAK,EAAE,CAAC,oBAAoB,GAAG;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,EAAE,CAAC;QACvE,MAAM,EAAE;YAAE,OAAO,EAAE,uBAAuB,CAAA;SAAE,CAAC;QAC7C,cAAc,EAAE,mBAAmB,EAAE,CAAC;QACtC,OAAO,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACtC,UAAU,EAAE,eAAe,EAAE,CAAC;KAC/B,CAAC;IACF,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC;IACvD,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,oBAAoB,CAAC;IAC1B,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,IAAI,GAAG;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;QACtB,SAAS,EAAE,IAAI,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,OAAO,CAAC;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,eAAO,MAAM,gBAAgB,GAAI,kIAe9B,IAAI,CACL,gBAAgB,EACd,IAAI,GACJ,eAAe,GACf,SAAS,GACT,SAAS,GACT,MAAM,GACN,YAAY,GACZ,OAAO,GACP,QAAQ,GACR,MAAM,GACN,SAAS,GACT,QAAQ,GACR,SAAS,CACZ,GACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG;IAChC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CACjC,MA+Ha,GAAG,OAAO,EAAE,MAAM,IAAI,kBAiFrC,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAClB,GAAG,OAAO,EAAE,MAAM,IAAI,kBASrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{HTTPException}from"hono/http-exception";import{LocalEventsAdapter}from"../adapters/events/local.js";import{PostgresSearchAdapter}from"../adapters/search/postgres.js";import{CacheModel}from"../lib/cache.js";import{AIModel}from"../models/ai.js";import{EmailModel}from"../models/email.js";import{EventsModel}from"../models/events.js";import{I18nModel}from"../models/i18n.js";import{QueueModel}from"../models/queue.js";import{assertSearchProviderCapabilities,SearchModel,validateSearchIndexers}from"../models/search.js";import{SessionModel}from"../models/session.js";import{SessionAdminModel}from"../models/session-admin.js";import{StorageModel}from"../models/storage.js";import{validateContentTypes}from"../../content/registry.js";import{ensureContentLocalizationLanguages}from"../../content/server/language-resolver.js";import{warnAboutContentPreviewConfig}from"../../content/server/preview-config.js";import{ensureContentPreviewSecret}from"../../content/server/preview-secret.js";import{CONFIG}from"../../lib/config.js";import{collectLocaleCodes}from"../../lib/i18n/load-messages.js";import{buildApiMessagesSources}from"../../lib/i18n/sources.js";import{realtime}from"../../ws/registry.js";import{collectCronJobs}from"../lib/cron.js";import{loggerMiddleware}from"../lib/logger-middleware.js";import{normalizePermissionStaffModules}from"../lib/permission-staff.js";export const globalMiddleware=({ai,authorization,content,metadata,email,dbProvider,captcha,cron,events,plugins,i18n,search,storage,cacheClient})=>{const pluginsMetadata=plugins.map(plugin=>({id:plugin.pluginId}));const messagesSources=buildApiMessagesSources({appMessages:i18n?.messages,plugins});const i18nMetadata={defaultLocale:i18n?.defaultLocale??"en",locales:i18n?.locales??collectLocaleCodes(messagesSources).map(code=>({code,name:code})),sources:messagesSources};const cronMetadata=collectCronJobs(plugins);const eventsMetadata=plugins.flatMap(plugin=>(plugin.events??[]).map(listener=>({...listener,pluginId:plugin.pluginId})));const queueMetadata=plugins.flatMap(plugin=>(plugin.queueTasks??[]).map(task=>({pluginId:plugin.pluginId,module:task.module,name:task.name,handler:task.handler,description:task.description,maxAttempts:task.maxAttempts})));const webSocketsMetadata=plugins.flatMap(plugin=>(plugin.webSockets??[]).map(webSocket=>({...webSocket,pluginId:plugin.pluginId})));const searchIndexersMetadata=validateSearchIndexers(plugins.flatMap(plugin=>(plugin.searchIndexers??[]).map(indexer=>({...indexer,pluginId:plugin.pluginId}))));const contentTypesMetadata=validateContentTypes(plugins.flatMap(plugin=>(plugin.contentTypes??[]).map(definition=>({definition,pluginId:plugin.pluginId}))));warnAboutContentPreviewConfig({contentTypes:contentTypesMetadata});const hasPreviewableContentTypes=contentTypesMetadata.some(entry=>entry.definition.editorial.preview.enabled);const contentModelsMetadata=plugins.flatMap(plugin=>(plugin.contentModels??[]).map(model=>({model,pluginId:plugin.pluginId})));const hasLocalizedContentTypes=contentTypesMetadata.some(entry=>entry.definition.localization.enabled);const searchAdapter=search?.adapter??PostgresSearchAdapter();assertSearchProviderCapabilities(searchAdapter,{localizedSearchContentTypes:contentTypesMetadata.filter(entry=>entry.definition.localization.enabled&&entry.definition.search.enabled).map(entry=>entry.definition.id)});const permissionStaffMetadata=plugins.map(plugin=>({pluginId:plugin.pluginId,admin:normalizePermissionStaffModules(plugin.permissionStaff?.admin),moderator:normalizePermissionStaffModules(plugin.permissionStaff?.moderator)}));
|
|
1
|
+
import{HTTPException}from"hono/http-exception";import{LocalEventsAdapter}from"../adapters/events/local.js";import{PostgresSearchAdapter}from"../adapters/search/postgres.js";import{CacheModel}from"../lib/cache.js";import{AIModel}from"../models/ai.js";import{EmailModel}from"../models/email.js";import{EventsModel}from"../models/events.js";import{I18nModel}from"../models/i18n.js";import{QueueModel}from"../models/queue.js";import{assertSearchProviderCapabilities,SearchModel,validateSearchIndexers}from"../models/search.js";import{SessionModel}from"../models/session.js";import{SessionAdminModel}from"../models/session-admin.js";import{StorageModel}from"../models/storage.js";import{validateContentTypes}from"../../content/registry.js";import{ensureContentLocalizationLanguages}from"../../content/server/language-resolver.js";import{warnAboutContentPreviewConfig}from"../../content/server/preview-config.js";import{ensureContentPreviewSecret}from"../../content/server/preview-secret.js";import{CONFIG}from"../../lib/config.js";import{collectLocaleCodes}from"../../lib/i18n/load-messages.js";import{buildApiMessagesSources}from"../../lib/i18n/sources.js";import{realtime}from"../../ws/registry.js";import{resolveClientIp}from"../lib/client-ip.js";import{collectCronJobs}from"../lib/cron.js";import{loggerMiddleware}from"../lib/logger-middleware.js";import{normalizePermissionStaffModules}from"../lib/permission-staff.js";export const globalMiddleware=({ai,authorization,content,metadata,email,dbProvider,captcha,cron,events,plugins,i18n,search,storage,cacheClient})=>{const pluginsMetadata=plugins.map(plugin=>({id:plugin.pluginId}));const messagesSources=buildApiMessagesSources({appMessages:i18n?.messages,plugins});const i18nMetadata={defaultLocale:i18n?.defaultLocale??"en",locales:i18n?.locales??collectLocaleCodes(messagesSources).map(code=>({code,name:code})),sources:messagesSources};const cronMetadata=collectCronJobs(plugins);const eventsMetadata=plugins.flatMap(plugin=>(plugin.events??[]).map(listener=>({...listener,pluginId:plugin.pluginId})));const queueMetadata=plugins.flatMap(plugin=>(plugin.queueTasks??[]).map(task=>({pluginId:plugin.pluginId,module:task.module,name:task.name,handler:task.handler,description:task.description,maxAttempts:task.maxAttempts})));const webSocketsMetadata=plugins.flatMap(plugin=>(plugin.webSockets??[]).map(webSocket=>({...webSocket,pluginId:plugin.pluginId})));const searchIndexersMetadata=validateSearchIndexers(plugins.flatMap(plugin=>(plugin.searchIndexers??[]).map(indexer=>({...indexer,pluginId:plugin.pluginId}))));const contentTypesMetadata=validateContentTypes(plugins.flatMap(plugin=>(plugin.contentTypes??[]).map(definition=>({definition,pluginId:plugin.pluginId}))));warnAboutContentPreviewConfig({contentTypes:contentTypesMetadata});const hasPreviewableContentTypes=contentTypesMetadata.some(entry=>entry.definition.editorial.preview.enabled);const contentModelsMetadata=plugins.flatMap(plugin=>(plugin.contentModels??[]).map(model=>({model,pluginId:plugin.pluginId})));const hasLocalizedContentTypes=contentTypesMetadata.some(entry=>entry.definition.localization.enabled);const searchAdapter=search?.adapter??PostgresSearchAdapter();assertSearchProviderCapabilities(searchAdapter,{localizedSearchContentTypes:contentTypesMetadata.filter(entry=>entry.definition.localization.enabled&&entry.definition.search.enabled).map(entry=>entry.definition.id)});const permissionStaffMetadata=plugins.map(plugin=>({pluginId:plugin.pluginId,admin:normalizePermissionStaffModules(plugin.permissionStaff?.admin),moderator:normalizePermissionStaffModules(plugin.permissionStaff?.moderator)}));return async(c,next)=>{if(!c.get("ipAddress")){c.set("ipAddress",resolveClientIp(c))}c.set("db",dbProvider);c.set("ai",new AIModel(c));c.set("cache",new CacheModel(cacheClient,c));c.set("email",new EmailModel(c));c.set("events",new EventsModel(c));c.set("i18n",new I18nModel(c));c.set("queue",new QueueModel(c));c.set("search",new SearchModel(c));c.set("storage",new StorageModel(c));c.set("realtime",realtime);const contentPreviewSecret=hasPreviewableContentTypes?await ensureContentPreviewSecret(dbProvider):undefined;c.set("core",{ai,i18n:i18nMetadata,metadata,email,events:{adapter:events?.adapter??LocalEventsAdapter(),listeners:eventsMetadata},search:{adapter:searchAdapter},searchIndexers:searchIndexersMetadata,storage,authorization:{cookieName:authorization?.cookieName??"vitnode_auth",cookie_expires:authorization?.cookieExpires??1e3*60*60*24*90,ssoAdapters:authorization?.ssoAdapters??[],deviceCookieName:authorization?.deviceCookieName??"vitnode_device",deviceCookieExpires:authorization?.deviceCookieExpires??1e3*60*60*24*365,adminCookieName:authorization?.adminCookieName??"vitnode_auth_admin",adminCookieExpires:authorization?.adminCookieExpires??1e3*60*60*24*1,cookieSecure:authorization?.cookieSecure??true,cookieDomain:authorization?.cookieDomain},captcha,contentPreviewSecret,cronSecret:CONFIG.cronJobSecret,hasCronAdapter:!!cron,plugins:pluginsMetadata,cron:cronMetadata,queue:queueMetadata,webSockets:webSocketsMetadata,permissionStaff:permissionStaffMetadata,contentModels:contentModelsMetadata,contentRevalidateOrigins:content?.revalidateOrigins,contentTypes:contentTypesMetadata});if(hasLocalizedContentTypes){await ensureContentLocalizationLanguages(c,contentTypesMetadata)}const user=await new SessionModel(c).getUser();c.set("user",user);c.set("admin",null);c.set("log",loggerMiddleware(c));await next()}};export const globalAdminMiddleware=()=>{return async(c,next)=>{const user=await new SessionAdminModel(c).getUser();if(!user)throw new HTTPException(403);c.set("admin",{user});await next()}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-static.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/storage-static.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAyB1C,eAAO,MAAM,8BAA8B,SAC3B,GAAG,OAAO,EAAE,MAAM,IAAI,kBAMrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const storageStaticHeadersMiddleware=()=>{return async(c,next)=>{await next();c.header("Content-Security-Policy","sandbox");c.header("X-Content-Type-Options","nosniff")}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-origin.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/websocket-origin.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA0C1C,eAAO,MAAM,yBAAyB,GAAI,cAEvC;IAKD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACd,MASU,GAAG,OAAO,EAAE,MAAM,IAAI,kBAarC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{HTTPException}from"hono/http-exception";import{CONFIG}from"../../lib/config.js";const originOf=value=>{if(!value)return undefined;try{return new URL(value).origin}catch{return undefined}};export const websocketOriginMiddleware=({origin}={})=>{const allowed=new Set([originOf(CONFIG.web.href),originOf(CONFIG.api.origin),...(origin??[]).map(entry=>originOf(entry)??entry)].filter(entry=>Boolean(entry)));return async(c,next)=>{const requestOrigin=c.req.header("origin");if(requestOrigin&&!allowed.has(requestOrigin)){throw new HTTPException(403,{message:"WebSocket connections are not allowed from this origin."})}await next()}};
|
|
@@ -5,7 +5,11 @@ export declare class DeviceModel {
|
|
|
5
5
|
private createDevice;
|
|
6
6
|
private getUserAgent;
|
|
7
7
|
private setCookieDevice;
|
|
8
|
-
|
|
8
|
+
getExistingDeviceId(): Promise<null | {
|
|
9
|
+
id: number;
|
|
10
|
+
publicId: string;
|
|
11
|
+
}>;
|
|
12
|
+
getOrCreateDeviceId(): Promise<{
|
|
9
13
|
id: number;
|
|
10
14
|
publicId: string;
|
|
11
15
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../../src/api/models/device.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AASpC,qBAAa,WAAW;gBACV,CAAC,EAAE,OAAO;IAGtB,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;YAEhB,YAAY;IAkB1B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../../../src/api/models/device.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AASpC,qBAAa,WAAW;gBACV,CAAC,EAAE,OAAO;IAGtB,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;YAEhB,YAAY;IAkB1B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;IAwBjB,mBAAmB,IAAI,OAAO,CAAC,IAAI,GAAG;QAC1C,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAsCI,mBAAmB;;;;CAG1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{eq}from"drizzle-orm";import{getCookie}from"hono/cookie";import{randomBytes}from"node:crypto";import{setAuthCookie}from"../lib/auth-cookie.js";import{core_sessions_known_devices}from"../../database/sessions.js";export class DeviceModel{constructor(c){this.c=c}c;async createDevice(){const publicId=randomBytes(16).toString("hex");const[device]=await this.c.get("db").insert(core_sessions_known_devices).values({publicId,ipAddress:this.c.get("ipAddress"),userAgent:this.getUserAgent()}).returning({id:core_sessions_known_devices.id});this.setCookieDevice(publicId);return{id:device.id,publicId}}getUserAgent(){return this.c.req.header("User-Agent")??"node"}setCookieDevice(publicDeviceId){setAuthCookie(this.c,this.c.get("core").authorization.deviceCookieName,publicDeviceId,{expires:new Date(Date.now()+this.c.get("core").authorization.deviceCookieExpires)})}async
|
|
1
|
+
import{eq}from"drizzle-orm";import{getCookie}from"hono/cookie";import{randomBytes}from"node:crypto";import{setAuthCookie}from"../lib/auth-cookie.js";import{core_sessions_known_devices}from"../../database/sessions.js";export class DeviceModel{constructor(c){this.c=c}c;async createDevice(){const publicId=randomBytes(16).toString("hex");const[device]=await this.c.get("db").insert(core_sessions_known_devices).values({publicId,ipAddress:this.c.get("ipAddress"),userAgent:this.getUserAgent()}).returning({id:core_sessions_known_devices.id});this.setCookieDevice(publicId);return{id:device.id,publicId}}getUserAgent(){return this.c.req.header("User-Agent")??"node"}setCookieDevice(publicDeviceId){setAuthCookie(this.c,this.c.get("core").authorization.deviceCookieName,publicDeviceId,{expires:new Date(Date.now()+this.c.get("core").authorization.deviceCookieExpires)})}async getExistingDeviceId(){const deviceIdFromCookie=getCookie(this.c,this.c.get("core").authorization.deviceCookieName);if(!deviceIdFromCookie)return null;try{const[device]=await this.c.get("db").select({id:core_sessions_known_devices.id}).from(core_sessions_known_devices).where(eq(core_sessions_known_devices.publicId,deviceIdFromCookie));if(!device)return null;await this.c.get("db").update(core_sessions_known_devices).set({ipAddress:this.c.get("ipAddress"),userAgent:this.getUserAgent(),lastSeen:new Date}).where(eq(core_sessions_known_devices.publicId,deviceIdFromCookie));return{id:device.id,publicId:deviceIdFromCookie}}catch{return null}}async getOrCreateDeviceId(){return await this.getExistingDeviceId()??await this.createDevice()}}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare class PasswordModel {
|
|
2
2
|
encryptPassword(password: string): Promise<string>;
|
|
3
|
+
verifyDummyPassword(password: string): Promise<boolean>;
|
|
3
4
|
verifyPassword(password: string, hash: string): Promise<boolean>;
|
|
4
5
|
}
|
|
5
6
|
export declare class ForgotPasswordTokenModel {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password.d.ts","sourceRoot":"","sources":["../../../../src/api/models/password.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"password.d.ts","sourceRoot":"","sources":["../../../../src/api/models/password.ts"],"names":[],"mappings":"AA6BA,qBAAa,aAAa;IAClB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBlD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAsBvE;AAED,qBAAa,wBAAwB;IACnC,kBAAkB;IAIlB,cAAc,CAAC,KAAK,EAAE,MAAM;CAG7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import crypto from"node:crypto";
|
|
1
|
+
import crypto from"node:crypto";const SALT_BYTES=16;const KEY_BYTES=64;const DUMMY_HASH=`${"0".repeat(SALT_BYTES*2)}:${"0".repeat(KEY_BYTES*2)}`;const scrypt=async(password,salt)=>await new Promise((resolve,reject)=>{crypto.scrypt(password,salt,KEY_BYTES,(err,derivedKey)=>{if(err){reject(err);return}resolve(derivedKey)})});export class PasswordModel{async encryptPassword(password){const salt=crypto.randomBytes(SALT_BYTES).toString("hex");const derivedKey=await scrypt(password,salt);return`${salt}:${derivedKey.toString("hex")}`}async verifyDummyPassword(password){return await this.verifyPassword(password,DUMMY_HASH)}async verifyPassword(password,hash){const[salt,key]=hash.split(":");if(!salt||!key)return false;const keyBuffer=Buffer.from(key,"hex");const derivedKey=await scrypt(password,salt);if(keyBuffer.length!==derivedKey.length){crypto.timingSafeEqual(derivedKey,derivedKey);return false}return crypto.timingSafeEqual(keyBuffer,derivedKey)}}export class ForgotPasswordTokenModel{generateResetToken(){return crypto.randomBytes(32).toString("base64url")}hashResetToken(token){return crypto.createHash("sha256").update(token).digest("hex")}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-admin.d.ts","sourceRoot":"","sources":["../../../../src/api/models/session-admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAkBpC,qBAAa,iBAAiB;gBAChB,CAAC,EAAE,OAAO;IAGtB,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;YAEhB,SAAS;IAcjB,kBAAkB,CAAC,MAAM,EAAE,MAAM;IAmBjC,qBAAqB,CAAC,MAAM,EAAE,MAAM;;;IA2CpC,aAAa;
|
|
1
|
+
{"version":3,"file":"session-admin.d.ts","sourceRoot":"","sources":["../../../../src/api/models/session-admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAkBpC,qBAAa,iBAAiB;gBAChB,CAAC,EAAE,OAAO;IAGtB,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;YAEhB,SAAS;IAcjB,kBAAkB,CAAC,MAAM,EAAE,MAAM;IAmBjC,qBAAqB,CAAC,MAAM,EAAE,MAAM;;;IA2CpC,aAAa;IA2Bb,OAAO;;;;;;;;;;;;;CAwEd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{and,eq,gt,or}from"drizzle-orm";import{getCookie}from"hono/cookie";import{HTTPException}from"hono/http-exception";import{deleteAuthCookie,setAuthCookie}from"../lib/auth-cookie.js";import{core_admin_permissions,core_admin_sessions}from"../../database/admins.js";import{DeviceModel}from"./device.js";import{adminSessionCacheKey,reviveSessionUser,sessionCacheTtl}from"./session-cache.js";import{UserModel}from"./user.js";export class SessionAdminModel{constructor(c){this.c=c}c;async hashToken(token){const encoder=new TextEncoder;const data=encoder.encode(token);const hashBuffer=await crypto.subtle.digest("SHA-256",data);const bytes=new Uint8Array(hashBuffer);let result="";for(const byte of bytes){result+=byte.toString(16).padStart(2,"0")}return result}async checkIfUserIsAdmin(userId){const user=await new UserModel().getUserById({id:userId,c:this.c});if(!user)return false;const[permission]=await this.c.get("db").select().from(core_admin_permissions).where(or(eq(core_admin_permissions.userId,user.id),eq(core_admin_permissions.roleId,user.roleId))).limit(1);return!!permission}async createSessionByUserId(userId){const isAdmin=await this.checkIfUserIsAdmin(userId);if(!isAdmin){throw new HTTPException(403,{message:"Forbidden"})}const randomBytes=new Uint8Array(64);crypto.getRandomValues(randomBytes);let token="";for(const byte of randomBytes){token+=byte.toString(16).padStart(2,"0")}const hashedToken=await this.hashToken(token);const device=await new DeviceModel(this.c).
|
|
1
|
+
import{and,eq,gt,or}from"drizzle-orm";import{getCookie}from"hono/cookie";import{HTTPException}from"hono/http-exception";import{deleteAuthCookie,setAuthCookie}from"../lib/auth-cookie.js";import{core_admin_permissions,core_admin_sessions}from"../../database/admins.js";import{DeviceModel}from"./device.js";import{adminSessionCacheKey,reviveSessionUser,sessionCacheTtl}from"./session-cache.js";import{UserModel}from"./user.js";export class SessionAdminModel{constructor(c){this.c=c}c;async hashToken(token){const encoder=new TextEncoder;const data=encoder.encode(token);const hashBuffer=await crypto.subtle.digest("SHA-256",data);const bytes=new Uint8Array(hashBuffer);let result="";for(const byte of bytes){result+=byte.toString(16).padStart(2,"0")}return result}async checkIfUserIsAdmin(userId){const user=await new UserModel().getUserById({id:userId,c:this.c});if(!user)return false;const[permission]=await this.c.get("db").select().from(core_admin_permissions).where(or(eq(core_admin_permissions.userId,user.id),eq(core_admin_permissions.roleId,user.roleId))).limit(1);return!!permission}async createSessionByUserId(userId){const isAdmin=await this.checkIfUserIsAdmin(userId);if(!isAdmin){throw new HTTPException(403,{message:"Forbidden"})}const randomBytes=new Uint8Array(64);crypto.getRandomValues(randomBytes);let token="";for(const byte of randomBytes){token+=byte.toString(16).padStart(2,"0")}const hashedToken=await this.hashToken(token);const device=await new DeviceModel(this.c).getOrCreateDeviceId();await this.c.get("db").insert(core_admin_sessions).values({token:hashedToken,userId,expiresAt:new Date(Date.now()+this.c.get("core").authorization.adminCookieExpires),deviceId:device.id});setAuthCookie(this.c,this.c.get("core").authorization.adminCookieName,token,{expires:new Date(Date.now()+this.c.get("core").authorization.adminCookieExpires)});return{token}}async deleteSession(){const token=getCookie(this.c,this.c.get("core").authorization.adminCookieName);if(!token)return;const hashedToken=await this.hashToken(token);const device=await new DeviceModel(this.c).getExistingDeviceId();await this.c.get("db").delete(core_admin_sessions).where(eq(core_admin_sessions.token,hashedToken));if(device){await this.c.get("cache").deleteSystem(adminSessionCacheKey(hashedToken,device.id))}deleteAuthCookie(this.c,this.c.get("core").authorization.adminCookieName)}async getUser(){const{authorization}=this.c.get("core");const token=getCookie(this.c,authorization.adminCookieName);if(!token)return null;const device=await new DeviceModel(this.c).getExistingDeviceId();if(!device)return null;const hashedToken=await this.hashToken(token);const cache=this.c.get("cache");const cacheKey=adminSessionCacheKey(hashedToken,device.id);const cached=await cache.getSystem(cacheKey);if(cached){const user=reviveSessionUser(cached);if(!await this.checkIfUserIsAdmin(user.id)){await this.deleteSession();return null}return user}const[session]=await this.c.get("db").select({userId:core_admin_sessions.userId,expiresAt:core_admin_sessions.expiresAt}).from(core_admin_sessions).where(and(eq(core_admin_sessions.token,hashedToken),eq(core_admin_sessions.deviceId,device.id),gt(core_admin_sessions.expiresAt,new Date))).limit(1);if(!session){deleteAuthCookie(this.c,this.c.get("core").authorization.adminCookieName);return null}const user=await new UserModel().getUserById({id:session.userId,c:this.c});if(!user)return null;const isStillAdmin=await this.checkIfUserIsAdmin(user.id);if(!isStillAdmin){await this.deleteSession();return null}const ttl=sessionCacheTtl(session.expiresAt);if(ttl>0)await cache.setSystem(cacheKey,user,ttl);return user}}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Context } from "hono";
|
|
2
|
+
export declare const invalidateSessionCacheForUser: (c: Context, userId: number) => Promise<void>;
|
|
3
|
+
export declare const revokeAllSessionsForUser: (c: Context, userId: number) => Promise<void>;
|
|
4
|
+
//# sourceMappingURL=session-revoke.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-revoke.d.ts","sourceRoot":"","sources":["../../../../src/api/models/session-revoke.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AA8DpC,eAAO,MAAM,6BAA6B,GACxC,GAAG,OAAO,EACV,QAAQ,MAAM,KACb,OAAO,CAAC,IAAI,CAMd,CAAC;AAiBF,eAAO,MAAM,wBAAwB,GACnC,GAAG,OAAO,EACV,QAAQ,MAAM,KACb,OAAO,CAAC,IAAI,CAcd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{eq}from"drizzle-orm";import{core_admin_sessions}from"../../database/admins.js";import{core_sessions}from"../../database/sessions.js";import{adminSessionCacheKey,sessionCacheKey}from"./session-cache.js";const sessionCacheKeysForUser=async(c,userId)=>{const db=c.get("db");const[sessions,adminSessions]=await Promise.all([db.select({token:core_sessions.token,deviceId:core_sessions.deviceId}).from(core_sessions).where(eq(core_sessions.userId,userId)),db.select({token:core_admin_sessions.token,deviceId:core_admin_sessions.deviceId}).from(core_admin_sessions).where(eq(core_admin_sessions.userId,userId))]);return[...sessions.map(({token,deviceId})=>sessionCacheKey(token,deviceId)),...adminSessions.map(({token,deviceId})=>adminSessionCacheKey(token,deviceId))]};export const invalidateSessionCacheForUser=async(c,userId)=>{const keys=await sessionCacheKeysForUser(c,userId);if(keys.length>0){await c.get("cache").deleteSystem(keys)}};export const revokeAllSessionsForUser=async(c,userId)=>{const db=c.get("db");const keys=await sessionCacheKeysForUser(c,userId);await Promise.all([db.delete(core_sessions).where(eq(core_sessions.userId,userId)),db.delete(core_admin_sessions).where(eq(core_admin_sessions.userId,userId))]);if(keys.length>0){await c.get("cache").deleteSystem(keys)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{and,eq,gt}from"drizzle-orm";import{getCookie}from"hono/cookie";import{deleteAuthCookie,setAuthCookie}from"../lib/auth-cookie.js";import{core_sessions}from"../../database/sessions.js";import{DeviceModel}from"./device.js";import{reviveSessionUser,sessionCacheKey,sessionCacheTtl}from"./session-cache.js";import{UserModel}from"./user.js";export class SessionModel{constructor(c){this.c=c}c;async hashToken(token){const encoder=new TextEncoder;const data=encoder.encode(token);const hashBuffer=await crypto.subtle.digest("SHA-256",data);const bytes=new Uint8Array(hashBuffer);let result="";for(const byte of bytes){result+=byte.toString(16).padStart(2,"0")}return result}async createSessionByUserId(userId){const randomBytes=new Uint8Array(64);crypto.getRandomValues(randomBytes);let token="";for(const byte of randomBytes){token+=byte.toString(16).padStart(2,"0")}const device=await new DeviceModel(this.c).
|
|
1
|
+
import{and,eq,gt}from"drizzle-orm";import{getCookie}from"hono/cookie";import{deleteAuthCookie,setAuthCookie}from"../lib/auth-cookie.js";import{core_sessions}from"../../database/sessions.js";import{DeviceModel}from"./device.js";import{reviveSessionUser,sessionCacheKey,sessionCacheTtl}from"./session-cache.js";import{UserModel}from"./user.js";export class SessionModel{constructor(c){this.c=c}c;async hashToken(token){const encoder=new TextEncoder;const data=encoder.encode(token);const hashBuffer=await crypto.subtle.digest("SHA-256",data);const bytes=new Uint8Array(hashBuffer);let result="";for(const byte of bytes){result+=byte.toString(16).padStart(2,"0")}return result}async createSessionByUserId(userId){const randomBytes=new Uint8Array(64);crypto.getRandomValues(randomBytes);let token="";for(const byte of randomBytes){token+=byte.toString(16).padStart(2,"0")}const device=await new DeviceModel(this.c).getOrCreateDeviceId();const hashedToken=await this.hashToken(token);await this.c.get("db").insert(core_sessions).values({token:hashedToken,userId,expiresAt:new Date(Date.now()+this.c.get("core").authorization.cookie_expires),deviceId:device.id});setAuthCookie(this.c,this.c.get("core").authorization.cookieName,token,{expires:this.c.get("core").authorization.cookie_expires>0?new Date(Date.now()+this.c.get("core").authorization.cookie_expires):undefined});return{token}}async deleteSession(){const token=getCookie(this.c,this.c.get("core").authorization.cookieName);const device=await new DeviceModel(this.c).getExistingDeviceId();if(!(token&&device?.id)){deleteAuthCookie(this.c,this.c.get("core").authorization.cookieName);return}const hashedToken=await this.hashToken(token);await this.c.get("db").delete(core_sessions).where(and(eq(core_sessions.token,hashedToken),eq(core_sessions.deviceId,device.id)));await this.c.get("cache").deleteSystem(sessionCacheKey(hashedToken,device.id));deleteAuthCookie(this.c,this.c.get("core").authorization.cookieName)}async getUser(){const token=getCookie(this.c,this.c.get("core").authorization.cookieName);if(!token)return null;const device=await new DeviceModel(this.c).getExistingDeviceId();if(!device)return null;const hashedToken=await this.hashToken(token);const cache=this.c.get("cache");const cacheKey=sessionCacheKey(hashedToken,device.id);const cached=await cache.getSystem(cacheKey);if(cached)return reviveSessionUser(cached);const[session]=await this.c.get("db").select({userId:core_sessions.userId,expiresAt:core_sessions.expiresAt}).from(core_sessions).where(and(eq(core_sessions.token,hashedToken),eq(core_sessions.deviceId,device.id),gt(core_sessions.expiresAt,new Date))).limit(1);if(!session){deleteAuthCookie(this.c,this.c.get("core").authorization.cookieName);return null}const user=await new UserModel().getUserById({id:session.userId,c:this.c});if(!user)return null;const ttl=sessionCacheTtl(session.expiresAt);if(ttl>0)await cache.setSystem(cacheKey,user,ttl);return user}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso.d.ts","sourceRoot":"","sources":["../../../../src/api/models/sso.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"sso.d.ts","sourceRoot":"","sources":["../../../../src/api/models/sso.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAgBpC,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,SAAS,EAAE,CAAC,IAAI,EAAE;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,WACgB,CAAC;AAE5D,qBAAa,QAAQ;gBACP,CAAC,EAAE,OAAO;IAKtB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IAEzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CA6BzB;IAEI,QAAQ,CAAC,EACb,IAAI,EACJ,UAAU,EACV,KAAK,GACN,EAAE;QACD,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAgEI,YAAY;IAuBZ,MAAM,CAAC,UAAU,EAAE,MAAM;IASzB,WAAW,CAAC,KAAK,EAAE,MAAM;CA+BhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{and,eq}from"drizzle-orm";import{getCookie}from"hono/cookie";import{HTTPException}from"hono/http-exception";import crypto from"node:crypto";import{deleteAuthCookie,setAuthCookie}from"../lib/auth-cookie.js";import{core_users,core_users_sso}from"../../database/users.js";import{CONFIG}from"../../lib/config.js";import{removeSpecialCharacters}from"../../lib/special-characters.js";import{UserModel}from"./user.js";export const getRedirectUri=code=>new URL(`${CONFIG.web.href}login/sso/${code}`).toString();export class SSOModel{constructor(c){this.c=c;this.plugins=c.get("core").authorization.ssoAdapters}c;plugins;signUpUser=async({providerId,user,c})=>{const data=await new UserModel().signUp({email:user.email,name:removeSpecialCharacters(user.username,false),newsletter:false,hashedPassword:undefined},c);await c.get("db").insert(core_users_sso).values({userId:data.id,providerId:providerId,providerAccountId:user.id});return{userId:data.id}};async callback({code,providerId,state}){await this.verifyState(state);const provider=this.plugins.find(p=>p.id===providerId);if(!provider){throw new HTTPException(404)}const ssoToken=await provider.fetchToken(code);const
|
|
1
|
+
import{and,eq}from"drizzle-orm";import{getCookie}from"hono/cookie";import{HTTPException}from"hono/http-exception";import crypto from"node:crypto";import{deleteAuthCookie,setAuthCookie}from"../lib/auth-cookie.js";import{matchesEmail,pickAccountForEmail}from"../lib/user-email-lookup.js";import{core_users,core_users_sso}from"../../database/users.js";import{CONFIG}from"../../lib/config.js";import{normalizeEmailAddress}from"../../lib/email-canonical.js";import{removeSpecialCharacters}from"../../lib/special-characters.js";import{UserModel}from"./user.js";export const getRedirectUri=code=>new URL(`${CONFIG.web.href}login/sso/${code}`).toString();export class SSOModel{constructor(c){this.c=c;this.plugins=c.get("core").authorization.ssoAdapters}c;plugins;signUpUser=async({providerId,user,c})=>{const data=await new UserModel().signUp({email:user.email,name:removeSpecialCharacters(user.username,false),newsletter:false,hashedPassword:undefined},c);await c.get("db").insert(core_users_sso).values({userId:data.id,providerId:providerId,providerAccountId:user.id});return{userId:data.id}};async callback({code,providerId,state}){await this.verifyState(state);const provider=this.plugins.find(p=>p.id===providerId);if(!provider){throw new HTTPException(404)}const ssoToken=await provider.fetchToken(code);const userFromProvider=await provider.fetchUser(ssoToken);const userFromSSO={...userFromProvider,email:normalizeEmailAddress(userFromProvider.email)};return await this.c.get("db").transaction(async tx=>{const[dataSSOFromDb]=await tx.select({userId:core_users_sso.userId}).from(core_users_sso).leftJoin(core_users,eq(core_users.id,core_users_sso.userId)).where(and(eq(core_users_sso.providerId,providerId),eq(core_users_sso.providerAccountId,userFromSSO.id))).limit(1);if(!dataSSOFromDb){const accountsWithEmail=await tx.select({id:core_users.id,email:core_users.email}).from(core_users).where(matchesEmail(userFromSSO.email)).limit(2);const userWithEmail=pickAccountForEmail(accountsWithEmail,userFromSSO.email);if(!userWithEmail){const signUpUser=await this.signUpUser({providerId,user:userFromSSO,c:this.c});return signUpUser}throw new HTTPException(409,{message:"Email already exists"})}return{userId:dataSSOFromDb.userId}})}async encryptState(){const state=crypto.randomBytes(8).toString("hex");const encryptedState=await new Promise((resolve,reject)=>{const salt=crypto.randomBytes(4).toString("hex");crypto.scrypt(state,salt,16,(err,derivedKey)=>{if(err)reject(err);resolve(`${salt}:${derivedKey.toString("hex")}`)})});setAuthCookie(this.c,`${this.c.get("core").authorization.cookieName}--state-sso`,encryptedState);return state}async getUrl(providerId){const provider=this.plugins.find(p=>p.id===providerId);if(!provider){throw new HTTPException(404)}return provider.getUrl({state:await this.encryptState()})}async verifyState(state){const storedState=getCookie(this.c,`${this.c.get("core").authorization.cookieName}--state-sso`);if(!storedState){throw new HTTPException(400,{message:"Invalid state"})}const isValid=await new Promise((resolve,reject)=>{const[salt,storedHash]=storedState.split(":");crypto.scrypt(state,salt,16,(err,derivedKey)=>{if(err)reject(err);resolve(storedHash===derivedKey.toString("hex"))})});if(!isValid){throw new HTTPException(400,{message:"Invalid state"})}deleteAuthCookie(this.c,`${this.c.get("core").authorization.cookieName}--state-sso`)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/api/models/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA2BpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,UAAU,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC;IAExB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAcD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,oBAAoB;IAEnC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC;IAEX,MAAM,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;CACxB;AAYD,qBAAa,8BAA+B,SAAQ,aAAa;gBACnD,OAAO,EAAE,MAAM;CAK5B;AA8ED,qBAAa,YAAY;gBACX,CAAC,EAAE,OAAO;IAItB,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;YAMhB,YAAY;IA6F1B,OAAO,CAAC,eAAe;IAYjB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwClC,UAAU,CACd,EAAE,EAAE,MAAM,EACV,EAAE,KAAa,EAAE,OAAO,EAAE,GAAE,wBAA6B,GACxD,OAAO,CAAC,IAAI,CAAC;IAyDhB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIrB,MAAM,CAAC,EACX,gBAAgB,EAChB,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,EAAE,oBAAoB,GAAG,OAAO,CAAC,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/api/models/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA2BpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,UAAU,EAAE,IAAI,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC;IAExB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAcD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,oBAAoB;IAEnC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC;IAEX,MAAM,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;CACxB;AAYD,qBAAa,8BAA+B,SAAQ,aAAa;gBACnD,OAAO,EAAE,MAAM;CAK5B;AA8ED,qBAAa,YAAY;gBACX,CAAC,EAAE,OAAO;IAItB,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;YAMhB,YAAY;IA6F1B,OAAO,CAAC,eAAe;IAYjB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwClC,UAAU,CACd,EAAE,EAAE,MAAM,EACV,EAAE,KAAa,EAAE,OAAO,EAAE,GAAE,wBAA6B,GACxD,OAAO,CAAC,IAAI,CAAC;IAyDhB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIrB,MAAM,CAAC,EACX,gBAAgB,EAChB,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,EAAE,oBAAoB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAgG3D"}
|