diff --git a/.env.example b/.env.example index 7b3b671..527dae2 100644 --- a/.env.example +++ b/.env.example @@ -18,6 +18,10 @@ ADMIN_PASSWORD= TWO_FACTOR_TIMEOUT=300000 +# OAuth +GITHUB_CLIENT_ID="" +GITHUB_CLIENT_SECRET="" + # Public PUBLIC_SITE_NAME='Bored Game' diff --git a/package.json b/package.json index e04cff2..92afa67 100644 --- a/package.json +++ b/package.json @@ -27,16 +27,17 @@ "@faker-js/faker": "^8.4.1", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.83.0", - "@playwright/test": "^1.47.0", + "@playwright/test": "^1.47.1", "@sveltejs/adapter-auto": "^3.2.4", - "@sveltejs/enhanced-img": "^0.3.4", - "@sveltejs/kit": "^2.5.26", + "@sveltejs/enhanced-img": "^0.3.7", + "@sveltejs/kit": "^2.5.27", "@sveltejs/vite-plugin-svelte": "^3.1.2", "@types/cookie": "^0.6.0", "@types/node": "^20.16.5", - "@types/pg": "^8.11.9", + "@types/pg": "^8.11.10", "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", + "arctic": "^1.9.2", "autoprefixer": "^10.4.20", "drizzle-kit": "^0.23.2", "eslint": "^8.57.0", @@ -47,7 +48,7 @@ "lucia": "3.2.0", "lucide-svelte": "^0.408.0", "nodemailer": "^6.9.15", - "postcss": "^8.4.45", + "postcss": "^8.4.47", "postcss-import": "^16.1.0", "postcss-load-config": "^5.1.0", "postcss-preset-env": "^9.6.0", @@ -64,13 +65,13 @@ "svelte-sequential-preprocessor": "^2.0.1", "sveltekit-flash-message": "^2.4.4", "sveltekit-rate-limiter": "^0.5.2", - "sveltekit-superforms": "^2.17.0", + "sveltekit-superforms": "^2.18.0", "tailwindcss": "^3.4.11", "ts-node": "^10.9.2", "tslib": "^2.7.0", "tsx": "^4.19.1", "typescript": "^5.6.2", - "vite": "^5.4.4", + "vite": "^5.4.5", "vitest": "^1.6.0", "zod": "^3.23.8" }, @@ -92,7 +93,6 @@ "@sveltejs/adapter-vercel": "^5.4.3", "@types/feather-icons": "^4.29.4", "@vercel/og": "^0.5.20", - "arctic": "^1.9.2", "bits-ui": "^0.21.13", "boardgamegeekclient": "^1.9.1", "bullmq": "^5.13.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1bcf7f5..3368666 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,7 +31,7 @@ importers: version: 3.5.5 '@lucia-auth/adapter-drizzle': specifier: ^1.1.0 - version: 1.1.0(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.9)(pg@8.12.0)(postgres@3.4.4))(lucia@3.2.0) + version: 1.1.0(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.12.0)(postgres@3.4.4))(lucia@3.2.0) '@lukeed/uuid': specifier: ^2.0.1 version: 2.0.1 @@ -46,19 +46,16 @@ importers: version: 2.6.2 '@sveltejs/adapter-node': specifier: ^5.2.2 - version: 5.2.2(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0))) + version: 5.2.2(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0))) '@sveltejs/adapter-vercel': specifier: ^5.4.3 - version: 5.4.3(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0))) + version: 5.4.3(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0))) '@types/feather-icons': specifier: ^4.29.4 version: 4.29.4 '@vercel/og': specifier: ^0.5.20 version: 0.5.20 - arctic: - specifier: ^1.9.2 - version: 1.9.2 bits-ui: specifier: ^0.21.13 version: 0.21.13(svelte@5.0.0-next.175) @@ -85,16 +82,16 @@ importers: version: 11.0.6 drizzle-orm: specifier: ^0.32.2 - version: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.9)(pg@8.12.0)(postgres@3.4.4) + version: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.12.0)(postgres@3.4.4) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.9)(pg@8.12.0)(postgres@3.4.4))(zod@3.23.8) + version: 0.5.1(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.12.0)(postgres@3.4.4))(zod@3.23.8) 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.17.0(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)) + version: 1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.18.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)) handlebars: specifier: ^4.7.8 version: 4.7.8 @@ -181,20 +178,20 @@ importers: specifier: ^0.83.0 version: 0.83.0(svelte@5.0.0-next.175) '@playwright/test': - specifier: ^1.47.0 - version: 1.47.0 + specifier: ^1.47.1 + version: 1.47.1 '@sveltejs/adapter-auto': specifier: ^3.2.4 - version: 3.2.4(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0))) + version: 3.2.4(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0))) '@sveltejs/enhanced-img': - specifier: ^0.3.4 - version: 0.3.4(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + specifier: ^0.3.7 + version: 0.3.7(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) '@sveltejs/kit': - specifier: ^2.5.26 - version: 2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + specifier: ^2.5.27 + version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.2 - version: 3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + version: 3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) '@types/cookie': specifier: ^0.6.0 version: 0.6.0 @@ -202,17 +199,20 @@ importers: specifier: ^20.16.5 version: 20.16.5 '@types/pg': - specifier: ^8.11.9 - version: 8.11.9 + specifier: ^8.11.10 + version: 8.11.10 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) '@typescript-eslint/parser': specifier: ^7.18.0 version: 7.18.0(eslint@8.57.0)(typescript@5.6.2) + arctic: + specifier: ^1.9.2 + version: 1.9.2 autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.45) + version: 10.4.20(postcss@8.4.47) drizzle-kit: specifier: ^0.23.2 version: 0.23.2 @@ -241,17 +241,17 @@ importers: specifier: ^6.9.15 version: 6.9.15 postcss: - specifier: ^8.4.45 - version: 8.4.45 + specifier: ^8.4.47 + version: 8.4.47 postcss-import: specifier: ^16.1.0 - version: 16.1.0(postcss@8.4.45) + version: 16.1.0(postcss@8.4.47) postcss-load-config: specifier: ^5.1.0 - version: 5.1.0(jiti@1.21.6)(postcss@8.4.45)(tsx@4.19.1) + version: 5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1) postcss-preset-env: specifier: ^9.6.0 - version: 9.6.0(postcss@8.4.45) + version: 9.6.0(postcss@8.4.47) prettier: specifier: ^3.3.3 version: 3.3.3 @@ -272,7 +272,7 @@ importers: version: 5.0.0-next.175 svelte-check: specifier: ^3.8.6 - version: 3.8.6(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.45)(tsx@4.19.1))(postcss@8.4.45)(sass@1.78.0)(svelte@5.0.0-next.175) + version: 3.8.6(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.78.0)(svelte@5.0.0-next.175) svelte-headless-table: specifier: ^0.18.2 version: 0.18.2(svelte@5.0.0-next.175) @@ -281,19 +281,19 @@ importers: version: 3.1.4(svelte@5.0.0-next.175)(typescript@5.6.2) svelte-preprocess: specifier: ^6.0.2 - version: 6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.45)(tsx@4.19.1))(postcss@8.4.45)(sass@1.78.0)(svelte@5.0.0-next.175)(typescript@5.6.2) + version: 6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.78.0)(svelte@5.0.0-next.175)(typescript@5.6.2) 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.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175) + version: 2.4.4(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175) sveltekit-rate-limiter: specifier: ^0.5.2 - version: 0.5.2(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0))) + version: 0.5.2(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0))) sveltekit-superforms: - specifier: ^2.17.0 - version: 2.17.0(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175) + specifier: ^2.18.0 + version: 2.18.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175) tailwindcss: specifier: ^3.4.11 version: 3.4.11(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)) @@ -310,8 +310,8 @@ importers: specifier: ^5.6.2 version: 5.6.2 vite: - specifier: ^5.4.4 - version: 5.4.4(@types/node@20.16.5)(sass@1.78.0) + specifier: ^5.4.5 + version: 5.4.5(@types/node@20.16.5)(sass@1.78.0) vitest: specifier: ^1.6.0 version: 1.6.0(@types/node@20.16.5)(sass@1.78.0) @@ -1706,8 +1706,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.47.0': - resolution: {integrity: sha512-SgAdlSwYVpToI4e/IH19IHHWvoijAYH5hu2MWSXptRypLSnzj51PcGD+rsOXFayde4P9ZLi+loXVwArg6IUkCA==} + '@playwright/test@1.47.1': + resolution: {integrity: sha512-dbWpcNQZ5nj16m+A5UNScYx7HX5trIy7g4phrcitn+Nk83S32EBX/CLU4hiF4RGKX/yRc93AAqtfaXB7JWBd4Q==} engines: {node: '>=18'} hasBin: true @@ -1956,14 +1956,14 @@ packages: peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/enhanced-img@0.3.4': - resolution: {integrity: sha512-eX+ob5uWr0bTLMKeG9nhhM84aR88hqiLiyEfWZPX7ijhk/wlmYSUX9nOiaVHh2ct1U+Ju9Hhb90Copw+ZNOB8w==} + '@sveltejs/enhanced-img@0.3.7': + resolution: {integrity: sha512-Rb692ralH4Vs8bx52b403Xs2ZmZJ3XctYiXGNXLay9ex1G56jD31jqPFnwoWKyUqiD9JTi6CxVp/1Xy2Dus86Q==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: '>= 5.0.0' - '@sveltejs/kit@2.5.26': - resolution: {integrity: sha512-8l1JTIM2L+bS8ebq1E+nGjv/YSKSnD9Q19bYIUkc41vaEG2JjVUx6ikvPIJv2hkQAuqJLzoPrXlKk4KcyWOv3Q==} + '@sveltejs/kit@2.5.27': + resolution: {integrity: sha512-CcbRTzl+65oWljAASL6UlxM4x3NWwd0fjq5fQOfP243vs50myFQ8lil0fr3Im6HeeQqYUCtnv8HjO8REWVPjTw==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -2019,12 +2019,12 @@ packages: '@types/node@20.16.5': resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==} + '@types/pg@8.11.10': + resolution: {integrity: sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==} + '@types/pg@8.11.6': resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} - '@types/pg@8.11.9': - resolution: {integrity: sha512-M4mYeJZRBD9lCBCGa72F44uKSV9eJrAFfjlPJagdA6pgIr2OPJULFB7nqnZzOdqXG0qzHlgtZKzTdIgbmHitSg==} - '@types/pug@2.0.10': resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} @@ -2034,6 +2034,22 @@ packages: '@types/validator@13.12.1': resolution: {integrity: sha512-w0URwf7BQb0rD/EuiG12KP0bailHKHP5YVviJG9zw3ykAokL0TuxU2TUqMB7EwZ59bDHYdeTIvjI5m0S7qHfOA==} + '@typeschema/class-validator@0.2.0': + resolution: {integrity: sha512-zq0qeflVu1Z6D0ttkqAWZMtxJeNEQ70yo/025sV0jujiOOgQx38JXrky77nSWWPp2E1KIMtgkToQbkzkXyW5yg==} + peerDependencies: + class-validator: ^0.14.1 + peerDependenciesMeta: + class-validator: + optional: true + + '@typeschema/core@0.14.0': + resolution: {integrity: sha512-Ia6PtZHcL3KqsAWXjMi5xIyZ7XMH4aSnOQes8mfMLx+wGFGtGRNlwe6Y7cYvX+WfNK67OL0/HSe9t8QDygV0/w==} + peerDependencies: + '@types/json-schema': ^7.0.15 + peerDependenciesMeta: + '@types/json-schema': + optional: true + '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2351,6 +2367,9 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} @@ -3219,6 +3238,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libphonenumber-js@1.11.8: + resolution: {integrity: sha512-0fv/YKpJBAgXKy0kaS3fnqoUVN8901vUYAKIGD/MWZaDfhJt1nZjPL3ZzdZBt/G8G8Hw2J1xOIrXWdNHFHPAvg==} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -3673,13 +3695,13 @@ packages: pkg-types@1.2.0: resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} - playwright-core@1.47.0: - resolution: {integrity: sha512-1DyHT8OqkcfCkYUD9zzUTfg7EfTd+6a8MkD/NWOvjo0u/SCNd5YmY/lJwFvUZOxJbWNds+ei7ic2+R/cRz/PDg==} + playwright-core@1.47.1: + resolution: {integrity: sha512-i1iyJdLftqtt51mEk6AhYFaAJCDx0xQ/O5NU8EKaWFgMjItPVma542Nh/Aq8aLCjIJSzjaiEQGW/nyqLkGF1OQ==} engines: {node: '>=18'} hasBin: true - playwright@1.47.0: - resolution: {integrity: sha512-jOWiRq2pdNAX/mwLiwFYnPHpEZ4rM+fRSQpRHwEwZlP2PUANvL3+aJOF/bvISMhFD30rqMxUB4RJx9aQbfh4Ww==} + playwright@1.47.1: + resolution: {integrity: sha512-SUEKi6947IqYbKxRiqnbUobVZY4bF1uu+ZnZNJX9DfU1tlf2UhWfvVjLf01pQx9URsOr18bFVUKXmanYWhbfkw==} engines: {node: '>=18'} hasBin: true @@ -3922,8 +3944,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.45: - resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -4211,6 +4233,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -4453,8 +4479,8 @@ packages: peerDependencies: '@sveltejs/kit': 1.x || 2.x - sveltekit-superforms@2.17.0: - resolution: {integrity: sha512-QrX8pkcmE0XoeVU42zMhsah4FoDrgtPc/4cZEr38rDlgU+DE0xNc5J0E7z1456sUJNbFjaB0+HZwwAkX0vYqaA==} + sveltekit-superforms@2.18.0: + resolution: {integrity: sha512-INx2EwWk82WcUdG5iEMtcJ+NLvBpYOdiHDRa68Q9p9W+YRAN3mxwiqj5gpfVrvBPlGfFZypeAze54pBZ/wlspw==} peerDependencies: '@sveltejs/kit': 1.x || 2.x svelte: 3.x || 4.x || >=5.0.0-next.51 @@ -4679,8 +4705,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.4.4: - resolution: {integrity: sha512-RHFCkULitycHVTtelJ6jQLd+KSAAzOgEYorV32R2q++M6COBjKJR6BxqClwp5sf0XaBDjVMuJ9wnNfyAJwjMkA==} + vite@5.4.5: + resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4939,201 +4965,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.45)': + '@csstools/postcss-cascade-layers@4.0.6(postcss@8.4.47)': dependencies: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - '@csstools/postcss-color-function@3.0.19(postcss@8.4.45)': + '@csstools/postcss-color-function@3.0.19(postcss@8.4.47)': dependencies: '@csstools/css-color-parser': 2.0.5(@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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-color-mix-function@2.0.19(postcss@8.4.45)': + '@csstools/postcss-color-mix-function@2.0.19(postcss@8.4.47)': dependencies: '@csstools/css-color-parser': 2.0.5(@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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-content-alt-text@1.0.0(postcss@8.4.45)': + '@csstools/postcss-content-alt-text@1.0.0(postcss@8.4.47)': 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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-exponential-functions@1.0.9(postcss@8.4.45)': + '@csstools/postcss-exponential-functions@1.0.9(postcss@8.4.47)': 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.45 + postcss: 8.4.47 - '@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.45)': + '@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.47)': dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-gamut-mapping@1.0.11(postcss@8.4.45)': + '@csstools/postcss-gamut-mapping@1.0.11(postcss@8.4.47)': dependencies: '@csstools/css-color-parser': 2.0.5(@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.45 + postcss: 8.4.47 - '@csstools/postcss-gradients-interpolation-method@4.0.20(postcss@8.4.45)': + '@csstools/postcss-gradients-interpolation-method@4.0.20(postcss@8.4.47)': dependencies: '@csstools/css-color-parser': 2.0.5(@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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-hwb-function@3.0.18(postcss@8.4.45)': + '@csstools/postcss-hwb-function@3.0.18(postcss@8.4.47)': dependencies: '@csstools/css-color-parser': 2.0.5(@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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-ic-unit@3.0.7(postcss@8.4.45)': + '@csstools/postcss-ic-unit@3.0.7(postcss@8.4.47)': dependencies: - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-initial@1.0.1(postcss@8.4.45)': + '@csstools/postcss-initial@1.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - '@csstools/postcss-is-pseudo-class@4.0.8(postcss@8.4.45)': + '@csstools/postcss-is-pseudo-class@4.0.8(postcss@8.4.47)': dependencies: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - '@csstools/postcss-light-dark-function@1.0.8(postcss@8.4.45)': + '@csstools/postcss-light-dark-function@1.0.8(postcss@8.4.47)': 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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.45)': + '@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - '@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.45)': + '@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - '@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.45)': + '@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - '@csstools/postcss-logical-resize@2.0.1(postcss@8.4.45)': + '@csstools/postcss-logical-resize@2.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-logical-viewport-units@2.0.11(postcss@8.4.45)': + '@csstools/postcss-logical-viewport-units@2.0.11(postcss@8.4.47)': dependencies: '@csstools/css-tokenizer': 2.4.1 - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-media-minmax@1.1.8(postcss@8.4.45)': + '@csstools/postcss-media-minmax@1.1.8(postcss@8.4.47)': 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.45 + postcss: 8.4.47 - '@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.11(postcss@8.4.45)': + '@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.11(postcss@8.4.47)': 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.45 + postcss: 8.4.47 - '@csstools/postcss-nested-calc@3.0.2(postcss@8.4.45)': + '@csstools/postcss-nested-calc@3.0.2(postcss@8.4.47)': dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.45)': + '@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-oklab-function@3.0.19(postcss@8.4.45)': + '@csstools/postcss-oklab-function@3.0.19(postcss@8.4.47)': dependencies: '@csstools/css-color-parser': 2.0.5(@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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-progressive-custom-properties@3.3.0(postcss@8.4.45)': + '@csstools/postcss-progressive-custom-properties@3.3.0(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-relative-color-syntax@2.0.19(postcss@8.4.45)': + '@csstools/postcss-relative-color-syntax@2.0.19(postcss@8.4.47)': dependencies: '@csstools/css-color-parser': 2.0.5(@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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - '@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.45)': + '@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - '@csstools/postcss-stepped-value-functions@3.0.10(postcss@8.4.45)': + '@csstools/postcss-stepped-value-functions@3.0.10(postcss@8.4.47)': 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.45 + postcss: 8.4.47 - '@csstools/postcss-text-decoration-shorthand@3.0.7(postcss@8.4.45)': + '@csstools/postcss-text-decoration-shorthand@3.0.7(postcss@8.4.47)': dependencies: '@csstools/color-helpers': 4.2.1 - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - '@csstools/postcss-trigonometric-functions@3.0.10(postcss@8.4.45)': + '@csstools/postcss-trigonometric-functions@3.0.10(postcss@8.4.47)': 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.45 + postcss: 8.4.47 - '@csstools/postcss-unset-value@3.0.1(postcss@8.4.45)': + '@csstools/postcss-unset-value@3.0.1(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.1.2)': dependencies: @@ -5143,9 +5169,9 @@ snapshots: dependencies: postcss-selector-parser: 6.1.2 - '@csstools/utilities@1.0.0(postcss@8.4.45)': + '@csstools/utilities@1.0.0(postcss@8.4.47)': dependencies: - postcss: 8.4.45 + postcss: 8.4.47 '@drizzle-team/brocli@0.8.2': {} @@ -5664,9 +5690,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@lucia-auth/adapter-drizzle@1.1.0(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.9)(pg@8.12.0)(postgres@3.4.4))(lucia@3.2.0)': + '@lucia-auth/adapter-drizzle@1.1.0(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.12.0)(postgres@3.4.4))(lucia@3.2.0)': dependencies: - drizzle-orm: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.9)(pg@8.12.0)(postgres@3.4.4) + drizzle-orm: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.12.0)(postgres@3.4.4) lucia: 3.2.0 '@lukeed/csprng@1.1.0': {} @@ -5888,9 +5914,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.47.0': + '@playwright/test@1.47.1': dependencies: - playwright: 1.47.0 + playwright: 1.47.1 '@polka/url@1.0.0-next.25': {} @@ -6063,41 +6089,41 @@ snapshots: '@sodaru/yup-to-json-schema@2.0.1': optional: true - '@sveltejs/adapter-auto@3.2.4(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))': + '@sveltejs/adapter-auto@3.2.4(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))': dependencies: - '@sveltejs/kit': 2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) import-meta-resolve: 4.1.0 - '@sveltejs/adapter-node@5.2.2(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))': + '@sveltejs/adapter-node@5.2.2(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))': dependencies: '@rollup/plugin-commonjs': 26.0.1(rollup@4.21.2) '@rollup/plugin-json': 6.1.0(rollup@4.21.2) '@rollup/plugin-node-resolve': 15.2.3(rollup@4.21.2) - '@sveltejs/kit': 2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) rollup: 4.21.2 - '@sveltejs/adapter-vercel@5.4.3(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))': + '@sveltejs/adapter-vercel@5.4.3(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))': dependencies: - '@sveltejs/kit': 2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) '@vercel/nft': 0.27.4 esbuild: 0.21.5 transitivePeerDependencies: - encoding - supports-color - '@sveltejs/enhanced-img@0.3.4(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0))': + '@sveltejs/enhanced-img@0.3.7(rollup@4.21.2)(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0))': dependencies: magic-string: 0.30.11 svelte: 5.0.0-next.175 svelte-parse-markup: 0.1.5(svelte@5.0.0-next.175) - vite: 5.4.4(@types/node@20.16.5)(sass@1.78.0) + vite: 5.4.5(@types/node@20.16.5)(sass@1.78.0) vite-imagetools: 7.0.4(rollup@4.21.2) transitivePeerDependencies: - rollup - '@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0))': + '@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.0.0 @@ -6111,28 +6137,28 @@ snapshots: sirv: 2.0.4 svelte: 5.0.0-next.175 tiny-glob: 0.2.9 - vite: 5.4.4(@types/node@20.16.5)(sass@1.78.0) + vite: 5.4.5(@types/node@20.16.5)(sass@1.78.0) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) debug: 4.3.6 svelte: 5.0.0-next.175 - vite: 5.4.4(@types/node@20.16.5)(sass@1.78.0) + vite: 5.4.5(@types/node@20.16.5)(sass@1.78.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0))': + '@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) debug: 4.3.6 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.11 svelte: 5.0.0-next.175 svelte-hmr: 0.16.0(svelte@5.0.0-next.175) - vite: 5.4.4(@types/node@20.16.5)(sass@1.78.0) - vitefu: 0.2.5(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + vite: 5.4.5(@types/node@20.16.5)(sass@1.78.0) + vitefu: 0.2.5(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) transitivePeerDependencies: - supports-color @@ -6166,13 +6192,13 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/pg@8.11.6': + '@types/pg@8.11.10': dependencies: '@types/node': 20.16.5 pg-protocol: 1.6.1 pg-types: 4.0.2 - '@types/pg@8.11.9': + '@types/pg@8.11.6': dependencies: '@types/node': 20.16.5 pg-protocol: 1.6.1 @@ -6185,6 +6211,20 @@ snapshots: '@types/validator@13.12.1': optional: true + '@typeschema/class-validator@0.2.0(@types/json-schema@7.0.15)(class-validator@0.14.1)': + dependencies: + '@typeschema/core': 0.14.0(@types/json-schema@7.0.15) + optionalDependencies: + class-validator: 0.14.1 + transitivePeerDependencies: + - '@types/json-schema' + optional: true + + '@typeschema/core@0.14.0(@types/json-schema@7.0.15)': + optionalDependencies: + '@types/json-schema': 7.0.15 + optional: true + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.11.0 @@ -6428,14 +6468,14 @@ snapshots: async-sema@3.1.1: {} - autoprefixer@10.4.20(postcss@8.4.45): + autoprefixer@10.4.20(postcss@8.4.47): dependencies: browserslist: 4.23.3 caniuse-lite: 1.0.30001655 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.0 - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 axobject-query@4.1.0: {} @@ -6578,6 +6618,13 @@ snapshots: chownr@2.0.0: {} + class-validator@0.14.1: + dependencies: + '@types/validator': 13.12.1 + libphonenumber-js: 1.11.8 + validator: 13.12.0 + optional: true + class-variance-authority@0.7.0: dependencies: clsx: 2.0.0 @@ -6658,25 +6705,25 @@ snapshots: css-background-parser@0.1.0: {} - css-blank-pseudo@6.0.2(postcss@8.4.45): + css-blank-pseudo@6.0.2(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 css-box-shadow@1.0.0-3: {} css-color-keywords@1.0.0: {} - css-has-pseudo@6.0.5(postcss@8.4.45): + css-has-pseudo@6.0.5(postcss@8.4.47): dependencies: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - css-prefers-color-scheme@9.0.1(postcss@8.4.45): + css-prefers-color-scheme@9.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 css-to-react-native@3.2.0: dependencies: @@ -6687,7 +6734,7 @@ snapshots: css-tree@2.3.1: dependencies: mdn-data: 2.0.30 - source-map-js: 1.2.0 + source-map-js: 1.2.1 cssdb@8.1.0: {} @@ -6769,16 +6816,16 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.9)(pg@8.12.0)(postgres@3.4.4): + drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.12.0)(postgres@3.4.4): optionalDependencies: '@neondatabase/serverless': 0.9.5 - '@types/pg': 8.11.9 + '@types/pg': 8.11.10 pg: 8.12.0 postgres: 3.4.4 - drizzle-zod@0.5.1(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.9)(pg@8.12.0)(postgres@3.4.4))(zod@3.23.8): + drizzle-zod@0.5.1(drizzle-orm@0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.12.0)(postgres@3.4.4))(zod@3.23.8): dependencies: - drizzle-orm: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.9)(pg@8.12.0)(postgres@3.4.4) + drizzle-orm: 0.32.2(@neondatabase/serverless@0.9.5)(@types/pg@8.11.10)(pg@8.12.0)(postgres@3.4.4) zod: 3.23.8 eastasianwidth@0.2.0: {} @@ -6945,9 +6992,9 @@ snapshots: eslint-compat-utils: 0.5.1(eslint@8.57.0) esutils: 2.0.3 known-css-properties: 0.30.0 - postcss: 8.4.45 - postcss-load-config: 3.1.4(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)) - postcss-safe-parser: 6.0.0(postcss@8.4.45) + postcss: 8.4.47 + postcss-load-config: 3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)) + postcss-safe-parser: 6.0.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 semver: 7.6.3 svelte-eslint-parser: 0.41.0(svelte@5.0.0-next.175) @@ -7170,11 +7217,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.17.0(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)): + formsnap@1.0.1(svelte@5.0.0-next.175)(sveltekit-superforms@2.18.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175)): dependencies: nanoid: 5.0.7 svelte: 5.0.0-next.175 - sveltekit-superforms: 2.17.0(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175) + sveltekit-superforms: 2.18.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175) forwarded@0.2.0: {} @@ -7488,6 +7535,9 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + libphonenumber-js@1.11.8: + optional: true + lilconfig@2.1.0: {} lilconfig@3.1.2: {} @@ -7884,281 +7934,281 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 - playwright-core@1.47.0: {} + playwright-core@1.47.1: {} - playwright@1.47.0: + playwright@1.47.1: dependencies: - playwright-core: 1.47.0 + playwright-core: 1.47.1 optionalDependencies: fsevents: 2.3.2 pngjs@5.0.0: {} - postcss-attribute-case-insensitive@6.0.3(postcss@8.4.45): + postcss-attribute-case-insensitive@6.0.3(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-clamp@4.1.0(postcss@8.4.45): + postcss-clamp@4.1.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-color-functional-notation@6.0.14(postcss@8.4.45): + postcss-color-functional-notation@6.0.14(postcss@8.4.47): dependencies: '@csstools/css-color-parser': 2.0.5(@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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - postcss-color-hex-alpha@9.0.4(postcss@8.4.45): + postcss-color-hex-alpha@9.0.4(postcss@8.4.47): dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-color-rebeccapurple@9.0.3(postcss@8.4.45): + postcss-color-rebeccapurple@9.0.3(postcss@8.4.47): dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-custom-media@10.0.8(postcss@8.4.45): + postcss-custom-media@10.0.8(postcss@8.4.47): 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.45 + postcss: 8.4.47 - postcss-custom-properties@13.3.12(postcss@8.4.45): + postcss-custom-properties@13.3.12(postcss@8.4.47): 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.45) - postcss: 8.4.45 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-custom-selectors@7.1.12(postcss@8.4.45): + postcss-custom-selectors@7.1.12(postcss@8.4.47): 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.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-dir-pseudo-class@8.0.1(postcss@8.4.45): + postcss-dir-pseudo-class@8.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-double-position-gradients@5.0.7(postcss@8.4.45): + postcss-double-position-gradients@5.0.7(postcss@8.4.47): dependencies: - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-focus-visible@9.0.1(postcss@8.4.45): + postcss-focus-visible@9.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-focus-within@8.0.1(postcss@8.4.45): + postcss-focus-within@8.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-font-variant@5.0.0(postcss@8.4.45): + postcss-font-variant@5.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - postcss-gap-properties@5.0.1(postcss@8.4.45): + postcss-gap-properties@5.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - postcss-image-set-function@6.0.3(postcss@8.4.45): + postcss-image-set-function@6.0.3(postcss@8.4.47): dependencies: - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-import@15.1.0(postcss@8.4.45): + postcss-import@15.1.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-import@16.1.0(postcss@8.4.45): + postcss-import@16.1.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.45): + postcss-js@4.0.1(postcss@8.4.47): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.45 + postcss: 8.4.47 - postcss-lab-function@6.0.19(postcss@8.4.45): + postcss-lab-function@6.0.19(postcss@8.4.47): dependencies: '@csstools/css-color-parser': 2.0.5(@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.45) - '@csstools/utilities': 1.0.0(postcss@8.4.45) - postcss: 8.4.45 + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/utilities': 1.0.0(postcss@8.4.47) + postcss: 8.4.47 - postcss-load-config@3.1.4(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)): + postcss-load-config@3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.45 + postcss: 8.4.47 ts-node: 10.9.2(@types/node@20.16.5)(typescript@5.6.2) - postcss-load-config@4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: - postcss: 8.4.45 + postcss: 8.4.47 ts-node: 10.9.2(@types/node@20.16.5)(typescript@5.6.2) - postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.45)(tsx@4.19.1): + postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 optionalDependencies: jiti: 1.21.6 - postcss: 8.4.45 + postcss: 8.4.47 tsx: 4.19.1 - postcss-logical@7.0.1(postcss@8.4.45): + postcss-logical@7.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-nested@6.2.0(postcss@8.4.45): + postcss-nested@6.2.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-nesting@12.1.5(postcss@8.4.45): + postcss-nesting@12.1.5(postcss@8.4.47): dependencies: '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.1.2) '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-opacity-percentage@2.0.0(postcss@8.4.45): + postcss-opacity-percentage@2.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - postcss-overflow-shorthand@5.0.1(postcss@8.4.45): + postcss-overflow-shorthand@5.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-page-break@3.0.4(postcss@8.4.45): + postcss-page-break@3.0.4(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - postcss-place@9.0.1(postcss@8.4.45): + postcss-place@9.0.1(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-preset-env@9.6.0(postcss@8.4.45): + postcss-preset-env@9.6.0(postcss@8.4.47): dependencies: - '@csstools/postcss-cascade-layers': 4.0.6(postcss@8.4.45) - '@csstools/postcss-color-function': 3.0.19(postcss@8.4.45) - '@csstools/postcss-color-mix-function': 2.0.19(postcss@8.4.45) - '@csstools/postcss-content-alt-text': 1.0.0(postcss@8.4.45) - '@csstools/postcss-exponential-functions': 1.0.9(postcss@8.4.45) - '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.45) - '@csstools/postcss-gamut-mapping': 1.0.11(postcss@8.4.45) - '@csstools/postcss-gradients-interpolation-method': 4.0.20(postcss@8.4.45) - '@csstools/postcss-hwb-function': 3.0.18(postcss@8.4.45) - '@csstools/postcss-ic-unit': 3.0.7(postcss@8.4.45) - '@csstools/postcss-initial': 1.0.1(postcss@8.4.45) - '@csstools/postcss-is-pseudo-class': 4.0.8(postcss@8.4.45) - '@csstools/postcss-light-dark-function': 1.0.8(postcss@8.4.45) - '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.45) - '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.45) - '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.45) - '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.45) - '@csstools/postcss-logical-viewport-units': 2.0.11(postcss@8.4.45) - '@csstools/postcss-media-minmax': 1.1.8(postcss@8.4.45) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.11(postcss@8.4.45) - '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.45) - '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.45) - '@csstools/postcss-oklab-function': 3.0.19(postcss@8.4.45) - '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.45) - '@csstools/postcss-relative-color-syntax': 2.0.19(postcss@8.4.45) - '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.45) - '@csstools/postcss-stepped-value-functions': 3.0.10(postcss@8.4.45) - '@csstools/postcss-text-decoration-shorthand': 3.0.7(postcss@8.4.45) - '@csstools/postcss-trigonometric-functions': 3.0.10(postcss@8.4.45) - '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.45) - autoprefixer: 10.4.20(postcss@8.4.45) + '@csstools/postcss-cascade-layers': 4.0.6(postcss@8.4.47) + '@csstools/postcss-color-function': 3.0.19(postcss@8.4.47) + '@csstools/postcss-color-mix-function': 2.0.19(postcss@8.4.47) + '@csstools/postcss-content-alt-text': 1.0.0(postcss@8.4.47) + '@csstools/postcss-exponential-functions': 1.0.9(postcss@8.4.47) + '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.4.47) + '@csstools/postcss-gamut-mapping': 1.0.11(postcss@8.4.47) + '@csstools/postcss-gradients-interpolation-method': 4.0.20(postcss@8.4.47) + '@csstools/postcss-hwb-function': 3.0.18(postcss@8.4.47) + '@csstools/postcss-ic-unit': 3.0.7(postcss@8.4.47) + '@csstools/postcss-initial': 1.0.1(postcss@8.4.47) + '@csstools/postcss-is-pseudo-class': 4.0.8(postcss@8.4.47) + '@csstools/postcss-light-dark-function': 1.0.8(postcss@8.4.47) + '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.4.47) + '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.4.47) + '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.4.47) + '@csstools/postcss-logical-resize': 2.0.1(postcss@8.4.47) + '@csstools/postcss-logical-viewport-units': 2.0.11(postcss@8.4.47) + '@csstools/postcss-media-minmax': 1.1.8(postcss@8.4.47) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.11(postcss@8.4.47) + '@csstools/postcss-nested-calc': 3.0.2(postcss@8.4.47) + '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.4.47) + '@csstools/postcss-oklab-function': 3.0.19(postcss@8.4.47) + '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.4.47) + '@csstools/postcss-relative-color-syntax': 2.0.19(postcss@8.4.47) + '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.4.47) + '@csstools/postcss-stepped-value-functions': 3.0.10(postcss@8.4.47) + '@csstools/postcss-text-decoration-shorthand': 3.0.7(postcss@8.4.47) + '@csstools/postcss-trigonometric-functions': 3.0.10(postcss@8.4.47) + '@csstools/postcss-unset-value': 3.0.1(postcss@8.4.47) + autoprefixer: 10.4.20(postcss@8.4.47) browserslist: 4.23.3 - css-blank-pseudo: 6.0.2(postcss@8.4.45) - css-has-pseudo: 6.0.5(postcss@8.4.45) - css-prefers-color-scheme: 9.0.1(postcss@8.4.45) + css-blank-pseudo: 6.0.2(postcss@8.4.47) + css-has-pseudo: 6.0.5(postcss@8.4.47) + css-prefers-color-scheme: 9.0.1(postcss@8.4.47) cssdb: 8.1.0 - postcss: 8.4.45 - postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.45) - postcss-clamp: 4.1.0(postcss@8.4.45) - postcss-color-functional-notation: 6.0.14(postcss@8.4.45) - postcss-color-hex-alpha: 9.0.4(postcss@8.4.45) - postcss-color-rebeccapurple: 9.0.3(postcss@8.4.45) - postcss-custom-media: 10.0.8(postcss@8.4.45) - postcss-custom-properties: 13.3.12(postcss@8.4.45) - postcss-custom-selectors: 7.1.12(postcss@8.4.45) - postcss-dir-pseudo-class: 8.0.1(postcss@8.4.45) - postcss-double-position-gradients: 5.0.7(postcss@8.4.45) - postcss-focus-visible: 9.0.1(postcss@8.4.45) - postcss-focus-within: 8.0.1(postcss@8.4.45) - postcss-font-variant: 5.0.0(postcss@8.4.45) - postcss-gap-properties: 5.0.1(postcss@8.4.45) - postcss-image-set-function: 6.0.3(postcss@8.4.45) - postcss-lab-function: 6.0.19(postcss@8.4.45) - postcss-logical: 7.0.1(postcss@8.4.45) - postcss-nesting: 12.1.5(postcss@8.4.45) - postcss-opacity-percentage: 2.0.0(postcss@8.4.45) - postcss-overflow-shorthand: 5.0.1(postcss@8.4.45) - postcss-page-break: 3.0.4(postcss@8.4.45) - postcss-place: 9.0.1(postcss@8.4.45) - postcss-pseudo-class-any-link: 9.0.2(postcss@8.4.45) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.45) - postcss-selector-not: 7.0.2(postcss@8.4.45) + postcss: 8.4.47 + postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.47) + postcss-clamp: 4.1.0(postcss@8.4.47) + postcss-color-functional-notation: 6.0.14(postcss@8.4.47) + postcss-color-hex-alpha: 9.0.4(postcss@8.4.47) + postcss-color-rebeccapurple: 9.0.3(postcss@8.4.47) + postcss-custom-media: 10.0.8(postcss@8.4.47) + postcss-custom-properties: 13.3.12(postcss@8.4.47) + postcss-custom-selectors: 7.1.12(postcss@8.4.47) + postcss-dir-pseudo-class: 8.0.1(postcss@8.4.47) + postcss-double-position-gradients: 5.0.7(postcss@8.4.47) + postcss-focus-visible: 9.0.1(postcss@8.4.47) + postcss-focus-within: 8.0.1(postcss@8.4.47) + postcss-font-variant: 5.0.0(postcss@8.4.47) + postcss-gap-properties: 5.0.1(postcss@8.4.47) + postcss-image-set-function: 6.0.3(postcss@8.4.47) + postcss-lab-function: 6.0.19(postcss@8.4.47) + postcss-logical: 7.0.1(postcss@8.4.47) + postcss-nesting: 12.1.5(postcss@8.4.47) + postcss-opacity-percentage: 2.0.0(postcss@8.4.47) + postcss-overflow-shorthand: 5.0.1(postcss@8.4.47) + postcss-page-break: 3.0.4(postcss@8.4.47) + postcss-place: 9.0.1(postcss@8.4.47) + postcss-pseudo-class-any-link: 9.0.2(postcss@8.4.47) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.47) + postcss-selector-not: 7.0.2(postcss@8.4.47) - postcss-pseudo-class-any-link@9.0.2(postcss@8.4.45): + postcss-pseudo-class-any-link@9.0.2(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-replace-overflow-wrap@4.0.0(postcss@8.4.45): + postcss-replace-overflow-wrap@4.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - postcss-safe-parser@6.0.0(postcss@8.4.45): + postcss-safe-parser@6.0.0(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - postcss-scss@4.0.9(postcss@8.4.45): + postcss-scss@4.0.9(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 - postcss-selector-not@7.0.2(postcss@8.4.45): + postcss-selector-not@7.0.2(postcss@8.4.47): dependencies: - postcss: 8.4.45 + postcss: 8.4.47 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -8168,11 +8218,11 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.45: + postcss@8.4.47: dependencies: nanoid: 3.3.7 picocolors: 1.1.0 - source-map-js: 1.2.0 + source-map-js: 1.2.1 postgres-array@2.0.0: {} @@ -8502,6 +8552,8 @@ snapshots: source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -8578,14 +8630,14 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.8.6(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.45)(tsx@4.19.1))(postcss@8.4.45)(sass@1.78.0)(svelte@5.0.0-next.175): + svelte-check@3.8.6(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.78.0)(svelte@5.0.0-next.175): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 picocolors: 1.1.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.45)(tsx@4.19.1))(postcss@8.4.45)(sass@1.78.0)(svelte@5.0.0-next.175)(typescript@5.6.2) + svelte-preprocess: 5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.78.0)(svelte@5.0.0-next.175)(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - '@babel/core' @@ -8603,8 +8655,8 @@ snapshots: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.45 - postcss-scss: 4.0.9(postcss@8.4.45) + postcss: 8.4.47 + postcss-scss: 4.0.9(postcss@8.4.47) optionalDependencies: svelte: 5.0.0-next.175 @@ -8641,7 +8693,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.45)(tsx@4.19.1))(postcss@8.4.45)(sass@1.78.0)(svelte@5.0.0-next.175)(typescript@5.6.2): + svelte-preprocess@5.1.4(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.78.0)(svelte@5.0.0-next.175)(typescript@5.6.2): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -8650,17 +8702,17 @@ snapshots: strip-indent: 3.0.0 svelte: 5.0.0-next.175 optionalDependencies: - postcss: 8.4.45 - postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.45)(tsx@4.19.1) + postcss: 8.4.47 + postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1) sass: 1.78.0 typescript: 5.6.2 - svelte-preprocess@6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.45)(tsx@4.19.1))(postcss@8.4.45)(sass@1.78.0)(svelte@5.0.0-next.175)(typescript@5.6.2): + svelte-preprocess@6.0.2(postcss-load-config@5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1))(postcss@8.4.47)(sass@1.78.0)(svelte@5.0.0-next.175)(typescript@5.6.2): dependencies: svelte: 5.0.0-next.175 optionalDependencies: - postcss: 8.4.45 - postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.45)(tsx@4.19.1) + postcss: 8.4.47 + postcss-load-config: 5.1.0(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.1) sass: 1.78.0 typescript: 5.6.2 @@ -8715,19 +8767,19 @@ snapshots: magic-string: 0.30.11 zimmerframe: 1.1.2 - sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175): + sveltekit-flash-message@2.4.4(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175): dependencies: - '@sveltejs/kit': 2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) svelte: 5.0.0-next.175 - sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0))): + sveltekit-rate-limiter@0.5.2(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0))): dependencies: '@isaacs/ttlcache': 1.4.1 - '@sveltejs/kit': 2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) - sveltekit-superforms@2.17.0(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175): + sveltekit-superforms@2.18.0(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(@types/json-schema@7.0.15)(svelte@5.0.0-next.175): dependencies: - '@sveltejs/kit': 2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)) + '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)) devalue: 5.0.0 just-clone: 6.2.0 memoize-weak: 1.0.2 @@ -8738,8 +8790,10 @@ snapshots: '@gcornut/valibot-json-schema': 0.31.0 '@sinclair/typebox': 0.32.35 '@sodaru/yup-to-json-schema': 2.0.1 + '@typeschema/class-validator': 0.2.0(@types/json-schema@7.0.15)(class-validator@0.14.1) '@vinejs/vine': 1.8.0 arktype: 2.0.0-beta.0 + class-validator: 0.14.1 joi: 17.13.3 json-schema-to-ts: 3.1.1 superstruct: 2.0.2 @@ -8747,6 +8801,8 @@ snapshots: yup: 1.4.0 zod: 3.23.8 zod-to-json-schema: 3.23.3(zod@3.23.8) + transitivePeerDependencies: + - '@types/json-schema' tabbable@6.2.0: {} @@ -8777,11 +8833,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.0 - postcss: 8.4.45 - postcss-import: 15.1.0(postcss@8.4.45) - postcss-js: 4.0.1(postcss@8.4.45) - postcss-load-config: 4.0.2(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)) - postcss-nested: 6.2.0(postcss@8.4.45) + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.6.2)) + postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 @@ -8964,7 +9020,7 @@ snapshots: debug: 4.3.6 pathe: 1.1.2 picocolors: 1.1.0 - vite: 5.4.4(@types/node@20.16.5)(sass@1.78.0) + vite: 5.4.5(@types/node@20.16.5)(sass@1.78.0) transitivePeerDependencies: - '@types/node' - less @@ -8976,19 +9032,19 @@ snapshots: - supports-color - terser - vite@5.4.4(@types/node@20.16.5)(sass@1.78.0): + vite@5.4.5(@types/node@20.16.5)(sass@1.78.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.45 + postcss: 8.4.47 rollup: 4.21.2 optionalDependencies: '@types/node': 20.16.5 fsevents: 2.3.3 sass: 1.78.0 - vitefu@0.2.5(vite@5.4.4(@types/node@20.16.5)(sass@1.78.0)): + vitefu@0.2.5(vite@5.4.5(@types/node@20.16.5)(sass@1.78.0)): optionalDependencies: - vite: 5.4.4(@types/node@20.16.5)(sass@1.78.0) + vite: 5.4.5(@types/node@20.16.5)(sass@1.78.0) vitest@1.6.0(@types/node@20.16.5)(sass@1.78.0): dependencies: @@ -9009,7 +9065,7 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.4(@types/node@20.16.5)(sass@1.78.0) + vite: 5.4.5(@types/node@20.16.5)(sass@1.78.0) vite-node: 1.6.0(@types/node@20.16.5)(sass@1.78.0) why-is-node-running: 2.3.0 optionalDependencies: diff --git a/src/lib/server/api/common/env.ts b/src/lib/server/api/common/env.ts index 17796e8..95b35c4 100644 --- a/src/lib/server/api/common/env.ts +++ b/src/lib/server/api/common/env.ts @@ -17,6 +17,8 @@ const EnvSchema = z.object({ DATABASE_DB: z.string(), DB_MIGRATING: stringBoolean, DB_SEEDING: stringBoolean, + GITHUB_CLIENT_ID: z.string(), + GITHUB_CLIENT_SECRET: z.string(), NODE_ENV: z.string().default('development'), ORIGIN: z.string(), PUBLIC_SITE_NAME: z.string(), diff --git a/src/lib/server/api/controllers/collection.controller.ts b/src/lib/server/api/controllers/collection.controller.ts index 86dfcc5..5cc94cd 100644 --- a/src/lib/server/api/controllers/collection.controller.ts +++ b/src/lib/server/api/controllers/collection.controller.ts @@ -18,6 +18,11 @@ export class CollectionController extends Controller { console.log('collections service', collections) return c.json({ collections }) }) + .get('/count', requireAuth, async (c) => { + const user = c.var.user + const collections = await this.collectionsService.findAllByUserIdWithDetails(user.id) + return c.json({ collections }) + }) .get('/:cuid', requireAuth, async (c) => { const cuid = c.req.param('cuid') const collection = await this.collectionsService.findOneByCuid(cuid) diff --git a/src/lib/server/api/controllers/oauth.controller.ts b/src/lib/server/api/controllers/oauth.controller.ts new file mode 100644 index 0000000..4b1bcb4 --- /dev/null +++ b/src/lib/server/api/controllers/oauth.controller.ts @@ -0,0 +1,55 @@ +import 'reflect-metadata' +import { Controller } from '$lib/server/api/common/types/controller' +import { LuciaService } from '$lib/server/api/services/lucia.service' +import { OAuthService } from '$lib/server/api/services/oauth.service' +import { github } from '$lib/server/auth' +import { OAuth2RequestError } from 'arctic' +import { getCookie } from 'hono/cookie' +import { inject, injectable } from 'tsyringe' + +@injectable() +export class OAuthController extends Controller { + constructor( + @inject(LuciaService) private luciaService: LuciaService, + @inject(OAuthService) private readonly oauthService: OAuthService) { + super() + } + + routes() { + return this.controller + .get('/github', async (c) => { + try { + const code = c.req.query('code')?.toString() ?? null + const state = c.req.query('state')?.toString() ?? null + const storedState = getCookie(c).github_oauth_state ?? null + + if (!code || !state || !storedState || state !== storedState) { + return c.body(null, 400) + } + + const tokens = await github.validateAuthorizationCode(code) + const githubUserResponse = await fetch("https://api.github.com/user", { + headers: { + Authorization: `Bearer ${tokens.accessToken}` + } + }); + const githubUser: GitHubUser = await githubUserResponse.json(); + + const token = await this.oauthService.handleOAuthUser(githubUser.id, githubUser.login, 'github') + return c.json({ token }) + } catch (error) { + // the specific error message depends on the provider + if (error instanceof OAuth2RequestError) { + // invalid code + return c.body(null, 400) + } + return c.body(null, 500) + } + }) + } +} + +interface GitHubUser { + id: number; + login: string; +} \ No newline at end of file diff --git a/src/lib/server/api/databases/tables/collections.table.ts b/src/lib/server/api/databases/tables/collections.table.ts index 715bf4d..4b483df 100644 --- a/src/lib/server/api/databases/tables/collections.table.ts +++ b/src/lib/server/api/databases/tables/collections.table.ts @@ -3,6 +3,7 @@ import { type InferSelectModel, relations } from 'drizzle-orm' import { pgTable, text, uuid } from 'drizzle-orm/pg-core' import { timestamps } from '../../common/utils/table' import { usersTable } from './users.table' +import { collection_items } from './collectionItems.table' export const collections = pgTable('collections', { id: uuid('id').primaryKey().defaultRandom(), @@ -16,11 +17,12 @@ export const collections = pgTable('collections', { ...timestamps, }) -export const collection_relations = relations(collections, ({ one }) => ({ +export const collection_relations = relations(collections, ({ one, many }) => ({ user: one(usersTable, { fields: [collections.user_id], references: [usersTable.id], }), + collection_items: many(collection_items), })) export type Collections = InferSelectModel diff --git a/src/lib/server/api/index.ts b/src/lib/server/api/index.ts index 8dd5adb..f39f32a 100644 --- a/src/lib/server/api/index.ts +++ b/src/lib/server/api/index.ts @@ -44,6 +44,7 @@ const routes = app .route('/me', container.resolve(IamController).routes()) .route('/user', container.resolve(UserController).routes()) .route('/login', container.resolve(LoginController).routes()) + .route('/oauth', container.resolve(OAuthController).routes()) .route('/signup', container.resolve(SignupController).routes()) .route('/wishlists', container.resolve(WishlistController).routes()) .route('/collections', container.resolve(CollectionController).routes()) diff --git a/src/lib/server/api/repositories/collections.repository.ts b/src/lib/server/api/repositories/collections.repository.ts index c6f097b..bea63ed 100644 --- a/src/lib/server/api/repositories/collections.repository.ts +++ b/src/lib/server/api/repositories/collections.repository.ts @@ -2,7 +2,7 @@ import { takeFirstOrThrow } from '$lib/server/api/common/utils/repository' import { DrizzleService } from '$lib/server/api/services/drizzle.service' import { type InferInsertModel, eq } from 'drizzle-orm' import { inject, injectable } from 'tsyringe' -import { collections } from '../databases/tables' +import { collection_items, collections } from '../databases/tables' export type CreateCollection = InferInsertModel export type UpdateCollection = Partial @@ -51,6 +51,23 @@ export class CollectionsRepository { }) } + async findAllByUserIdWithDetails(userId: string, db = this.drizzle.db) { + return db.query.collections.findMany({ + where: eq(collections.user_id, userId), + columns: { + cuid: true, + name: true, + }, + with: { + collection_items: { + columns: { + cuid: true + } + }, + } + }) + } + async create(data: CreateCollection, db = this.drizzle.db) { return db.insert(collections).values(data).returning().then(takeFirstOrThrow) } diff --git a/src/lib/server/api/repositories/federated_identity.repository.ts b/src/lib/server/api/repositories/federated_identity.repository.ts new file mode 100644 index 0000000..a67009e --- /dev/null +++ b/src/lib/server/api/repositories/federated_identity.repository.ts @@ -0,0 +1,25 @@ +import { inject, injectable } from "tsyringe"; +import { DrizzleService } from "../services/drizzle.service"; +import { and, eq, type InferInsertModel } from "drizzle-orm"; +import { federatedIdentityTable } from "../databases/tables"; +import { takeFirstOrThrow } from "../common/utils/repository"; + +export type CreateFederatedIdentity = InferInsertModel + +@injectable() +export class FederatedIdentityRepository { + + constructor( + @inject(DrizzleService) private readonly drizzle: DrizzleService + ) { } + + async findOneByUserIdAndProvider(userId: string, provider: string) { + return this.drizzle.db.query.federatedIdentityTable.findFirst({ + where: and(eq(federatedIdentityTable.user_id, userId), eq(federatedIdentityTable.identity_provider, provider)) + }) + } + + async create(data: CreateFederatedIdentity, db = this.drizzle.db) { + return db.insert(federatedIdentityTable).values(data).returning().then(takeFirstOrThrow) + } +} \ No newline at end of file diff --git a/src/lib/server/api/services/collections.service.ts b/src/lib/server/api/services/collections.service.ts index 4e0a009..107ccdf 100644 --- a/src/lib/server/api/services/collections.service.ts +++ b/src/lib/server/api/services/collections.service.ts @@ -16,6 +16,10 @@ export class CollectionsService { return this.collectionsRepository.findAllByUserId(userId); } + async findAllByUserIdWithDetails(userId: string) { + return this.collectionsRepository.findAllByUserIdWithDetails(userId); + } + async findOneById(id: string) { return this.collectionsRepository.findOneById(id); } diff --git a/src/lib/server/api/services/oauth.service.ts b/src/lib/server/api/services/oauth.service.ts new file mode 100644 index 0000000..4432792 --- /dev/null +++ b/src/lib/server/api/services/oauth.service.ts @@ -0,0 +1,54 @@ +import { github } from "$lib/server/auth"; +import { db } from "$lib/server/db"; +import { lucia } from "$lib/server/lucia"; +import type { RequestEvent } from "@sveltejs/kit"; +import { OAuth2RequestError } from "arctic"; +import { generateIdFromEntropySize } from "lucia"; +import { inject, injectable } from "tsyringe"; +import { UsersService } from "./users.service"; +import { FederatedIdentityRepository } from "../repositories/federated_identity.repository"; + +@inejectable() +export class OAuthService { + constructor( + @inject(FederatedIdentityRepository) private readonly federatedIdentityRepository: FederatedIdentityRepository, + @inject(UsersService) private readonly usersService: UsersService + ) {} + + async handleOAuthUser(oauthUserId: number, oauthUsername: string, oauthProvider: string) { + const existingUser = await this.federatedIdentityRepository.findOneByUserIdAndProvider(`${oauthUserId}`, oauthProvider) + + if (existingUser) { + return existingUser.id + } else { + const userId = generateIdFromEntropySize(10); // 16 characters long + + const user = await this.drizzleService.db.transaction(async (trx) => { + const user = await this.usersService.create({ + id: userId, + username: oauthUsername + }, trx); + + await this.federatedIdentityRepository.create({ + identity_provider: oauthProvider, + user_id: userId, + identity_id: `${oauthUserId}` + }, trx); + return user; + }) + + const session = await lucia.createSession(userId, {}); + const sessionCookie = lucia.createSessionCookie(session.id); + event.cookies.set(sessionCookie.name, sessionCookie.value, { + path: ".", + ...sessionCookie.attributes + }); + } + return new Response(null, { + status: 302, + headers: { + Location: "/" + } + }); + } +} \ No newline at end of file diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts new file mode 100644 index 0000000..bf0d9aa --- /dev/null +++ b/src/lib/server/auth.ts @@ -0,0 +1,4 @@ +import env from "$lib/server/api/common/env"; +import { GitHub } from "arctic"; + +export const github = new GitHub(env.GITHUB_CLIENT_ID, env.GITHUB_CLIENT_SECRET); diff --git a/src/routes/(app)/(protected)/collections/+page.server.ts b/src/routes/(app)/(protected)/collections/+page.server.ts index 7dc3e2e..881f050 100644 --- a/src/routes/(app)/(protected)/collections/+page.server.ts +++ b/src/routes/(app)/(protected)/collections/+page.server.ts @@ -1,13 +1,12 @@ import { notSignedInMessage } from '$lib/flashMessages' +import { collection_items, collections, gamesTable } from '$lib/server/api/databases/tables' import { db } from '$lib/server/api/packages/drizzle' -import { userNotAuthenticated } from '$lib/server/auth-utils' import { modifyListGameSchema } from '$lib/validations/zod-schemas' import { type Actions, error, fail } from '@sveltejs/kit' import { and, eq } from 'drizzle-orm' import { redirect } from 'sveltekit-flash-message/server' import { zod } from 'sveltekit-superforms/adapters' import { superValidate } from 'sveltekit-superforms/server' -import { collection_items, collections, gamesTable } from '../../../../lib/server/api/databases/tables' export async function load(event) { const { locals } = event @@ -18,23 +17,10 @@ export async function load(event) { } try { - const userCollections = await db.query.collections.findMany({ - columns: { - cuid: true, - name: true, - created_at: true, - }, - where: eq(collections.user_id, authedUser.id), - }) - console.log('collections', userCollections) - - if (userCollections?.length === 0) { - console.log('Collection was not found') - return fail(404, {}) - } + const { data, error } = await locals.api.collections.$get().then(locals.parseApiResponse) return { - collections: userCollections, + collections: data?.collections || [], } } catch (e) { console.error(e) diff --git a/src/routes/(app)/(protected)/collections/+page.svelte b/src/routes/(app)/(protected)/collections/+page.svelte index 81f993f..6d600b9 100644 --- a/src/routes/(app)/(protected)/collections/+page.svelte +++ b/src/routes/(app)/(protected)/collections/+page.svelte @@ -1,24 +1,34 @@ Your Collections | Bored Game +

Your Collections

-
{#if collections.length === 0}

You have no collections

{:else} {#each collections as collection} -
+ + + {collection.name} + + +

Number of items:

+

Created at: {new Date(collection.createdAt).toLocaleString()}

+
+
+ {/each} {/if}
@@ -30,10 +40,6 @@ width: 100%; } - .collections { - margin: 2rem 0; - } - .collection-list { display: grid; grid-template-columns: repeat(3, minmax(200px, 1fr)); diff --git a/src/routes/(auth)/auth/callback/github/+server.ts b/src/routes/(auth)/auth/callback/github/+server.ts new file mode 100644 index 0000000..c58847d --- /dev/null +++ b/src/routes/(auth)/auth/callback/github/+server.ts @@ -0,0 +1,21 @@ +import { github } from "$lib/server/auth"; +import { OAuth2RequestError } from "arctic"; +import { generateIdFromEntropySize } from "lucia"; + +import type { RequestEvent } from "@sveltejs/kit"; + +export async function GET(event: RequestEvent): Promise { + const code = event.url.searchParams.get('code') + const state = event.url.searchParams.get('state') + const { data, error } = await locals.api.oauth.$get({ + params: { + code, + state + } + }) +} + +interface GitHubUser { + id: number; + login: string; +} \ No newline at end of file diff --git a/src/routes/(auth)/login/github/+server.ts b/src/routes/(auth)/login/github/+server.ts new file mode 100644 index 0000000..a93f2f8 --- /dev/null +++ b/src/routes/(auth)/login/github/+server.ts @@ -0,0 +1,18 @@ +import { github } from '$lib/server/auth' +import { redirect } from '@sveltejs/kit' +import { generateState } from 'arctic' + +export async function GET(event) { + const state = generateState(); + const url = await github.createAuthorizationURL(state) + + event.cookies.set('github_state', state, { + path: '/', + secure: import.meta.env.PROD, + httpOnly: true, + maxAge: 60 * 10, + sameSite: 'lax' + }); + + redirect(302, url.toString()) +} \ No newline at end of file