From 3190e9601e346b4019810fe5952ed0f641fe1336 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Sun, 28 Jul 2024 18:39:42 -0700 Subject: [PATCH] Creating controllers, updating deps, and adding more repositories. --- package.json | 26 +- pnpm-lock.yaml | 900 +++++++++--------- .../server/api/controllers/iam.controller.ts | 5 +- .../api/controllers/login.controller.ts | 13 + .../api/controllers/signup.controller.ts | 0 .../server/api/controllers/user.controller.ts | 22 + src/lib/server/api/index.ts | 23 +- .../database/tables/users.table.ts | 4 +- .../server/api/providers/lucia.provider.ts | 15 +- .../api/repositories/users.repository.ts | 56 ++ .../server/api/services/hashing.service.ts | 32 + src/lib/server/api/services/iam.service.ts | 24 + .../api/services/login-requests.service.ts | 62 -- src/lib/server/api/services/mailer.service.ts | 104 ++ src/lib/server/api/services/queues.service.ts | 19 + src/lib/server/api/services/tokens.service.ts | 33 + 16 files changed, 799 insertions(+), 539 deletions(-) create mode 100644 src/lib/server/api/controllers/login.controller.ts create mode 100644 src/lib/server/api/controllers/signup.controller.ts create mode 100644 src/lib/server/api/controllers/user.controller.ts create mode 100644 src/lib/server/api/repositories/users.repository.ts create mode 100644 src/lib/server/api/services/hashing.service.ts create mode 100644 src/lib/server/api/services/iam.service.ts delete mode 100644 src/lib/server/api/services/login-requests.service.ts create mode 100644 src/lib/server/api/services/mailer.service.ts create mode 100644 src/lib/server/api/services/queues.service.ts create mode 100644 src/lib/server/api/services/tokens.service.ts diff --git a/package.json b/package.json index 63fa3e3..325c70e 100644 --- a/package.json +++ b/package.json @@ -25,17 +25,17 @@ "devDependencies": { "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.83.0", - "@playwright/test": "^1.45.2", + "@playwright/test": "^1.45.3", "@resvg/resvg-js": "^2.6.2", "@sveltejs/adapter-auto": "^3.2.2", - "@sveltejs/enhanced-img": "^0.3.0", + "@sveltejs/enhanced-img": "^0.3.1", "@sveltejs/kit": "^2.5.18", "@sveltejs/vite-plugin-svelte": "^3.1.1", "@types/cookie": "^0.6.0", - "@types/node": "^20.14.11", + "@types/node": "^20.14.13", "@types/pg": "^8.11.6", - "@typescript-eslint/eslint-plugin": "^7.16.1", - "@typescript-eslint/parser": "^7.16.1", + "@typescript-eslint/eslint-plugin": "^7.17.0", + "@typescript-eslint/parser": "^7.17.0", "autoprefixer": "^10.4.19", "drizzle-kit": "^0.23.0", "eslint": "^8.57.0", @@ -43,7 +43,7 @@ "eslint-plugin-svelte": "^2.43.0", "just-clone": "^6.2.0", "just-debounce-it": "^3.2.0", - "postcss": "^8.4.39", + "postcss": "^8.4.40", "postcss-import": "^16.1.0", "postcss-load-config": "^5.1.0", "postcss-preset-env": "^9.6.0", @@ -61,12 +61,12 @@ "sveltekit-flash-message": "^2.4.4", "sveltekit-rate-limiter": "^0.5.2", "sveltekit-superforms": "^2.16.1", - "tailwindcss": "^3.4.6", + "tailwindcss": "^3.4.7", "ts-node": "^10.9.2", "tslib": "^2.6.3", "tsx": "^4.16.2", - "typescript": "^5.5.3", - "vite": "^5.3.4", + "typescript": "^5.5.4", + "vite": "^5.3.5", "vitest": "^1.6.0", "zod": "^3.23.8" }, @@ -80,7 +80,7 @@ "@hono/zod-validator": "^0.2.2", "@iconify-icons/line-md": "^1.2.30", "@iconify-icons/mdi": "^1.2.48", - "@internationalized/date": "^3.5.4", + "@internationalized/date": "^3.5.5", "@lucia-auth/adapter-drizzle": "^1.0.7", "@lukeed/uuid": "^2.0.1", "@neondatabase/serverless": "^0.9.4", @@ -96,10 +96,10 @@ "cookie": "^0.6.0", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", - "drizzle-orm": "^0.32.0", + "drizzle-orm": "^0.32.1", "feather-icons": "^4.29.2", "formsnap": "^1.0.1", - "hono": "^4.5.0", + "hono": "^4.5.2", "hono-rate-limiter": "^0.4.0", "html-entities": "^2.5.2", "iconify-icon": "^2.1.0", @@ -122,6 +122,6 @@ "tailwind-merge": "^2.4.0", "tailwind-variants": "^0.2.1", "tailwindcss-animate": "^1.0.7", - "zod-to-json-schema": "^3.23.1" + "zod-to-json-schema": "^3.23.2" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d950581..f36d828 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 5.0.13 '@hono/zod-validator': specifier: ^0.2.2 - version: 0.2.2(hono@4.5.0)(zod@3.23.8) + version: 0.2.2(hono@4.5.2)(zod@3.23.8) '@iconify-icons/line-md': specifier: ^1.2.30 version: 1.2.30 @@ -21,8 +21,8 @@ importers: specifier: ^1.2.48 version: 1.2.48 '@internationalized/date': - specifier: ^3.5.4 - version: 3.5.4 + specifier: ^3.5.5 + version: 3.5.5 '@lucia-auth/adapter-drizzle': specifier: ^1.0.7 version: 1.0.7(lucia@3.2.0) @@ -37,7 +37,7 @@ importers: version: 2.2.2 '@sveltejs/adapter-vercel': specifier: ^5.4.1 - version: 5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))) + version: 5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))) '@types/feather-icons': specifier: ^4.29.4 version: 4.29.4 @@ -69,20 +69,20 @@ importers: specifier: ^11.0.6 version: 11.0.6 drizzle-orm: - specifier: ^0.32.0 - version: 0.32.0(@neondatabase/serverless@0.9.4)(@types/pg@8.11.6)(pg@8.12.0)(postgres@3.4.4) + specifier: ^0.32.1 + version: 0.32.1(@neondatabase/serverless@0.9.4)(@types/pg@8.11.6)(pg@8.12.0)(postgres@3.4.4) feather-icons: specifier: ^4.29.2 version: 4.29.2 formsnap: specifier: ^1.0.1 - version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)) + version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)) hono: - specifier: ^4.5.0 - version: 4.5.0 + specifier: ^4.5.2 + version: 4.5.2 hono-rate-limiter: specifier: ^0.4.0 - version: 0.4.0(hono@4.5.0) + version: 0.4.0(hono@4.5.2) html-entities: specifier: ^2.5.2 version: 2.5.2 @@ -142,13 +142,13 @@ importers: version: 2.4.0 tailwind-variants: specifier: ^0.2.1 - version: 0.2.1(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))) + version: 0.2.1(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))) + version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))) zod-to-json-schema: - specifier: ^3.23.1 - version: 3.23.1(zod@3.23.8) + specifier: ^3.23.2 + version: 3.23.2(zod@3.23.8) devDependencies: '@melt-ui/pp': specifier: ^0.3.2 @@ -157,41 +157,41 @@ importers: specifier: ^0.83.0 version: 0.83.0(svelte@5.0.0-next.175) '@playwright/test': - specifier: ^1.45.2 - version: 1.45.2 + specifier: ^1.45.3 + version: 1.45.3 '@resvg/resvg-js': specifier: ^2.6.2 version: 2.6.2 '@sveltejs/adapter-auto': specifier: ^3.2.2 - version: 3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))) + version: 3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))) '@sveltejs/enhanced-img': - specifier: ^0.3.0 - version: 0.3.0(rollup@4.18.1)(svelte@5.0.0-next.175) + specifier: ^0.3.1 + version: 0.3.1(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/kit': specifier: ^2.5.18 - version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.1 - version: 3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + version: 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@types/cookie': specifier: ^0.6.0 version: 0.6.0 '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: ^20.14.13 + version: 20.14.13 '@types/pg': specifier: ^8.11.6 version: 8.11.6 '@typescript-eslint/eslint-plugin': - specifier: ^7.16.1 - version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + specifier: ^7.17.0 + version: 7.17.0(@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': - specifier: ^7.16.1 - version: 7.16.1(eslint@8.57.0)(typescript@5.5.3) + specifier: ^7.17.0 + version: 7.17.0(eslint@8.57.0)(typescript@5.5.4) autoprefixer: specifier: ^10.4.19 - version: 10.4.19(postcss@8.4.39) + version: 10.4.19(postcss@8.4.40) drizzle-kit: specifier: ^0.23.0 version: 0.23.0 @@ -203,7 +203,7 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-plugin-svelte: specifier: ^2.43.0 - version: 2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)) + version: 2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) just-clone: specifier: ^6.2.0 version: 6.2.0 @@ -211,17 +211,17 @@ importers: specifier: ^3.2.0 version: 3.2.0 postcss: - specifier: ^8.4.39 - version: 8.4.39 + specifier: ^8.4.40 + version: 8.4.40 postcss-import: specifier: ^16.1.0 - version: 16.1.0(postcss@8.4.39) + version: 16.1.0(postcss@8.4.40) postcss-load-config: specifier: ^5.1.0 - version: 5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2) + version: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2) postcss-preset-env: specifier: ^9.6.0 - version: 9.6.0(postcss@8.4.39) + version: 9.6.0(postcss@8.4.40) prettier: specifier: ^3.3.3 version: 3.3.3 @@ -242,34 +242,34 @@ importers: version: 5.0.0-next.175 svelte-check: specifier: ^3.8.4 - version: 3.8.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2))(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.175) + version: 3.8.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175) svelte-headless-table: specifier: ^0.18.2 version: 0.18.2(svelte@5.0.0-next.175) svelte-meta-tags: specifier: ^3.1.2 - version: 3.1.2(svelte@5.0.0-next.175)(typescript@5.5.3) + version: 3.1.2(svelte@5.0.0-next.175)(typescript@5.5.4) svelte-preprocess: specifier: ^6.0.2 - version: 6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2))(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.3) + version: 6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4) svelte-sequential-preprocessor: specifier: ^2.0.1 version: 2.0.1 sveltekit-flash-message: specifier: ^2.4.4 - version: 2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175) + version: 2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175) sveltekit-rate-limiter: specifier: ^0.5.2 - version: 0.5.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))) + version: 0.5.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))) sveltekit-superforms: specifier: ^2.16.1 - version: 2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175) + version: 2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175) tailwindcss: - specifier: ^3.4.6 - version: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)) + specifier: ^3.4.7 + version: 3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.14.11)(typescript@5.5.3) + version: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -277,14 +277,14 @@ importers: specifier: ^4.16.2 version: 4.16.2 typescript: - specifier: ^5.5.3 - version: 5.5.3 + specifier: ^5.5.4 + version: 5.5.4 vite: - specifier: ^5.3.4 - version: 5.3.4(@types/node@20.14.11)(sass@1.77.8) + specifier: ^5.3.5 + version: 5.3.5(@types/node@20.14.13)(sass@1.77.8) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@20.14.11)(sass@1.77.8) + version: 1.6.0(@types/node@20.14.13)(sass@1.77.8) zod: specifier: ^3.23.8 version: 3.23.8 @@ -1314,8 +1314,8 @@ packages: cpu: [x64] os: [win32] - '@internationalized/date@3.5.4': - resolution: {integrity: sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==} + '@internationalized/date@3.5.5': + resolution: {integrity: sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ==} '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -1586,8 +1586,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.45.2': - resolution: {integrity: sha512-JxG9eq92ET75EbVi3s+4sYbcG7q72ECeZNbdBlaMkGcNbiDQ4cAi8U2QP5oKkOx+1gpaiL1LDStmzCaEM1Z6fQ==} + '@playwright/test@1.45.3': + resolution: {integrity: sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==} engines: {node: '>=18'} hasBin: true @@ -1884,8 +1884,11 @@ packages: peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/enhanced-img@0.3.0': - resolution: {integrity: sha512-o8FdEUyJR/+LjUUl4sgB9QeM9rSGpOzTO6/CH0AmO/FgwWkcJdj/MwVNtr2F/AtaPgNfzvRpnExjklmuuDOtPA==} + '@sveltejs/enhanced-img@0.3.1': + resolution: {integrity: sha512-75A4YiXQp+GRc54EyiNOlhHnHt9O8e0CdCHLm3RWESLRaazd5OIciSa4SbKIo9DM84yGwSVShU0buyUmNJvgWg==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: '>= 5.0.0' '@sveltejs/kit@2.5.18': resolution: {integrity: sha512-+g06hvpVAnH7b4CDjhnTDgFWBKBiQJpuSmQeGYOuzbO3SC3tdYjRNlDCrafvDtKbGiT2uxY5Dn9qdEUGVZdWOQ==} @@ -1941,8 +1944,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@20.14.11': - resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} + '@types/node@20.14.13': + resolution: {integrity: sha512-+bHoGiZb8UiQ0+WEtmph2IWQCjIqg8MDZMAV+ppRRhUZnquF5mQkP/9vpSwJClEiSM/C7fZZExPzfU0vJTyp8w==} '@types/pg@8.11.6': resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} @@ -1953,8 +1956,8 @@ packages: '@types/validator@13.12.0': resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} - '@typescript-eslint/eslint-plugin@7.16.1': - resolution: {integrity: sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==} + '@typescript-eslint/eslint-plugin@7.17.0': + resolution: {integrity: sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1964,8 +1967,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.16.1': - resolution: {integrity: sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==} + '@typescript-eslint/parser@7.17.0': + resolution: {integrity: sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1974,12 +1977,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.16.1': - resolution: {integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==} + '@typescript-eslint/scope-manager@7.17.0': + resolution: {integrity: sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.16.1': - resolution: {integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==} + '@typescript-eslint/type-utils@7.17.0': + resolution: {integrity: sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1988,12 +1991,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.16.1': - resolution: {integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==} + '@typescript-eslint/types@7.17.0': + resolution: {integrity: sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.16.1': - resolution: {integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==} + '@typescript-eslint/typescript-estree@7.17.0': + resolution: {integrity: sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -2001,14 +2004,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.16.1': - resolution: {integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==} + '@typescript-eslint/utils@7.17.0': + resolution: {integrity: sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.16.1': - resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==} + '@typescript-eslint/visitor-keys@7.17.0': + resolution: {integrity: sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': @@ -2516,8 +2519,8 @@ packages: resolution: {integrity: sha512-w9jE97z193dd4jzAyj4Uv2SOh8Ydue70Ki6W0awy4bGM1aPXan6zD6Yv+nNTA6oGgNTDl2MJFxutjHG4fden5g==} hasBin: true - drizzle-orm@0.32.0: - resolution: {integrity: sha512-99IlfVGPNHzOFEXo9Phyu5At5TALLsY2t6WxFFy68rYd9Ej4cHX/7WjdPOn7JNRW69MNeNtP8XrDQg43SppuAA==} + drizzle-orm@0.32.1: + resolution: {integrity: sha512-Wq1J+lL8PzwR5K3a1FfoWsbs8powjr3pGA4+5+2ueN1VTLDNFYEolUyUWFtqy8DVRvYbL2n7sXZkgVmK9dQkng==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -2971,8 +2974,8 @@ packages: peerDependencies: hono: ^4.1.1 - hono@4.5.0: - resolution: {integrity: sha512-ZbezypZfn4odyApjCCv+Fw5OgweBqRLA/EsMyc4FUknFvBJcBIKhHy4sqmD1rWpBc/3wUlaQ6tqOPjk36R1ckg==} + hono@4.5.2: + resolution: {integrity: sha512-93P8XEALrHAUGRZoqXs8MDL3w9mDgRpbW9Sy5x4LS7srg78bKUw7EGynxze+Ft1e/rLGmDAbxeSTMu6dHUSRDw==} engines: {node: '>=16.0.0'} html-entities@2.5.2: @@ -3575,13 +3578,13 @@ packages: pkg-types@1.1.0: resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} - playwright-core@1.45.2: - resolution: {integrity: sha512-ha175tAWb0dTK0X4orvBIqi3jGEt701SMxMhyujxNrgd8K0Uy5wMSwwcQHtyB4om7INUkfndx02XnQ2p6dvLDw==} + playwright-core@1.45.3: + resolution: {integrity: sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==} engines: {node: '>=18'} hasBin: true - playwright@1.45.2: - resolution: {integrity: sha512-ReywF2t/0teRvNBpfIgh5e4wnrI/8Su8ssdo5XsQKpjxJj+jspm00jSoz9BTg91TT0c9HRjXO7LBNVrgYj9X0g==} + playwright@1.45.3: + resolution: {integrity: sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==} engines: {node: '>=18'} hasBin: true @@ -3828,8 +3831,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} + postcss@8.4.40: + resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -4390,8 +4393,8 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.6: - resolution: {integrity: sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==} + tailwindcss@3.4.7: + resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -4508,8 +4511,8 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true @@ -4580,8 +4583,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.3.4: - resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==} + vite@5.3.5: + resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4735,8 +4738,8 @@ packages: zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zod-to-json-schema@3.23.1: - resolution: {integrity: sha512-oT9INvydob1XV0v1d2IadrR74rLtDInLvDFfAa1CG0Pmg/vxATk7I2gSelfj271mbzeM4Da0uuDQE/Nkj3DWNw==} + zod-to-json-schema@3.23.2: + resolution: {integrity: sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==} peerDependencies: zod: ^3.23.3 @@ -4799,201 +4802,201 @@ snapshots: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-cascade-layers@4.0.6(postcss@8.4.39)': + '@csstools/postcss-cascade-layers@4.0.6(postcss@8.4.40)': dependencies: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.1.0 - '@csstools/postcss-color-function@3.0.19(postcss@8.4.39)': + '@csstools/postcss-color-function@3.0.19(postcss@8.4.40)': dependencies: '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - '@csstools/postcss-color-mix-function@2.0.19(postcss@8.4.39)': + '@csstools/postcss-color-mix-function@2.0.19(postcss@8.4.40)': dependencies: '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - '@csstools/postcss-content-alt-text@1.0.0(postcss@8.4.39)': + '@csstools/postcss-content-alt-text@1.0.0(postcss@8.4.40)': dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - '@csstools/postcss-exponential-functions@1.0.9(postcss@8.4.39)': + '@csstools/postcss-exponential-functions@1.0.9(postcss@8.4.40)': dependencies: '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.39)': + '@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.40)': dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 - '@csstools/postcss-gamut-mapping@1.0.11(postcss@8.4.39)': + '@csstools/postcss-gamut-mapping@1.0.11(postcss@8.4.40)': dependencies: '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-gradients-interpolation-method@4.0.20(postcss@8.4.39)': + '@csstools/postcss-gradients-interpolation-method@4.0.20(postcss@8.4.40)': dependencies: '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - '@csstools/postcss-hwb-function@3.0.18(postcss@8.4.39)': + '@csstools/postcss-hwb-function@3.0.18(postcss@8.4.40)': dependencies: '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - '@csstools/postcss-ic-unit@3.0.7(postcss@8.4.39)': + '@csstools/postcss-ic-unit@3.0.7(postcss@8.4.40)': dependencies: - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 - '@csstools/postcss-initial@1.0.1(postcss@8.4.39)': + '@csstools/postcss-initial@1.0.1(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-is-pseudo-class@4.0.8(postcss@8.4.39)': + '@csstools/postcss-is-pseudo-class@4.0.8(postcss@8.4.40)': dependencies: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.1.0 - '@csstools/postcss-light-dark-function@1.0.8(postcss@8.4.39)': + '@csstools/postcss-light-dark-function@1.0.8(postcss@8.4.40)': dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - '@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.39)': + '@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.39)': + '@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.39)': + '@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-logical-resize@2.0.1(postcss@8.4.39)': + '@csstools/postcss-logical-resize@2.0.1(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 - '@csstools/postcss-logical-viewport-units@2.0.11(postcss@8.4.39)': + '@csstools/postcss-logical-viewport-units@2.0.11(postcss@8.4.40)': dependencies: '@csstools/css-tokenizer': 2.4.1 - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - '@csstools/postcss-media-minmax@1.1.8(postcss@8.4.39)': + '@csstools/postcss-media-minmax@1.1.8(postcss@8.4.40)': dependencies: '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.11(postcss@8.4.39)': + '@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.11(postcss@8.4.40)': dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-nested-calc@3.0.2(postcss@8.4.39)': + '@csstools/postcss-nested-calc@3.0.2(postcss@8.4.40)': dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 - '@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.39)': + '@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 - '@csstools/postcss-oklab-function@3.0.19(postcss@8.4.39)': + '@csstools/postcss-oklab-function@3.0.19(postcss@8.4.40)': dependencies: '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - '@csstools/postcss-progressive-custom-properties@3.3.0(postcss@8.4.39)': + '@csstools/postcss-progressive-custom-properties@3.3.0(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 - '@csstools/postcss-relative-color-syntax@2.0.19(postcss@8.4.39)': + '@csstools/postcss-relative-color-syntax@2.0.19(postcss@8.4.40)': dependencies: '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - '@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.39)': + '@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.0.16 - '@csstools/postcss-stepped-value-functions@3.0.10(postcss@8.4.39)': + '@csstools/postcss-stepped-value-functions@3.0.10(postcss@8.4.40)': dependencies: '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-text-decoration-shorthand@3.0.7(postcss@8.4.39)': + '@csstools/postcss-text-decoration-shorthand@3.0.7(postcss@8.4.40)': dependencies: '@csstools/color-helpers': 4.2.1 - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 - '@csstools/postcss-trigonometric-functions@3.0.10(postcss@8.4.39)': + '@csstools/postcss-trigonometric-functions@3.0.10(postcss@8.4.40)': dependencies: '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.39 + postcss: 8.4.40 - '@csstools/postcss-unset-value@3.0.1(postcss@8.4.39)': + '@csstools/postcss-unset-value@3.0.1(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.1.0)': dependencies: @@ -5003,9 +5006,9 @@ snapshots: dependencies: postcss-selector-parser: 6.1.0 - '@csstools/utilities@1.0.0(postcss@8.4.39)': + '@csstools/utilities@1.0.0(postcss@8.4.40)': dependencies: - postcss: 8.4.39 + postcss: 8.4.40 '@emnapi/core@0.45.0': dependencies: @@ -5379,9 +5382,9 @@ snapshots: '@hapi/hoek': 9.3.0 optional: true - '@hono/zod-validator@0.2.2(hono@4.5.0)(zod@3.23.8)': + '@hono/zod-validator@0.2.2(hono@4.5.2)(zod@3.23.8)': dependencies: - hono: 4.5.0 + hono: 4.5.2 zod: 3.23.8 '@humanwhocodes/config-array@0.11.14': @@ -5481,7 +5484,7 @@ snapshots: '@img/sharp-win32-x64@0.33.4': optional: true - '@internationalized/date@3.5.4': + '@internationalized/date@3.5.5': dependencies: '@swc/helpers': 0.5.11 @@ -5560,7 +5563,7 @@ snapshots: dependencies: '@floating-ui/core': 1.6.2 '@floating-ui/dom': 1.6.5 - '@internationalized/date': 3.5.4 + '@internationalized/date': 3.5.5 dequal: 2.0.3 focus-trap: 7.5.4 nanoid: 5.0.7 @@ -5570,7 +5573,7 @@ snapshots: dependencies: '@floating-ui/core': 1.6.4 '@floating-ui/dom': 1.6.7 - '@internationalized/date': 3.5.4 + '@internationalized/date': 3.5.5 dequal: 2.0.3 focus-trap: 7.5.4 nanoid: 5.0.7 @@ -5729,9 +5732,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.45.2': + '@playwright/test@1.45.3': dependencies: - playwright: 1.45.2 + playwright: 1.45.3 '@polka/url@1.0.0-next.25': {} @@ -5924,32 +5927,33 @@ snapshots: '@sodaru/yup-to-json-schema@2.0.1': optional: true - '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))': + '@sveltejs/adapter-auto@3.2.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))': dependencies: - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) import-meta-resolve: 4.1.0 - '@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))': + '@sveltejs/adapter-vercel@5.4.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))': dependencies: - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@vercel/nft': 0.27.2 esbuild: 0.21.5 transitivePeerDependencies: - encoding - supports-color - '@sveltejs/enhanced-img@0.3.0(rollup@4.18.1)(svelte@5.0.0-next.175)': + '@sveltejs/enhanced-img@0.3.1(rollup@4.18.1)(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))': dependencies: magic-string: 0.30.10 + svelte: 5.0.0-next.175 svelte-parse-markup: 0.1.5(svelte@5.0.0-next.175) + vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) vite-imagetools: 7.0.2(rollup@4.18.1) transitivePeerDependencies: - rollup - - svelte - '@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))': + '@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -5963,28 +5967,28 @@ snapshots: sirv: 2.0.4 svelte: 5.0.0-next.175 tiny-glob: 0.2.9 - vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8) + vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) debug: 4.3.4 svelte: 5.0.0-next.175 - vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8) + vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))': + '@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 svelte: 5.0.0-next.175 svelte-hmr: 0.16.0(svelte@5.0.0-next.175) - vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8) - vitefu: 0.2.5(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) + vitefu: 0.2.5(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) transitivePeerDependencies: - supports-color @@ -6014,13 +6018,13 @@ snapshots: '@types/json-schema@7.0.15': optional: true - '@types/node@20.14.11': + '@types/node@20.14.13': dependencies: undici-types: 5.26.5 '@types/pg@8.11.6': dependencies: - '@types/node': 20.14.11 + '@types/node': 20.14.13 pg-protocol: 1.6.1 pg-types: 4.0.2 @@ -6029,85 +6033,85 @@ snapshots: '@types/validator@13.12.0': optional: true - '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@7.17.0(@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.16.1 + '@typescript-eslint/parser': 7.17.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.17.0 + '@typescript-eslint/type-utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.17.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.5.3 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.16.1 + '@typescript-eslint/scope-manager': 7.17.0 + '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.17.0 debug: 4.3.4 eslint: 8.57.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.16.1': + '@typescript-eslint/scope-manager@7.17.0': dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 + '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/visitor-keys': 7.17.0 - '@typescript-eslint/type-utils@7.16.1(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/type-utils@7.17.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) debug: 4.3.5 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.5.3 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.16.1': {} + '@typescript-eslint/types@7.17.0': {} - '@typescript-eslint/typescript-estree@7.16.1(typescript@5.5.3)': + '@typescript-eslint/typescript-estree@7.17.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 + '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/visitor-keys': 7.17.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.5.3 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.16.1(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/utils@7.17.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.17.0 + '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.16.1': + '@typescript-eslint/visitor-keys@7.17.0': dependencies: - '@typescript-eslint/types': 7.16.1 + '@typescript-eslint/types': 7.17.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -6272,14 +6276,14 @@ snapshots: async-sema@3.1.1: {} - autoprefixer@10.4.19(postcss@8.4.39): + autoprefixer@10.4.19(postcss@8.4.40): dependencies: browserslist: 4.23.0 caniuse-lite: 1.0.30001616 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 axobject-query@4.0.0: @@ -6298,7 +6302,7 @@ snapshots: bits-ui@0.21.12(svelte@5.0.0-next.175): dependencies: - '@internationalized/date': 3.5.4 + '@internationalized/date': 3.5.5 '@melt-ui/svelte': 0.76.2(svelte@5.0.0-next.175) nanoid: 5.0.7 svelte: 5.0.0-next.175 @@ -6497,25 +6501,25 @@ snapshots: css-background-parser@0.1.0: {} - css-blank-pseudo@6.0.2(postcss@8.4.39): + css-blank-pseudo@6.0.2(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.0.16 css-box-shadow@1.0.0-3: {} css-color-keywords@1.0.0: {} - css-has-pseudo@6.0.5(postcss@8.4.39): + css-has-pseudo@6.0.5(postcss@8.4.40): dependencies: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.1.0 postcss-value-parser: 4.2.0 - css-prefers-color-scheme@9.0.1(postcss@8.4.39): + css-prefers-color-scheme@9.0.1(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 css-to-react-native@3.2.0: dependencies: @@ -6611,7 +6615,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.32.0(@neondatabase/serverless@0.9.4)(@types/pg@8.11.6)(pg@8.12.0)(postgres@3.4.4): + drizzle-orm@0.32.1(@neondatabase/serverless@0.9.4)(@types/pg@8.11.6)(pg@8.12.0)(postgres@3.4.4): optionalDependencies: '@neondatabase/serverless': 0.9.4 '@types/pg': 8.11.6 @@ -6778,7 +6782,7 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-svelte@2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)): + eslint-plugin-svelte@2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@jridgewell/sourcemap-codec': 1.4.15 @@ -6786,9 +6790,9 @@ snapshots: eslint-compat-utils: 0.5.1(eslint@8.57.0) esutils: 2.0.3 known-css-properties: 0.34.0 - postcss: 8.4.39 - postcss-load-config: 3.1.4(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)) - postcss-safe-parser: 6.0.0(postcss@8.4.39) + postcss: 8.4.40 + postcss-load-config: 3.1.4(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + postcss-safe-parser: 6.0.0(postcss@8.4.40) postcss-selector-parser: 6.1.0 semver: 7.6.2 svelte-eslint-parser: 0.41.0(svelte@5.0.0-next.175) @@ -7014,11 +7018,11 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)): + formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)): dependencies: nanoid: 5.0.7 svelte: 5.0.0-next.175 - sveltekit-superforms: 2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175) + sveltekit-superforms: 2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175) forwarded@0.2.0: {} @@ -7141,11 +7145,11 @@ snapshots: hex-rgb@4.3.0: {} - hono-rate-limiter@0.4.0(hono@4.5.0): + hono-rate-limiter@0.4.0(hono@4.5.2): dependencies: - hono: 4.5.0 + hono: 4.5.2 - hono@4.5.0: {} + hono@4.5.2: {} html-entities@2.5.2: {} @@ -7689,281 +7693,281 @@ snapshots: mlly: 1.7.0 pathe: 1.1.2 - playwright-core@1.45.2: {} + playwright-core@1.45.3: {} - playwright@1.45.2: + playwright@1.45.3: dependencies: - playwright-core: 1.45.2 + playwright-core: 1.45.3 optionalDependencies: fsevents: 2.3.2 pngjs@5.0.0: {} - postcss-attribute-case-insensitive@6.0.3(postcss@8.4.39): + postcss-attribute-case-insensitive@6.0.3(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.0.16 - postcss-clamp@4.1.0(postcss@8.4.39): + postcss-clamp@4.1.0(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 - postcss-color-functional-notation@6.0.14(postcss@8.4.39): + postcss-color-functional-notation@6.0.14(postcss@8.4.40): dependencies: '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - postcss-color-hex-alpha@9.0.4(postcss@8.4.39): + postcss-color-hex-alpha@9.0.4(postcss@8.4.40): dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 - postcss-color-rebeccapurple@9.0.3(postcss@8.4.39): + postcss-color-rebeccapurple@9.0.3(postcss@8.4.40): dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 - postcss-custom-media@10.0.8(postcss@8.4.39): + postcss-custom-media@10.0.8(postcss@8.4.40): dependencies: '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) - postcss: 8.4.39 + postcss: 8.4.40 - postcss-custom-properties@13.3.12(postcss@8.4.39): + postcss-custom-properties@13.3.12(postcss@8.4.40): dependencies: '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 - postcss-custom-selectors@7.1.12(postcss@8.4.39): + postcss-custom-selectors@7.1.12(postcss@8.4.40): dependencies: '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.1.0 - postcss-dir-pseudo-class@8.0.1(postcss@8.4.39): + postcss-dir-pseudo-class@8.0.1(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.0.16 - postcss-double-position-gradients@5.0.7(postcss@8.4.39): + postcss-double-position-gradients@5.0.7(postcss@8.4.40): dependencies: - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 - postcss-focus-visible@9.0.1(postcss@8.4.39): + postcss-focus-visible@9.0.1(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.0.16 - postcss-focus-within@8.0.1(postcss@8.4.39): + postcss-focus-within@8.0.1(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.0.16 - postcss-font-variant@5.0.0(postcss@8.4.39): + postcss-font-variant@5.0.0(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - postcss-gap-properties@5.0.1(postcss@8.4.39): + postcss-gap-properties@5.0.1(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - postcss-image-set-function@6.0.3(postcss@8.4.39): + postcss-image-set-function@6.0.3(postcss@8.4.40): dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 postcss-value-parser: 4.2.0 - postcss-import@15.1.0(postcss@8.4.39): + postcss-import@15.1.0(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-import@16.1.0(postcss@8.4.39): + postcss-import@16.1.0(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.39): + postcss-js@4.0.1(postcss@8.4.40): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.39 + postcss: 8.4.40 - postcss-lab-function@6.0.19(postcss@8.4.39): + postcss-lab-function@6.0.19(postcss@8.4.40): dependencies: '@csstools/css-color-parser': 2.0.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/utilities': 1.0.0(postcss@8.4.39) - postcss: 8.4.39 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/utilities': 1.0.0(postcss@8.4.40) + postcss: 8.4.40 - postcss-load-config@3.1.4(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)): + postcss-load-config@3.1.4(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.39 - ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.5.3) + postcss: 8.4.40 + ts-node: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) - postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): dependencies: lilconfig: 3.1.1 yaml: 2.4.3 optionalDependencies: - postcss: 8.4.39 - ts-node: 10.9.2(@types/node@20.14.11)(typescript@5.5.3) + postcss: 8.4.40 + ts-node: 10.9.2(@types/node@20.14.13)(typescript@5.5.4) - postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2): + postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: jiti: 1.21.6 - postcss: 8.4.39 + postcss: 8.4.40 tsx: 4.16.2 - postcss-logical@7.0.1(postcss@8.4.39): + postcss-logical@7.0.1(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 - postcss-nested@6.0.1(postcss@8.4.39): + postcss-nested@6.0.1(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.1.0 - postcss-nesting@12.1.5(postcss@8.4.39): + postcss-nesting@12.1.5(postcss@8.4.40): dependencies: '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.1.0) '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.0) - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.1.0 - postcss-opacity-percentage@2.0.0(postcss@8.4.39): + postcss-opacity-percentage@2.0.0(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - postcss-overflow-shorthand@5.0.1(postcss@8.4.39): + postcss-overflow-shorthand@5.0.1(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 - postcss-page-break@3.0.4(postcss@8.4.39): + postcss-page-break@3.0.4(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - postcss-place@9.0.1(postcss@8.4.39): + postcss-place@9.0.1(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-value-parser: 4.2.0 - postcss-preset-env@9.6.0(postcss@8.4.39): + postcss-preset-env@9.6.0(postcss@8.4.40): dependencies: - '@csstools/postcss-cascade-layers': 4.0.6(postcss@8.4.39) - '@csstools/postcss-color-function': 3.0.19(postcss@8.4.39) - '@csstools/postcss-color-mix-function': 2.0.19(postcss@8.4.39) - '@csstools/postcss-content-alt-text': 1.0.0(postcss@8.4.39) - '@csstools/postcss-exponential-functions': 1.0.9(postcss@8.4.39) - '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.39) - '@csstools/postcss-gamut-mapping': 1.0.11(postcss@8.4.39) - '@csstools/postcss-gradients-interpolation-method': 4.0.20(postcss@8.4.39) - '@csstools/postcss-hwb-function': 3.0.18(postcss@8.4.39) - '@csstools/postcss-ic-unit': 3.0.7(postcss@8.4.39) - '@csstools/postcss-initial': 1.0.1(postcss@8.4.39) - '@csstools/postcss-is-pseudo-class': 4.0.8(postcss@8.4.39) - '@csstools/postcss-light-dark-function': 1.0.8(postcss@8.4.39) - '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.39) - '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.39) - '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.39) - '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.39) - '@csstools/postcss-logical-viewport-units': 2.0.11(postcss@8.4.39) - '@csstools/postcss-media-minmax': 1.1.8(postcss@8.4.39) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.11(postcss@8.4.39) - '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.39) - '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.39) - '@csstools/postcss-oklab-function': 3.0.19(postcss@8.4.39) - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.39) - '@csstools/postcss-relative-color-syntax': 2.0.19(postcss@8.4.39) - '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.39) - '@csstools/postcss-stepped-value-functions': 3.0.10(postcss@8.4.39) - '@csstools/postcss-text-decoration-shorthand': 3.0.7(postcss@8.4.39) - '@csstools/postcss-trigonometric-functions': 3.0.10(postcss@8.4.39) - '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.39) - autoprefixer: 10.4.19(postcss@8.4.39) + '@csstools/postcss-cascade-layers': 4.0.6(postcss@8.4.40) + '@csstools/postcss-color-function': 3.0.19(postcss@8.4.40) + '@csstools/postcss-color-mix-function': 2.0.19(postcss@8.4.40) + '@csstools/postcss-content-alt-text': 1.0.0(postcss@8.4.40) + '@csstools/postcss-exponential-functions': 1.0.9(postcss@8.4.40) + '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.40) + '@csstools/postcss-gamut-mapping': 1.0.11(postcss@8.4.40) + '@csstools/postcss-gradients-interpolation-method': 4.0.20(postcss@8.4.40) + '@csstools/postcss-hwb-function': 3.0.18(postcss@8.4.40) + '@csstools/postcss-ic-unit': 3.0.7(postcss@8.4.40) + '@csstools/postcss-initial': 1.0.1(postcss@8.4.40) + '@csstools/postcss-is-pseudo-class': 4.0.8(postcss@8.4.40) + '@csstools/postcss-light-dark-function': 1.0.8(postcss@8.4.40) + '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.40) + '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.40) + '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.40) + '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.40) + '@csstools/postcss-logical-viewport-units': 2.0.11(postcss@8.4.40) + '@csstools/postcss-media-minmax': 1.1.8(postcss@8.4.40) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.11(postcss@8.4.40) + '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.40) + '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.40) + '@csstools/postcss-oklab-function': 3.0.19(postcss@8.4.40) + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.40) + '@csstools/postcss-relative-color-syntax': 2.0.19(postcss@8.4.40) + '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.40) + '@csstools/postcss-stepped-value-functions': 3.0.10(postcss@8.4.40) + '@csstools/postcss-text-decoration-shorthand': 3.0.7(postcss@8.4.40) + '@csstools/postcss-trigonometric-functions': 3.0.10(postcss@8.4.40) + '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.40) + autoprefixer: 10.4.19(postcss@8.4.40) browserslist: 4.23.1 - css-blank-pseudo: 6.0.2(postcss@8.4.39) - css-has-pseudo: 6.0.5(postcss@8.4.39) - css-prefers-color-scheme: 9.0.1(postcss@8.4.39) + css-blank-pseudo: 6.0.2(postcss@8.4.40) + css-has-pseudo: 6.0.5(postcss@8.4.40) + css-prefers-color-scheme: 9.0.1(postcss@8.4.40) cssdb: 8.1.0 - postcss: 8.4.39 - postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.39) - postcss-clamp: 4.1.0(postcss@8.4.39) - postcss-color-functional-notation: 6.0.14(postcss@8.4.39) - postcss-color-hex-alpha: 9.0.4(postcss@8.4.39) - postcss-color-rebeccapurple: 9.0.3(postcss@8.4.39) - postcss-custom-media: 10.0.8(postcss@8.4.39) - postcss-custom-properties: 13.3.12(postcss@8.4.39) - postcss-custom-selectors: 7.1.12(postcss@8.4.39) - postcss-dir-pseudo-class: 8.0.1(postcss@8.4.39) - postcss-double-position-gradients: 5.0.7(postcss@8.4.39) - postcss-focus-visible: 9.0.1(postcss@8.4.39) - postcss-focus-within: 8.0.1(postcss@8.4.39) - postcss-font-variant: 5.0.0(postcss@8.4.39) - postcss-gap-properties: 5.0.1(postcss@8.4.39) - postcss-image-set-function: 6.0.3(postcss@8.4.39) - postcss-lab-function: 6.0.19(postcss@8.4.39) - postcss-logical: 7.0.1(postcss@8.4.39) - postcss-nesting: 12.1.5(postcss@8.4.39) - postcss-opacity-percentage: 2.0.0(postcss@8.4.39) - postcss-overflow-shorthand: 5.0.1(postcss@8.4.39) - postcss-page-break: 3.0.4(postcss@8.4.39) - postcss-place: 9.0.1(postcss@8.4.39) - postcss-pseudo-class-any-link: 9.0.2(postcss@8.4.39) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.39) - postcss-selector-not: 7.0.2(postcss@8.4.39) + postcss: 8.4.40 + postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.40) + postcss-clamp: 4.1.0(postcss@8.4.40) + postcss-color-functional-notation: 6.0.14(postcss@8.4.40) + postcss-color-hex-alpha: 9.0.4(postcss@8.4.40) + postcss-color-rebeccapurple: 9.0.3(postcss@8.4.40) + postcss-custom-media: 10.0.8(postcss@8.4.40) + postcss-custom-properties: 13.3.12(postcss@8.4.40) + postcss-custom-selectors: 7.1.12(postcss@8.4.40) + postcss-dir-pseudo-class: 8.0.1(postcss@8.4.40) + postcss-double-position-gradients: 5.0.7(postcss@8.4.40) + postcss-focus-visible: 9.0.1(postcss@8.4.40) + postcss-focus-within: 8.0.1(postcss@8.4.40) + postcss-font-variant: 5.0.0(postcss@8.4.40) + postcss-gap-properties: 5.0.1(postcss@8.4.40) + postcss-image-set-function: 6.0.3(postcss@8.4.40) + postcss-lab-function: 6.0.19(postcss@8.4.40) + postcss-logical: 7.0.1(postcss@8.4.40) + postcss-nesting: 12.1.5(postcss@8.4.40) + postcss-opacity-percentage: 2.0.0(postcss@8.4.40) + postcss-overflow-shorthand: 5.0.1(postcss@8.4.40) + postcss-page-break: 3.0.4(postcss@8.4.40) + postcss-place: 9.0.1(postcss@8.4.40) + postcss-pseudo-class-any-link: 9.0.2(postcss@8.4.40) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.40) + postcss-selector-not: 7.0.2(postcss@8.4.40) - postcss-pseudo-class-any-link@9.0.2(postcss@8.4.39): + postcss-pseudo-class-any-link@9.0.2(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.0.16 - postcss-replace-overflow-wrap@4.0.0(postcss@8.4.39): + postcss-replace-overflow-wrap@4.0.0(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - postcss-safe-parser@6.0.0(postcss@8.4.39): + postcss-safe-parser@6.0.0(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - postcss-scss@4.0.9(postcss@8.4.39): + postcss-scss@4.0.9(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 - postcss-selector-not@7.0.2(postcss@8.4.39): + postcss-selector-not@7.0.2(postcss@8.4.40): dependencies: - postcss: 8.4.39 + postcss: 8.4.40 postcss-selector-parser: 6.0.16 postcss-selector-parser@6.0.16: @@ -7978,7 +7982,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.39: + postcss@8.4.40: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 @@ -8220,9 +8224,9 @@ snapshots: postcss-value-parser: 4.2.0 yoga-wasm-web: 0.3.3 - schema-dts@1.1.2(typescript@5.5.3): + schema-dts@1.1.2(typescript@5.5.4): dependencies: - typescript: 5.5.3 + typescript: 5.5.4 semver@6.3.1: {} @@ -8414,15 +8418,15 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.8.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2))(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.175): + svelte-check@3.8.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 picocolors: 1.0.0 sade: 1.8.1 svelte: 5.0.0-next.175 - svelte-preprocess: 5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2))(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.3) - typescript: 5.5.3 + svelte-preprocess: 5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -8439,8 +8443,8 @@ snapshots: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.39 - postcss-scss: 4.0.9(postcss@8.4.39) + postcss: 8.4.40 + postcss-scss: 4.0.9(postcss@8.4.40) optionalDependencies: svelte: 5.0.0-next.175 @@ -8466,9 +8470,9 @@ snapshots: svelte-lazy-loader@1.0.0: {} - svelte-meta-tags@3.1.2(svelte@5.0.0-next.175)(typescript@5.5.3): + svelte-meta-tags@3.1.2(svelte@5.0.0-next.175)(typescript@5.5.4): dependencies: - schema-dts: 1.1.2(typescript@5.5.3) + schema-dts: 1.1.2(typescript@5.5.4) svelte: 5.0.0-next.175 transitivePeerDependencies: - typescript @@ -8477,7 +8481,7 @@ snapshots: dependencies: svelte: 5.0.0-next.175 - svelte-preprocess@5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2))(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.3): + svelte-preprocess@5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -8486,19 +8490,19 @@ snapshots: strip-indent: 3.0.0 svelte: 5.0.0-next.175 optionalDependencies: - postcss: 8.4.39 - postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2) + postcss: 8.4.40 + postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2) sass: 1.77.8 - typescript: 5.5.3 + typescript: 5.5.4 - svelte-preprocess@6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2))(postcss@8.4.39)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.3): + svelte-preprocess@6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2))(postcss@8.4.40)(sass@1.77.8)(svelte@5.0.0-next.175)(typescript@5.5.4): dependencies: svelte: 5.0.0-next.175 optionalDependencies: - postcss: 8.4.39 - postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.39)(tsx@4.16.2) + postcss: 8.4.40 + postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.40)(tsx@4.16.2) sass: 1.77.8 - typescript: 5.5.3 + typescript: 5.5.4 svelte-render@2.0.1(svelte@5.0.0-next.175): dependencies: @@ -8551,19 +8555,19 @@ snapshots: magic-string: 0.30.10 zimmerframe: 1.1.2 - sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175): + sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175): dependencies: - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) svelte: 5.0.0-next.175 - sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8))): + sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8))): dependencies: '@isaacs/ttlcache': 1.4.1 - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) - sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175): + sveltekit-superforms@2.16.1(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175): dependencies: - '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)) + '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)))(svelte@5.0.0-next.175)(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)) devalue: 5.0.0 just-clone: 6.2.0 memoize-weak: 1.0.2 @@ -8582,22 +8586,22 @@ snapshots: valibot: 0.35.0 yup: 1.4.0 zod: 3.23.8 - zod-to-json-schema: 3.23.1(zod@3.23.8) + zod-to-json-schema: 3.23.2(zod@3.23.8) tabbable@6.2.0: {} tailwind-merge@2.4.0: {} - tailwind-variants@0.2.1(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))): + tailwind-variants@0.2.1(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))): dependencies: tailwind-merge: 2.4.0 - tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)) + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) - tailwindcss-animate@1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4))): dependencies: - tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)) + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) - tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)): + tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -8613,11 +8617,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.1 - postcss: 8.4.39 - postcss-import: 15.1.0(postcss@8.4.39) - postcss-js: 4.0.1(postcss@8.4.39) - postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3)) - postcss-nested: 6.0.1(postcss@8.4.39) + postcss: 8.4.40 + postcss-import: 15.1.0(postcss@8.4.40) + postcss-js: 4.0.1(postcss@8.4.40) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4)) + postcss-nested: 6.0.1(postcss@8.4.40) postcss-selector-parser: 6.1.0 resolve: 1.22.8 sucrase: 3.35.0 @@ -8675,29 +8679,29 @@ snapshots: ts-algebra@2.0.0: optional: true - ts-api-utils@1.3.0(typescript@5.5.3): + ts-api-utils@1.3.0(typescript@5.5.4): dependencies: - typescript: 5.5.3 + typescript: 5.5.4 ts-deepmerge@7.0.0: {} ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.3): + ts-node@10.9.2(@types/node@20.14.13)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.14.11 + '@types/node': 20.14.13 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.3 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -8729,7 +8733,7 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript@5.5.3: {} + typescript@5.5.4: {} ufo@1.5.3: {} @@ -8786,13 +8790,13 @@ snapshots: transitivePeerDependencies: - rollup - vite-node@1.6.0(@types/node@20.14.11)(sass@1.77.8): + vite-node@1.6.0(@types/node@20.14.13)(sass@1.77.8): dependencies: cac: 6.7.14 debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8) + vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) transitivePeerDependencies: - '@types/node' - less @@ -8803,21 +8807,21 @@ snapshots: - supports-color - terser - vite@5.3.4(@types/node@20.14.11)(sass@1.77.8): + vite@5.3.5(@types/node@20.14.13)(sass@1.77.8): dependencies: esbuild: 0.21.5 - postcss: 8.4.39 + postcss: 8.4.40 rollup: 4.17.2 optionalDependencies: - '@types/node': 20.14.11 + '@types/node': 20.14.13 fsevents: 2.3.3 sass: 1.77.8 - vitefu@0.2.5(vite@5.3.4(@types/node@20.14.11)(sass@1.77.8)): + vitefu@0.2.5(vite@5.3.5(@types/node@20.14.13)(sass@1.77.8)): optionalDependencies: - vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8) + vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) - vitest@1.6.0(@types/node@20.14.11)(sass@1.77.8): + vitest@1.6.0(@types/node@20.14.13)(sass@1.77.8): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -8836,11 +8840,11 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.3.4(@types/node@20.14.11)(sass@1.77.8) - vite-node: 1.6.0(@types/node@20.14.11)(sass@1.77.8) + vite: 5.3.5(@types/node@20.14.13)(sass@1.77.8) + vite-node: 1.6.0(@types/node@20.14.13)(sass@1.77.8) why-is-node-running: 2.2.2 optionalDependencies: - '@types/node': 20.14.11 + '@types/node': 20.14.13 transitivePeerDependencies: - less - lightningcss @@ -8943,7 +8947,7 @@ snapshots: zimmerframe@1.1.2: {} - zod-to-json-schema@3.23.1(zod@3.23.8): + zod-to-json-schema@3.23.2(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/src/lib/server/api/controllers/iam.controller.ts b/src/lib/server/api/controllers/iam.controller.ts index 5be066e..372e240 100644 --- a/src/lib/server/api/controllers/iam.controller.ts +++ b/src/lib/server/api/controllers/iam.controller.ts @@ -4,7 +4,7 @@ import { requireAuth } from "../middleware/auth.middleware"; import { registerEmailPasswordDto } from '$lib/dtos/register-emailpassword.dto'; import { limiter } from '../middleware/rate-limiter.middleware'; -const users = new Hono() +const app = new Hono() .get('/me', requireAuth, async (c) => { const user = c.var.user; return c.json({ user }); @@ -19,5 +19,4 @@ const users = new Hono() return c.json({ message: 'Verification email sent' }); }); -export default users; -export type UsersType = typeof users \ No newline at end of file +export default app; diff --git a/src/lib/server/api/controllers/login.controller.ts b/src/lib/server/api/controllers/login.controller.ts new file mode 100644 index 0000000..aeecf6e --- /dev/null +++ b/src/lib/server/api/controllers/login.controller.ts @@ -0,0 +1,13 @@ +import { Hono } from 'hono'; +import { zValidator } from '@hono/zod-validator'; +import { registerEmailPasswordDto } from '$lib/dtos/register-emailpassword.dto'; +import { limiter } from '../middleware/rate-limiter.middleware'; + +const app = new Hono() + .post('/', zValidator('json', registerEmailPasswordDto), limiter({ limit: 10, minutes: 60 }), async (c) => { + const { email } = c.req.valid('json'); + await loginRequestsService.create({ email }); + return c.json({ message: 'Verification email sent' }); + }); + +export default app; diff --git a/src/lib/server/api/controllers/signup.controller.ts b/src/lib/server/api/controllers/signup.controller.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/lib/server/api/controllers/user.controller.ts b/src/lib/server/api/controllers/user.controller.ts new file mode 100644 index 0000000..372e240 --- /dev/null +++ b/src/lib/server/api/controllers/user.controller.ts @@ -0,0 +1,22 @@ +import { Hono } from 'hono'; +import { zValidator } from '@hono/zod-validator'; +import { requireAuth } from "../middleware/auth.middleware"; +import { registerEmailPasswordDto } from '$lib/dtos/register-emailpassword.dto'; +import { limiter } from '../middleware/rate-limiter.middleware'; + +const app = new Hono() + .get('/me', requireAuth, async (c) => { + const user = c.var.user; + return c.json({ user }); + }) + .get('/user', requireAuth, async (c) => { + const user = c.var.user; + return c.json({ user }); + }) + .post('/login/request', zValidator('json', registerEmailPasswordDto), limiter({ limit: 10, minutes: 60 }), async (c) => { + const { email } = c.req.valid('json'); + await this.loginRequestsService.create({ email }); + return c.json({ message: 'Verification email sent' }); + }); + +export default app; diff --git a/src/lib/server/api/index.ts b/src/lib/server/api/index.ts index a5476dd..3e53e76 100644 --- a/src/lib/server/api/index.ts +++ b/src/lib/server/api/index.ts @@ -1,7 +1,9 @@ import { Hono } from 'hono'; import { hc } from 'hono/client'; +import { cors } from 'hono/cors'; +import { logger } from 'hono/logger'; import { validateAuthSession, verifyOrigin } from './middleware/auth.middleware'; -import users from './controllers/iam.controller'; +import users from './controllers/user.controller'; import { config } from './common/config'; /* ----------------------------------- Api ---------------------------------- */ @@ -9,10 +11,27 @@ const app = new Hono().basePath('/api'); /* --------------------------- Global Middlewares --------------------------- */ app.use(verifyOrigin).use(validateAuthSession); +app.use(logger()); + +app.use( + '/*', + cors({ + origin: [ + 'http://localhost:5173', + 'http://localhost:80', + 'http://host.docker.internal:80', + 'http://host.docker.internal:5173' + ], // Replace with your allowed domains + + allowMethods: ['POST'], + allowHeaders: ['Content-Type'] + // credentials: true, // If you need to send cookies or HTTP authentication + }) +); /* --------------------------------- Routes --------------------------------- */ const routes = app - .route('/iam', users) + .route('/user', users) .get('/', (c) => c.json({ message: 'Server is healthy' })); /* -------------------------------------------------------------------------- */ diff --git a/src/lib/server/api/infrastructure/database/tables/users.table.ts b/src/lib/server/api/infrastructure/database/tables/users.table.ts index e3e40cb..e520f2e 100644 --- a/src/lib/server/api/infrastructure/database/tables/users.table.ts +++ b/src/lib/server/api/infrastructure/database/tables/users.table.ts @@ -4,7 +4,7 @@ import { type InferSelectModel, relations } from 'drizzle-orm'; import { timestamps } from '../utils'; import user_roles from './userRoles'; -const usersTable = pgTable('users', { +export const usersTable = pgTable('users', { id: uuid('id').primaryKey().defaultRandom(), cuid: text('cuid') .unique() @@ -25,5 +25,3 @@ export const userRelations = relations(usersTable, ({ many }) => ({ })); export type Users = InferSelectModel; - -export default usersTable; diff --git a/src/lib/server/api/providers/lucia.provider.ts b/src/lib/server/api/providers/lucia.provider.ts index 6546d43..e5af95a 100644 --- a/src/lib/server/api/providers/lucia.provider.ts +++ b/src/lib/server/api/providers/lucia.provider.ts @@ -1,11 +1,10 @@ -import { container } from 'tsyringe'; -import { lucia } from '../infrastructure/auth/lucia'; +// import { lucia } from '../infrastructure/auth/lucia'; -// Symbol -export const LuciaProvider = Symbol('LUCIA_PROVIDER'); +// // Symbol +// export const LuciaProvider = Symbol('LUCIA_PROVIDER'); -// Type -export type LuciaProvider = typeof lucia; +// // Type +// export type LuciaProvider = typeof lucia; -// Register -container.register(LuciaProvider, { useValue: lucia }); +// // Register +// container.register(LuciaProvider, { useValue: lucia }); diff --git a/src/lib/server/api/repositories/users.repository.ts b/src/lib/server/api/repositories/users.repository.ts new file mode 100644 index 0000000..2621363 --- /dev/null +++ b/src/lib/server/api/repositories/users.repository.ts @@ -0,0 +1,56 @@ +import { eq, type InferInsertModel } from 'drizzle-orm'; +import { usersTable } from '../infrastructure/database/tables/users.table'; +import { takeFirstOrThrow } from '../infrastructure/database/utils'; +import { db } from '../infrastructure/database'; + +/* -------------------------------------------------------------------------- */ +/* Repository */ +/* -------------------------------------------------------------------------- */ +/* ---------------------------------- About --------------------------------- */ +/* +Repositories are the layer that interacts with the database. They are responsible for retrieving and +storing data. They should not contain any business logic, only database queries. +*/ +/* ---------------------------------- Notes --------------------------------- */ +/* + Repositories should only contain methods for CRUD operations and any other database interactions. + Any complex logic should be delegated to a service. If a repository method requires a transaction, + it should be passed in as an argument or the class should have a method to set the transaction. + In our case the method 'trxHost' is used to set the transaction context. +*/ + +export type CreateUser = InferInsertModel; +export type UpdateUser = Partial; + +export class UsersRepository { + async findOneById(id: string) { + return db.query.usersTable.findFirst({ + where: eq(usersTable.id, id) + }); + } + + async findOneByIdOrThrow(id: string) { + const user = await this.findOneById(id); + if (!user) throw Error('User not found'); + return user; + } + + async findOneByEmail(email: string) { + return db.query.usersTable.findFirst({ + where: eq(usersTable.email, email) + }); + } + + async create(data: CreateUser) { + return db.insert(usersTable).values(data).returning().then(takeFirstOrThrow); + } + + async update(id: string, data: UpdateUser) { + return db + .update(usersTable) + .set(data) + .where(eq(usersTable.id, id)) + .returning() + .then(takeFirstOrThrow); + } +} diff --git a/src/lib/server/api/services/hashing.service.ts b/src/lib/server/api/services/hashing.service.ts new file mode 100644 index 0000000..e1b7cd6 --- /dev/null +++ b/src/lib/server/api/services/hashing.service.ts @@ -0,0 +1,32 @@ +import { Argon2id } from "oslo/password"; + +/* ---------------------------------- Note ---------------------------------- */ +/* +Reference: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#argon2id + +I use Scrpt as the hashing algorithm due to its higher compatability +with vite's build system and it uses less memory than Argon2id. + +You can use Argon2id or any other hashing algorithm you prefer. +*/ +/* -------------------------------------------------------------------------- */ +/* +With Argon2id, you get the following error at times when vite optimizes its dependencies at times, + +Error: Build failed with 2 errors: +node_modules/.pnpm/@node-rs+argon2@1.7.0/node_modules/@node-rs/argon2/index.js:159:36: ERROR: No loader is configured for ".node" files: node_module +*/ +/* -------------------------------------------------------------------------- */ +// If you don't use a hasher from oslo, which are preconfigured with recommended parameters from OWASP, +// ensure that you configure them properly. +export class HashingService { + private readonly hasher = new Argon2id(); + + async hash(data: string) { + return this.hasher.hash(data); + } + + async verify(hash: string, data: string) { + return this.hasher.verify(hash, data) + } +} \ No newline at end of file diff --git a/src/lib/server/api/services/iam.service.ts b/src/lib/server/api/services/iam.service.ts new file mode 100644 index 0000000..395c748 --- /dev/null +++ b/src/lib/server/api/services/iam.service.ts @@ -0,0 +1,24 @@ +import { lucia } from '../infrastructure/auth/lucia'; + +/* -------------------------------------------------------------------------- */ +/* Service */ +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ +/* ---------------------------------- About --------------------------------- */ +/* +Services are responsible for handling business logic and data manipulation. +They genreally call on repositories or other services to complete a use-case. +*/ +/* ---------------------------------- Notes --------------------------------- */ +/* +Services should be kept as clean and simple as possible. + +Create private functions to handle complex logic and keep the public methods as +simple as possible. This makes the service easier to read, test and understand. +*/ +/* -------------------------------------------------------------------------- */ +export class IamService { + async logout(sessionId: string) { + return lucia.invalidateSession(sessionId); + } +} diff --git a/src/lib/server/api/services/login-requests.service.ts b/src/lib/server/api/services/login-requests.service.ts deleted file mode 100644 index e831e93..0000000 --- a/src/lib/server/api/services/login-requests.service.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { BadRequest } from '../common/errors'; -import { DatabaseProvider } from '../providers'; -import { MailerService } from './mailer.service'; -import { TokensService } from './tokens.service'; -import { LuciaProvider } from '../providers/lucia.provider'; -import { UsersRepository } from '../repositories/users.repository'; -import type { SignInEmailDto } from '../../../dtos/signin-email.dto'; -import type { RegisterEmailDto } from '../../../dtos/register-email.dto'; -import { LoginRequestsRepository } from '../repositories/login-requests.repository'; - -export class LoginRequestsService { - async create(data: RegisterEmailDto) { - // generate a token, expiry date, and hash - const { token, expiry, hashedToken } = await this.tokensService.generateTokenWithExpiryAndHash(15, 'm'); - // save the login request to the database - ensuring we save the hashedToken - await this.loginRequestsRepository.create({ email: data.email, hashedToken, expiresAt: expiry }); - // send the login request email - await this.mailerService.sendLoginRequest({ - to: data.email, - props: { token: token } - }); - } - - async verify(data: SignInEmailDto) { - const validLoginRequest = await this.fetchValidRequest(data.email, data.token); - if (!validLoginRequest) throw BadRequest('Invalid token'); - - let existingUser = await this.usersRepository.findOneByEmail(data.email); - - if (!existingUser) { - const newUser = await this.handleNewUserRegistration(data.email); - return this.lucia.createSession(newUser.id, {}); - } - - return this.lucia.createSession(existingUser.id, {}); - } - - // Create a new user and send a welcome email - or other onboarding process - private async handleNewUserRegistration(email: string) { - const newUser = await this.usersRepository.create({ email, verified: true, avatar: null }) - this.mailerService.sendWelcome({ to: email, props: null }); - // TODO: add whatever onboarding process or extra data you need here - return newUser - } - - // Fetch a valid request from the database, verify the token and burn the request if it is valid - private async fetchValidRequest(email: string, token: string) { - return await this.db.transaction(async (trx) => { - // fetch the login request - const loginRequest = await this.loginRequestsRepository.trxHost(trx).findOneByEmail(email) - if (!loginRequest) return null; - - // check if the token is valid - const isValidRequest = await this.tokensService.verifyHashedToken(loginRequest.hashedToken, token); - if (!isValidRequest) return null - - // if the token is valid, burn the request - await this.loginRequestsRepository.trxHost(trx).deleteById(loginRequest.id); - return loginRequest - }) - } -} \ No newline at end of file diff --git a/src/lib/server/api/services/mailer.service.ts b/src/lib/server/api/services/mailer.service.ts new file mode 100644 index 0000000..368fdb9 --- /dev/null +++ b/src/lib/server/api/services/mailer.service.ts @@ -0,0 +1,104 @@ +import fs from 'fs'; +import path from 'path'; +import nodemailer from 'nodemailer'; +import handlebars from 'handlebars'; +import { fileURLToPath } from 'url'; +import { injectable } from 'tsyringe'; + +/* -------------------------------------------------------------------------- */ +/* Service */ +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ +/* ---------------------------------- About --------------------------------- */ +/* +Services are responsible for handling business logic and data manipulation. +They genreally call on repositories or other services to complete a use-case. +*/ +/* ---------------------------------- Notes --------------------------------- */ +/* +Services should be kept as clean and simple as possible. + +Create private functions to handle complex logic and keep the public methods as +simple as possible. This makes the service easier to read, test and understand. +*/ +/* -------------------------------------------------------------------------- */ + +type SendMail = { + to: string | string[]; + subject: string; + html: string; +}; + +type SendTemplate = { + to: string | string[]; + props: T; +}; + +@injectable() +export class MailerService { + private nodemailer = nodemailer.createTransport({ + host: 'smtp.ethereal.email', + port: 587, + secure: false, // Use `true` for port 465, `false` for all other ports + auth: { + user: 'adella.hoppe@ethereal.email', + pass: 'dshNQZYhATsdJ3ENke' + } + }); + + sendEmailVerificationToken(data: SendTemplate<{ token: string }>) { + const template = handlebars.compile(this.getTemplate('email-verification-token')); + return this.send({ + to: data.to, + subject: 'Email Verification', + html: template({ token: data.props.token }) + }); + } + + sendEmailChangeNotification(data: SendTemplate) { + const template = handlebars.compile(this.getTemplate('email-change-notice')); + return this.send({ + to: data.to, + subject: 'Email Change Notice', + html: template(null) + }); + } + + sendLoginRequest(data: SendTemplate<{ token: string }>) { + const template = handlebars.compile(this.getTemplate('email-verification-token')); + return this.send({ + to: data.to, + subject: 'Login Request', + html: template({ token: data.props.token }) + }); + } + + sendWelcome(data: SendTemplate) { + const template = handlebars.compile(this.getTemplate('welcome')); + return this.send({ + to: data.to, + subject: 'Welcome!', + html: template(null) + }); + } + + private async send({ to, subject, html }: SendMail) { + const message = await this.nodemailer.sendMail({ + from: '"Example" ', // sender address + bcc: to, + subject, // Subject line + text: html, + html + }); + console.log(nodemailer.getTestMessageUrl(message)); + } + + private getTemplate(template: string) { + const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file + const __dirname = path.dirname(__filename); // get the name of the directory + return fs.readFileSync( + path.join(__dirname, `../infrastructure/email-templates/${template}.hbs`), + 'utf-8' + ); + } +} diff --git a/src/lib/server/api/services/queues.service.ts b/src/lib/server/api/services/queues.service.ts new file mode 100644 index 0000000..97e7ca3 --- /dev/null +++ b/src/lib/server/api/services/queues.service.ts @@ -0,0 +1,19 @@ +import { injectable } from "tsyringe"; +import RedisClient from 'ioredis' +import { config } from "../common/config"; +import { Queue, Worker, type Processor } from 'bullmq'; + +@injectable() +export class QueuesServices { + connection = new RedisClient(config.REDIS_URL); + + constructor() { } + + createQueue(name: string) { + return new Queue(name, { connection: this.connection }) + } + + createWorker(name: string, prcoessor: Processor) { + return new Worker(name, prcoessor, { connection: this.connection }) + } +} \ No newline at end of file diff --git a/src/lib/server/api/services/tokens.service.ts b/src/lib/server/api/services/tokens.service.ts new file mode 100644 index 0000000..c8ac626 --- /dev/null +++ b/src/lib/server/api/services/tokens.service.ts @@ -0,0 +1,33 @@ +import { generateRandomString } from "oslo/crypto"; +import { TimeSpan, createDate, type TimeSpanUnit } from 'oslo'; +import { HashingService } from "./hashing.service"; + +export class TokensService { + private readonly hashingService = new HashingService(); + + generateToken() { + const alphabet = '23456789ACDEFGHJKLMNPQRSTUVWXYZ'; // alphabet with removed look-alike characters (0, 1, O, I) + return generateRandomString(6, alphabet); + } + + generateTokenWithExpiry(number: number, lifespan: TimeSpanUnit) { + return { + token: this.generateToken(), + expiry: createDate(new TimeSpan(number, lifespan)) + } + } + + async generateTokenWithExpiryAndHash(number: number, lifespan: TimeSpanUnit) { + const token = this.generateToken() + const hashedToken = await this.hashingService.hash(token) + return { + token, + hashedToken, + expiry: createDate(new TimeSpan(number, lifespan)) + } + } + + async verifyHashedToken(hashedToken: string, token: string) { + return this.hashingService.verify(hashedToken, token) + } +}