From 1319a74967af8faf5c8cd4dd213c1b01b185648d Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Mon, 6 Jan 2025 18:07:30 -0800 Subject: [PATCH] Adding change password in settings. --- package.json | 12 +- pnpm-lock.yaml | 313 +++++++++--------- .../settings/{ => email}/update-email.dto.ts | 0 .../settings/{ => email}/verify-email.dto.ts | 0 .../settings/password/change-password.dto.ts | 10 + src/lib/server/api/users/users.controller.ts | 105 +++--- .../settings/account/+page.server.ts | 90 +++-- .../(protected)/settings/account/+page.svelte | 2 + .../settings/account/update-email-card.svelte | 13 +- .../account/update-password-card.svelte | 92 +++++ 10 files changed, 387 insertions(+), 250 deletions(-) rename src/lib/dtos/settings/{ => email}/update-email.dto.ts (100%) rename src/lib/dtos/settings/{ => email}/verify-email.dto.ts (100%) create mode 100644 src/lib/dtos/settings/password/change-password.dto.ts create mode 100644 src/routes/(app)/(protected)/settings/account/update-password-card.svelte diff --git a/package.json b/package.json index be49397..1e9dcfe 100644 --- a/package.json +++ b/package.json @@ -49,15 +49,15 @@ "@types/qrcode": "^1.5.5", "arctic": "^1.9.2", "autoprefixer": "^10.4.20", - "bits-ui": "1.0.0-next.76", - "bullmq": "^5.13.0", + "bits-ui": "1.0.0-next.77", + "bullmq": "^5.34.7", "clsx": "^2.1.1", "drizzle-kit": "^0.30.1", "formsnap": "^2.0.0", "lucide-svelte": "^0.469.0", "mode-watcher": "^0.5.0", "storybook": "^8.4.7", - "svelte": "^5.16.1", + "svelte": "^5.16.5", "svelte-check": "^4.0.0", "svelte-meta-tags": "^4.0.4", "svelte-preprocess": "^6.0.3", @@ -80,7 +80,7 @@ "@hono/swagger-ui": "^0.5.0", "@hono/zod-openapi": "^0.18.3", "@hono/zod-validator": "^0.4.2", - "@inlang/paraglide-sveltekit": "^0.15.3", + "@inlang/paraglide-sveltekit": "^0.15.4", "@internationalized/date": "^3.5.5", "@needle-di/core": "^0.8.4", "@oslojs/binary": "^1.0.0", @@ -94,13 +94,13 @@ "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.9", "@tailwindcss/typography": "^0.5.15", - "arctic": "^3.0.0", + "arctic": "^3.1.0", "argon2": "^0.41.1", "dayjs": "^1.11.13", "dotenv": "^16.4.7", "drizzle-orm": "^0.38.3", "drizzle-zod": "^0.6.1", - "hono": "^4.6.15", + "hono": "^4.6.16", "hono-pino": "^0.7.0", "hono-rate-limiter": "^0.4.2", "hono-zod-openapi": "^0.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae27d01..2f5f06a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,16 +10,16 @@ importers: dependencies: '@hono/swagger-ui': specifier: ^0.5.0 - version: 0.5.0(hono@4.6.15) + version: 0.5.0(hono@4.6.16) '@hono/zod-openapi': specifier: ^0.18.3 - version: 0.18.3(hono@4.6.15)(zod@3.24.1) + version: 0.18.3(hono@4.6.16)(zod@3.24.1) '@hono/zod-validator': specifier: ^0.4.2 - version: 0.4.2(hono@4.6.15)(zod@3.24.1) + version: 0.4.2(hono@4.6.16)(zod@3.24.1) '@inlang/paraglide-sveltekit': - specifier: ^0.15.3 - version: 0.15.3(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))) + specifier: ^0.15.4 + version: 0.15.4(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))) '@internationalized/date': specifier: ^3.5.5 version: 3.6.0 @@ -49,7 +49,7 @@ importers: version: 1.0.0 '@scalar/hono-api-reference': specifier: ^0.5.162 - version: 0.5.165(hono@4.6.15) + version: 0.5.165(hono@4.6.16) '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@3.4.17) @@ -60,8 +60,8 @@ importers: specifier: ^0.5.15 version: 0.5.15(tailwindcss@3.4.17) arctic: - specifier: ^3.0.0 - version: 3.0.0 + specifier: ^3.1.0 + version: 3.1.0 argon2: specifier: ^0.41.1 version: 0.41.1 @@ -78,17 +78,17 @@ importers: specifier: ^0.6.1 version: 0.6.1(drizzle-orm@0.38.3(@types/pg@8.11.10)(@types/react@19.0.2)(pg@8.13.1)(postgres@3.4.5)(react@18.3.1))(zod@3.24.1) hono: - specifier: ^4.6.15 - version: 4.6.15 + specifier: ^4.6.16 + version: 4.6.16 hono-pino: specifier: ^0.7.0 - version: 0.7.0(hono@4.6.15)(pino@9.6.0) + version: 0.7.0(hono@4.6.16)(pino@9.6.0) hono-rate-limiter: specifier: ^0.4.2 - version: 0.4.2(hono@4.6.15) + version: 0.4.2(hono@4.6.16) hono-zod-openapi: specifier: ^0.5.0 - version: 0.5.0(hono@4.6.15)(zod@3.24.1) + version: 0.5.0(hono@4.6.16)(zod@3.24.1) ioredis: specifier: ^5.4.2 version: 5.4.2 @@ -124,7 +124,7 @@ importers: version: 1.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) stoker: specifier: ^1.4.2 - version: 1.4.2(@asteasolutions/zod-to-openapi@7.3.0(zod@3.24.1))(@hono/zod-openapi@0.18.3(hono@4.6.15)(zod@3.24.1))(hono@4.6.15)(openapi3-ts@4.4.0) + version: 1.4.2(@asteasolutions/zod-to-openapi@7.3.0(zod@3.24.1))(@hono/zod-openapi@0.18.3(hono@4.6.16)(zod@3.24.1))(hono@4.6.16)(openapi3-ts@4.4.0) devDependencies: '@biomejs/biome': specifier: ^1.9.4 @@ -155,31 +155,31 @@ importers: version: 8.4.7(storybook@8.4.7) '@storybook/addon-svelte-csf': specifier: ^5.0.0-next.21 - version: 5.0.0-next.21(@storybook/svelte@8.4.7(storybook@8.4.7)(svelte@5.16.1))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(storybook@8.4.7)(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + version: 5.0.0-next.21(@storybook/svelte@8.4.7(storybook@8.4.7)(svelte@5.16.5))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(storybook@8.4.7)(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) '@storybook/blocks': specifier: ^8.4.7 version: 8.4.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.7) '@storybook/svelte': specifier: ^8.4.7 - version: 8.4.7(storybook@8.4.7)(svelte@5.16.1) + version: 8.4.7(storybook@8.4.7)(svelte@5.16.5) '@storybook/sveltekit': specifier: ^8.4.7 - version: 8.4.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(storybook@8.4.7)(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + version: 8.4.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(storybook@8.4.7)(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) '@storybook/test': specifier: ^8.4.7 version: 8.4.7(storybook@8.4.7) '@sveltejs/adapter-node': specifier: ^5.2.9 - version: 5.2.11(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))) + version: 5.2.11(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))) '@sveltejs/enhanced-img': specifier: ^0.4.4 - version: 0.4.4(rollup@4.29.1)(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + version: 0.4.4(rollup@4.29.1)(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) '@sveltejs/kit': specifier: ^2.15.1 - version: 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + version: 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + version: 5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) '@types/cookie': specifier: ^1.0.0 version: 1.0.0 @@ -199,11 +199,11 @@ importers: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.49) bits-ui: - specifier: 1.0.0-next.76 - version: 1.0.0-next.76(svelte@5.16.1) + specifier: 1.0.0-next.77 + version: 1.0.0-next.77(svelte@5.16.5) bullmq: - specifier: ^5.13.0 - version: 5.34.6 + specifier: ^5.34.7 + version: 5.34.7 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -212,40 +212,40 @@ importers: version: 0.30.1 formsnap: specifier: ^2.0.0 - version: 2.0.0(svelte@5.16.1)(sveltekit-superforms@2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.1)(typescript@5.7.2)) + version: 2.0.0(svelte@5.16.5)(sveltekit-superforms@2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.5)(typescript@5.7.2)) lucide-svelte: specifier: ^0.469.0 - version: 0.469.0(svelte@5.16.1) + version: 0.469.0(svelte@5.16.5) mode-watcher: specifier: ^0.5.0 - version: 0.5.0(svelte@5.16.1) + version: 0.5.0(svelte@5.16.5) storybook: specifier: ^8.4.7 version: 8.4.7 svelte: - specifier: ^5.16.1 - version: 5.16.1 + specifier: ^5.16.5 + version: 5.16.5 svelte-check: specifier: ^4.0.0 - version: 4.1.1(picomatch@4.0.2)(svelte@5.16.1)(typescript@5.7.2) + version: 4.1.1(picomatch@4.0.2)(svelte@5.16.5)(typescript@5.7.2) svelte-meta-tags: specifier: ^4.0.4 - version: 4.0.4(svelte@5.16.1)(typescript@5.7.2) + version: 4.0.4(svelte@5.16.5)(typescript@5.7.2) svelte-preprocess: specifier: ^6.0.3 - version: 6.0.3(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.16.1)(typescript@5.7.2) + version: 6.0.3(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.16.5)(typescript@5.7.2) svelte-sequential-preprocessor: specifier: ^2.0.2 version: 2.0.2 svelte-sonner: specifier: ^0.3.28 - version: 0.3.28(svelte@5.16.1) + version: 0.3.28(svelte@5.16.5) sveltekit-flash-message: specifier: ^2.4.4 - version: 2.4.4(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1) + version: 2.4.4(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5) sveltekit-superforms: specifier: ^2.22.1 - version: 2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.1)(typescript@5.7.2) + version: 2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.5)(typescript@5.7.2) tailwind-merge: specifier: ^2.6.0 version: 2.6.0 @@ -1471,17 +1471,17 @@ packages: resolution: {integrity: sha512-KEZQvED+eLidJ/U7VSE60ux7M+ctfvvxlqQ3pkaSNbRPeEYRSt/9e8aWMv9cHgEtqS62x2s0n7Ej+BF7uNSJyA==} hasBin: true - '@inlang/paraglide-sveltekit@0.15.3': - resolution: {integrity: sha512-/kw4TE7+COOEpqPryt3+g4aindV1N21FPEyeaVMwejh4cyZgVjLXDeZzNTvsfYLwjcAHkAkUPEEzPfZ8U5+Gcg==} + '@inlang/paraglide-sveltekit@0.15.4': + resolution: {integrity: sha512-SkhhitIdVYYEhy/uOec4X3m+ufzBwOrF/YLwoiaNPUSBvnUdyMTBeC5/MkDd9ztcm1ruJ/f56tX/GmJTgApBow==} hasBin: true peerDependencies: '@sveltejs/kit': ^2.4.3 - '@inlang/paraglide-unplugin@1.9.3': - resolution: {integrity: sha512-ddtHTqL6x7ySTSLX466oryznWdKNo44UZ8KcX1MtMxX6OO4SSecrIhMEX64sPjx8NpM0D03MmYnLMGV8Rf53Gw==} + '@inlang/paraglide-unplugin@1.9.4': + resolution: {integrity: sha512-8UPXNJSdJx8c5p2R85ITqEv9crPgcIJ3W7CsJRWhLHOU3g6FibXbwz98+25jTJJnadmhiQ+P+nZKNYJOFjcEDw==} - '@inlang/paraglide-vite@1.3.3': - resolution: {integrity: sha512-ZSvrGbPuvJZLeg9YKico5zMx3Rjeby7q6oSqBItcVmg5Sptu+ULe2H28C8HwHJL2fkVjiSCAkhWbop1kyf6tWw==} + '@inlang/paraglide-vite@1.3.4': + resolution: {integrity: sha512-6LqDU7ed7QzV5qBGcOfFhuvGZZ3s5RFBSHyItyh9G8+8XrpGGYIQ5LZfvgd2DAFs2Bzjlk5gRGXcfwc5W+wfYQ==} '@inlang/plugin-message-format@2.2.0': resolution: {integrity: sha512-6MJLExr3OLqbR8gCP4UEgNMgdaJFFCug2GLmFwid7Ana4kObnbCA33YN3m3eN8p+lmnv7zpfW7oeyTZXZLoptg==} @@ -2452,8 +2452,8 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - arctic@3.0.0: - resolution: {integrity: sha512-Od87d6wYenoExOHMmU0ss7ViXnNZpUhclemhf32OAYzpzQyXEz1clV/MlPEkBtpbukJ+ZVNuQdconuzW1tsh0w==} + arctic@3.1.0: + resolution: {integrity: sha512-g+EOL5+/DUm1aly4HD90L/bpg7ngDvjH65SvZn0MaUfPzuPxhzra7w3HP8f1tvDpSJqyzbI7l1L4Rvj9eqoOcg==} arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -2538,8 +2538,8 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bits-ui@1.0.0-next.76: - resolution: {integrity: sha512-BtTBlAQgdtA7l1V2EarM2QJlD8pkH4DAKACjCy4KMIVWMXdg15BGwALoXw1IWk4Xe4nCXI5Bz+lIB6nSgrzo6Q==} + bits-ui@1.0.0-next.77: + resolution: {integrity: sha512-IV0AyVEvsRkXv4s/fl4iea5E9W2b9EBf98s9mRMKMc1xHxM9MmtM2r6MZMqftHQ/c+gHTIt3A9EKuTlh7uay8w==} engines: {node: '>=18', pnpm: '>=8.7.0'} peerDependencies: svelte: ^5.11.0 @@ -2588,8 +2588,8 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bullmq@5.34.6: - resolution: {integrity: sha512-pRCYyO9RlkQWxdmKlrNnUthyFwurYXRYLVXD1YIx+nCCdhAOiHatD8FDHbsT/w2I31c0NWoMcfZiIGuipiF7Lg==} + bullmq@5.34.7: + resolution: {integrity: sha512-Z6nKi8skD9n5/ErddTngeeEd8dRvZCu8wgZqpeH9zK0DlyTxYKceTnkGab3FkA+U9mzlqa0z34ZKGMbn4GWdgQ==} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -3469,8 +3469,8 @@ packages: hono: ^4.6.10 zod: ^3.21.4 - hono@4.6.15: - resolution: {integrity: sha512-OiQwvAOAaI2JrABBH69z5rsctHDzFzIKJge0nYXgtzGJ0KftwLWcBXm1upJC23/omNRtnqM0gjRMbtXshPdqhQ==} + hono@4.6.16: + resolution: {integrity: sha512-iE6xOPwDYlfnZFwk6BfIMMIH4WZm3pPhz6rc1uJM/OPew0pjG5K6p8WTLaMBY1/szF/T0TaEjprMpwn16BA0NQ==} engines: {node: '>=16.9.0'} hookable@5.5.3: @@ -4716,8 +4716,8 @@ packages: resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} - svelte@5.16.1: - resolution: {integrity: sha512-FsA1OjAKMAFSDob6j/Tv2ZV9rY4SeqPd1WXQlQkFkePAozSHLp6tbkU9qa1xJ+uTRzMSM2Vx3USdsYZBXd3H3g==} + svelte@5.16.5: + resolution: {integrity: sha512-zTG45crJUGjNYQgmQ0YDxFJ7ge1O6ZwevPxGgGOxuMOXOQhcH9LC9GEx2JS9/BlkhxdsO8ETofQ76ouFwDVpCQ==} engines: {node: '>=18'} sveltedoc-parser@4.2.1: @@ -5811,20 +5811,20 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true - '@hono/swagger-ui@0.5.0(hono@4.6.15)': + '@hono/swagger-ui@0.5.0(hono@4.6.16)': dependencies: - hono: 4.6.15 + hono: 4.6.16 - '@hono/zod-openapi@0.18.3(hono@4.6.15)(zod@3.24.1)': + '@hono/zod-openapi@0.18.3(hono@4.6.16)(zod@3.24.1)': dependencies: '@asteasolutions/zod-to-openapi': 7.3.0(zod@3.24.1) - '@hono/zod-validator': 0.4.2(hono@4.6.15)(zod@3.24.1) - hono: 4.6.15 + '@hono/zod-validator': 0.4.2(hono@4.6.16)(zod@3.24.1) + hono: 4.6.16 zod: 3.24.1 - '@hono/zod-validator@0.4.2(hono@4.6.15)(zod@3.24.1)': + '@hono/zod-validator@0.4.2(hono@4.6.16)(zod@3.24.1)': dependencies: - hono: 4.6.15 + hono: 4.6.16 zod: 3.24.1 '@humanwhocodes/config-array@0.9.5': @@ -5964,36 +5964,37 @@ snapshots: - debug - supports-color - '@inlang/paraglide-sveltekit@0.15.3(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))': + '@inlang/paraglide-sveltekit@0.15.4(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))': dependencies: '@inlang/paraglide-js': 1.11.7 - '@inlang/paraglide-vite': 1.3.3 + '@inlang/paraglide-vite': 1.3.4 '@lix-js/client': 2.2.1 - '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) commander: 12.1.0 dedent: 1.5.1 devalue: 4.3.3 magic-string: 0.30.17 - svelte: 5.16.1 + svelte: 5.16.5 transitivePeerDependencies: - babel-plugin-macros - debug - supports-color - '@inlang/paraglide-unplugin@1.9.3': + '@inlang/paraglide-unplugin@1.9.4': dependencies: '@inlang/paraglide-js': 1.11.7 '@inlang/sdk': 0.36.4 '@lix-js/client': 2.2.1 + typescript: 5.7.2 unplugin: 1.16.0 transitivePeerDependencies: - babel-plugin-macros - debug - supports-color - '@inlang/paraglide-vite@1.3.3': + '@inlang/paraglide-vite@1.3.4': dependencies: - '@inlang/paraglide-unplugin': 1.9.3 + '@inlang/paraglide-unplugin': 1.9.4 transitivePeerDependencies: - babel-plugin-macros - debug @@ -6548,10 +6549,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.29.1': optional: true - '@scalar/hono-api-reference@0.5.165(hono@4.6.15)': + '@scalar/hono-api-reference@0.5.165(hono@4.6.16)': dependencies: '@scalar/types': 0.0.25 - hono: 4.6.15 + hono: 4.6.16 '@scalar/openapi-types@0.1.5': {} @@ -6654,20 +6655,20 @@ snapshots: storybook: 8.4.7 ts-dedent: 2.2.0 - '@storybook/addon-svelte-csf@5.0.0-next.21(@storybook/svelte@8.4.7(storybook@8.4.7)(svelte@5.16.1))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(storybook@8.4.7)(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': + '@storybook/addon-svelte-csf@5.0.0-next.21(@storybook/svelte@8.4.7(storybook@8.4.7)(svelte@5.16.5))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(storybook@8.4.7)(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': dependencies: '@storybook/csf': 0.1.13 '@storybook/docs-tools': 8.4.7(storybook@8.4.7) '@storybook/node-logger': 8.4.7(storybook@8.4.7) - '@storybook/svelte': 8.4.7(storybook@8.4.7)(svelte@5.16.1) + '@storybook/svelte': 8.4.7(storybook@8.4.7)(svelte@5.16.5) '@storybook/types': 8.4.7(storybook@8.4.7) - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) dedent: 1.5.3 es-toolkit: 1.31.0 esrap: 1.3.2 magic-string: 0.30.17 - svelte: 5.16.1 - svelte-ast-print: 0.4.2(svelte@5.16.1) + svelte: 5.16.5 + svelte-ast-print: 0.4.2(svelte@5.16.5) vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) zimmerframe: 1.1.2 transitivePeerDependencies: @@ -6767,16 +6768,16 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.4.7 - '@storybook/svelte-vite@8.4.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(storybook@8.4.7)(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': + '@storybook/svelte-vite@8.4.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(storybook@8.4.7)(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': dependencies: '@storybook/builder-vite': 8.4.7(storybook@8.4.7)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) - '@storybook/svelte': 8.4.7(storybook@8.4.7)(svelte@5.16.1) - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + '@storybook/svelte': 8.4.7(storybook@8.4.7)(svelte@5.16.5) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) magic-string: 0.30.17 storybook: 8.4.7 - svelte: 5.16.1 - svelte-preprocess: 5.1.4(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.16.1)(typescript@5.7.2) - svelte2tsx: 0.7.31(svelte@5.16.1)(typescript@5.7.2) + svelte: 5.16.5 + svelte-preprocess: 5.1.4(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.16.5)(typescript@5.7.2) + svelte2tsx: 0.7.31(svelte@5.16.5)(typescript@5.7.2) sveltedoc-parser: 4.2.1 ts-dedent: 2.2.0 typescript: 5.7.2 @@ -6793,7 +6794,7 @@ snapshots: - sugarss - supports-color - '@storybook/svelte@8.4.7(storybook@8.4.7)(svelte@5.16.1)': + '@storybook/svelte@8.4.7(storybook@8.4.7)(svelte@5.16.5)': dependencies: '@storybook/components': 8.4.7(storybook@8.4.7) '@storybook/global': 5.0.0 @@ -6801,21 +6802,21 @@ snapshots: '@storybook/preview-api': 8.4.7(storybook@8.4.7) '@storybook/theming': 8.4.7(storybook@8.4.7) storybook: 8.4.7 - svelte: 5.16.1 + svelte: 5.16.5 sveltedoc-parser: 4.2.1 ts-dedent: 2.2.0 type-fest: 2.19.0 transitivePeerDependencies: - supports-color - '@storybook/sveltekit@8.4.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(storybook@8.4.7)(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': + '@storybook/sveltekit@8.4.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(storybook@8.4.7)(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': dependencies: '@storybook/addon-actions': 8.4.7(storybook@8.4.7) '@storybook/builder-vite': 8.4.7(storybook@8.4.7)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) - '@storybook/svelte': 8.4.7(storybook@8.4.7)(svelte@5.16.1) - '@storybook/svelte-vite': 8.4.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(storybook@8.4.7)(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + '@storybook/svelte': 8.4.7(storybook@8.4.7)(svelte@5.16.5) + '@storybook/svelte-vite': 8.4.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(storybook@8.4.7)(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) storybook: 8.4.7 - svelte: 5.16.1 + svelte: 5.16.5 vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - '@babel/core' @@ -6850,29 +6851,29 @@ snapshots: dependencies: storybook: 8.4.7 - '@sveltejs/adapter-node@5.2.11(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))': + '@sveltejs/adapter-node@5.2.11(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))': dependencies: '@rollup/plugin-commonjs': 28.0.2(rollup@4.29.1) '@rollup/plugin-json': 6.1.0(rollup@4.29.1) '@rollup/plugin-node-resolve': 16.0.0(rollup@4.29.1) - '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) rollup: 4.29.1 - '@sveltejs/enhanced-img@0.4.4(rollup@4.29.1)(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/enhanced-img@0.4.4(rollup@4.29.1)(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': dependencies: magic-string: 0.30.17 sharp: 0.33.5 - svelte: 5.16.1 - svelte-parse-markup: 0.1.5(svelte@5.16.1) + svelte: 5.16.5 + svelte-parse-markup: 0.1.5(svelte@5.16.5) vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) vite-imagetools: 7.0.5(rollup@4.29.1) zimmerframe: 1.1.2 transitivePeerDependencies: - rollup - '@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -6884,27 +6885,27 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.0 - svelte: 5.16.1 + svelte: 5.16.5 tiny-glob: 0.2.9 vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) debug: 4.4.0 - svelte: 5.16.1 + svelte: 5.16.5 vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.16.1 + svelte: 5.16.5 vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) vitefu: 1.0.4(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) transitivePeerDependencies: @@ -7160,7 +7161,7 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - arctic@3.0.0: + arctic@3.1.0: dependencies: '@oslojs/crypto': 1.0.1 '@oslojs/encoding': 1.1.0 @@ -7242,15 +7243,15 @@ snapshots: binary-extensions@2.3.0: {} - bits-ui@1.0.0-next.76(svelte@5.16.1): + bits-ui@1.0.0-next.77(svelte@5.16.5): dependencies: '@floating-ui/core': 1.6.8 '@floating-ui/dom': 1.6.12 '@internationalized/date': 3.6.0 esm-env: 1.2.1 - runed: 0.22.0(svelte@5.16.1) - svelte: 5.16.1 - svelte-toolbelt: 0.7.0(svelte@5.16.1) + runed: 0.22.0(svelte@5.16.5) + svelte: 5.16.5 + svelte-toolbelt: 0.7.0(svelte@5.16.5) block-stream2@2.1.0: dependencies: @@ -7307,7 +7308,7 @@ snapshots: buffer-from@1.1.2: {} - bullmq@5.34.6: + bullmq@5.34.7: dependencies: cron-parser: 4.9.0 ioredis: 5.4.2 @@ -8069,11 +8070,11 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - formsnap@2.0.0(svelte@5.16.1)(sveltekit-superforms@2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.1)(typescript@5.7.2)): + formsnap@2.0.0(svelte@5.16.5)(sveltekit-superforms@2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.5)(typescript@5.7.2)): dependencies: - svelte: 5.16.1 - svelte-toolbelt: 0.5.0(svelte@5.16.1) - sveltekit-superforms: 2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.1)(typescript@5.7.2) + svelte: 5.16.5 + svelte-toolbelt: 0.5.0(svelte@5.16.5) + sveltekit-superforms: 2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.5)(typescript@5.7.2) forwarded@0.2.0: {} @@ -8190,24 +8191,24 @@ snapshots: help-me@5.0.0: {} - hono-pino@0.7.0(hono@4.6.15)(pino@9.6.0): + hono-pino@0.7.0(hono@4.6.16)(pino@9.6.0): dependencies: defu: 6.1.4 - hono: 4.6.15 + hono: 4.6.16 pino: 9.6.0 - hono-rate-limiter@0.4.2(hono@4.6.15): + hono-rate-limiter@0.4.2(hono@4.6.16): dependencies: - hono: 4.6.15 + hono: 4.6.16 - hono-zod-openapi@0.5.0(hono@4.6.15)(zod@3.24.1): + hono-zod-openapi@0.5.0(hono@4.6.16)(zod@3.24.1): dependencies: - '@hono/zod-validator': 0.4.2(hono@4.6.15)(zod@3.24.1) - hono: 4.6.15 + '@hono/zod-validator': 0.4.2(hono@4.6.16)(zod@3.24.1) + hono: 4.6.16 zod: 3.24.1 zod-openapi: 4.2.2(zod@3.24.1) - hono@4.6.15: {} + hono@4.6.16: {} hookable@5.5.3: {} @@ -8456,9 +8457,9 @@ snapshots: lru-cache@10.4.3: {} - lucide-svelte@0.469.0(svelte@5.16.1): + lucide-svelte@0.469.0(svelte@5.16.5): dependencies: - svelte: 5.16.1 + svelte: 5.16.5 luxon@3.5.0: {} @@ -8538,9 +8539,9 @@ snapshots: dependencies: minimist: 1.2.8 - mode-watcher@0.5.0(svelte@5.16.1): + mode-watcher@0.5.0(svelte@5.16.5): dependencies: - svelte: 5.16.1 + svelte: 5.16.5 mri@1.2.0: {} @@ -9048,15 +9049,15 @@ snapshots: dependencies: queue-microtask: 1.2.3 - runed@0.20.0(svelte@5.16.1): + runed@0.20.0(svelte@5.16.5): dependencies: esm-env: 1.2.1 - svelte: 5.16.1 + svelte: 5.16.5 - runed@0.22.0(svelte@5.16.1): + runed@0.22.0(svelte@5.16.5): dependencies: esm-env: 1.2.1 - svelte: 5.16.1 + svelte: 5.16.5 rusha@0.8.14: {} @@ -9251,13 +9252,13 @@ snapshots: std-env@3.8.0: {} - stoker@1.4.2(@asteasolutions/zod-to-openapi@7.3.0(zod@3.24.1))(@hono/zod-openapi@0.18.3(hono@4.6.15)(zod@3.24.1))(hono@4.6.15)(openapi3-ts@4.4.0): + stoker@1.4.2(@asteasolutions/zod-to-openapi@7.3.0(zod@3.24.1))(@hono/zod-openapi@0.18.3(hono@4.6.16)(zod@3.24.1))(hono@4.6.16)(openapi3-ts@4.4.0): dependencies: '@asteasolutions/zod-to-openapi': 7.3.0(zod@3.24.1) - hono: 4.6.15 + hono: 4.6.16 openapi3-ts: 4.4.0 optionalDependencies: - '@hono/zod-openapi': 0.18.3(hono@4.6.15)(zod@3.24.1) + '@hono/zod-openapi': 0.18.3(hono@4.6.16)(zod@3.24.1) storybook@8.4.7: dependencies: @@ -9330,51 +9331,51 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-ast-print@0.4.2(svelte@5.16.1): + svelte-ast-print@0.4.2(svelte@5.16.5): dependencies: esrap: 1.2.2 - svelte: 5.16.1 + svelte: 5.16.5 zimmerframe: 1.1.2 - svelte-check@4.1.1(picomatch@4.0.2)(svelte@5.16.1)(typescript@5.7.2): + svelte-check@4.1.1(picomatch@4.0.2)(svelte@5.16.5)(typescript@5.7.2): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 fdir: 6.4.2(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.16.1 + svelte: 5.16.5 typescript: 5.7.2 transitivePeerDependencies: - picomatch - svelte-meta-tags@4.0.4(svelte@5.16.1)(typescript@5.7.2): + svelte-meta-tags@4.0.4(svelte@5.16.5)(typescript@5.7.2): dependencies: schema-dts: 1.1.2(typescript@5.7.2) - svelte: 5.16.1 + svelte: 5.16.5 transitivePeerDependencies: - typescript - svelte-parse-markup@0.1.5(svelte@5.16.1): + svelte-parse-markup@0.1.5(svelte@5.16.5): dependencies: - svelte: 5.16.1 + svelte: 5.16.5 - svelte-preprocess@5.1.4(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.16.1)(typescript@5.7.2): + svelte-preprocess@5.1.4(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.16.5)(typescript@5.7.2): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 magic-string: 0.30.17 sorcery: 0.11.1 strip-indent: 3.0.0 - svelte: 5.16.1 + svelte: 5.16.5 optionalDependencies: postcss: 8.4.49 postcss-load-config: 4.0.2(postcss@8.4.49) typescript: 5.7.2 - svelte-preprocess@6.0.3(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.16.1)(typescript@5.7.2): + svelte-preprocess@6.0.3(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.16.5)(typescript@5.7.2): dependencies: - svelte: 5.16.1 + svelte: 5.16.5 optionalDependencies: postcss: 8.4.49 postcss-load-config: 4.0.2(postcss@8.4.49) @@ -9385,28 +9386,28 @@ snapshots: svelte: 4.2.19 tslib: 2.7.0 - svelte-sonner@0.3.28(svelte@5.16.1): + svelte-sonner@0.3.28(svelte@5.16.5): dependencies: - svelte: 5.16.1 + svelte: 5.16.5 - svelte-toolbelt@0.5.0(svelte@5.16.1): + svelte-toolbelt@0.5.0(svelte@5.16.5): dependencies: clsx: 2.1.1 style-to-object: 1.0.8 - svelte: 5.16.1 + svelte: 5.16.5 - svelte-toolbelt@0.7.0(svelte@5.16.1): + svelte-toolbelt@0.7.0(svelte@5.16.5): dependencies: clsx: 2.1.1 - runed: 0.20.0(svelte@5.16.1) + runed: 0.20.0(svelte@5.16.5) style-to-object: 1.0.8 - svelte: 5.16.1 + svelte: 5.16.5 - svelte2tsx@0.7.31(svelte@5.16.1)(typescript@5.7.2): + svelte2tsx@0.7.31(svelte@5.16.5)(typescript@5.7.2): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 5.16.1 + svelte: 5.16.5 typescript: 5.7.2 svelte@4.2.19: @@ -9426,7 +9427,7 @@ snapshots: magic-string: 0.30.17 periscopic: 3.1.0 - svelte@5.16.1: + svelte@5.16.5: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -9451,17 +9452,17 @@ snapshots: transitivePeerDependencies: - supports-color - sveltekit-flash-message@2.4.4(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1): + sveltekit-flash-message@2.4.4(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5): dependencies: - '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) - svelte: 5.16.1 + '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + svelte: 5.16.5 - sveltekit-superforms@2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.1)(typescript@5.7.2): + sveltekit-superforms@2.22.1(@sveltejs/kit@2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(@types/json-schema@7.0.15)(svelte@5.16.5)(typescript@5.7.2): dependencies: - '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.1)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/kit': 2.15.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.16.5)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) devalue: 5.1.1 memoize-weak: 1.0.2 - svelte: 5.16.1 + svelte: 5.16.5 ts-deepmerge: 7.0.2 optionalDependencies: '@exodus/schemasafe': 1.3.0 diff --git a/src/lib/dtos/settings/update-email.dto.ts b/src/lib/dtos/settings/email/update-email.dto.ts similarity index 100% rename from src/lib/dtos/settings/update-email.dto.ts rename to src/lib/dtos/settings/email/update-email.dto.ts diff --git a/src/lib/dtos/settings/verify-email.dto.ts b/src/lib/dtos/settings/email/verify-email.dto.ts similarity index 100% rename from src/lib/dtos/settings/verify-email.dto.ts rename to src/lib/dtos/settings/email/verify-email.dto.ts diff --git a/src/lib/dtos/settings/password/change-password.dto.ts b/src/lib/dtos/settings/password/change-password.dto.ts new file mode 100644 index 0000000..3388f2a --- /dev/null +++ b/src/lib/dtos/settings/password/change-password.dto.ts @@ -0,0 +1,10 @@ +import { refinePasswords } from '$lib/validations/account'; +import { z } from 'zod'; + +export const changePasswordDto = z.object({ + current_password: z.string({ required_error: 'Current Password is required' }), + new_password: z.string({ required_error: 'New Password is required' }), + confirm_password: z.string({ required_error: 'Confirm Password is required' }), +}); + +export type ChangePasswordDto = z.infer; diff --git a/src/lib/server/api/users/users.controller.ts b/src/lib/server/api/users/users.controller.ts index 2bbc3c3..3961d99 100644 --- a/src/lib/server/api/users/users.controller.ts +++ b/src/lib/server/api/users/users.controller.ts @@ -5,60 +5,65 @@ import { authState } from '../common/middleware/auth.middleware'; import { zValidator } from '@hono/zod-validator'; import { updateUserDto } from './dtos/update-user.dto'; import { EmailChangeRequestsService } from './email-change-requests/email-change-requests.service'; -import { updateEmailDto } from '$lib/dtos/settings/update-email.dto'; +import { updateEmailDto } from '$lib/dtos/settings/email/update-email.dto'; import { UsersRepository } from './users.repository'; -import { verifyEmailDto } from '$lib/dtos/settings/verify-email.dto'; +import { verifyEmailDto } from '$lib/dtos/settings/email/verify-email.dto'; import { rateLimit } from '../common/middleware/rate-limit.middleware'; +import { changePasswordDto } from '$lib/dtos/settings/password/change-password.dto'; +import { StatusCodes } from '$lib/constants/status-codes'; +import { SessionsService } from '../iam/sessions/sessions.service'; @injectable() export class UsersController extends Controller { - constructor( - private usersService = inject(UsersService), - private emailChangeRequestsService = inject(EmailChangeRequestsService), - private usersRepository = inject(UsersRepository) - ) { - super(); - } + constructor( + private usersService = inject(UsersService), + private emailChangeRequestsService = inject(EmailChangeRequestsService), + private sessionsService = inject(SessionsService), + private usersRepository = inject(UsersRepository), + ) { + super(); + } - routes() { - return this.controller - .get('/me', async (c) => { - const session = c.var.session; - const user = session ? await this.usersRepository.findOneByIdOrThrow(session.userId) : null; - c.var.logger.info(`Get user: ${JSON.stringify(user)}`); - return c.json(user); - }) - .patch('/me', authState('session'), zValidator('form', updateUserDto), async (c) => { - await this.usersService.update(c.var.session.userId, c.req.valid('form')); - const user = await this.usersRepository.findOneByIdOrThrow(c.var.session.id); - return c.json(user); - }) - .post( - '/me/email/request', - authState('session'), - zValidator('json', updateEmailDto), - rateLimit({ limit: 5, minutes: 15 }), - async (c) => { - c.var.logger.info(`Request email change: ${c.req.valid('json').email}`); - await this.emailChangeRequestsService.requestEmailChange( - c.var.session.userId, - c.req.valid('json').email - ); - return c.json({ message: 'Email change request sent' }); - } - ) - .post( - '/me/email/verify', - authState('session'), - zValidator('json', verifyEmailDto), - rateLimit({ limit: 5, minutes: 15 }), - async (c) => { - await this.emailChangeRequestsService.verifyEmailChange( - c.var.session.userId, - c.req.valid('json').code - ); - return c.json({ message: 'Email change request sent' }); - } - ); - } + routes() { + return this.controller + .get('/me', async (c) => { + const session = c.var.session; + const user = session ? await this.usersRepository.findOneByIdOrThrow(session.userId) : null; + c.var.logger.info(`Get user: ${JSON.stringify(user)}`); + return c.json(user); + }) + .patch('/me', authState('session'), zValidator('form', updateUserDto), async (c) => { + await this.usersService.update(c.var.session.userId, c.req.valid('form')); + const user = await this.usersRepository.findOneByIdOrThrow(c.var.session.id); + return c.json(user); + }) + .post('/me/email/request', authState('session'), zValidator('json', updateEmailDto), rateLimit({ limit: 5, minutes: 15 }), async (c) => { + c.var.logger.info(`Request email change: ${c.req.valid('json').email}`); + await this.emailChangeRequestsService.requestEmailChange(c.var.session.userId, c.req.valid('json').email); + return c.json({ message: 'Email change request sent' }); + }) + .post('/me/email/verify', authState('session'), zValidator('json', verifyEmailDto), rateLimit({ limit: 5, minutes: 15 }), async (c) => { + await this.emailChangeRequestsService.verifyEmailChange(c.var.session.userId, c.req.valid('json').code); + return c.json({ message: 'Email change request sent' }); + }) + .put('/me/password', authState('session'), zValidator('json', changePasswordDto), rateLimit({ limit: 5, minutes: 15 }), async (c) => { + const { current_password, new_password, confirm_password } = c.req.valid('json'); + if (new_password !== confirm_password) { + return c.json({ error: 'Passwords do not match' }, StatusCodes.UNPROCESSABLE_ENTITY); + } + try { + const correctPassword = await this.usersService.verifyPassword(c.var.session.userId, { password: current_password }); + if (!correctPassword) { + return c.json({ error: 'Unable to update password' }, StatusCodes.UNAUTHORIZED); + } + await this.usersService.updatePassword(c.var.session.userId, new_password); + await this.sessionsService.invalidateSession(''); + this.sessionsService.deleteSessionCookie(); + return c.json({ message: 'logout' }); + } catch (error) { + console.error('Error updating password', error); + return c.json({ error: 'Unable to update password' }, StatusCodes.INTERNAL_SERVER_ERROR); + } + }); + } } diff --git a/src/routes/(app)/(protected)/settings/account/+page.server.ts b/src/routes/(app)/(protected)/settings/account/+page.server.ts index 3d7bdc2..cf3a334 100644 --- a/src/routes/(app)/(protected)/settings/account/+page.server.ts +++ b/src/routes/(app)/(protected)/settings/account/+page.server.ts @@ -1,47 +1,71 @@ -import { zod } from "sveltekit-superforms/adapters"; -import { fail, setError, superValidate } from "sveltekit-superforms"; -import { StatusCodes } from "@/constants/status-codes.js"; -import { updateEmailDto } from "$lib/dtos/settings/update-email.dto.js"; -import { verifyEmailDto } from "$lib/dtos/settings/verify-email.dto.js"; -import { redirect } from "sveltekit-flash-message/server"; -import { notSignedInMessage } from "$lib/utils/flashMessages.js"; +import { zod } from 'sveltekit-superforms/adapters'; +import { fail, setError, superValidate } from 'sveltekit-superforms'; +import { StatusCodes } from '@/constants/status-codes.js'; +import { updateEmailDto } from '$lib/dtos/settings/email/update-email.dto.js'; +import { verifyEmailDto } from '$lib/dtos/settings/email/verify-email.dto.js'; +import { redirect } from 'sveltekit-flash-message/server'; +import { notSignedInMessage } from '$lib/utils/flashMessages.js'; +import { changePasswordDto } from '$lib/dtos/settings/password/change-password.dto'; export const load = async (event) => { - const { parent } = event; - const { authedUser } = await parent(); + const { parent } = event; + const { authedUser } = await parent(); if (!authedUser) { throw redirect('/login', notSignedInMessage, event); } - return { - updateEmailForm: await superValidate(zod(updateEmailDto), { - defaults: { - email: authedUser.email - } - }), - verifyEmailForm: await superValidate(zod(verifyEmailDto)) - }; + return { + updateEmailForm: await superValidate(zod(updateEmailDto), { + defaults: { + email: authedUser.email, + }, + }), + verifyEmailForm: await superValidate(zod(verifyEmailDto)), + changePasswordForm: await superValidate(zod(changePasswordDto)), + }; }; export const actions = { - updateEmail: async ({ request, locals }) => { - const updateEmailForm = await superValidate(request, zod(updateEmailDto)); - if (!updateEmailForm.valid) return fail(StatusCodes.BAD_REQUEST, { updateEmailForm }) - const { error } = await locals.api.users.me.email.request.$post({ json: updateEmailForm.data }).then(locals.parseApiResponse); - if (error) return setError(updateEmailForm, 'email', error); - return { updateEmailForm } - }, - verifyEmail: async ({ request, locals }) => { - const verifyEmailForm = await superValidate(request, zod(verifyEmailDto)); - console.log(verifyEmailForm) - if (!verifyEmailForm.valid) { - return fail(StatusCodes.BAD_REQUEST, { verifyEmailForm }); + updateEmail: async ({ request, locals }) => { + const updateEmailForm = await superValidate(request, zod(updateEmailDto)); + if (!updateEmailForm.valid) return fail(StatusCodes.BAD_REQUEST, { updateEmailForm }); + const { error } = await locals.api.users.me.email.request.$post({ json: updateEmailForm.data }).then(locals.parseApiResponse); + if (error) return setError(updateEmailForm, 'email', error); + return { updateEmailForm }; + }, + verifyEmail: async ({ request, locals }) => { + const verifyEmailForm = await superValidate(request, zod(verifyEmailDto)); + console.log(verifyEmailForm); + if (!verifyEmailForm.valid) { + return fail(StatusCodes.BAD_REQUEST, { verifyEmailForm }); + } + const { error } = await locals.api.users.me.email.verify.$post({ json: verifyEmailForm.data }).then(locals.parseApiResponse); + if (error) { + return setError(verifyEmailForm, 'code', error); + } + return { verifyEmailForm }; + }, + changePassword: async ({ request, locals }) => { + const changePasswordForm = await superValidate(request, zod(changePasswordDto)); + if (!changePasswordForm.valid) { + return fail(StatusCodes.BAD_REQUEST, { changePasswordForm }); } - const { error } = await locals.api.users.me.email.verify.$post({ json: verifyEmailForm.data }).then(locals.parseApiResponse); + + const { error } = await locals.api.users.me.password.$put({ json: changePasswordForm.data }).then(locals.parseApiResponse); + console.log('error', error); if (error) { - return setError(verifyEmailForm, 'code', error); + if (error.status === StatusCodes.UNPROCESSABLE_ENTITY) { + return setError(changePasswordForm, 'confirm_password', 'Confirm password does not match'); + } else if (error.status === StatusCodes.BAD_REQUEST) { + return setError(changePasswordForm, 'password', error.message); + } else if (error.status === StatusCodes.FORBIDDEN) { + return setError(changePasswordForm, 'password', error.message); + } else { + console.log('error', error); + return setError(changePasswordForm, 'password', error); + } } - return { verifyEmailForm } - } + return { changePasswordForm }; + }, }; diff --git a/src/routes/(app)/(protected)/settings/account/+page.svelte b/src/routes/(app)/(protected)/settings/account/+page.svelte index f1745ad..0c51c90 100644 --- a/src/routes/(app)/(protected)/settings/account/+page.svelte +++ b/src/routes/(app)/(protected)/settings/account/+page.svelte @@ -1,7 +1,9 @@ + diff --git a/src/routes/(app)/(protected)/settings/account/update-email-card.svelte b/src/routes/(app)/(protected)/settings/account/update-email-card.svelte index c3b65be..dcdf8ef 100644 --- a/src/routes/(app)/(protected)/settings/account/update-email-card.svelte +++ b/src/routes/(app)/(protected)/settings/account/update-email-card.svelte @@ -6,8 +6,9 @@ import { superForm } from 'sveltekit-superforms'; import * as Dialog from '@/components/ui/dialog'; import * as InputOTP from '$lib/components/ui/input-otp/index.js'; - import type { UpdateEmailDto } from '$lib/dtos/settings/update-email.dto'; - import type { VerifyEmailDto } from '$lib/dtos/settings/verify-email.dto'; + import { updateEmailDto, type UpdateEmailDto } from '$lib/dtos/settings/email/update-email.dto'; + import { verifyEmailDto, type VerifyEmailDto } from '$lib/dtos/settings/email/verify-email.dto'; + import { zodClient } from 'sveltekit-superforms/adapters'; /* ---------------------------------- props --------------------------------- */ let { updateEmailForm, verifyEmailForm }: { updateEmailForm: UpdateEmailDto; verifyEmailForm: VerifyEmailDto } = $props(); @@ -18,6 +19,7 @@ /* ---------------------------------- forms --------------------------------- */ const sf_updateEmailForm = superForm(updateEmailForm, { resetForm: false, + validators: zodClient(updateEmailDto), onUpdated: ({ form }) => { if (!form.valid) { return; @@ -27,6 +29,7 @@ }); const sf_verifyEmailForm = superForm(verifyEmailForm, { + validators: zodClient(verifyEmailDto), onUpdated: ({ form }) => { if (!form.valid) { return; @@ -59,7 +62,7 @@ {#snippet children({ props })} Email - + {/snippet} @@ -68,8 +71,8 @@ - - + submitEmailForm()}> + Submit diff --git a/src/routes/(app)/(protected)/settings/account/update-password-card.svelte b/src/routes/(app)/(protected)/settings/account/update-password-card.svelte new file mode 100644 index 0000000..55f7180 --- /dev/null +++ b/src/routes/(app)/(protected)/settings/account/update-password-card.svelte @@ -0,0 +1,92 @@ + + + + + Change Password + + +
+ + + {#snippet children({ props })} + Current Password + + {/snippet} + + + + + + + + {#snippet children({ props })} + New Password + + {/snippet} + + + + + + + + {#snippet children({ props })} + Confirm Password + + {/snippet} + + + + + + + Heads up! + Changing your password will log you out of the current session. + +
+
+ + changePasswordFormSubmit()}> + Submit + + +