From 10efd1647c9cc3e83b247d4879587d9d74d80b16 Mon Sep 17 00:00:00 2001 From: Elias Schneider Date: Fri, 2 Oct 2026 20:01:44 +0200 Subject: [PATCH] chore: upgrade to SvelteKit 3 --- .github/workflows/svelte-check.yml | 4 +- AGENTS.md | 7 +- frontend/components.json | 10 +- frontend/package.json | 13 +- frontend/src/app.d.ts | 1 - frontend/src/hooks.client.ts | 23 +- .../src/lib/components/api-access-cell.svelte | 2 +- .../components/api-permissions-modal.svelte | 20 +- .../src/lib/components/audit-log-list.svelte | 14 +- .../lib/components/collapsible-card.svelte | 4 +- .../confirm-dialog/confirm-dialog.svelte | 2 +- .../lib/components/confirm-dialog/index.ts | 2 +- .../lib/components/copy-to-clipboard.svelte | 4 +- .../email-verification-state-box.svelte | 22 +- frontend/src/lib/components/error.svelte | 4 +- .../form/auto-complete-input.svelte | 4 +- .../form/custom-claims-input.svelte | 12 +- .../lib/components/form/date-picker.svelte | 10 +- .../lib/components/form/duration-input.svelte | 12 +- .../src/lib/components/form/file-input.svelte | 6 +- .../src/lib/components/form/form-input.svelte | 12 +- .../lib/components/form/multi-select.svelte | 6 +- .../form/profile-picture-settings.svelte | 14 +- .../form/searchable-multi-select.svelte | 14 +- .../components/form/searchable-select.svelte | 12 +- .../components/form/switch-with-label.svelte | 6 +- .../lib/components/form/url-list-input.svelte | 6 +- .../components/form/user-group-input.svelte | 6 +- .../components/header/header-avatar.svelte | 14 +- .../src/lib/components/header/header.svelte | 4 +- .../components/header/mode-switcher.svelte | 6 +- frontend/src/lib/components/image-box.svelte | 2 +- .../src/lib/components/login-wrapper.svelte | 9 +- frontend/src/lib/components/logo.svelte | 8 +- .../lib/components/navigation-progress.svelte | 2 +- .../lib/components/oidc-client-avatar.svelte | 8 +- .../lib/components/one-time-link-modal.svelte | 22 +- .../src/lib/components/passkey-row.svelte | 8 +- .../src/lib/components/qrcode/qrcode.svelte | 2 +- frontend/src/lib/components/scope-item.svelte | 2 +- frontend/src/lib/components/scope-list.svelte | 6 +- frontend/src/lib/components/sidebar.svelte | 6 +- .../lib/components/signup/signup-form.svelte | 14 +- .../signup/signup-token-list-modal.svelte | 20 +- .../signup/signup-token-modal.svelte | 28 +- .../advanced-table-column-selection.svelte | 8 +- .../table/advanced-table-filter.svelte | 14 +- .../table/advanced-table-toolbar.svelte | 10 +- .../components/table/advanced-table.svelte | 28 +- .../alert-dialog/alert-dialog-action.svelte | 4 +- .../alert-dialog/alert-dialog-cancel.svelte | 4 +- .../alert-dialog/alert-dialog-content.svelte | 2 +- .../alert-dialog-description.svelte | 2 +- .../alert-dialog/alert-dialog-footer.svelte | 2 +- .../alert-dialog/alert-dialog-header.svelte | 2 +- .../ui/alert-dialog/alert-dialog-media.svelte | 2 +- .../alert-dialog/alert-dialog-overlay.svelte | 2 +- .../ui/alert-dialog/alert-dialog-title.svelte | 2 +- .../components/ui/alert/alert-action.svelte | 2 +- .../ui/alert/alert-description.svelte | 2 +- .../components/ui/alert/alert-title.svelte | 2 +- .../src/lib/components/ui/alert/alert.svelte | 2 +- .../components/ui/avatar/avatar-badge.svelte | 2 +- .../ui/avatar/avatar-fallback.svelte | 2 +- .../ui/avatar/avatar-group-count.svelte | 2 +- .../components/ui/avatar/avatar-group.svelte | 2 +- .../components/ui/avatar/avatar-image.svelte | 2 +- .../lib/components/ui/avatar/avatar.svelte | 2 +- .../src/lib/components/ui/badge/badge.svelte | 2 +- .../button-group-separator.svelte | 4 +- .../ui/button-group/button-group-text.svelte | 2 +- .../ui/button-group/button-group.svelte | 2 +- .../lib/components/ui/button/button.svelte | 4 +- .../ui/calendar/calendar-cell.svelte | 2 +- .../ui/calendar/calendar-day.svelte | 2 +- .../ui/calendar/calendar-grid-body.svelte | 2 +- .../ui/calendar/calendar-grid-head.svelte | 2 +- .../ui/calendar/calendar-grid-row.svelte | 2 +- .../ui/calendar/calendar-grid.svelte | 2 +- .../ui/calendar/calendar-head-cell.svelte | 2 +- .../ui/calendar/calendar-header.svelte | 2 +- .../ui/calendar/calendar-heading.svelte | 2 +- .../ui/calendar/calendar-month-select.svelte | 2 +- .../ui/calendar/calendar-month.svelte | 2 +- .../ui/calendar/calendar-months.svelte | 2 +- .../ui/calendar/calendar-nav.svelte | 2 +- .../ui/calendar/calendar-next-button.svelte | 4 +- .../ui/calendar/calendar-prev-button.svelte | 4 +- .../ui/calendar/calendar-year-select.svelte | 2 +- .../components/ui/calendar/calendar.svelte | 4 +- .../lib/components/ui/card/card-action.svelte | 2 +- .../components/ui/card/card-content.svelte | 2 +- .../ui/card/card-description.svelte | 2 +- .../lib/components/ui/card/card-footer.svelte | 2 +- .../lib/components/ui/card/card-header.svelte | 2 +- .../lib/components/ui/card/card-title.svelte | 2 +- .../src/lib/components/ui/card/card.svelte | 2 +- .../components/ui/checkbox/checkbox.svelte | 2 +- .../ui/command/command-dialog.svelte | 4 +- .../ui/command/command-empty.svelte | 2 +- .../ui/command/command-group.svelte | 2 +- .../ui/command/command-input.svelte | 4 +- .../components/ui/command/command-item.svelte | 2 +- .../ui/command/command-link-item.svelte | 2 +- .../components/ui/command/command-list.svelte | 2 +- .../ui/command/command-separator.svelte | 2 +- .../ui/command/command-shortcut.svelte | 2 +- .../lib/components/ui/command/command.svelte | 2 +- .../ui/dialog/dialog-content.svelte | 4 +- .../ui/dialog/dialog-description.svelte | 2 +- .../components/ui/dialog/dialog-footer.svelte | 4 +- .../components/ui/dialog/dialog-header.svelte | 2 +- .../ui/dialog/dialog-overlay.svelte | 2 +- .../components/ui/dialog/dialog-title.svelte | 2 +- .../dropdown-menu-checkbox-item.svelte | 2 +- .../dropdown-menu-content.svelte | 2 +- .../dropdown-menu-group-heading.svelte | 2 +- .../dropdown-menu/dropdown-menu-item.svelte | 2 +- .../dropdown-menu/dropdown-menu-label.svelte | 2 +- .../dropdown-menu-radio-item.svelte | 2 +- .../dropdown-menu-separator.svelte | 2 +- .../dropdown-menu-shortcut.svelte | 2 +- .../dropdown-menu-sub-content.svelte | 2 +- .../dropdown-menu-sub-trigger.svelte | 2 +- .../components/ui/empty/empty-content.svelte | 2 +- .../ui/empty/empty-description.svelte | 2 +- .../components/ui/empty/empty-header.svelte | 2 +- .../components/ui/empty/empty-media.svelte | 2 +- .../components/ui/empty/empty-title.svelte | 2 +- .../src/lib/components/ui/empty/empty.svelte | 2 +- .../components/ui/field/field-content.svelte | 2 +- .../ui/field/field-description.svelte | 2 +- .../components/ui/field/field-error.svelte | 2 +- .../components/ui/field/field-group.svelte | 2 +- .../components/ui/field/field-label.svelte | 4 +- .../components/ui/field/field-legend.svelte | 2 +- .../ui/field/field-separator.svelte | 4 +- .../lib/components/ui/field/field-set.svelte | 2 +- .../components/ui/field/field-title.svelte | 2 +- .../src/lib/components/ui/field/field.svelte | 2 +- .../lib/components/ui/form/form-button.svelte | 7 - .../ui/form/form-description.svelte | 17 - .../ui/form/form-element-field.svelte | 24 - .../ui/form/form-field-errors.svelte | 30 - .../lib/components/ui/form/form-field.svelte | 24 - .../components/ui/form/form-fieldset.svelte | 15 - .../lib/components/ui/form/form-label.svelte | 24 - .../lib/components/ui/form/form-legend.svelte | 16 - frontend/src/lib/components/ui/form/index.ts | 33 - .../ui/input-group/input-group-addon.svelte | 2 +- .../ui/input-group/input-group-button.svelte | 4 +- .../ui/input-group/input-group-input.svelte | 4 +- .../ui/input-group/input-group-text.svelte | 2 +- .../input-group/input-group-textarea.svelte | 4 +- .../ui/input-group/input-group.svelte | 2 +- .../ui/input-otp/input-otp-group.svelte | 2 +- .../ui/input-otp/input-otp-separator.svelte | 4 +- .../ui/input-otp/input-otp-slot.svelte | 2 +- .../components/ui/input-otp/input-otp.svelte | 2 +- .../src/lib/components/ui/input/input.svelte | 2 +- .../components/ui/item/item-actions.svelte | 2 +- .../components/ui/item/item-content.svelte | 2 +- .../ui/item/item-description.svelte | 2 +- .../lib/components/ui/item/item-footer.svelte | 2 +- .../lib/components/ui/item/item-group.svelte | 2 +- .../lib/components/ui/item/item-header.svelte | 2 +- .../lib/components/ui/item/item-media.svelte | 2 +- .../components/ui/item/item-separator.svelte | 4 +- .../lib/components/ui/item/item-title.svelte | 2 +- .../src/lib/components/ui/item/item.svelte | 2 +- .../src/lib/components/ui/label/label.svelte | 2 +- .../ui/pagination/pagination-content.svelte | 2 +- .../ui/pagination/pagination-ellipsis.svelte | 2 +- .../ui/pagination/pagination-item.svelte | 2 +- .../ui/pagination/pagination-link.svelte | 4 +- .../pagination/pagination-next-button.svelte | 2 +- .../ui/pagination/pagination-next.svelte | 4 +- .../pagination/pagination-prev-button.svelte | 2 +- .../ui/pagination/pagination-previous.svelte | 4 +- .../ui/pagination/pagination.svelte | 2 +- .../ui/popover/popover-content.svelte | 2 +- .../ui/popover/popover-description.svelte | 2 +- .../ui/popover/popover-header.svelte | 2 +- .../ui/popover/popover-title.svelte | 2 +- .../ui/popover/popover-trigger.svelte | 2 +- .../ui/radio-group/radio-group-item.svelte | 2 +- .../ui/radio-group/radio-group.svelte | 2 +- .../scroll-area/scroll-area-scrollbar.svelte | 2 +- .../ui/scroll-area/scroll-area.svelte | 2 +- .../ui/select/select-content.svelte | 4 +- .../ui/select/select-group-heading.svelte | 2 +- .../components/ui/select/select-group.svelte | 2 +- .../components/ui/select/select-item.svelte | 2 +- .../components/ui/select/select-label.svelte | 2 +- .../select/select-scroll-down-button.svelte | 2 +- .../ui/select/select-scroll-up-button.svelte | 2 +- .../ui/select/select-separator.svelte | 4 +- .../ui/select/select-trigger.svelte | 2 +- .../components/ui/separator/separator.svelte | 2 +- .../components/ui/skeleton/skeleton.svelte | 2 +- .../lib/components/ui/spinner/spinner.svelte | 2 +- .../lib/components/ui/switch/switch.svelte | 2 +- .../lib/components/ui/table/table-body.svelte | 2 +- .../components/ui/table/table-caption.svelte | 2 +- .../lib/components/ui/table/table-cell.svelte | 2 +- .../components/ui/table/table-footer.svelte | 2 +- .../lib/components/ui/table/table-head.svelte | 2 +- .../components/ui/table/table-header.svelte | 2 +- .../lib/components/ui/table/table-row.svelte | 2 +- .../src/lib/components/ui/table/table.svelte | 2 +- .../components/ui/tabs/tabs-content.svelte | 2 +- .../lib/components/ui/tabs/tabs-list.svelte | 2 +- .../components/ui/tabs/tabs-trigger.svelte | 2 +- .../src/lib/components/ui/tabs/tabs.svelte | 12 +- .../components/ui/textarea/textarea.svelte | 2 +- .../lib/components/ui/toggle/toggle.svelte | 2 +- .../ui/tooltip/tooltip-content.svelte | 4 +- .../lib/components/unsaved-changes-bar.svelte | 12 +- .../components/user-group-selection.svelte | 10 +- frontend/src/lib/services/api-key-service.ts | 4 +- frontend/src/lib/services/api-service.ts | 2 +- frontend/src/lib/services/apis-service.ts | 6 +- .../src/lib/services/app-config-service.ts | 9 +- .../src/lib/services/audit-log-service.ts | 4 +- .../src/lib/services/custom-claim-service.ts | 2 +- .../src/lib/services/device-login-service.ts | 2 +- frontend/src/lib/services/oidc-service.ts | 10 +- frontend/src/lib/services/scim-service.ts | 2 +- .../src/lib/services/user-group-service.ts | 4 +- frontend/src/lib/services/user-service.ts | 14 +- frontend/src/lib/services/version-service.ts | 2 +- frontend/src/lib/services/webauthn-service.ts | 6 +- .../stores/application-configuration-store.ts | 6 +- .../stores/unsaved-changes-store.svelte.ts | 4 +- frontend/src/lib/stores/user-store.ts | 4 +- frontend/src/lib/types/oidc.type.ts | 2 +- frontend/src/lib/types/user.type.ts | 2 +- .../src/lib/utils/audit-log-translator.ts | 2 +- frontend/src/lib/utils/error-util.ts | 2 +- frontend/src/lib/utils/form-util.ts | 2 +- frontend/src/lib/utils/jwk-util.ts | 2 +- frontend/src/lib/utils/locale.util.ts | 2 +- frontend/src/lib/utils/redirection-util.ts | 2 +- frontend/src/lib/utils/tracing-util.ts | 2 +- .../lib/utils/unsaved-changes-util.svelte.ts | 6 +- frontend/src/lib/utils/zod-util.ts | 2 +- frontend/src/routes/+error.svelte | 7 +- frontend/src/routes/+layout.svelte | 20 +- frontend/src/routes/+layout.ts | 18 +- .../components/client-provider-images.svelte | 16 +- frontend/src/routes/device/+page.svelte | 34 +- frontend/src/routes/interaction/+page.svelte | 36 +- frontend/src/routes/interaction/+page.ts | 4 +- .../src/routes/interaction/error/+page.svelte | 6 +- frontend/src/routes/login/+page.svelte | 16 +- .../src/routes/login/alternative/+page.svelte | 10 +- .../login/alternative/code/+page.svelte | 22 +- .../login/alternative/device/+page.svelte | 24 +- .../login/alternative/email/+page.svelte | 14 +- .../login-logo-error-success-indicator.svelte | 6 +- frontend/src/routes/logout/+page.svelte | 18 +- frontend/src/routes/settings/+layout.svelte | 15 +- frontend/src/routes/settings/+layout.ts | 6 +- frontend/src/routes/settings/+page.ts | 4 +- .../src/routes/settings/account/+page.svelte | 26 +- frontend/src/routes/settings/account/+page.ts | 4 +- .../settings/account/account-form.svelte | 22 +- .../settings/account/locale-picker.svelte | 10 +- .../settings/account/passkey-list.svelte | 16 +- .../account/rename-passkey-modal.svelte | 18 +- .../settings/admin/api-keys/+page.svelte | 14 +- .../admin/api-keys/api-key-dialog.svelte | 10 +- .../admin/api-keys/api-key-form.svelte | 14 +- .../admin/api-keys/api-key-list.svelte | 14 +- .../admin/api-keys/renew-api-key-modal.svelte | 12 +- .../routes/settings/admin/apis/+page.svelte | 12 +- .../settings/admin/apis/[id]/+page.svelte | 12 +- .../routes/settings/admin/apis/[id]/+page.ts | 2 +- .../admin/apis/[id]/api-access-card.svelte | 10 +- .../apis/[id]/api-cimd-access-tab.svelte | 16 +- .../admin/apis/[id]/api-clients-tab.svelte | 26 +- .../apis/[id]/api-permissions-input.svelte | 8 +- .../apis/[id]/client-selection-modal.svelte | 16 +- .../settings/admin/apis/api-form.svelte | 16 +- .../settings/admin/apis/api-list.svelte | 14 +- .../application-configuration/+page.svelte | 14 +- .../admin/application-configuration/+page.ts | 2 +- .../application-image.svelte | 10 +- .../forms/accent-color-picker.svelte | 6 +- .../app-config-client-secrets-form.svelte | 12 +- .../app-config-dynamic-clients-form.svelte | 14 +- .../forms/app-config-email-form.svelte | 26 +- .../forms/app-config-general-form.svelte | 18 +- .../forms/app-config-ldap-form.svelte | 20 +- .../forms/app-config-passkeys-form.svelte | 16 +- .../app-config-signup-defaults-form.svelte | 16 +- .../forms/custom-accent-color-dialog.svelte | 12 +- .../update-application-images.svelte | 8 +- .../settings/admin/oidc-clients/+page.svelte | 16 +- .../admin/oidc-clients/[id]/+page.svelte | 26 +- .../settings/admin/oidc-clients/[id]/+page.ts | 6 +- .../oidc-clients/[id]/api-access-card.svelte | 26 +- .../[id]/api-selection-modal.svelte | 14 +- ...idc-client-allowed-user-groups-card.svelte | 20 +- ...oidc-client-connection-details-card.svelte | 14 +- ...c-client-federated-credentials-card.svelte | 12 +- .../[id]/oidc-client-secrets-card.svelte | 26 +- .../oidc-client-token-lifetimes-card.svelte | 12 +- .../[id]/scim-resource-provider-form.svelte | 22 +- .../federated-identities-input.svelte | 20 +- .../federated-identity-keys-input.svelte | 10 +- .../oidc-callback-url-input.svelte | 6 +- .../oidc-client-create-form.svelte | 22 +- .../oidc-clients/oidc-client-form.svelte | 28 +- .../oidc-client-image-input.svelte | 18 +- .../oidc-clients/oidc-client-list.svelte | 24 +- .../oidc-client-preview-modal.svelte | 32 +- .../settings/admin/user-groups/+page.svelte | 10 +- .../admin/user-groups/[id]/+page.svelte | 20 +- .../settings/admin/user-groups/[id]/+page.ts | 2 +- .../[id]/oidc-client-selection.svelte | 16 +- .../admin/user-groups/user-group-form.svelte | 18 +- .../admin/user-groups/user-group-list.svelte | 18 +- .../admin/user-groups/user-selection.svelte | 16 +- .../routes/settings/admin/users/+page.svelte | 20 +- .../src/routes/settings/admin/users/+page.ts | 2 +- .../settings/admin/users/[id]/+page.svelte | 30 +- .../routes/settings/admin/users/[id]/+page.ts | 2 +- .../users/[id]/admin-passkey-list.svelte | 16 +- .../admin/users/navigate-back-util.ts | 4 +- .../settings/admin/users/user-form.svelte | 28 +- .../settings/admin/users/user-list.svelte | 26 +- .../src/routes/settings/apps/+page.svelte | 22 +- frontend/src/routes/settings/apps/+page.ts | 4 +- .../apps/authorized-oidc-client-card.svelte | 22 +- .../routes/settings/audit-log/+page.svelte | 8 +- .../audit-log/audit-log-switcher.svelte | 4 +- .../settings/audit-log/global/+page.svelte | 16 +- frontend/src/routes/signup/+page.svelte | 20 +- .../routes/signup/add-passkey/+page.svelte | 14 +- frontend/src/routes/signup/setup/+page.svelte | 20 +- frontend/src/routes/signup/setup/+page.ts | 2 +- frontend/src/routes/verify-email/+page.ts | 4 +- frontend/svelte.config.js | 32 - frontend/tsconfig.json | 20 +- frontend/vite.config.ts | 19 +- pnpm-lock.yaml | 1479 +++++------------ tests/specs/scim.spec.ts | 1 + 348 files changed, 1705 insertions(+), 2474 deletions(-) delete mode 100644 frontend/src/lib/components/ui/form/form-button.svelte delete mode 100644 frontend/src/lib/components/ui/form/form-description.svelte delete mode 100644 frontend/src/lib/components/ui/form/form-element-field.svelte delete mode 100644 frontend/src/lib/components/ui/form/form-field-errors.svelte delete mode 100644 frontend/src/lib/components/ui/form/form-field.svelte delete mode 100644 frontend/src/lib/components/ui/form/form-fieldset.svelte delete mode 100644 frontend/src/lib/components/ui/form/form-label.svelte delete mode 100644 frontend/src/lib/components/ui/form/form-legend.svelte delete mode 100644 frontend/src/lib/components/ui/form/index.ts delete mode 100644 frontend/svelte.config.js diff --git a/.github/workflows/svelte-check.yml b/.github/workflows/svelte-check.yml index 2db0415a..fa98d2ce 100644 --- a/.github/workflows/svelte-check.yml +++ b/.github/workflows/svelte-check.yml @@ -8,7 +8,7 @@ on: - ".github/svelte-check-matcher.json" - "frontend/package.json" - "frontend/tsconfig.json" - - "frontend/svelte.config.js" + - "frontend/vite.config.ts" pull_request: branches: [main, breaking/**] paths: @@ -16,7 +16,7 @@ on: - ".github/svelte-check-matcher.json" - "frontend/package.json" - "frontend/tsconfig.json" - - "frontend/svelte.config.js" + - "frontend/vite.config.ts" workflow_dispatch: permissions: diff --git a/AGENTS.md b/AGENTS.md index d2c5b4ea..79cfd9b8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -54,10 +54,9 @@ cd ../.. && pnpm test # = playwright test in tests/ ## Frontend (SvelteKit) - **Svelte 5 runes only:** `$state`, `$derived`, `$props`, `$bindable`. No `export let`. Event - modifiers are gone — use `preventDefault` from `$lib/utils/event-util` (`onsubmit={preventDefault(fn)}`). -- **Forms:** use the custom `createForm(schema, initial)` from `$lib/utils/form-util.ts` with - `form-input.svelte`. The vendored shadcn formsnap/superforms wrappers exist but app forms don't - use them — match the surrounding file. Import zod as `import { z } from 'zod/v4'`. + modifiers are gone — use `preventDefault` from `#lib/utils/event-util.ts` (`onsubmit={preventDefault(fn)}`). +- **Forms:** use the custom `createForm(schema, initial)` from `#lib/utils/form-util.ts` with + `form-input.svelte` — match the surrounding file. Import zod as `import { z } from 'zod/v4'`. ## Coding Style Guidelines diff --git a/frontend/components.json b/frontend/components.json index cb523fda..082e8891 100644 --- a/frontend/components.json +++ b/frontend/components.json @@ -5,11 +5,11 @@ "baseColor": "neutral" }, "aliases": { - "components": "$lib/components", - "utils": "$lib/utils/style", - "ui": "$lib/components/ui", - "hooks": "$lib/hooks", - "lib": "$lib" + "components": "#lib/components", + "utils": "#lib/utils/style.ts", + "ui": "#lib/components/ui", + "hooks": "#lib/hooks", + "lib": "#lib" }, "typescript": true, "registry": "https://shadcn-svelte.com/registry", diff --git a/frontend/package.json b/frontend/package.json index 2fd902c0..794b7ecc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -27,7 +27,6 @@ "date-fns": "^4.2.1", "qrcode": "^1.5.4", "runed": "^0.37.1", - "sveltekit-superforms": "^2.30.1", "tailwind-merge": "^3.6.0", "zod": "^4.4.3" }, @@ -38,8 +37,8 @@ "@inlang/plugin-message-format": "^4.4.0", "@internationalized/date": "^3.12.1", "@lucide/svelte": "^1.16.0", - "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.60.1", + "@sveltejs/adapter-static": "^4.0.0", + "@sveltejs/kit": "^3.0.0", "@sveltejs/vite-plugin-svelte": "^7.1.2", "@types/node": "^25.9.0", "@types/qrcode": "^1.5.6", @@ -47,7 +46,6 @@ "eslint": "^10.4.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-svelte": "^3.17.1", - "formsnap": "^2.0.1", "globals": "^17.6.0", "mode-watcher": "^1.1.0", "prettier": "^3.8.3", @@ -56,8 +54,8 @@ "rollup": "^4.63.3", "rollup-plugin-sbom": "4.0.0", "shadcn-svelte": "^1.3.0", - "svelte": "^5.55.8", - "svelte-check": "^4.4.8", + "svelte": "^5.57.1", + "svelte-check": "^4.7.6", "svelte-sonner": "^1.1.1", "tailwind-variants": "^3.2.2", "tailwindcss": "^4.3.0", @@ -65,5 +63,8 @@ "typescript": "^6.0.3", "typescript-eslint": "^8.59.4", "vite": "^8.0.16" + }, + "imports": { + "#lib/*": "./src/lib/*" } } diff --git a/frontend/src/app.d.ts b/frontend/src/app.d.ts index 342b5eba..3f8acc34 100644 --- a/frontend/src/app.d.ts +++ b/frontend/src/app.d.ts @@ -4,7 +4,6 @@ declare global { namespace App { interface Error { message: string; - status?: number; } // interface Locals {} // interface PageData {} diff --git a/frontend/src/hooks.client.ts b/frontend/src/hooks.client.ts index 0e2a9f3f..d40119d3 100644 --- a/frontend/src/hooks.client.ts +++ b/frontend/src/hooks.client.ts @@ -1,21 +1,22 @@ -import type { HandleClientError } from '@sveltejs/kit'; +import type { HandleClientError } from '@sveltejs/kit/hooks'; import { isAxiosError } from 'axios'; -import { getAxiosErrorMessage, getAxiosErrorRequestId } from '$lib/utils/error-util'; +import { getAxiosErrorMessage, getAxiosErrorRequestId } from '#lib/utils/error-util.ts'; -export const handleError: HandleClientError = async ({ error, message, status }) => { +export const handleError: HandleClientError = ({ kind, error }) => { + // Preserve safe application and framework errors, including their status codes + if (kind !== 'unknown') return error; + + // Retain API error messages and request IDs for failed backend requests if (isAxiosError(error)) { - message = getAxiosErrorMessage(error, message); - status = error.response?.status || status; + const message = getAxiosErrorMessage(error); + const status = error.response?.status || 500; console.error( `Axios error: ${error.request?.path ?? 'unknown path'} - ${getAxiosErrorMessage(error, error.message)}`, { requestId: getAxiosErrorRequestId(error) } ); - } else { - console.error(error); + return { message, status }; } - return { - message, - status - }; + // Keep SvelteKit's generic response for unexpected errors while logging the cause + console.error(error); }; diff --git a/frontend/src/lib/components/api-access-cell.svelte b/frontend/src/lib/components/api-access-cell.svelte index 4973c76d..416aa42e 100644 --- a/frontend/src/lib/components/api-access-cell.svelte +++ b/frontend/src/lib/components/api-access-cell.svelte @@ -1,5 +1,5 @@ -{#if navigating.to} +{#if navigating.to && !navigating.shallow} {/if} diff --git a/frontend/src/lib/components/oidc-client-avatar.svelte b/frontend/src/lib/components/oidc-client-avatar.svelte index 53e2f92c..4ffef648 100644 --- a/frontend/src/lib/components/oidc-client-avatar.svelte +++ b/frontend/src/lib/components/oidc-client-avatar.svelte @@ -1,8 +1,8 @@ diff --git a/frontend/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte b/frontend/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte index 946a1870..d79f2be8 100644 --- a/frontend/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte +++ b/frontend/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte @@ -4,8 +4,8 @@ buttonVariants, type ButtonVariant, type ButtonSize - } from '$lib/components/ui/button/index.js'; - import { cn } from '$lib/utils/style.js'; + } from '#lib/components/ui/button/index.js'; + import { cn } from '#lib/utils/style.js'; let { ref = $bindable(null), diff --git a/frontend/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte b/frontend/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte index f3089db6..61f9f18f 100644 --- a/frontend/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte +++ b/frontend/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte @@ -4,8 +4,8 @@ buttonVariants, type ButtonVariant, type ButtonSize - } from '$lib/components/ui/button/index.js'; - import { cn } from '$lib/utils/style.js'; + } from '#lib/components/ui/button/index.js'; + import { cn } from '#lib/utils/style.js'; let { ref = $bindable(null), diff --git a/frontend/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte b/frontend/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte index 805a9331..7b43c00a 100644 --- a/frontend/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte +++ b/frontend/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte @@ -2,7 +2,7 @@ import { AlertDialog as AlertDialogPrimitive } from 'bits-ui'; import AlertDialogPortal from './alert-dialog-portal.svelte'; import AlertDialogOverlay from './alert-dialog-overlay.svelte'; - import { cn, type WithoutChild, type WithoutChildrenOrChild } from '$lib/utils/style.js'; + import { cn, type WithoutChild, type WithoutChildrenOrChild } from '#lib/utils/style.js'; import type { ComponentProps } from 'svelte'; let { diff --git a/frontend/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte b/frontend/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte index 3d6ede31..3930f40f 100644 --- a/frontend/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte +++ b/frontend/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte @@ -1,6 +1,6 @@ - -